| 598 | } |
| 599 | |
| 600 | void CopyFrameBGR48(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch) |
| 601 | { |
| 602 | UINT line_pixels = abs(src_pitch) / 6; |
| 603 | UINT line_pixels4 = line_pixels & ~(4u - 1); |
| 604 | |
| 605 | for (UINT y = 0; y < lines; ++y) { |
| 606 | uint64_t* src64 = (uint64_t*)src; |
| 607 | uint64_t* dst64 = (uint64_t*)dst; |
| 608 | |
| 609 | UINT i = 0; |
| 610 | for (; i < line_pixels4; i += 4) { |
| 611 | uint64_t sa = *src64++; |
| 612 | uint64_t sb = *src64++; |
| 613 | uint64_t sc = *src64++; |
| 614 | |
| 615 | *dst64++ = ((sa & 0xffff) << 32) | (sa & 0xffff0000) | ((sa & 0xffff00000000) >> 32); |
| 616 | *dst64++ = ((sa & 0xffff000000000000) >> 16) | ((sb & 0xffff) << 16) | ((sb & 0xffff0000) >> 16); |
| 617 | *dst64++ = (sb & 0xffff00000000) | ((sb & 0xffff000000000000) >> 32) | (sc & 0xffff); |
| 618 | *dst64++ = ((sc & 0xffff0000) << 16) | ((sc & 0xffff00000000) >> 16) | ((sc & 0xffff000000000000) >> 48); |
| 619 | } |
| 620 | |
| 621 | if (UINT remainder = line_pixels - i) { |
| 622 | uint64_t sa = *src64++; |
| 623 | *dst64++ = ((sa & 0xffff) << 32) | (sa & 0xffff0000) | ((sa & 0xffff00000000) >> 32); |
| 624 | |
| 625 | if (remainder==2) { |
| 626 | uint64_t sb = *(uint32_t*)src64; |
| 627 | *dst64 = ((sa & 0xffff000000000000) >> 16) | ((sb & 0xffff) << 16) | ((sb & 0xffff0000) >> 16); |
| 628 | } |
| 629 | else if (remainder == 3) { |
| 630 | uint64_t sb = *src64++; |
| 631 | uint64_t sc = *(uint32_t*)src64; |
| 632 | *dst64++ = ((sa & 0xffff000000000000) >> 16) | ((sb & 0xffff) << 16) | ((sb & 0xffff0000) >> 16); |
| 633 | *dst64 = (sb & 0xffff00000000) | ((sb & 0xffff000000000000) >> 32) | (sc & 0xffff); |
| 634 | } |
| 635 | } |
| 636 | |
| 637 | src += src_pitch; |
| 638 | dst += dst_pitch; |
| 639 | } |
| 640 | } |
| 641 | |
| 642 | void CopyFrameBGRA64(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch) |
| 643 | { |
nothing calls this directly
no outgoing calls
no test coverage detected