//
//  GTNLIB for VC++  Header
//
#ifndef __CFBMP__
#define __CFBMP__

// αチャンネルつきのピクセル情報
typedef union tagARGBQUAD {
	DWORD dwValue;
	struct {
		BYTE    rgbBlue;
		BYTE    rgbGreen;
		BYTE    rgbRed;
		BYTE    alpha;
	} quad;
} ARGBQUAD;

//---------------------------< ファイルから読んだり破棄したりできるＢＭＰを扱うクラス >----
class Cfbmp
{
public:	//-------------------------------------------------<< 初期化 >>
	BOOL isReady();
	BOOL isBitOpe();
	Cfbmp();								// デフォルトコンストラクタ
	Cfbmp(LPCTSTR fname,CDC* pDC);			// ファイルネーム指定のコンストラクタ
	Cfbmp(int SizeX,int SizeY,int BitDepth,CDC* pDC);	// サイズ、ビット深度指定コンストラクタ
	~Cfbmp();								// デストラクタ

public:	//-------------------------------------------------<< 操作 >>
	BOOL Load(LPCTSTR fname,CDC* pDC);				// ファイル名を指定して、データをロードする
	BOOL Save(LPCTSTR fname);						// ファイル名を指定して、ＢＭＰファイルを書き出す
	BOOL SaveStencil(LPCTSTR fname);				// ステンシルBMPをセーブする
	void Free();									// 画像を破棄する
	BOOL Initialize(int SizeX,int SizeY,int BitDepth,CDC* pDC);	// サイズ、ビット深度指定イニシャライザ
	void NormalDraw(CPoint& dist,CDC *pDC);			// 指定ＤＣ指定位置に普通に全領域描画
	void FrameDraw(CPoint& src,CRect& dist,CDC *pDC);	// 指定ＤＣに指定部分のみを描画
	void StretchDraw(CRect& src,CRect& dist,CDC *pDC);	// 指定ＤＣに指定部分を指定サイズに変形して描画

	int  GetWidth();								// 読み込まれた画像の幅を返す
	int  GetHeight();								// 読み込まれた画像の高さを返す
	int  GetColorDepth();							// 読み込まれた画像のビットデプスを返す
	int  GetColorNum();								// 読み込まれた画像の色数返す
	CSize GetSize();								// 読み込まれた画像のサイズを返す
	UINT GetWidthByte();							// ビット配列の、横１ラインに対応するバイト数を返す
	HBITMAP GetBmpHandle();							// ビットマップハンドルを返す
	BITMAPFILEHEADER* GetBMFH();					// BITMAPFILEHEADERへのポインタを返す
	BITMAPINFOHEADER* GetBMIH();						// BITMAPINFOHEADERへのポインタを返す
	void* GetLPBits();								// ビット配列へのポインタを得る

	RGBQUAD GetPalet( int index );					// 指定インデックスに対応するパレットコードを返す
	RGBQUAD GetPixelColor( int x , int y );			// 指定位置のピクセルのパレットコードを返す
	int     GetPixelIndex( int x , int y );			// 指定位置のピクセルのパレットインデックスを返す

	void PrepareBitOperation();						// ビット配列の直接操作を行う前の準備
	void EndBitOperation(CDC* pDC);					// ビット配列の直接操作を終了
	void SetPalet( int index,RGBQUAD& quad );		// パレットをセットする
	BOOL SetPixelColor( int x,int y,RGBQUAD& col );	// 指定位置に色を置く（フルカラーの場合）
	BOOL SetPixelIndex( int x,int y,int col );		// 指定位置に色を置く（インデックスカラーの場合）

public:	//-------------------------------------------------<< パブリックアイテム >>

private:	//---------------------------------------------<< アイテム >>
	BOOL isSet;							// 情報がセットされたか否か  TRUE:ready  FALSE:no data
	BOOL isFullColor;					// フルカラーか否か
	BOOL isBitOperating;				// ビット配列の操作中か否か  TRUE:操作中  FALSE:非操作中

	HBITMAP hBmp;							// ＢＭＰのハンドル
	HPALETTE hPal;							// パレットのハンドル
	BITMAPFILEHEADER bmfh;					// ビットマップファイルヘッダ
	BITMAPINFOHEADER bmih;					// ビットマップインフォヘッダ
	LPBITMAPINFO lpbmi;						// BMPINFO へのポインタ
	LPVOID lpBits;							// ビット配列のポインタ
	LPLOGPALETTE lpLogPal;					// パレットへのポインタ
};

#endif
