Unpack one 4x4 block from B44 compressed 14 bytes (matches OpenEXR unpack14)
| 3761 | |
| 3762 | // Unpack one 4x4 block from B44 compressed 14 bytes (matches OpenEXR unpack14) |
| 3763 | static void UnpackB44Block(unsigned short dst[16], const unsigned char src[14]) { |
| 3764 | // Extract t[0] (stored as ordered-magnitude value) |
| 3765 | unsigned short s0 = (static_cast<unsigned short>(src[0]) << 8) | src[1]; |
| 3766 | |
| 3767 | // Extract shift and compute bias |
| 3768 | unsigned short shift = src[2] >> 2; |
| 3769 | unsigned short bias = static_cast<unsigned short>(0x20u << shift); |
| 3770 | |
| 3771 | // Reconstruct t values using running differences |
| 3772 | // Pattern: s[0]->s[4]->s[8]->s[12], then s[0]->s[1], s[4]->s[5], etc. |
| 3773 | |
| 3774 | unsigned short s4 = static_cast<unsigned short>( |
| 3775 | static_cast<unsigned int>(s0) + |
| 3776 | static_cast<unsigned int>(((static_cast<unsigned int>(src[2]) << 4) | |
| 3777 | (static_cast<unsigned int>(src[3]) >> 4)) & 0x3fu) * (1u << shift) - bias); |
| 3778 | |
| 3779 | unsigned short s8 = static_cast<unsigned short>( |
| 3780 | static_cast<unsigned int>(s4) + |
| 3781 | static_cast<unsigned int>(((static_cast<unsigned int>(src[3]) << 2) | |
| 3782 | (static_cast<unsigned int>(src[4]) >> 6)) & 0x3fu) * (1u << shift) - bias); |
| 3783 | |
| 3784 | unsigned short s12 = static_cast<unsigned short>( |
| 3785 | static_cast<unsigned int>(s8) + |
| 3786 | static_cast<unsigned int>(src[4] & 0x3fu) * (1u << shift) - bias); |
| 3787 | |
| 3788 | unsigned short s1 = static_cast<unsigned short>( |
| 3789 | static_cast<unsigned int>(s0) + |
| 3790 | static_cast<unsigned int>(src[5] >> 2) * (1u << shift) - bias); |
| 3791 | |
| 3792 | unsigned short s5 = static_cast<unsigned short>( |
| 3793 | static_cast<unsigned int>(s4) + |
| 3794 | static_cast<unsigned int>(((static_cast<unsigned int>(src[5]) << 4) | |
| 3795 | (static_cast<unsigned int>(src[6]) >> 4)) & 0x3fu) * (1u << shift) - bias); |
| 3796 | |
| 3797 | unsigned short s9 = static_cast<unsigned short>( |
| 3798 | static_cast<unsigned int>(s8) + |
| 3799 | static_cast<unsigned int>(((static_cast<unsigned int>(src[6]) << 2) | |
| 3800 | (static_cast<unsigned int>(src[7]) >> 6)) & 0x3fu) * (1u << shift) - bias); |
| 3801 | |
| 3802 | unsigned short s13 = static_cast<unsigned short>( |
| 3803 | static_cast<unsigned int>(s12) + |
| 3804 | static_cast<unsigned int>(src[7] & 0x3fu) * (1u << shift) - bias); |
| 3805 | |
| 3806 | unsigned short s2 = static_cast<unsigned short>( |
| 3807 | static_cast<unsigned int>(s1) + |
| 3808 | static_cast<unsigned int>(src[8] >> 2) * (1u << shift) - bias); |
| 3809 | |
| 3810 | unsigned short s6 = static_cast<unsigned short>( |
| 3811 | static_cast<unsigned int>(s5) + |
| 3812 | static_cast<unsigned int>(((static_cast<unsigned int>(src[8]) << 4) | |
| 3813 | (static_cast<unsigned int>(src[9]) >> 4)) & 0x3fu) * (1u << shift) - bias); |
| 3814 | |
| 3815 | unsigned short s10 = static_cast<unsigned short>( |
| 3816 | static_cast<unsigned int>(s9) + |
| 3817 | static_cast<unsigned int>(((static_cast<unsigned int>(src[9]) << 2) | |
| 3818 | (static_cast<unsigned int>(src[10]) >> 6)) & 0x3fu) * (1u << shift) - bias); |
| 3819 | |
| 3820 | unsigned short s14 = static_cast<unsigned short>( |