亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gp_alpha.cpp

?? 圣劍英雄傳II雙刃劍番外篇(源程序+文檔).
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//********************************************
//	像素級的操作相關處理函數
//  softboy 創(chuàng)建于2000年1月25日
//********************************************

#include <windows.h>
#include <fstream.h>
#include <math.h>
#include <ddraw.h>
#include "gp_draw.h"
#include "gp_input.h"
#include "gp_alpha.h"

//==============================alpha=============================
//	alpha混合相關函數
//================================================================
WORD RMask, GMask, BMask;	//顏色遮罩
BYTE RMove,GMove;			//移動到最右邊的位數
DWORD rgbMask, rgbTemp;

//****************************
//功能:兩個點的ALPHA混合(0-31)
//參數:源點,目標點,ALPHA級別
//返回:混合后的點
WORD Alpha_Pixel(WORD sour, WORD dest, int alpha)
{
	//C++版 :看下面的匯編版的注釋
	rgbTemp =  ((((sour<<16)|sour) & rgbMask ) * alpha +
						(((dest<<16)|dest) & rgbMask ) * (32-alpha) ) >> 5;
	rgbTemp = rgbTemp & rgbMask;
	return (WORD)((rgbTemp>>16)|rgbTemp);
	
/*
	//匯編版
	int ialpha=32-alpha;
	_asm{
		movzx eax, sour			//零擴展成32位
		mov bx, ax				//把sour放到bx中
		sal eax, 16				//算術左移16位,低位填0
		mov ax, bx				//把sour放到ax中,現在的eax中放的是兩個sour
		and eax, rgbMask		//與上rgbMask
		mul alpha				//乘上alpha值
		mov esi, eax			//保存到esi
	
		movzx eax, dest			//同樣的方法
		mov bx, ax
		sal eax, 16
		mov ax, bx
		and eax, rgbMask
		mul ialpha
		add eax, esi			//加上剛剛的值
		shr eax, 5				//邏輯右移5位,高位填0
		 
		//rgbTemp = rgbTemp & rgbMask;
		and eax, rgbMask		//與上rgbMask
		mov esi, eax			//放到esi中
		shr eax, 16				//邏輯右移動16位,高位填0
		or  eax, esi			//或上esi
		mov rgbTemp, eax		//返回
	}
	return (WORD)rgbTemp;
	*/
	/*--------------------------------------------------------
	多說點點,看看rgbMask的形式是什么:比如是655格式
	00000|gggggg|00000|rrrrr|000000|bbbbb
	5個0  六位的 5個0 |五位 |6個0  |五位
		  綠掩碼      |紅掩碼      |藍掩碼

	好了,看看是個什么結果
	要是將他與一個數與的話,也只是保留grb位的數
	如果把這個數右移動16位,再與原數或,再去掉高位的話
	結果是什么呢?16位的rgb的值
	明白了就好辦多了。:)
	那又是怎么做到alpha混合的呢?
	
	主要是在那個乘法上面,注意先乘了一個alpha,然后有個右移5位
	也就是除以32了。所以各個顏色成分的值算出來了也不會有越位,
	各個顏色還是對齊了的。

	然后就是上面說的那個了,還原成16位的顏色值
	----------------------------------------------------------*/
}

//***************************
//功能:兩個表面的Alpha混合
//參數:(SS:目標表面 DS:源表面 Color_Key:透明色[0:無] iAlpha:alpha值)
void ABlt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect, WORD Color_Key, char iAlpha)
{
	if( iAlpha <= 0 )
	{										//不要驚奇:)看看下面就知道了,想想true和false的值
		Blt(SS, x, y, DS, rcRect, true);	//#define DDBLTFAST_NOCOLORKEY 0x00000000
		return;								//#define DDBLTFAST_SRCCOLORKEY 0x00000001
	}										//明白了嗎?用的是SRCCOLORKEY
	else if( iAlpha >= 31 )
	{
		return;
	}

	WORD *Dest,*Sour;
	int t1,t2;
	int DestWidth, SourWidth;
	
	//取源頁面指針
	if( BeginDraw(DS) )
	{
		Dest=(WORD *)GraphBuffer;
		DestWidth=GraphPitch;
		EndDraw(DS);
	}

	//取目標頁面指針
	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;			//想想跨度和寬度的區(qū)別
	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]=_Alpha_Pixel(Sour[t1], Dest[t2], iAlpha);//alpha混合
				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]=_Alpha_Pixel(Sour[t1], Dest[t2], iAlpha);
				t1++;
				t2++;
			}
			t1+=SW;
			t2+=DW;
		}
	}
}

