//==============================================================================================================================
//	変換ルーチンベースプログラム
//==============================================================================================================================
#define	SW_MODULE_RESIZE

//		
class BMP_RESIZE{
	
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	
public:
	void		Initialize();
//	int			Func(char *path,char *out,char *param);
	int			Func( LPCTSTR _sParamString );
	void		Quit( BOOL _bExit );
	
	BMP_RESIZE();
	~BMP_RESIZE();
	
};


BMP_RESIZE::BMP_RESIZE()
: m_bInitialized( FALSE )
, m_bImplemented( FALSE )
{
	
	
}
BMP_RESIZE::~BMP_RESIZE(){
	
}


void	BMP_RESIZE::Initialize(){
	
	//	随時初期化する必要のある処理はここで
	
	if(m_bInitialized == TRUE)	return;
	m_bInitialized = TRUE;	//	初期済みフラグ
	
	//	一回だけ行う初期化はここで
	
	
}

//		
void	BMP_RESIZE::Quit( BOOL _bExit )
{
	
	if(m_bImplemented == FALSE)	return;
	m_bImplemented = FALSE;
	m_bInitialized = FALSE;
	//	終了処理は変換処理が実行された場合のみ行う
	
	
	
}

//		
int		BMP_RESIZE::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.

	TCHAR	cName[ _MAX_FNAME ];
	char	*pMem_moto = NULL;
	char	*pMem_out = NULL;
	int		i,len,x,y,w,h,iLen_moto,iLen_out;
	BMPINFO bmp_moto;
	BMPINFO bmp_out;
	TCHAR	szPath[_MAX_PATH], szOut[_MAX_PATH], szParam[ 256 ];
	
	
	/// 引数の取り出し.
	STRING_cpy( szPath , cParam.GetPath() );	///< ターゲットファイル (GetFilePath(0)としても同じ).
	STRING_cpy( szOut  , cParam.GetOutPath() );	///< 第1引数をファイルパスとして取得(%0等が変換されて得られる).
	STRING_cpy( szParam, cParam.GetString( 2 ) );
	
	
	iLen_moto = MEM_TargetRead( &pMem_moto, szPath );
	if(iLen_moto == 0)	return FALSE;
	
	m_bImplemented = TRUE;	//	実行済みフラグ
	
	if(pMem_moto[0] != 'B' || pMem_moto[1] != 'M'){
		Message_error( TEXT("ビットマップでないファイル") );
		return FALSE;
	}
	
	FILE_split( szPath, NULL, NULL, cName, NULL );
	bmp_moto = BMP_GetRECTinfo(pMem_moto);
/*	
	switch(bmp_moto.BitCount){
		default:
			Message_win("対応していないビットマップ");
			return FALSE;
		case 4:
			break;
		case 8:
			break;
	}
*/	
	#define	getvalue(reg)	reg=0;while(i<len && szParam[i]>='0' && szParam[i]<='9'){reg*=10;reg += (szParam[i++]-'0');}
	
	len = STRING_len(szParam);
	i = 0;
	while(i<len && szParam[i]<=' ')	i++;
	
	w = bmp_moto.Width;
	if(szParam[i]=='%'){
		i++;
		getvalue(w);
		w = ((bmp_moto.Width +(w-1))/w)*w;
	}else if(szParam[i]=='+'){
		i++;
		getvalue(w);
		w = bmp_moto.Width + w;
	}else if(szParam[i]=='-'){
		i++;
		getvalue(w);
		w = bmp_moto.Width - w;
	}else if(szParam[i]==','){
		//省略
	}else{
		getvalue(w);
	}
	h = bmp_moto.Height;
	if(szParam[i]==','){
		i++;
		if(szParam[i]=='%'){
			i++;
			getvalue(h);
			h = ((bmp_moto.Height +(h-1))/h)*h;
		}else if(szParam[i]=='+'){
			i++;
			getvalue(h);
			h = bmp_moto.Height + h;
		}else if(szParam[i]=='-'){
			i++;
			getvalue(h);
			h = bmp_moto.Height - h;
		}else{
			getvalue(h);
		}
	}
	
	Message_printf( TEXT("%s(%d,%d)->(%d,%d)"), cName, bmp_moto.Width, bmp_moto.Height, w, h );
	
	iLen_out = BMP_Create( &pMem_out, w, h, bmp_moto.BitCount, 72,72);
	if( iLen_out <= 0 )	return FALSE;
	bmp_out = BMP_GetRECTinfo(pMem_out);
	for(y=0 ; y<h ; y++)
		for(x=0 ; x<w ; x++)
			BMP_setpixel( &bmp_out, x, y, 0 );
	
	switch(bmp_moto.BitCount){
		case 4:
			BMP_PaletteCopy( bmp_moto, bmp_out, 0,0, 16);
			break;
		case 8:
			BMP_PaletteCopy( bmp_moto, bmp_out, 0,0, 256);
		default:
			break;
	}
	
	w = bmp_moto.Width;
	if(w > (int)bmp_out.Width)	w = bmp_out.Width;
	h = bmp_moto.Height;
	if(h > (int)bmp_out.Height)	h = bmp_out.Height;
	for(y=0 ; y<h ; y++)
		for(x=0 ; x<w ; x++)
			BMP_setpixel( &bmp_out, x, y, BMP_getpixel( &bmp_moto, x, y ) );
	
	//	ファイル出力(バックアップ作成)
	file_targetwrite( szOut, pMem_out, iLen_out );
	
	mem_del(pMem_out);
	mem_del(pMem_moto);
	
	return TRUE;
}


BMP_RESIZE	bmprs;

