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);
}