//********************************************************************************************
/**
 * @file		makemask.cpp
 * @brief		BMPをchaosで使用するマスクデータにコンバートする
 *
	もっとも単純な構造のサンプルプログラム.
 *
	@date		2013/01/07	takedan	新規作成.
 */
//********************************************************************************************

#define	SW_MODULE_MAKEMASK						///< この機能を切り離したい時はコメントアウト.
#ifdef	SW_MODULE_MAKEMASK


//********************************************************************************************
/**
 * @class		MAKEMASK
 * @brief		BMPをchaosで使用するマスクデータにコンバートするスクリプトコマンドクラス.
 */
//********************************************************************************************
class MAKEMASK
{
public:
	virtual int		Func( LPCTSTR _sParamString );
	virtual void	Quit( BOOL _bExit ){}
};



//==============================================================================================================================================
//	変換処理部分
//==============================================================================================================================================

#define	MAKEMASK_OUTAREA		2	//	変換後の容量は仮に元の倍取っている　内容によって変更して下さい

//********************************************************************************************
/**
 * @brief		BMPをchaosで使用するマスクデータにコンバートする変換フィルターサンプル　機能:無変換(ファイルコピー)
 *				変換せず調査だけなら pOut に関する部分は不要.
 *
 * @param[in]	LPCTSTR	_sParamString	引数文字列  ターゲットファイル名 + スクリプトで指定する引数.
 *
 * @return		int	TRUE:成 / FALSE:否(デフォルト)
 */
//********************************************************************************************
int		MAKEMASK::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	char	*pMem = NULL;
	char	*pOut = NULL;
	int		ii, xx, yy, iSourceLength;
	LPCTSTR	szFileName;
	BMPINFO	cBmpMoto;
	
	
	/// 引数の取り出し.
	szFileName = cParam.GetPath();		///< ターゲットファイル (GetString(0)としても同じ).
	
	
	/// 元データ読み込み(関数内部でpMemに領域を確保している).
	iSourceLength = MEM_TargetRead( &pMem, szFileName );						///< バイナリーデータとしてベタ読み.
	if(iSourceLength == 0)	return FALSE;		///< ファイルがない.
	
	cBmpMoto = BMP_GetRECTinfo( pMem );
	UInt32	hh = cBmpMoto.Height;	///< BMPの高さ
	UInt32	ww = cBmpMoto.Width;	///< BMPの幅
	
	if( hh == 272 )	hh = 288;
	
	/// 変換後のデータバッファを確保	元データがあまりに小さい場合があるので最低1KBは確保.
	mem_alloc( char, pOut, ww * hh );
	
	
	/// 変換処理部分.
	ii = 0;
	if( hh != 288 )
	{
		for( yy=0 ; yy<(int)hh ; yy++ )
		{
			for( xx=0 ; xx<(int)ww ; xx++ )
			{
				*(pOut+ii++) = BMP_getpixel( &cBmpMoto, xx, yy );
			}
		}
	}else{
		/// PSP特殊.
		
		for( Int32 by=0 ; by<9 ; by++ )
			for( Int32 bx=0 ; bx<15 ; bx++ )
			{
				for( yy=0 ; yy<32 ; yy++ )
					for( xx=0 ; xx<32 ; xx++ )
					{
						UInt8	uCol = (by*32+yy < 272) ? BMP_getpixel( &cBmpMoto, bx*32 + xx, by*32 + yy ) : 0;
						*(pOut+ii++) = uCol;
					}
			}
	}
	
	/// 変換された pOut を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名.
	{
		TCHAR	cDrive[_MAX_DRIVE], cDir[_MAX_DIR], cName[_MAX_FNAME], szTemp[_MAX_PATH];
		
		FILE_split( szFileName, cDrive, cDir, cName, NULL );
		FILE_merge( szTemp, cDrive, cDir, cName, TEXT(".msk") );	///<拡張子を".txt"に変えるサンプル.
		
		/// ファイル出力(同名が存在する時はバックアップが作成される).
		file_targetwrite( szTemp, pOut, ww*hh );						///< UNICODEの場合 S-JISに戻して書き込み.
	}
	
	
	/// メモリを開放.
	mem_del( pMem );
	mem_del( pOut );
	
	return TRUE;
}


MAKEMASK	*pC_makemask = NULL;

#endif	// SW_MODULE_MAKEMASK
