/*	=================================================================================================
		パレット制御関数
			Programed By K.Tadamori		2000/12/23 - 
	-------------------------------------------------------------------------------------------------

	=================================================================================================	*/


/*	-------------------------------------------------------------------------------------------------
 *		構築
	-------------------------------------------------------------------------------------------------	*/
#include <sys/bios.h>
#include "palet.h"


/*	-------------------------------------------------------------------------------------------------
 *		ローカル関数
	-------------------------------------------------------------------------------------------------	*/
unsigned int palet__fade( unsigned int uiPalet1, unsigned int uiPalet2, int iValue );


/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			フェード処理を行います。
 *		[IN]
 *			uiPalet1	対象パレット
 *			uiPalet2	
 *			iValue		palet1 <-> palet2 どちらに近い色を設定するかを 0 - 8 で設定します。
 *						0 に近いほど palet1 に近い色が設定されます。
 *	-------------------------------------------------------------------------------------------------	*/
void palet_SetFade( unsigned int uiPalet1L, unsigned int uiPalet1H, unsigned int uiPalet2L, unsigned int uiPalet2H, int iValue )
{
	unsigned int uiPaletL, uiPaletH;
	uiPaletL = palet__fade( uiPalet1L, uiPalet2L, iValue );
	uiPaletH = palet__fade( uiPalet1H, uiPalet2H, iValue );
	lcd_set_color( uiPaletL, uiPaletH );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			フェード処理(palet_SetFade)で使われる内部関数です。
 *			パレットの色を求めます。(16Bit分)
 *
 *		[IN]
 *			uiPalet1	対象パレット
 *			uiPalet2	
 *			iValue		palet1 <-> palet2 どちらに近い色を設定するかを 0 - 8 で設定します。
 *						0 に近いほど palet1 に近い色が設定されます。
 *	-------------------------------------------------------------------------------------------------	*/
unsigned int palet__fade( unsigned int uiPalet1, unsigned int uiPalet2, int iValue )
{
	unsigned int uiColor1, uiColor2, uiPalet;

	uiColor1 = (uiPalet1 & 0xf000) >> 12;
	uiColor1 = uiColor1 * iValue;
	uiColor2 = (uiPalet2 & 0xf000) >> 12;
	uiColor2 = uiColor2 * ( PALLETE_FADE_VALUE - iValue );
	uiColor1 = ((uiColor1 + uiColor2)/PALLETE_FADE_VALUE) & 0x000f;
	uiPalet = uiColor1 << 12;

	uiColor1 = (uiPalet1 & 0x0f00) >> 8;
	uiColor1 = uiColor1 * iValue;
	uiColor2 = (uiPalet2 & 0x0f00) >> 8;
	uiColor2 = uiColor2 * ( PALLETE_FADE_VALUE - iValue );
	uiColor1 = ((uiColor1 + uiColor2)/PALLETE_FADE_VALUE) & 0x000f;
	uiPalet = uiPalet | uiColor1 << 8;

	uiColor1 = (uiPalet1 & 0x00f0) >> 4;
	uiColor1 = uiColor1 * iValue;
	uiColor2 = (uiPalet2 & 0x00f0) >> 4;
	uiColor2 = uiColor2 * ( PALLETE_FADE_VALUE - iValue );
	uiColor1 = ((uiColor1 + uiColor2)/PALLETE_FADE_VALUE) & 0x000f;
	uiPalet = uiPalet | uiColor1 << 4;

	uiColor1 = (uiPalet1 & 0x000f);
	uiColor1 = uiColor1 * iValue;
	uiColor2 = (uiPalet2 & 0x000f);
	uiColor2 = uiColor2 * ( PALLETE_FADE_VALUE - iValue );
	uiColor1 = ((uiColor1 + uiColor2)/PALLETE_FADE_VALUE) & 0x000f;
	uiPalet = uiPalet | uiColor1;

	return uiPalet;
}
