📄 ddutil.cpp
字号:
sub eax,1;
add ebx,1;
sub ecx,1;
dec dx;
jmp Not_Next;
Row_End:
xor dx,dx;
pop eax;
add eax,lSrcPitch;
pop ebx;
add ebx,lBackPitch;
pop ecx;
add ecx,nSrcWidth;
pop dx;
dec dx;
push dx;
push ecx;
push ebx;
push eax;
jmp Add_Row;
All_End:
pop eax;
pop ebx;
pop ecx;
pop dx;
emms;
}
}
/* for(i = rectSrcBlt.top; i < rectSrcBlt.bottom; i++)
{
for(j = rectSrcBlt.left; j < rectSrcBlt.right; j++)
{
// nOption = 0 : 正常显示
if(nOption == 0)
{
if(pAlpha[j] == 0x0)
{
continue;
}
else if(pAlpha[j] == 0xFF)
{
pwBack[x + j] = pwSrc[j];
}
else
{
wTemp = 0;
// Alpha 0.5,0.5
//wTemp |= (((pwSrc[j]&0xF800)>>1) + ((pwBack[j]&0xF800)>>1))&0xF800;
//wTemp |= (((pwSrc[j]&0x07e0)>>1) + ((pwBack[j]&0x07e0)>>1))&0x07e0;
//wTemp |= (((pwSrc[j]&0x001F)>>1) + ((pwBack[j]&0x001F)>>1))&0x001F;
fAlpha = (float)(pAlpha[j])/255;
wTemp |= (DWORD)(((pwSrc[j]&0xF800)*fAlpha) + (pwBack[j+x]&0xF800)*(1-fAlpha))&0xF800;
wTemp |= (DWORD)(((pwSrc[j]&0x07e0)*fAlpha) + (pwBack[j+x]&0x07e0)*(1-fAlpha))&0x07e0;
wTemp |= (DWORD)(((pwSrc[j]&0x001F)*fAlpha) + (pwBack[j+x]&0x001F)*(1-fAlpha))&0x001F;
pwBack[x + j] = wTemp;
}
}
else if(nOption == 1)
{
if(pAlpha[nSrcWidth - j] == 0x0) {continue; }
else if(pAlpha[nSrcWidth - j] == 0xFF)
{
pwBack[x+j] = pwSrc[nSrcWidth - j];
}
else
{
wTemp = 0;
fAlpha = (float)(pAlpha[nSrcWidth-j])/255;
wTemp |= (DWORD)(((pwSrc[nSrcWidth - j]&0xF800)*fAlpha) + (pwBack[j+x]&0xF800)*(1-fAlpha))&0xF800;
wTemp |= (DWORD)(((pwSrc[nSrcWidth - j]&0x07e0)*fAlpha) + (pwBack[j+x]&0x07e0)*(1-fAlpha))&0x07e0;
wTemp |= (DWORD)(((pwSrc[nSrcWidth - j]&0x001F)*fAlpha) + (pwBack[j+x]&0x001F)*(1-fAlpha))&0x001F;
pwBack[x+j] = wTemp;
}
}
}
pwSrcLine += nSrcWidth;
pwBackLine += lBackPitch >> 1;
pAlphaLine += nSrcWidth;
pwSrc = pwSrcLine;
pwBack = pwBackLine;
pAlpha = pAlphaLine;
}
pSrc->Unlock(NULL);
}
pBack->Unlock(NULL);
}
return hr;
}*/
{
if(x >= m_rcWindow.right - m_rcWindow.left || y >=m_rcWindow.bottom - m_rcWindow.top)
return DD_OK;
HRESULT hr;
int i, j;
LPDIRECTDRAWSURFACE7 pBack = NULL, pSrc =NULL;
long lSrcPitch, lBackPitch; //源图面, BackBuffer 的图面pitch;
int nSrcWidth, nSrcHeight; //源图面的高与宽
int nBackHeight, nBackWidth; //Backbuffer 的高与宽
int nBltHeight, nBltWidth; //要显示的图面的高与宽
RECT rectSrcBlt;
DDSURFACEDESC2 ddsd;
WORD wTemp, *pwBack = NULL, *pwSrc = NULL;
WORD *pwBackLine = NULL, *pwSrcLine = NULL;
BYTE *pAlpha = lpAlphaSurface->lpAlpha;
BYTE *pAlphaLine = pAlpha;
float fAlpha; //alpha值
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
pBack = GetBackBuffer();
pSrc = lpAlphaSurface->lpSurface->GetDDrawSurface();
nSrcWidth = lpAlphaSurface->lpSurface->GetWidth();
if(!FAILED(hr = pBack->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL)))
{
pwBackLine = pwBack = (WORD *)ddsd.lpSurface;
lBackPitch = ddsd.lPitch;
nBackHeight = ddsd.dwHeight;
nBackWidth = ddsd.dwWidth;
if(!FAILED(hr = pSrc->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_READONLY,NULL)))
{
pwSrcLine = pwSrc = (WORD *)ddsd.lpSurface;
lSrcPitch = ddsd.lPitch;
nSrcWidth = ddsd.dwWidth;
nSrcHeight = ddsd.dwHeight;
rectSrcBlt.left = 0;
rectSrcBlt.top = 0;
rectSrcBlt.right= nSrcWidth;
rectSrcBlt.bottom=nSrcHeight;
if( x < 0 )
{
rectSrcBlt.left = -x;
}
if( x + nSrcWidth < 0)
{
pSrc->Unlock(NULL);
pBack->Unlock(NULL);
return DD_OK;
}
if( x + nSrcWidth > nBackWidth )
{
if( x < nBackWidth)
rectSrcBlt.right = nBackWidth - x;
}
if( y < 0)
{
rectSrcBlt.top = -y;
}
if( y + nSrcHeight < 0)
{
pSrc->Unlock(NULL);
pBack->Unlock(NULL);
return DD_OK;
}
if( y + nSrcHeight > nBackHeight)
{
if( y < nBackHeight)
rectSrcBlt.bottom = nBackHeight - y;
}
pwBack = pwBack+(lBackPitch>>1) * (rectSrcBlt.top+y)+ rectSrcBlt.left+x ;
WORD nMMXCount=(rectSrcBlt.right-rectSrcBlt.left)/4;
WORD nNotMMX= (rectSrcBlt.right-rectSrcBlt.left)%4 ;
WORD nUseH=rectSrcBlt.bottom-rectSrcBlt.top;
__int64 mask1=0x003f003f003f003f,mask2=0x001f001f001f001f, mask3=0x00ff00ff00ff00ff;
__int64 m1=0x00000000ffff0000,m2=0x0000ffff00000000,m3=0xffff000000000000,m4=0x000000000000ffff;
if (nOption==0)
{
pwSrc =pwSrc+(lSrcPitch>>1)*rectSrcBlt.top+ rectSrcBlt.left ;
pAlpha =pAlpha+(nSrcWidth)*rectSrcBlt.top+rectSrcBlt.left;
__asm
{
mov ecx, dword ptr pAlpha;
mov eax, dword ptr pwSrc;
mov ebx, dword ptr pwBack;
mov dx, nUseH;
push dx;
push ecx;
push ebx;
push eax;
AddRow:
cmp dx, 0;
JE AllEnd;
xor dx,dx;
mov dx,nMMXCount;
NextMMX:
// 以下读入4个点,进行运算
movq mm0, [eax];
movq mm1, [ebx];
movq mm6, [ecx]; //读入8个点alpha: adcdefgh
punpcklbw mm6,mm6; //aabbccdd
pand mm6, mask3; //0a0b0c0d
//分离每个点的R G B值
movq mm2,mm0;//g
psrlw mm2,5;
pand mm2,mask1;
movq mm3,mm1;
psrlw mm3,5;
pand mm3,mask1;
movq mm4,mm0;//r
psrlw mm4,11;
pand mm4,mask2;
movq mm5,mm1;
psrlw mm5,11;
pand mm5,mask2;
pand mm0,mask2; //b
pand mm1,mask2;
// pwBack=pwSrc *fAlpha/255 + pwBack *(1-fAlpha/255)
// pwBack=((pwSrc-pwBack)*fAlpha+(pwBack<<5))>>5
psubsw mm0,mm1;//b
pmullw mm0,mm6;
psllw mm1, 8;
paddsw mm1,mm0;
psrlw mm1,8;
psubsw mm2,mm3;//g
pmullw mm2,mm6;
psllw mm3, 8;
paddsw mm3,mm2;
psrlw mm3,8;
psubsw mm4,mm5;//r
pmullw mm4,mm6;
psllw mm5, 8;
paddsw mm5,mm4;
psrlw mm5,8;
psllw mm3,5;
psllw mm5,11;
por mm1,mm3;
por mm1,mm5;
cmp dx,0;
JE NotMMX;
movq [ebx] , mm1;
add eax,8;
add ebx,8;
add ecx,4;
dec dx;
jmp NextMMX;
NotMMX:
// m0=0x0,m1=0x00000000ffff0000,m2=0x0000ffff00000000,
// m3=0xffff000000000000,m4=0x000000000000ffff;
xor dx,dx;
mov dx,nNotMMX;
movq mm2,m4;
movq mm3,m3;
movq mm4,[ebx];
cmp dx,0;
je RowEnd;
cmp dx,0x01;
je Not_1;
cmp dx,0x02;
je Not_2;
Not_3:
por mm2,m2;
por mm2,m1;
pand mm1,mm2;
pand mm4,mm3;
por mm1,mm4;
movq [ebx],mm1;
jmp RowEnd;
Not_2:
por mm2,m1;
por mm3,m2;
pand mm1,mm2;
pand mm4,mm3;
por mm1,mm4;
movq [ebx],mm1;
jmp RowEnd;
Not_1:
por mm3, m1;
por mm3, m2;
pand mm4, mm3;
pand mm1,mm2;
por mm1,mm4;
movq [ebx],mm1;
RowEnd:
pop eax;
add eax,lSrcPitch;
pop ebx;
add ebx,lBackPitch;
pop ecx;
add ecx,nSrcWidth;
pop dx;
dec dx;
push dx;
push ecx;
push ebx;
push eax;
jmp AddRow;
AllEnd:
pop eax;
pop ebx;
pop ecx;
pop dx;
emms;
}
}
if (nOption==1)
{
pwSrc =pwSrc+(lSrcPitch>>1)*rectSrcBlt.top+(nSrcWidth-rectSrcBlt.left);
pAlpha =pAlpha+ nSrcWidth *rectSrcBlt.top+(nSrcWidth-rectSrcBlt.left);
__asm
{
mov ecx, dword ptr pAlpha;
sub ecx,4;
mov eax, dword ptr pwSrc;
sub eax,8;
mov ebx, dword ptr pwBack;
mov dx, nUseH;
push dx;
push ecx;
push ebx;
push eax;
Add_Row:
cmp dx, 0;
JE All_End;
xor dx,dx;
mov dx,nMMXCount;
Next_MMX:
// 以下读入4个点,进行运算
movq mm0, [eax];
movq mm6, [ecx]; //读入8个点alpha: adcdefgh
punpcklbw mm6,mm6; //aabbccdd
pand mm6,mask3; //0a0b0c0d
movq mm2,mm0;
pand mm2,m1;
movq mm3,mm0;
pand mm3,m2;
movq mm4,mm0;
pand mm4,m3;
psrlq mm4,48;
psllq mm2,16;
psrlq mm3,16;
pand mm0,m4;
psllq mm0,48;
por mm0,mm2;
por mm0,mm3;
por mm0,mm4;
movq mm2,mm6;
pand mm2,m1;
movq mm3,mm6;
pand mm3,m2;
movq mm4,mm6;
pand mm4,m3;
psrlq mm4,48;
psllq mm2,16;
psrlq mm3,16;
pand mm6,m4;
psllq mm6,48;
por mm6,mm2;
por mm6,mm3;
por mm6,mm4;
movq mm1, [ebx];
//分离每个点的R G B值
movq mm2,mm0;//g
psrlw mm2,5;
pand mm2,mask1;
movq mm3,mm1;
psrlw mm3,5;
pand mm3,mask1;
movq mm4,mm0;//r
psrlw mm4,11;
pand mm4,mask2;
movq mm5,mm1;
psrlw mm5,11;
pand mm5,mask2;
pand mm0,mask2; //b
pand mm1,mask2;
// pwBack=pwSrc *fAlpha/255 + pwBack *(1-fAlpha/255)
// pwBack=((pwSrc-pwBack)*fAlpha+(pwBack<<5))>>5
psubsw mm0,mm1;//b
pmullw mm0,mm6;
psllw mm1, 8;
paddsw mm1,mm0;
psrlw mm1,8;
psubsw mm2,mm3;//g
pmullw mm2,mm6;
psllw mm3, 8;
paddsw mm3,mm2;
psrlw mm3,8;
psubsw mm4,mm5;//r
pmullw mm4,mm6;
psllw mm5, 8;
paddsw mm5,mm4;
psrlw mm5,8;
psllw mm3,5;
psllw mm5,11;
por mm1,mm3;
por mm1,mm5;
cmp dx,0;
je Not_MMX;
movq [ebx] , mm1;
sub eax,8;
add ebx,8;
sub ecx,4;
dec dx;
jmp Next_MMX;
Not_MMX:
// m0=0x0,m1=0x00000000ffff0000,m2=0x0000ffff00000000,
// m3=0xffff000000000000,m4=0x000000000000ffff;
xor dx,dx;
mov dx,nNotMMX;
movq mm2,m4;
movq mm3,m3;
movq mm4,[ebx];
cmp dx,0;
je Row_End;
cmp dx,0x01;
je Not__1;
cmp dx,0x02;
je Not__2;
Not__3:
por mm2,m2;
por mm2,m1;
pand mm1,mm2;
pand mm4,mm3;
por mm1,mm4;
movq [ebx],mm1;
jmp Row_End;
Not__2:
por mm2,m1;
por mm3,m2;
pand mm1,mm2;
pand mm4,mm3;
por mm1,mm4;
movq [ebx],mm1;
jmp Row_End;
Not__1:
por mm3, m1;
por mm3, m2;
pand mm4, mm3;
pand mm1,mm2;
por mm1,mm4;
movq [ebx],mm1;
Row_End:
pop eax;
add eax,lSrcPitch;
pop ebx;
add ebx,lBackPitch;
pop ecx;
add ecx,nSrcWidth;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -