?? gp_alpha.cpp
字號:
//==============================Additive==========================
// additive混合相關(guān)函數(shù)
//================================================================
//****************************
//功能:兩個點(diǎn)的Additive混合
//參數(shù):源點(diǎn),目標(biāo)點(diǎn)
//返回:混合后的點(diǎn)
WORD Additive_Pixel(WORD sour, WORD dest)
{
//C++版
//簡單了,明白了alpha混合,這個就不算什么了
//不懂的話,恩,看看alpha混合的注釋先
rgbTemp = (((sour<<16)|sour) & rgbMask) + (((dest<<16)|dest) & rgbMask);
rgbTemp = rgbTemp & rgbMask;
return (WORD)((rgbTemp>>16)|rgbTemp);
}
//***************************
//功能:兩個表面的Additive混合
//參數(shù):(SS:目標(biāo)表面 DS:源表面 Color_Key:透明色[0:無])
void AdditiveBlt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect, WORD Color_Key)
{
WORD *Dest,*Sour;
int t1,t2;
int DestWidth, SourWidth;
//取目標(biāo)頁面指針
if( BeginDraw(DS) )
{
Dest=(WORD *)GraphBuffer;
DestWidth=GraphPitch;
EndDraw(DS);
}
//取目標(biāo)頁面指針
if( BeginDraw(SS) )
{
Sour=(WORD *)GraphBuffer;
SourWidth=GraphPitch;
EndDraw(SS);
}
//邊界檢查
if( x<0 )
{
rcRect.left = rcRect.left - x;
x=0;
}
if( y<0 )
{
rcRect.top = rcRect.top - y;
y=0;
}
if( x+ rcRect.right - rcRect.left > ScreenWidth )
{
rcRect.right = rcRect.left + ScreenWidth - x;
}
if( y+ rcRect.bottom - rcRect.top > ScreenHeight )
{
rcRect.bottom = rcRect.top + ScreenHeight - y;
}
//看上面的吧
t1=SourWidth*y+x;
t2=DestWidth*rcRect.top+rcRect.left;
int rectWidth=rcRect.right-rcRect.left;
int SW=SourWidth-rectWidth; //沒有語言了
int DW=DestWidth-rectWidth;
if( Color_Key == 0 ) //無透明色檢查
{
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
Sour[t1]=_Additive_Pixel(Sour[t1], Dest[t2]);
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
else //透明色檢查
{
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
if( Dest[t2] != Color_Key )
Sour[t1]=_Additive_Pixel(Sour[t1], Dest[t2]);
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
}
//==============================Gray=============================
// 'RGB->灰度'相關(guān)函數(shù)
//================================================================
//****************************
//功能:把一個RGB點(diǎn)的變成灰度
//參數(shù):源點(diǎn)
//返回:混合后的點(diǎn)
WORD Gray_Pixel(WORD sour)
{
WORD t; //看看那個inline版的注釋……
WORD r, g, b;
r= sour >> RMove;
g= (GMask & sour) >> GMove;
b= BMask & sour;
t= (r*3 + g*6 + b)/10;
/*
//匯編版 //同樣給個注釋吧,本來我是想把這段給刪掉的
_asm{
mov ax, sour //把sour放到ax中
mov bx, ax //放到bx中
mov dx, ax //放到dx中
mov cl, RMove //移位數(shù)目
shr ax, cl //邏輯右移
and bx, GMask //與上綠色的掩碼
mov cl,GMove //……
shr bx, cl //……
and dx, BMask //與上藍(lán)色的掩碼
add ax, bx
add ax, dx //加到一起
mov bl, 3
div bl //除以3:和上面的算法不一樣
xor ah, ah //ah放的是余數(shù),不需要的,清0就是了
mov t, ax //放到t中
}
*/
return (t<<RMove)|(t<<GMove)|t; //合成
}
//****************************
//功能:把圖片變成灰色后BLT
//參數(shù):(SS:目標(biāo)表面 DS:目標(biāo)表面 Color_Key:透明色[0:無])
void Gray_Blt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect,WORD Color_Key)
{
WORD *Dest,*Sour;
int DestWidth,SourWidth;
int t1,t2;
//取目標(biāo)頁面指針
if( BeginDraw(DS) )
{
Dest=(WORD *)GraphBuffer;
DestWidth=GraphPitch;
EndDraw(DS);
}
//取目標(biāo)頁面指針
if( BeginDraw(SS) )
{
Sour=(WORD *)GraphBuffer;
SourWidth=GraphPitch;
EndDraw(SS);
}
//邊界檢查
if( x<0 )
{
rcRect.left = rcRect.left - x;
x=0;
}
if( y<0 )
{
rcRect.top = rcRect.top - y;
y=0;
}
if( x+ rcRect.right - rcRect.left > ScreenWidth )
{
rcRect.right = rcRect.left + ScreenWidth - x;
}
if( y+ rcRect.bottom - rcRect.top > ScreenHeight )
{
rcRect.bottom = rcRect.top + ScreenHeight - y;
}
//………………
t1=SourWidth*y+x;
t2=DestWidth*rcRect.top+rcRect.left;
int rectWidth=rcRect.right-rcRect.left;
int SW=SourWidth-rectWidth;
int DW=DestWidth-rectWidth;
if( Color_Key == 0 ) //沒有透明色
{
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
Sour[t1]=_Gray_Pixel(Dest[t2] );
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
else //帶透明色
{
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
if( Dest[t2] != Color_Key )
Sour[t1]=_Gray_Pixel(Dest[t2] );
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
}
//==============================單色=============================
// 單色處理相關(guān)函數(shù)
//================================================================
//**************************************
//功能:把圖片變成單色(color)后BLT Color=顏色
//參數(shù):(SS:目標(biāo)表面 DS:目標(biāo)表面 Color_Key:透明色[0:無] Color=顏色)
void Color_Blt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect,WORD Color_Key, WORD Color)
{
WORD *Dest,*Sour;
int DestWidth,SourWidth;
int t1,t2;
//取目標(biāo)頁面指針
if( BeginDraw(DS) )
{
Dest=(WORD *)GraphBuffer;
DestWidth=GraphPitch;
EndDraw(DS);
}
//取目標(biāo)頁面指針
if( BeginDraw(SS) )
{
Sour=(WORD *)GraphBuffer;
SourWidth=GraphPitch;
EndDraw(SS);
}
//邊界檢查
if( x<0 )
{
rcRect.left = rcRect.left - x;
x=0;
}
if( y<0 )
{
rcRect.top = rcRect.top - y;
y=0;
}
if( x+ rcRect.right - rcRect.left > ScreenWidth )
{
rcRect.right = rcRect.left + ScreenWidth - x;
}
if( y+ rcRect.bottom - rcRect.top > ScreenHeight )
{
rcRect.bottom = rcRect.top + ScreenHeight - y;
}
//…………
t1=SourWidth*y+x;
t2=DestWidth*rcRect.top+rcRect.left;
int rectWidth=rcRect.right-rcRect.left;
int SW=SourWidth-rectWidth;
int DW=DestWidth-rectWidth;
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
if( Dest[t2] != Color_Key ) //只要不是透明色就變成所要求的單色
Sour[t1]=Color;
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////
//**************************************
//功能:查找精靈邊緣
//參數(shù):精靈頁面,邊緣色,透明色
void FindEdge(LPDIRECTDRAWSURFACE lpDDSPict, WORD Color, WORD CK)
{
int n, i, j;
if( BeginDraw(lpDDSPict) )
{
WORD *Pict=GraphBuffer;
int Width=GraphWidth;
int Height=GraphHeight;
int Pitch=GraphPitch;
for(i=0; i<Height; i++)
for(j=0; j<Width; j++)
{
n=Pitch*i+j; //按順序掃描點(diǎn)
if( Pict[n]!=CK && (Pict[n+1]==CK || Pict[n-1]==CK
|| Pict[n+Pitch]==CK || Pict[n-Pitch]==CK ) )
{
Pict[n]=Color; //這個點(diǎn)不是透明的,但是他的周圍四個點(diǎn)有一個
} //是透明的。
else //左右是加減一
Pict[n]=CK; //上下是加減Pitch
} //邊緣變成指定的顏色
EndDraw(lpDDSPict); //其他都變成透明色
}
}
//**************************************
//功能:Blt精靈邊緣
//參數(shù):(SS:目標(biāo)表面 DS:源表面 CK:透明色 Color:邊緣顏色)
void Edge_Blt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect,WORD CK, WORD Color)
{
WORD *Dest,*Sour;
int DestWidth,SourWidth;
int t1,t2;
//取源頁面指針
if( BeginDraw(DS) )
{
Dest=(WORD *)GraphBuffer;
DestWidth=GraphPitch;
EndDraw(DS);
}
//取目標(biāo)頁面指針
if( BeginDraw(SS) )
{
Sour=(WORD *)GraphBuffer;
SourWidth=GraphPitch;
EndDraw(SS);
}
//邊界檢查
if( x<0 )
{
rcRect.left = rcRect.left - x;
x=0;
}
if( y<0 )
{
rcRect.top = rcRect.top - y;
y=0;
}
if( x+ rcRect.right - rcRect.left > ScreenWidth )
{
rcRect.right = rcRect.left + ScreenWidth - x;
}
if( y+ rcRect.bottom - rcRect.top > ScreenHeight )
{
rcRect.bottom = rcRect.top + ScreenHeight - y;
}
//這樣的用法在這個文件里有很多了
t1=SourWidth*y+x;
t2=DestWidth*rcRect.top+rcRect.left;
int rectWidth=rcRect.right-rcRect.left;
int SW=SourWidth-rectWidth;
int DW=DestWidth-rectWidth;
for(int i=0; i<rcRect.bottom-rcRect.top; i++)
{
for( int j=0; j<rectWidth; j++)
{
//和上個函數(shù)一樣的邏輯,只不過改變的對象不同而已
if( Dest[t2]!=CK && (Dest[t2+1]==CK || Dest[t2-1]==CK
|| Dest[t2+DestWidth]==CK || Dest[t2-DestWidth]==CK ) )
Sour[t1]=Color;
t1++;
t2++;
}
t1+=SW;
t2+=DW;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -