www.pudn.com > 3D_OnlineGame_Humen.rar > alpha.cpp


//這個程序主要完成有關alpha運算的部分 
#include "stdafx.h" 
#include "XMudClient.h" 
#include "alpha.h" 
#include "MainScreen.h" 
 
extern rmfullglobals myglobs; 
extern D3DAppInfo* d3dapp; 
extern char g_tszPathName[256]; 
extern int g_nGameState; 
extern CMainScreen m_MainScreen; 
 
#define MASK	0x03e07c1f 
#define MASK6	0x07e0f81f 
 
#define MASKr	  0x7c00 
#define MASKfr	0x03ff 
#define MASKg	  0x03e0 
#define MASKfg	0x7c1f 
#define MASKb	  0x001f 
#define MASKfb	0x7fe0 
 
#define MASKr6  0xf800 
#define MASKfr6 0x07ff 
#define MASKg6	0x07e0 
#define MASKfg6 0xf81f 
#define MASKb6	0x001f 
#define MASKfb6	0xffe0 
 
#define MASKall			0xfdef 
#define MASKall6		0x7bef 
#define LONGMASKall		0x3def3def 
#define LONGMASKall6	0x7bef7bef 
 
extern D3DAppInfo* d3dapp; 
 
BOOL Check555or565() 
{ 
	DDPIXELFORMAT ddpf; 
	ZeroMemory(&ddpf, sizeof(ddpf)); 
	ddpf.dwSize = sizeof(ddpf); 
	d3dapp->lpFrontBuffer->GetPixelFormat(&ddpf); 
	if(ddpf.dwGBitMask == 0x07e0) return FALSE; 
	else if(ddpf.dwGBitMask == 0x03e0) return TRUE; 
	else return FALSE; 
} 
 
 
/*/ 
功能︰ 
		從文件中讀出alpha數據 
入口︰ 
		bmp文件名,AlphaData結構指針 
出口︰ 
		成功返回真 
//*/ 
 
BOOL GetAlphaData(const char * FileName, AlphaData * pAData) 
{ 
	if((pAData == NULL)||(FileName == NULL)) 
		return FALSE; 
	if(pAData->buf != NULL) 
		return FALSE; 
 
	CFile Bmpf; 
	BITMAPFILEHEADER BmpFileHead; 
	BITMAPINFOHEADER BmpInfoHead; 
	long SrcDataSize; 
 
	if( ! Bmpf.Open(FileName, CFile::modeRead)) 
	{ 
		TRACE("Open file %s error.\n", FileName); 
		goto error_return; 
	} 
	Bmpf.Read(&BmpFileHead, sizeof(BmpFileHead)); 
	Bmpf.Read(&BmpInfoHead, sizeof(BmpInfoHead)); 
 
	if ( BmpFileHead.bfType != 0x4d42 ) 
	{ 
		TRACE("The file %s isn't a BMP files.\n", FileName); 
		goto error_return; 
	} 
	if ( BmpFileHead.bfSize != Bmpf.GetLength() ) 
	{ 
		TRACE("The file %s data error!\n", FileName ); 
		goto error_return; 
	} 
	if ( BmpInfoHead.biBitCount != 8 ) 
	{ 
		TRACE("This file isn't a 8 BIT bmp file.(%s)\n", FileName); 
		goto error_return; 
	} 
	 
	Bmpf.Seek(BmpFileHead.bfOffBits, CFile::begin); 
 
	SrcDataSize = Bmpf.GetLength () - BmpFileHead.bfOffBits; 
 
	pAData->buf = (BYTE *) new char[ SrcDataSize ] ; 
	if (pAData->buf == NULL) 
	{ 
		TRACE("Alloc Data buffer error.\n"); 
		goto error_return; 
	} 
	 
	//讀入文件數據 
	if (Bmpf.Read ( pAData->buf, SrcDataSize ) != (unsigned)SrcDataSize ) 
	{ 
		TRACE("File read error or file length error.\n"); 
		goto error_return; 
	} 
	Bmpf.Close () ; 
 
	pAData->width = BmpInfoHead.biWidth; 
	pAData->height = BmpInfoHead.biHeight; 
 
	return TRUE; 
error_return: 
	Bmpf.Abort(); 
	return FALSE; 
} 
 
 
/*/ 
功能︰ 
		顯示alpha圖像在鼠標指向的位置上(555) 
入口︰ 
		Alpha文件名,要顯示的顏色值 
出口︰ 
		無 
//*/ 
 
