VOID asmARGB2Gray(BitmapData *data)
{
UINT Height=data->Height;
UINT Width=data->Width;
Pix* p=(Pix*)data->Scan0;
UINT n=Height*Width;
Pix cp[]={0x014c961e};
__asm
{
push esi;
mov ecx,n;
pxor mm7,mm7;
mov esi,[p];
movd mm2,[cp];
lp:
movq mm1,mm2;
movd mm0,[esi]; //mm0:00 00 00 00 Alpha R G B
mov al,[esi+3]; //al:Alpha
punpcklbw mm0,mm7; //mm0:00 Alpha 00 R 00 G 00 B
punpcklbw mm1,mm7; //mm1:00 01 00 4c 00 96 00 1e
movq mm3,mm0;
movq mm5,mm1;
//模拟 pmulluw
movq mm4, mm5
pmullw mm5, mm3 /* a * b lo 16×16 unsigned */
pmulhuw mm4, mm3 /* a * b hi 16×16 unsigned */
movq mm6, mm5
punpcklwd mm5, mm4
punpckhwd mm6, mm4
movq mm0,mm5;
movq mm1,mm6;
psrlw mm0,8;
psrlw mm1,8;
packssdw mm0,mm0;
packssdw mm1,mm1;
movd edx,mm0;
movd ebx,mm1;
shr edx,16;
add dl,bl;
shr ebx,16;
add dl,bl;
mov [esi], dl;
mov [esi+1],dl;
mov [esi+2],dl;
mov [esi+3],al;
add esi,4;
dec ecx;
jnz lp;
pop esi;
emms;
}
}