|
发表于 2004-7-27 18:23:00
|
显示全部楼层
Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?
void CopyBlt(LPDIRECTDRAWSURFACE7 lpDDS_src,LPDIRECTDRAWSURFACE7 lpDDS_dest,int lpDD_srcX,int lpDD_srcY,int lpDD_destTopX,int lpDD_destTopY,int lpDD_destBottomX,int lpDD_destBottomY){
ZeroMemory(&ddsd_src,sizeof(ddsd_src));
ddsd_src.dwSize=sizeof(ddsd_src);
ZeroMemory(&ddsd_dest,sizeof(ddsd_dest));
ddsd_dest.dwSize=sizeof(ddsd_dest);
lpDDS_src->Lock(NULL,&ddsd_src,DDLOCK_WAIT,NULL);
lpDDS_dest->Lock(NULL,&ddsd_dest,DDLOCK_WAIT,NULL);
BYTE *lPsrc=(BYTE*)ddsd_src.lpSurface;
BYTE *lPdest=(BYTE*)ddsd_dest.lpSurface;
int FirstPoint_src=lpDD_srcY*ddsd_src.lPitch+lpDD_srcX*4;
int FirstPoint_dest=lpDD_destTopY*ddsd_dest.lPitch+lpDD_destTopX*4;
int lpDD_destHeight=lpDD_destBottomY-lpDD_destTopY;
int lpDD_destWidth=(lpDD_destBottomX-lpDD_destTopX)/2;
_asm{
mov eax,lPsrc
add eax,FirstPoint_src
mov ebx,lPdest
add ebx,FirstPoint_dest
mov edi,lpDD_destHeight
FirstLoop:
push eax
push ebx
mov esi,lpDD_destWidth
SecondLoop:
movq mm0,[ebx]
movq [eax],mm0
add ebx,8
add eax,8
dec esi
jnz SecondLoop
pop ebx
pop eax
add eax,ddsd_src.lPitch
add ebx,ddsd_dest.lPitch
dec edi
jnz FirstLoop
emms
}
lpDDS_src->Unlock(NULL);
lpDDS_dest->Unlock(NULL);
} |
|