?? calpha.cpp
字號:
//阿爾法混合
//Alpha 混合
//By Flysky
#include <ddraw.h>
#include "CDraw.h"
#include "CAlpha.h"
#include "CMMX.h"
DWORD s_dwAlphaMask=_ALPHA565RGBMASK; //Alpha混合的DW
void AlphaP565_mmx(WORD *Sour,int SourPitch,WORD *Dest,int DestPitch,COLORREF *colorkey,int Width,int Height,int aValue)
{
_asm
{
//為了高速,從mm0開始
//
movd mm0,aValue; //把Alpha放進mm0;
punpcklbw mm0,mm0;//從BYTE變到WORD | R0 G0 B0 ......|
punpcklwd mm0,mm0; //從WORD變到DWORD |
punpckldq mm0,mm0; //從DWORD變到QWORD
movd mm1,colorkey; //顏色鍵拷入
punpcklwd mm1,mm1; //從WORD變到DWORD
punpckldq mm1,mm1; //從DWORD變到QWORD
emms; //清除MMX狀態
}
}
//兩個表面的一部分的ALPHA混合(內聯版) By Flysky
//注意:Sour目標表面,Dest為Alpha通道。
//請不要使用后臺緩存,而使用Nbuffer
bool AlphaSR(LPDIRECTDRAWSURFACE7 Sour,LPDIRECTDRAWSURFACE7 Dest,RECT rect,int aValue,COLORREF *colorkey)
{
BeginDraw(Sour); //Sour鎖屏
WORD *pSour=GraphBuffer;
int SourPitch=GraphPitch;
BeginDraw(Dest); //Sour鎖屏
WORD *pDest=GraphBuffer;
int DestPitch=GraphPitch;
int dy=0,sy=0;
for(int y=rect.top;y<rect.bottom;y++)
{
dy=y*DestPitch;
sy=y*SourPitch;
for(int x=rect.left;x<rect.right;x++)
if (colorkey==NULL||pDest[dy+x]==RGB16(*colorkey))
pSour[sy+x]=AlphaP(pSour[sy+x],pDest[sy+x],aValue);
}
EndDraw(Sour);
EndDraw(Dest);
return true;
}
//兩個表面的ALPHA混合(內聯版) By Flysky
//注意:Sour目標表面,Dest為Alpha通道。
//請不要使用后臺緩存,而使用Nbuffer
bool AlphaS(LPDIRECTDRAWSURFACE7 Sour,LPDIRECTDRAWSURFACE7 Dest,int aValue,COLORREF *colorkey)
{
//2005年7月30日重寫
//哈哈,原來需要ScreenWidth和ScreenHeight,現在不需要了,主要是為了
// 1. 完全庫技術
// 2. 可以增大安全,可以混合不等于主頁面的頁面
//如果兩個頁面大小不同,那么就混合小的那部分
BeginDraw(Sour); //Sour鎖屏
WORD *pSour=GraphBuffer;
int SourPitch=GraphPitch;
int Width=GraphWidth;//寬度
int Height=GraphHeight; //高度
BeginDraw(Dest); //Sour鎖屏
WORD *pDest=GraphBuffer;
int DestPitch=GraphPitch;
if (Width>GraphWidth) Width=GraphWidth;//寬度
if (Height>GraphHeight) Height=GraphHeight; //高度
int dy=0,sy=0;
for(int y=0;y<Height;y++)
{
dy=y*DestPitch;
sy=y*SourPitch;
for(int x=0;x<Width;x++)
if (colorkey==NULL||pDest[dy+x]==RGB16(*colorkey))
pSour[sy+x]=AlphaP(pSour[sy+x],pDest[sy+x],aValue);
}
EndDraw(Sour);
EndDraw(Dest);
return true;
}
bool AlphaSRP(LPDIRECTDRAWSURFACE7 Sour,int x,int y,LPDIRECTDRAWSURFACE7 Dest,RECT rect,int aValue,COLORREF *colorkey)//最高級的Alpha混合方法
{
BeginDraw(Sour); //Sour鎖屏
WORD *pSour=GraphBuffer;
int SourPitch=GraphPitch;
BeginDraw(Dest); //Sour鎖屏
WORD *pDest=GraphBuffer;
int DestPitch=GraphPitch;
int dy=0,sy=0,x1=0,x2=0,y1=0,y2=0;
for(y1=rect.top,y2=y;y<rect.bottom;y1++,y2++)
{
dy=y1*DestPitch;
sy=y2*SourPitch;
for(x1=rect.left,x2=x;x1<rect.right;x1++,x2++)
if (colorkey==NULL||pDest[dy+x1]==RGB16(*colorkey))
pSour[sy+x2]=AlphaP(pSour[sy+x2],pDest[sy+x1],aValue);
}
EndDraw(Sour);
EndDraw(Dest);
return true;
}
bool AlphaSRP(LPDIRECTDRAWSURFACE7 Sour,int x,int y,LPDIRECTDRAWSURFACE7 Dest,RECT rect,int aValue,WORD colorkey)//最高級的Alpha混合方法
{
BeginDraw(Sour); //Sour鎖屏
WORD *pSour=GraphBuffer;
int SourPitch=GraphPitch;
BeginDraw(Dest); //Sour鎖屏
WORD *pDest=GraphBuffer;
int DestPitch=GraphPitch;
int dy=0,sy=0,x1=0,x2=0,y1=0,y2=0;
for(y1=rect.top,y2=y;y<rect.bottom;y1++,y2++)
{
dy=y1*DestPitch;
sy=y2*SourPitch;
for(x1=rect.left,x2=x;x1<rect.right;x1++,x2++)
if (colorkey==NULL||pDest[dy+x1]==colorkey)
pSour[sy+x2]=AlphaP(pSour[sy+x2],pDest[sy+x1],aValue);
}
EndDraw(Sour);
EndDraw(Dest);
return true;
}
//淡入淡出 BY Flysky
//Sour 源表面 Dest 為Alpha 通道
//混合將保存到Sour
bool NTLightTN(LPDIRECTDRAWSURFACE7 Sour,LPDIRECTDRAWSURFACE7 Dest,RECT *rt)
{
static int alpha=0; //淡入淡出的Alpha的值
static int k=1;
alpha+=k;
if(alpha>128)
{
k=-k;
alpha=128;
}
if(alpha<0)
{
alpha=0;
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return true;
}
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return false;
}
//淡入 BY Flysky
//Sour 源表面 Dest 為Alpha 通道
//混合將保存到Sour
bool NTLight(LPDIRECTDRAWSURFACE7 Sour,LPDIRECTDRAWSURFACE7 Dest,RECT *rt)
{
static int alpha=0; //淡入淡出的Alpha的值
static int k=1;
alpha+=k;
if(alpha>128)
{
alpha=0;
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return true;
}
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return false;
}
//淡出 BY Flysky
//Sour 源表面 Dest 為Alpha 通道
//混合將保存到Sour
bool LightTN(LPDIRECTDRAWSURFACE7 Sour,LPDIRECTDRAWSURFACE7 Dest,RECT *rt)
{
static int alpha=0; //淡入淡出的Alpha的值
static int k=1;
alpha+=k;
if(alpha<0)
{
k=-k;
alpha=0;
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return true;
}
if (rt!=NULL) AlphaSR(Sour,Dest,*rt,alpha>>2,NULL);
else AlphaS(Sour,Dest,alpha>>2,NULL);
return false;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -