WORD * pwBitmapDest, * pwBitmapSrc;
WORD * pwDest, * pwSrc;
DWORD dwColorDest, dwColorSrc;
LONG lPitchDest, lPitchSrc;
pwBitmapDest = (WORD*) ddsd2.lpSurface; // 锁定的目标表面
pwBitmapSrc = (WORD*) ddsd.lpSurface; // 锁定的源表面
lPitchDest = ddsd2.lPitch >> 1;
lPitchSrc = ddsd.lPitch >> 1;
for ( int i = 0; i < t2; i++)
{
pwSrc = pwBitmapSrc;
pwDest = pwBitmapDest;
for ( int j = 0; j < t1; j++ )
{
dwColorSrc = *pwSrc ;
if ( dwColorKey != dwColorSrc ) // 这个是过滤透明色的判断
{
// 下面基本都是位运算
dwColorDest = *pwDest;
// 565mode: 0000 0GGG GGG0 0000 | RRRR R000 000B BBBB
// 555mode: 0000 00GG GGG0 0000 | 0RRR RR00 000B BBBB
dwColorSrc = (dwColorSrc<<16 | dwColorSrc) & m_dwGRBBitMask ;
dwColorDest = (dwColorDest<<16 | dwColorDest) & m_dwGRBBitMask ;
// ( D * (32-a) + S * a ) / 32
// = (S-D) * a / 32 + D
dwColorDest = ((((dwColorSrc-dwColorDest) * dwAlpha) >> 5) + dwColorDest) &
m_dwGRBBitMask;
*pwDest = (WORD)( dwColorDest>>16 | dwColorDest );
}
pwSrc++;
pwDest++;
}
pwBitmapSrc += lPitchSrc;
pwBitmapDest += lPitchDest;
}