|
发表于 2005-8-19 14:38:00
|
显示全部楼层
Re:战略三国的图片
没有编译过的代码
void _Alpha16Blend( WORD * pwSrc, WORD * pwDes, int nSize, DWORD dwColorKey )
{
DWORD dwAlpha = ((dwColorKey&0xFF000000)>>24);
DWORD dwMask = ((((((dwColorKey&0xFF0000)>>16)<<5)>>8)<<11)|(((((dwColorKey&0xFF00)>>8)<<6)>>8)<<5)|(((dwColorKey&0xFF)<<5)>>8));
// dwMask = 0xCCCC;
WORD * t1 = &pwSrc[nSize-2];
WORD * t2 = &pwDes[nSize-2];
int nLoop = nSize / 2; // 2个WORD
__asm
{
emms
push esi
push edi
mov esi, dword ptr pwSrc
mov edi, dword ptr pwDes
xor ecx, ecx
movd mm1, dwAlpha
movq mm0, mm1
psllq mm0, 32
por mm0, mm1 // mm0存放2个Alpha值
loopFlag:
pxor mm3, mm3
movd mm1, [esi]
punpcklwd mm1, mm3
movd mm2, [edi]
punpcklwd mm2, mm3
movd mm4, dwMask // ColorKey的Mask
movq mm3, mm4
psllq mm3, 32
por mm3, mm4
pcmpeqd mm3, mm2 // 跟目标颜色值比较,如果相同mm3=1,否则mm3=0
pandn mm3, mm2 // 这样,如果目标颜色跟ColorKey相同mm3应该是0,否则原值
movq mm2, mm3 // (((Src & ColorKey) * Alpha) >> 8) + Des - ((Des * Alpha) >> 8)
movq mm4, MASK_RED // 红色 mm3 = MASK_RED
pand mm4, mm2 // mm4 = Src(5位)
pslld mm4, 3 // mm4 = Src(8位) Red * 256 / 32 = ((Red << 8) >> 5)
pmullw mm4, mm0
psrld mm4, 8 // mm4 = ((Src & ColorKey) >> 8)
movq mm5, mm3
pand mm5, mm1 // mm5 = Des
movq mm6, mm5 // mm6 = Des
pmullw mm6, mm0
psrld mm6, 8 // mm6 = ((Des * Alpha) >> 8)
psubusb mm5, mm6 // mm5 = mm5 - mm6
paddusb mm4, mm6 // mm4 = mm4 + mm5
movq mm5, MASK_GREEN // 绿色 mm3 = MASK_GREEN
pand mm5, mm2 // mm5 = Src
psrld mm5, 2 // 移至低8位,然后5位转换为8位 mm5 = Src(8位) Green * 256 / 32 = (((Green >> 5) << 8) >> 5)
pmullw mm5, mm0
psrld mm5, 8 // mm5 = ((Src & ColorKey) >> 8)
movq mm6, mm3
pand mm6, mm1 // mm6 = Des
movq mm7, mm6 // mm7 = Des
pmullw mm7, mm0
psrld mm7, 8 // mm7 = ((Des * Alpha) >> 8)
psubusb mm6, mm7 // mm6 = mm6 - mm7
paddusb mm5, mm7 // mm5 = mm5 + mm6
movq mm6, MASK_BLUE // 蓝色 mm3 = MASK_BLUE
pand mm6, mm2 // mm6 = Src
psrld mm6, 8 // 移至低8位,然后5位转换为8位 mm6 = Src(8位) Blue * 256 / 32 = (((Blue >> 11) << 8) >> 5)
pmullw mm6, mm0
psrld mm6, 8 // mm6 = ((Src & ColorKey) >> 8)
movq mm7, mm3
pand mm7, mm1 // mm7 = Des
movq mm3, mm6 // mm3 = Des
pmullw mm3, mm0
psrld mm3, 8 // mm3 = ((Des * Alpha) >> 8)
psubusb mm7, mm7 // mm7 = mm7 - mm3
paddusb mm6, mm7 // mm6 = mm6 + mm7
movq mm3, MASK_BLUE // 蓝色 mm3 = MASK_BLUE
psllq mm6, 11 // mm4,mm5,mm6分别存储红绿蓝色分量
pand mm6, mm3
movq mm3, MASK_GREEN // 绿色 mm3 = MASK_BLUE
psllq mm5, 5
pand mm5, mm3
movq mm3, MASK_RED // 红色 mm3 = MASK_RED
pand mm4, mm3
por mm4, mm5
por mm4, mm6
cmp ecx, nLoop
jz jmpFlag
inc ecx
add esi, 32
add edi, 32
cmp ecx, nLoop
jnz loopFlag
mov esi, dword ptr t1
mov edi, dword ptr t2
jmp loopFlag
jmpFlag:
pop edi
pop esi
emms
}
} |
|