/*============================================================================
  wsPalet.h ver.1.00 「ワンダースワンパレット制御」
------------------------------------------------------------------------------
												Programmed by Keiichi.Tago.
============================================================================*/
#include "wsPalet.h"

/* ==================== スタティック変数 */
int nPalColorMode;		/* 動作モード (0=モノクロ, 1=カラー) */
WORD wTruePaletLo;		/* モノクロ基本パレット Lo */
WORD wTruePaletHi;		/* モノクロ基本パレット Hi */
WORD wColorPalet[256];	/* カラーパレット */
int nNowLuminosity;		/* 0 - 15 */
int nLuminosity;
int nCount;
int nCountMax;
BOOL bFade;

/*============================================================
	PALET の初期化
--------------------------------------------------------------
In  : nSetColorMode (0=モノクロモード,
    :                1=ワンダースワンカラーなら 16 色カラーモードに設定する )
Out : なし
============================================================*/
void wsPalInit( int nSetColorMode )
{
	wTruePaletLo = 0x7530;
	wTruePaletHi = 0xFDB9;
	nNowLuminosity = 0;
	nLuminosity = 0;
	nCount = 0;
	nCountMax = 4;
	/* 適切なモードに設定する */
	if ( ( wwc_get_hardarch() == HARDARCH_WS ) || ( nSetColorMode == 0 ) ) {
		/* モノクロモード設定 */
		lcd_set_color( wTruePaletLo, wTruePaletHi );
		nPalColorMode = 0;
	} else {
		/* 16 色カラーモード設定 */
		nPalColorMode = 1;
	}
	bFade = FALSE;
}

/*============================================================
	モノクロ基本 PALET の設定
--------------------------------------------------------------
In  : wPaletLo = 標準パレット下位ワード
    : wPaletHi = 標準パレット上位ワード
    : nLumi = 光度
Out : なし
============================================================*/
void wsPalSetPalet( WORD wPaletLo, WORD wPaletHi, int nLumi )
{
	wTruePaletLo = wPaletLo;
	wTruePaletHi = wPaletHi;
	nNowLuminosity = nLumi;
	nLuminosity = nLumi;
	bFade = FALSE;
	wsPalSetLuminosityDirect( nLuminosity );
}

/*============================================================
	カラーパレット設定
--------------------------------------------------------------
In  : wPaletNumber = パレット番号
    : wPaletIndex = 色番号
    : wColor = 色 (0x000〜0xFFF)
Out : なし
============================================================*/
void wsPalSetColorPalet( WORD wPaletNumber, WORD wPaletIndex, WORD wColor )
{
	wColorPalet[ wPaletNumber * 16 + wPaletIndex ] = wColor;
	bFade = TRUE;
}

/*============================================================
	PALET の光度を直接指定
--------------------------------------------------------------
In  : nLumi = 画面全体の光度 ( 0 - 15 )
Out : なし
============================================================*/
void wsPalSetLuminosityDirect( int nLumi )
{
	nNowLuminosity = nLumi;
	if ( nPalColorMode == 0 ) {
		/* モノクロモード */
		int i;
		WORD wTemp1, wTemp2;
		WORD wPaletLo, wPaletHi;
		wTemp1 = wTruePaletLo;
		wPaletLo = 0;
		for ( i=0; i<4; i++ ) {
			wPaletLo >>= 4;
			wTemp2 = wTemp1 & 15;
			wTemp2 = wTemp2 * nLumi / 15;
			wPaletLo |= ( wTemp2 << 12 );
			wTemp1 >>= 4;
		}
		wTemp1 = wTruePaletHi;
		wPaletHi = 0;
		for ( i=0; i<4; i++ ) {
			wPaletHi >>= 4;
			wTemp2 = wTemp1 & 15;
			wTemp2 = wTemp2 * nLumi / 15;
			wPaletHi |= ( wTemp2 << 12 );
			wTemp1 >>= 4;
		}
		lcd_set_color( wPaletLo, wPaletHi );
	} else {
		/* 16 色カラーモード */
		WORD wPal;
		WORD wIndex;
		WORD wR;
		WORD wG;
		WORD wB;
		WORD wTemp;
		for ( wPal=0; wPal<16; wPal++ ) {
			for( wIndex=0; wIndex<16; wIndex++ ) {
				wTemp = wColorPalet[ wPal * 16 + wIndex ];
				wR = ( wTemp >> 8 ) * nLumi / 15;
				wG = ( ( wTemp >> 4 ) & 0xF ) * nLumi / 15;
				wB = ( wTemp & 0xF ) * nLumi / 15;
				wTemp = ( wR << 8 ) | ( wG << 4 ) | wB;
				wwc_palette_set_color( wPal, wIndex, wTemp );
			}
		}
	}
}

/*============================================================
	個別 PALET の光度を直接指定
--------------------------------------------------------------
In  : nPalet = パレット番号
    : nLumi = 画面全体の光度 ( 0 - 15 )
Out : なし
============================================================*/
void wsPalSetLuminosityDirectOne( int nPalet, int nLumi )
{
	/* 16 色カラーモード */
	WORD wIndex;
	WORD wR;
	WORD wG;
	WORD wB;
	WORD wTemp;
	for( wIndex=0; wIndex<16; wIndex++ ) {
		wTemp = wColorPalet[ nPalet * 16 + wIndex ];
		wR = ( wTemp >> 8 ) * nLumi / 15;
		wG = ( ( wTemp >> 4 ) & 0xF ) * nLumi / 15;
		wB = ( wTemp & 0xF ) * nLumi / 15;
		wTemp = ( wR << 8 ) | ( wG << 4 ) | wB;
		wwc_palette_set_color( nPalet, wIndex, wTemp );
	}
}

/*============================================================
	PALET の光度を間接指定
--------------------------------------------------------------
In  : nLumi = 画面全体の光度 ( 0 - 15 )
Out : なし
============================================================*/
void wsPalSetLuminosity( int nLumi )
{
	nLuminosity = nLumi;
	if ( nNowLuminosity == nLuminosity ) {
		bFade = FALSE;
	} else {
		bFade = TRUE;
	}
}

/*============================================================
	PALET の光度を変化させる
--------------------------------------------------------------
In  : なし
Out : なし
============================================================*/
void wsPalMove( void )
{
	if ( bFade == TRUE ) {
		nCount++;
		if ( nCount >= nCountMax ) {
			if ( nLuminosity > nNowLuminosity ) {
				nNowLuminosity++;
			} else if ( nLuminosity < nNowLuminosity ) {
				nNowLuminosity--;
			} else {
				bFade = FALSE;
			}
			wsPalSetLuminosityDirect( nNowLuminosity );
			nCount = 0;
		}
	}
}

/*============================================================
	PALET の光度を変化させる
--------------------------------------------------------------
In  : nSpeed = フェードの速度指定
Out : なし
============================================================*/
void wsPalMoveSpeed( int nSpeed )
{
	nCountMax = nSpeed;
}
