| 565 | } |
| 566 | |
| 567 | void CopyFrameRGB48_SSSE3(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch) |
| 568 | { |
| 569 | UINT line_pixels = abs(src_pitch) / 6; |
| 570 | UINT line_pixels8 = line_pixels & ~(8u - 1); |
| 571 | |
| 572 | __m128i mask = _mm_setr_epi8(0, 1, 2, 3, 4, 5, -1, -1, 6, 7, 8, 9, 10, 11, -1, -1); |
| 573 | |
| 574 | for (UINT y = 0; y < lines; ++y) { |
| 575 | __m128i *src128 = (__m128i*)src; |
| 576 | __m128i *dst128 = (__m128i*)dst; |
| 577 | for (UINT i = 0; i < line_pixels8; i += 8) { |
| 578 | __m128i sa = _mm_load_si128(src128); |
| 579 | __m128i sb = _mm_load_si128(src128 + 1); |
| 580 | __m128i sc = _mm_load_si128(src128 + 2); |
| 581 | |
| 582 | __m128i val = _mm_shuffle_epi8(sa, mask); |
| 583 | _mm_store_si128(dst128, val); |
| 584 | val = _mm_shuffle_epi8(_mm_alignr_epi8(sb, sa, 12), mask); |
| 585 | _mm_store_si128(dst128 + 1, val); |
| 586 | val = _mm_shuffle_epi8(_mm_alignr_epi8(sc, sb, 8), mask); |
| 587 | _mm_store_si128(dst128 + 2, val); |
| 588 | val = _mm_shuffle_epi8(_mm_alignr_epi8(sc, sc, 4), mask); |
| 589 | _mm_store_si128(dst128 + 3, val); |
| 590 | |
| 591 | src128 += 3; |
| 592 | dst128 += 4; |
| 593 | } |
| 594 | |
| 595 | src += src_pitch; |
| 596 | dst += dst_pitch; |
| 597 | } |
| 598 | } |
| 599 | |
| 600 | void CopyFrameBGR48(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch) |
| 601 | { |
nothing calls this directly
no outgoing calls
no test coverage detected