#ifndef CSurfaceInfo_h
#define CSurfaceInfo_h

/*!
 	@file
 	@brief	ISurfaceInfo の継承でよく使われるクラス群
 */


#include"../Setup/CompileMode.h"
#include"../Auxiliary/Debug/CAssert.h"


namespace Maid
{
	/*!
	 	@enum	PIXELFORMAT CSurface.h
	 	@brief	サーフェスのピクセルフォーマットを表すenum
	 */
	enum PIXELFORMAT
	{
		PIXELFORMAT_NONE,	//!<	不明　大概はエラー


		PIXELFORMAT_COLORBEGIN,

		PIXELFORMAT_A08R08G08B08I,	//!<	アルファ有 32bit/Pixel
		PIXELFORMAT_X08R08G08B08I,	//!<	アルファ無 32bit/Pixel
		PIXELFORMAT_R08G08B08I,		//!<	アルファ無 24bit/Pixel
		PIXELFORMAT_A04R04G04B04I,	//!<	アルファ有 16bit/Pixel
		PIXELFORMAT_R05G06B05I,		//!<	アルファ無 16bit/Pixel
		PIXELFORMAT_X01R05G05B05I,	//!<	アルファ無 16bit/Pixel
		PIXELFORMAT_A01R05G05B05I,	//!<	カラーキ有 16bit/Pixel
		PIXELFORMAT_P08X08R08G08B08I,//!<	8bit/Pixel XRGB8888 パレット参照で決定
		PIXELFORMAT_P08A08R08G08B08I,//!<	8bit/Pixel ARGB8888 パレット参照で決定

		// カラーフォーマットが増えた場合はここに追加
		//	↓の GetPixelBPP() にも追加しておくこと
		//
		//	Maid で使用するパレットはすべて 256 個である

		PIXELFORMAT_COLOREND,



		PIXELFORMAT_COMPLESSCOLORBEGIN,

		PIXELFORMAT_DXT1,	//!<	DirectX Texture Compression Format 1
		PIXELFORMAT_DXT2,	//!<	DirectX Texture Compression Format 2
		PIXELFORMAT_DXT3,	//!<	DirectX Texture Compression Format 3
		PIXELFORMAT_DXT4,	//!<	DirectX Texture Compression Format 4
		PIXELFORMAT_DXT5,	//!<	DirectX Texture Compression Format 5

		// 圧縮カラーフォーマットが増えた場合はここに追加
		//	↓の GetPixelBPP() にも追加しておくこと

		PIXELFORMAT_COMPLESSCOLOREND,


		PIXELFORMAT_DEPTHSTENCILEBEGIN,

		PIXELFORMAT_D16,		//!<	16bit/Pixel の ZBuffer
		PIXELFORMAT_D32,		//!<	32bit/Pixel の ZBuffer
		PIXELFORMAT_D24X8,		//!<	32bit/Pixel (有効範囲24Bit) の ZBuffer
		PIXELFORMAT_D24S8,		//!<	32bit/Pixel のうち、 24Bitの ZBuffer 8Bit のステンシルバッファ

		// 深度フォーマットが増えた場合はここに追加
		//	↓の GetPixelBPP() にも追加しておくこと

		PIXELFORMAT_DEPTHSTENCILEEND,

	};

	/*!
	 	@brief	ピクセルフォーマットから１ピクセルあたりに使用する
	\n			ビット数を求める
	 
	 	@param	Format	[i ]	求めるフォーマット
	 
	 	@return	求めたビット数
	 */
	inline int GetPixelBPP( PIXELFORMAT Format )
	{
		switch( Format )
		{
		case PIXELFORMAT_NONE:			{ return  0; }break;

		case PIXELFORMAT_A08R08G08B08I:		{ return 32; }break;
		case PIXELFORMAT_X08R08G08B08I:		{ return 32; }break;
		case PIXELFORMAT_R08G08B08I:		{ return 24; }break;
		case PIXELFORMAT_A04R04G04B04I:		{ return 16; }break;
		case PIXELFORMAT_R05G06B05I:		{ return 16; }break;
		case PIXELFORMAT_X01R05G05B05I:		{ return 16; }break;
		case PIXELFORMAT_A01R05G05B05I:		{ return 16; }break;
		case PIXELFORMAT_P08X08R08G08B08I:	{ return  8; }break;
		case PIXELFORMAT_P08A08R08G08B08I:	{ return  8; }break;

		case PIXELFORMAT_DXT1:			{ return  4; }break;
		case PIXELFORMAT_DXT2:			{ return  8; }break;
		case PIXELFORMAT_DXT3:			{ return  8; }break;
		case PIXELFORMAT_DXT4:			{ return  8; }break;
		case PIXELFORMAT_DXT5:			{ return  8; }break;

		case PIXELFORMAT_D16:			{ return 16; }break;
		case PIXELFORMAT_D32:			{ return 32; }break;
		case PIXELFORMAT_D24X8:			{ return 32; }break;
		case PIXELFORMAT_D24S8:			{ return 32; }break;

		}
		MAID_ASSERT( true, "不明なフォーマットです" );
		return 0;
	}