//***********************************************************
//功能:把一個表面上的特定顏色Alpha混合到另一個表面,其他不變
//參數:(SS:目標表面 DS:源表面 Color_Key:透明色[0:無] Color:混合色 iAlpha:alpha值)
void AlphaColorBlt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect, WORD Color_Key, WORD Color, char iAlpha)
{
	if( iAlpha <= 0 )				
	{
		Blt(SS, x, y, DS, rcRect, true);	//有不明白的看看上一個函數的注釋
		return;
	}
	else if( iAlpha >= 31 )
	{
		return;
	}

	WORD *Dest,*Sour;
	int t1,t2;
	int DestWidth, SourWidth;
	
	//取源頁面指針
	if( BeginDraw(DS) )
	{
		Dest=(WORD *)GraphBuffer;
		DestWidth=GraphPitch;
		EndDraw(DS);
	}

	//取目標頁面指針
	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++)
			{
				if( Dest[t2]==Color )		//只混合一種顏色
					Sour[t1]=_Alpha_Pixel(Sour[t1], Dest[t2], iAlpha);
				else
					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 )
				{
					if( Dest[t2]==Color ) 
						Sour[t1]=_Alpha_Pixel(Sour[t1], Dest[t2], iAlpha);
					else
						Sour[t1]=Dest[t2];
				}

				t1++;
				t2++;
			}
			t1+=SW;
			t2+=DW;
		}
	}
}

//**************************
//功能:表面連續(xù)漸變Blt
//參數:(背景頁面,源頁面,x, y, 起始ALPHA值,步長,步數,延時,透明色)
void ChangeBlt(LPDIRECTDRAWSURFACE BackSurface, LPDIRECTDRAWSURFACE suf, int x, int y, int BeginAlpha, int StepSize, int Step,int Time, WORD Color_Key)
{
	long T1=0, T2=0;
	int W,H;
	int bAlpha=BeginAlpha;
	T1=T2=timeGetTime();

	//取表面寬高
	GetSurfaceSize(suf, W, H);
	
	RECT rect={0,0,W,H};
	RECT rect2={0,0,ScreenWidth, ScreenHeight};

	for( int j=0; j<Step+1; j++)
	{
		//延時
		while( T1-T2<Time )
		{
			T1=timeGetTime();
		}
		T2=T1;
		//先把BackSurface以NOCOLORKEY方式blt到Back表面上
		Blt(lpDDSBack, 0,0, BackSurface, rect2, false);
		//再把suf按照alpha的值和透明色blt到Back表面上
		ABlt(lpDDSBack, x, y, suf, rect, ColorKey16, bAlpha);
		//更新屏幕
		_UpdateScreen();
		//alpha的值增加一個單位
		bAlpha+=StepSize;
		//越界檢查
		if( bAlpha<0 ) 
			bAlpha=0;
		if( bAlpha>31 ) 
			bAlpha=31;

		//一次到位
		if( Mouse.IsButton(0) )	//左鍵按下
		{
			//看上面的……
			bAlpha=BeginAlpha+StepSize*Step;

			if( bAlpha<0 ) 
				bAlpha=0;
			if( bAlpha>31 ) 
				bAlpha=31;

			Blt(lpDDSBack, 0,0, BackSurface, rect2, false);
			ABlt(lpDDSBack, x, y, suf, rect, ColorKey16, bAlpha);
			_UpdateScreen();
			return;
		}
	}
}

