📄 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 + -