	/*!
	 	@brief	ピクセルフォーマットからCLUT１つあたりあたりに使用する
	\n			ビット数を求める
	 
	 	@param	Format	[i ]	求めるフォーマット
	 
	 	@return	求めたビット数
	 */
	inline int GetCLUTBPP( PIXELFORMAT Format )
	{
		switch( Format )
		{
		case PIXELFORMAT_NONE:
		case PIXELFORMAT_A08R08G08B08I:
		case PIXELFORMAT_X08R08G08B08I:
		case PIXELFORMAT_R08G08B08I:
		case PIXELFORMAT_A04R04G04B04I:
		case PIXELFORMAT_R05G06B05I:
		case PIXELFORMAT_X01R05G05B05I:
		case PIXELFORMAT_A01R05G05B05I:
		case PIXELFORMAT_DXT1:
		case PIXELFORMAT_DXT2:
		case PIXELFORMAT_DXT3:
		case PIXELFORMAT_DXT4:
		case PIXELFORMAT_DXT5:
		case PIXELFORMAT_D16:
		case PIXELFORMAT_D32:
		case PIXELFORMAT_D24X8:
		case PIXELFORMAT_D24S8:
			{ return 0; }break;

		case PIXELFORMAT_P08X08R08G08B08I:	{ return  32; }break;
		case PIXELFORMAT_P08A08R08G08B08I:	{ return  32; }break;
		}
		MAID_ASSERT( true, "不明なフォーマットです" );
		return 0;
	}

	/*!
	 	@brief	ピクセルフォーマットからパレットのインデックス数を求める
	 
	 	@param	Format	[i ]	求めるフォーマット
	 
	 	@return	インデックス数
	 */
	inline int GetCLUTLength( PIXELFORMAT Format )
	{
		switch( Format )
		{
		case PIXELFORMAT_NONE:
		case PIXELFORMAT_A08R08G08B08I:
		case PIXELFORMAT_X08R08G08B08I:
		case PIXELFORMAT_R08G08B08I:
		case PIXELFORMAT_A04R04G04B04I:
		case PIXELFORMAT_R05G06B05I:
		case PIXELFORMAT_X01R05G05B05I:
		case PIXELFORMAT_A01R05G05B05I:
		case PIXELFORMAT_DXT1:
		case PIXELFORMAT_DXT2:
		case PIXELFORMAT_DXT3:
		case PIXELFORMAT_DXT4:
		case PIXELFORMAT_DXT5:
		case PIXELFORMAT_D16:
		case PIXELFORMAT_D32:
		case PIXELFORMAT_D24X8:
		case PIXELFORMAT_D24S8:
			{ return 0; }break;

		case PIXELFORMAT_P08X08R08G08B08I:	{ return  256; }break;
		case PIXELFORMAT_P08A08R08G08B08I:	{ return  256; }break;
		}
		MAID_ASSERT( true, "不明なフォーマットです" );
		return 0;
	}

	/*!
	 	@brief	圧縮テクスチャか調べる
	 
	 	@param	Format	[i ]	調べるフォーマット
	 
	 	@return	圧縮テクスチャであったら true
	 */
	inline bool IsCompressSurfaceBuffer( PIXELFORMAT Format )
	{
		return PIXELFORMAT_COMPLESSCOLORBEGIN<Format && Format<PIXELFORMAT_COMPLESSCOLOREND;
	}

	/*!
	 	@brief	αピクセルを含むか調べる
	 
	 	@param	Format	[i ]	調べるフォーマット
	 
	 	@return	αピクセルがあるなら true
	 */
	inline bool IsAlphaPixel( PIXELFORMAT Format )
	{
		switch( Format )
		{
		case PIXELFORMAT_A08R08G08B08I:
		case PIXELFORMAT_A04R04G04B04I:
		case PIXELFORMAT_A01R05G05B05I:
		case PIXELFORMAT_P08A08R08G08B08I:
		case PIXELFORMAT_DXT2:
		case PIXELFORMAT_DXT3:
		case PIXELFORMAT_DXT4:
		case PIXELFORMAT_DXT5: { return true; }
		}
		return false;
	}

}


#endif