void DrawAlpha5(COLORREF color) 
{ 
	long x,y,nheight,nwidth; 
	char *surfbits; 
  WORD *surfptrs; 
	unsigned long c1,c2; 
	BOOL hr; 
 
	x = m_MainScreen.rcFaceSomeOne.left; 
	y = m_MainScreen.rcFaceSomeOne.top; 
	nwidth = m_MainScreen.rcFaceSomeOne.right-x; 
	nheight = m_MainScreen.rcFaceSomeOne.bottom-y; 
 
	//取得surface信息 
	DDSURFACEDESC desc; 
	ZeroMemory( &desc, sizeof(desc) ); 
	desc.dwSize = sizeof(desc); 
	hr = d3dapp->lpBackBuffer->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 ); 
	if (hr!=DD_OK) 
	{ 
		TRACE("Alpha Lock() failed\n"); 
		return; 
	} 
	//計算目標指針 
	surfbits = (char *)desc.lpSurface + desc.lPitch * y + x * 2; 
 
	//轉化真彩格式為555的16位格式 
	c2  = (color&0xf80000)>>19;	//c2==b; 
	c2 |= (color&0xf800)>>6;		//c2|=g; 
	c2 |= (color&0xf8)<<7;			//c2|=r; 
	//再轉化為需要的間隔格式( 0 g 0   r 0 b ) 
	c2 |= c2<<16; 
	c2 &= MASK; 
 
	register unsigned long * srcbits=(unsigned long *)surfbits; 
 
	for(int i=0;i>1; 
			*surfptrs++ = (WORD)((c1&MASK)|(c1&MASK)>>16); 
/*/ 
			register int rc1; 
			rc1 = *surfbits; 
			//*surfbits++ = (rc1>>1)&MASKr | rc1&MASKfr; //紅色減半 
			//*surfbits++ = (rc1>>1)&MASKg | rc1&MASKfg; //綠色減半 
			//*surfbits++ = (rc1>>1)&MASKb | rc1&MASKfb; //藍色減半 
			//*surfbits++ = (rc1>>1)&MASKall; //所有顏色減半 
//*/ 
		} 
		surfbits+=desc.lPitch; 
	} 
	d3dapp->lpBackBuffer->Unlock(0); 
} 
 
/*/ 
功能︰ 
		顯示alpha圖像在鼠標指向的位置上(565) 
入口︰ 
		要顯示的顏色值 
出口︰ 
		無 
//*/ 
void DrawAlpha6(COLORREF color) 
{ 
	long x,y,nheight,nwidth; 
	char *surfbits; 
  WORD *surfptrs; 
	unsigned long c1,c2; 
	BOOL hr; 
 
	x = m_MainScreen.rcFaceSomeOne.left; 
	y = m_MainScreen.rcFaceSomeOne.top; 
	nwidth = m_MainScreen.rcFaceSomeOne.right-x; 
	nheight = m_MainScreen.rcFaceSomeOne.bottom-y; 
 
 
	//取得surface信息 
	DDSURFACEDESC desc; 
	ZeroMemory( &desc, sizeof(desc) ); 
	desc.dwSize = sizeof(desc); 
	hr = d3dapp->lpBackBuffer->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 ); 
	if (hr!=DD_OK) 
	{ 
		TRACE("Alpha Lock() failed\n"); 
		return; 
	} 
	//計算目標指針 
	surfbits = (char *)desc.lpSurface + desc.lPitch * y + x * 2; 
 
	//轉化真彩格式為565的16位格式 
	c2  = (color&0xf80000)>>19;		//c2==b; 
	c2 |= (color&0xfc00)>>5;		//c2|=g; 
	c2 |= (color&0xf8)<<8;			//c2|=r; 
	//再轉化為需要的間隔格式( 0 g 0   r 0 b ) 
	c2 |= c2<<16; 
	c2 &= MASK6; 
 
	for(int i=0;i>1; 
			*surfptrs++ = (WORD)((c1&MASK6)|(c1&MASK6)>>16); 
/*/ 
			register int rc1; 
			rc1 = *surfbits; 
			//*surfbits++ = (rc1>>1)&MASKr | rc1&MASKfr; //紅色減半 
			//*surfbits++ = (rc1>>1)&MASKg6 | rc1&MASKfg6; //綠色減半 
			//*surfbits++ = (rc1>>1)&MASKb6 | rc1&MASKfb6; //藍色減半 
			//*surfbits++ = (rc1>>1)&MASKall6; //所有顏色減半 
//*/ 
		} 
		surfbits += desc.lPitch; 
	} 
	d3dapp->lpBackBuffer->Unlock(0); 
}