//***************************
//功能:表面和光圈的Alpha混合
//參數:(SS:目標表面 DS:光圈表面)
void Alpha_Blt(LPDIRECTDRAWSURFACE SS,int x,int y, LPDIRECTDRAWSURFACE DS,RECT rcRect)
{
	WORD d=0x0000;		//想想是什么顏色:)黑
	WORD *Dest,*Sour;
	int t1, t2;
	int DestWidth, SourWidth;
	
	//取源頁面指針
	if( BeginDraw(DS) )
	{
		Dest=(WORD *)GraphBuffer;
		DestWidth=GraphPitch;
		EndDraw(DS);
	}

	//取目標頁面指針
	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++)
		{	
			//看好哦,光圈表面的藍色是alpha值,d是黑色
			Sour[t1]=_Alpha_Pixel(Sour[t1], d, Dest[t2]&BMask );
			t1++;
			t2++;
		}
		t1+=SW;
		t2+=DW;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男人的天堂久久精品| 亚洲国产成人av网| 开心九九激情九九欧美日韩精美视频电影| 岛国精品一区二区| 日韩精品一区二区三区蜜臀| 一区二区三区在线免费视频| 成人h动漫精品一区二区| 欧美精品一区二区三区在线| 99久久国产综合色|国产精品| 在线观看区一区二| 亚洲一区在线免费观看| 色婷婷综合久久久中文一区二区 | 美女任你摸久久| 福利一区二区在线| 精品国偷自产国产一区| 免费成人在线观看| 久久综合久久综合久久综合| 亚洲人成7777| 91片黄在线观看| 亚洲美女偷拍久久| 欧美情侣在线播放| 午夜私人影院久久久久| 日韩视频在线一区二区| 日本视频一区二区| 精品奇米国产一区二区三区| 精油按摩中文字幕久久| 亚洲精品久久久久久国产精华液| 这里是久久伊人| 91一区二区在线| 日韩av成人高清| 亚洲日本在线a| 久久久精品国产99久久精品芒果| 91麻豆精东视频| 国产91精品一区二区麻豆网站 | 精品亚洲免费视频| 一区二区三区日韩| 国产三级精品在线| 欧美日韩国产首页在线观看| 高清不卡一区二区在线| 日韩av高清在线观看| 国产精品美女久久久久久2018 | 成人高清免费观看| 免费成人美女在线观看| 中文字幕中文字幕一区二区| 91精品在线麻豆| 91美女片黄在线观看91美女| 三级不卡在线观看| 亚洲国产cao| 亚洲日本护士毛茸茸| 国产日韩v精品一区二区| 欧美日韩一区二区在线视频| 99视频一区二区| 国产精品一区二区在线观看网站| 香蕉久久一区二区不卡无毒影院 | 日韩高清不卡一区二区三区| 国产精品三级av在线播放| 国产日韩欧美一区二区三区乱码| 欧美日韩大陆在线| 欧美日韩黄色影视| 欧美日韩国产小视频在线观看| 在线欧美日韩精品| 欧美综合在线视频| 欧美日韩综合不卡| 日韩一区二区三区电影| 欧美日韩激情一区二区三区| 欧美性大战久久久久久久 | 97久久超碰国产精品电影| a亚洲天堂av| 在线亚洲高清视频| 777久久久精品| 国产精品私人自拍| 亚洲伊人伊色伊影伊综合网| 国产综合色产在线精品| 91美女精品福利| 欧美精品一区二区三区一线天视频 | 成人一区在线观看| 99久久久国产精品| 精品免费日韩av| 亚洲韩国精品一区| 精品一区二区三区香蕉蜜桃 | 欧美一区二区女人| 国产亚洲欧美在线| 亚洲大片精品永久免费| 成人美女在线观看| 日韩一级片网站| 一区精品在线播放| 婷婷久久综合九色综合伊人色| 免费看欧美女人艹b| 国产精品影视网| 色哟哟一区二区| 欧美一区二区在线观看| 亚洲乱码国产乱码精品精98午夜 | 国产日韩欧美一区二区三区乱码| 午夜精品视频在线观看| 粉嫩一区二区三区在线看| 日韩限制级电影在线观看| 亚洲欧美电影一区二区| 成av人片一区二区| www激情久久| 成人在线视频首页| 欧美电影免费观看高清完整版在线观看| 欧美国产一区二区在线观看 | 欧美日韩精品久久久| 亚洲视频图片小说| 成人国产精品免费观看视频| 国产日韩精品一区二区浪潮av| 久久激五月天综合精品| 欧美日韩三级在线| 亚洲国产一区二区a毛片| 欧美特级限制片免费在线观看| 久久先锋资源网| 国产一区在线看| 国产欧美一区二区三区沐欲| 成人手机在线视频| 亚洲日本va在线观看| 色偷偷一区二区三区| 免费人成在线不卡| 国产欧美日韩视频在线观看| 99re这里只有精品首页| 午夜精品福利一区二区蜜股av| 欧美精品在线观看播放| 麻豆精品一区二区综合av| 久久综合九色综合97婷婷| 国产成人a级片| 亚洲gay无套男同| 国产免费观看久久| 欧美男男青年gay1069videost| 黄网站免费久久| 久久精品视频一区二区| 在线观看av不卡| 精品在线一区二区三区| 中文字幕av一区二区三区免费看| 色天天综合久久久久综合片| 麻豆91在线播放免费| 国产无一区二区| 欧美久久久久久久久久| 99久久亚洲一区二区三区青草| 一区二区三区日韩| 国产精品久久久久久久岛一牛影视 | 日韩毛片视频在线看| 91精品久久久久久蜜臀| 成人高清免费观看| 激情丁香综合五月| 精品一区二区三区影院在线午夜| 麻豆成人久久精品二区三区小说| 国产欧美一区二区精品忘忧草| 欧美日韩在线一区二区| 韩国视频一区二区| 五月婷婷久久综合| 国产日韩一级二级三级| 日韩欧美一区二区三区在线| 色综合天天狠狠| 91丨九色丨蝌蚪富婆spa| 国产传媒一区在线| 国产精品资源站在线| 曰韩精品一区二区| 国产精品传媒视频| 国产欧美日韩综合精品一区二区 | 亚洲国产成人91porn| 亚洲午夜视频在线观看| 国产精品视频一二| 国产偷国产偷精品高清尤物| 国产欧美精品日韩区二区麻豆天美| 欧美成人aa大片| 久久只精品国产| 国产精品乱人伦| 国产精品久久精品日日| 亚洲高清三级视频| 亚洲宅男天堂在线观看无病毒| 日本中文在线一区| 国产精品一区在线观看你懂的| 91丝袜呻吟高潮美腿白嫩在线观看| 欧洲av一区二区嗯嗯嗯啊| 欧美一区二区三区四区久久| 久久综合狠狠综合久久综合88 | 91蜜桃在线观看| 国产欧美精品一区aⅴ影院 | 日日夜夜一区二区| 国产91精品入口| 欧美视频日韩视频| 久久婷婷国产综合国色天香| 亚洲欧美精品午睡沙发| 韩国精品久久久| 欧美一区二区三区四区五区| 亚洲色大成网站www久久九九| 国产在线国偷精品免费看| 欧美午夜片在线看| 亚洲精品自拍动漫在线| 成人爽a毛片一区二区免费| 欧美一区二区三区免费| 亚洲bt欧美bt精品| 成人avav影音| 欧美—级在线免费片| 成人午夜免费视频| 久久日韩粉嫩一区二区三区| 免费成人在线观看视频| 欧美日韩不卡视频| 亚洲午夜免费福利视频| 欧美性大战久久久久久久蜜臀| 一区二区三区影院|