void CColorSpaceConvector::YUV2RGB(BYTE * pDest, BYTE * pSrc, DWORD dwRGBBit, DWORD dwDestPitch, DWORD dwSrcPitch, int nHeight, UINT nWidth) { UINT nLength = nWidth * ((dwRGBBit + 7) / 8); if (nHeight <= 0) { nHeight = -nHeight; switch (dwRGBBit) { case 15: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; UINT b = Trunc((y < < 8) + n1) > > 11; UINT g = Trunc((y < < 8) + n2) > > 11; UINT r = Trunc((y < < 8) + n3) > > 11; *(WORD*)(pDest + j) = (WORD) ((r < < 10) | (g < < 5) | b); y = pSrc[k+2]; b = Trunc((y < < 8) + n1) > > 11; g = Trunc((y < < 8) + n2) > > 11; r = Trunc((y < < 8) + n3) > > 11; *(WORD*)(pDest + j + 2) = (WORD) ((r < < 10) | (g < < 5) | b); } pSrc += dwSrcPitch; pDest += dwDestPitch; } } break; case 16: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; UINT b = Trunc((y < < 8) + n1) > > 11; UINT g = Trunc((y < < 8) + n2) > > 10; UINT r = Trunc((y < < 8) + n3) > > 11; *(WORD*)(pDest + j) = (WORD) ((r < < 11) | (g < < 5) | b); y = pSrc[k+2]; b = Trunc((y < < 8) + n1) > > 11; g = Trunc((y < < 8) + n2) > > 10; r = Trunc((y < < 8) + n3) > > 11; *(WORD*)(pDest + j + 2) = (WORD) ((r < < 11) | (g < < 5) | b); } pSrc += dwSrcPitch; pDest += dwDestPitch; } } break; case 24: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; pDest[j ] = (BYTE) (Trunc((y < < 8) + n1) > > 8); pDest[j+1] = (BYTE) (Trunc((y < < 8) + n2) > > 8); pDest[j+2] = (BYTE) (Trunc((y < < 8) + n3) > > 8); y = pSrc[k+2]; pDest[j+3] = (BYTE) (Trunc((y < < 8) + n1) > > 8); pDest[j+4] = (BYTE) (Trunc((y < < 8) + n2) > > 8); pDest[j+5] = (BYTE) (Trunc((y < < 8) + n3) > > 8); } pSrc += dwSrcPitch; pDest += dwDestPitch; } } break; case 32: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; pDest[j ] = (BYTE) (Trunc((y < < 8) + n1) > > 8); pDest[j+1] = (BYTE) (Trunc((y < < 8) + n2) > > 8); pDest[j+2] = (BYTE) (Trunc((y < < 8) + n3) > > 8); pDest[j+3] = 0; y = pSrc[k+2]; pDest[j+4] = (BYTE) (Trunc((y < < 8) + n1) > > 8); pDest[j+5] = (BYTE) (Trunc((y < < 8) + n2) > > 8); pDest[j+6] = (BYTE) (Trunc((y < < 8) + n3) > > 8); pDest[j+7] = 0; } pSrc += dwSrcPitch; pDest += dwDestPitch; } } break; } } else { pDest += (nHeight - 1) * dwDestPitch; switch (dwRGBBit) { case 15: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT b = Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 11; UINT g = Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 11; UINT r = Trunc((y < < 8) - u + 506 * v - 64522) > > 11; *(WORD*)(pDest + j) = (WORD) ((r < < 10) | (g < < 5) | b); y = pSrc[k+2]; b = Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 11; g = Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 11; r = Trunc((y < < 8) - u + 506 * v - 64522) > > 11; *(WORD*)(pDest + j + 2) = (WORD) ((r < < 10) | (g < < 5) | b); } pSrc += dwSrcPitch; pDest -= dwDestPitch; } } break; case 16: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; UINT b = Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 11; UINT g = Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 10; UINT r = Trunc((y < < 8) - u + 506 * v - 64522) > > 11; *(WORD*)(pDest + j) = (WORD) ((r < < 11) | (g < < 5) | b); y = pSrc[k+2]; b = Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 11; g = Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 10; r = Trunc((y < < 8) - u + 506 * v - 64522) > > 11; *(WORD*)(pDest + j + 2) = (WORD) ((r < < 11) | (g < < 5) | b); } pSrc += dwSrcPitch; pDest -= dwDestPitch; } } break; case 24: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; pDest[j ] = (BYTE) (Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 8); pDest[j+1] = (BYTE) (Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 8); pDest[j+2] = (BYTE) (Trunc((y < < 8) - u + 506 * v - 64522) > > 8); y = pSrc[k+2]; pDest[j+3] = (BYTE) (Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 8); pDest[j+4] = (BYTE) (Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 8); pDest[j+5] = (BYTE) (Trunc((y < < 8) - u + 506 * v - 64522) > > 8); } pSrc += dwSrcPitch; pDest -= dwDestPitch; } } break; case 32: { for (UINT i = 0; i < (UINT) nHeight; i++) { for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4) { UINT y = pSrc[k]; UINT u = pSrc[k+1]; UINT v = pSrc[k+3]; pDest[j ] = (BYTE) (Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 8); pDest[j+1] = (BYTE) (Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 8); pDest[j+2] = (BYTE) (Trunc((y < < 8) - u + 506 * v - 64522) > > 8); pDest[j+3] = 0; y = pSrc[k+2]; pDest[j+4] = (BYTE) (Trunc((y < < 8) + 511 * u - 6 * v - 64522) > > 8); pDest[j+5] = (BYTE) (Trunc((y < < 8) - 125 * u - 255 * v + 48838) > > 8); pDest[j+6] = (BYTE) (Trunc((y < < 8) - u + 506 * v - 64522) > > 8); pDest[j+7] = 0; } pSrc += dwSrcPitch; pDest -= dwDestPitch; } } break; }