⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddutil.cpp

📁 一款不错的射击类游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					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 + -