21,459
社区成员
发帖
与我相关
我的任务
分享
void BlendWithMask_Normal_MMX(BYTE *pBuffer,
BYTE *pBaseBuffer,
BYTE *pMask,
VDWORD dwMaskAlignWidth,
DWORD dwMaskWidth,
VDWORD dwMaskHeight)
{
__int64 nMask = 0x00FF00FF00FF;
__int32 nColorKey = 0xFFFFFFFE;
VINT32 nMaskPitch = dwMaskAlignWidth - dwMaskWidth;
VINT32 nWidth = dwMaskWidth;
VINT32 nHeight = dwMaskHeight;
//BlendWithMask_Normal_MMX_ASM(pBuffer, pBaseBuffer, pMask, nWidth, nHeight, nMaskPitch)
__asm
{
mov ebx, nWidth
mov ecx, nHeight
pxor mm4, mm4
mov esi, pBuffer
mov edi, pBaseBuffer
mov eax, pMask
jmp line
next_line:
mov ebx, nWidth
add eax, nMaskPitch
line:
xor edx, edx
movd mm0, [esi]
movd mm1, [edi]
mov dl, [eax]
movd mm2, edx
movd edx, mm0 // 判断是否为255,255,254
cmp edx, nColorKey
je normal
movd edx, mm2
cmp edx, 0x0
je normal
punpcklbw mm0, mm4
punpcklbw mm1, mm4
movq mm5, mm2
psllq mm2, 16
por mm5, mm2
psllq mm2, 16
por mm5, mm2
movq mm3, mm5
pandn mm3, nMask // 1-alpha
pmullw mm0, mm5
pmullw mm1, mm3
paddusw mm0, mm1
psrlw mm0, 8
packuswb mm0, mm4
movd [esi], mm0
jmp continue_loop
normal:
movd [esi], mm1
continue_loop:
add esi, 4
add edi, 4
add eax, 1
dec ebx
jnz line
dec ecx
jnz next_line
emms
}
}
转为纯汇编时 pxor,movd,pmullw,paddusw 等这些指令都不识别。