⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calpha.cpp

📁 成熟的RPG引擎,Flysky发布. 斜视角引擎.
💻 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 + -