19,468
社区成员
发帖
与我相关
我的任务
分享
void CGSurface::AlphaBlt(int x,int y,LPCGSURFACE sour,LPRECT prc,int alpha,COLORREF Key_Color)
{
RECT rect={0,0,sour->m_Desc.dwWidth,sour->m_Desc.dwHeight};
if(prc==NULL)
prc=▭
_RESTRICT_RECT(x,y,prc,this);
if(alpha<=0)
{
HBltFast(x,y,sour,prc,Key_Color);
return;
}
else if(alpha>255)
return;
BeginDraw();
sour->BeginDraw();
int srcw=(prc->right-prc->left);
int srch=(prc->bottom-prc->top);
int sourline=sour->m_Desc.lPitch-srcw*4;
int destline=m_Desc.lPitch-srcw*4;
LPBYTE pSour=((LPBYTE)(sour->m_GraphBuffer+prc->top*sour->m_Pitch+prc->left));
LPBYTE pDest=((LPBYTE)(m_GraphBuffer+y*m_Pitch+x));
int ialpha=(256-alpha)<<24;
for(int j=0;j<srch;j++)
{
__asm
{
mov ebx,pDest;
mov ecx,pSour;
mov eax,Key_Color;
xor edx,edx;
cmp edx,srcw;
jc STLOOP;
jmp ENDLOOP;
STLOOP:
cmp [ecx],eax;
je KEYOUT;
pxor mm2,mm2;
movd mm0,dword ptr [ebx];
movd mm1,dword ptr [ecx];
punpcklbw mm0,mm2;
punpcklbw mm1,mm2;
movd mm3,ialpha;
punpcklbw mm3,mm2;
punpckhwd mm3,mm3;
punpckhdq mm3,mm3;
movq mm4,mm0;
movq mm5,mm1;
psubusw mm4,mm1;
psubusw mm5,mm0;
pmullw mm4,mm3;
pmullw mm5,mm3;
psrlw mm4,8;
psrlw mm5,8;
paddusw mm0,mm5;
psubusw mm0,mm4;
packuswb mm0,mm0;
movd dword ptr [ebx],mm0 //保存结果
KEYOUT:
add ebx,4;
add ecx,4;
inc edx;
cmp edx,srcw;
jc STLOOP;
jmp ENDLOOP;
ENDLOOP:
add ebx,destline;
add ecx,sourline;
mov pSour,ecx;
mov pDest,ebx;
}
}
__asm emms;
sour->EndDraw();
EndDraw();
}