#ifndef CSurfaceBufferInfoTemplate_h
#define CSurfaceBufferInfoTemplate_h

#include"../../../Setup/CompileMode.h"
#include"CSurfaceBuffer.h"


namespace Maid
{

	/*!
	 	@class	ISurfaceBufferInfoNormal CSurfaceBufferInfoTemplate.h
	 	@brief	イメージ内容が普通のもの
	\n			大概はこのクラスです
	 */
	class ISurfaceBufferInfoNormal : public ISurfaceBufferInfo
	{
	public:
		//! コンストラクタ
		/*! 
		 	@param	pBits	[i ]	イメージの先頭アドレス
		 	@param	pCLUT	[i ]	パレットの先頭アドレス
		 	@param	Width	[i ]	イメージの横幅
		 	@param	Height	[i ]	イメージの縦幅
		 	@param	Format	[i ]	イメージのピクセルフォーマット
		 	@param	Pitch	[i ]	イメージのラインサイズ（単位はバイト）
		 */
		ISurfaceBufferInfoNormal( void* pBits, void* pCLUT, int Width, int Height, PIXELFORMAT Format, int Pitch )
			: m_pBits(pBits), m_pCLUT(pCLUT), m_Width(Width), m_Height(Height), m_Format(Format), m_Pitch(Pitch)
		{

		}

		virtual ~ISurfaceBufferInfoNormal(){}	//!<	デストラクタ

		//! ISurfaceInfo::GetLinePtr() を参照
		virtual void* GetLinePtr( int PosY )const 
		{
			MAID_ASSERT(!(PosY<(int)GetHeight()),"指定した範囲を超えています" << PosY << GetHeight());
			return (unt08*)m_pBits + m_Pitch*PosY; 
		}

		//! ISurfaceInfo::GetAddress() を参照
		virtual void* GetAddress() const { return m_pBits; }


		//! ISurfaceInfo::GetCLUT() を参照
		virtual void* GetCLUT() const { return m_pCLUT; }


		//! ISurfaceInfo::GetWidth() を参照
		virtual int		GetWidth() const { return m_Width; }

		//! ISurfaceInfo::GetHeight() を参照
		virtual int		GetHeight() const { return m_Height; }

		//! ISurfaceInfo::GetPixelFormat() を参照
		virtual PIXELFORMAT GetPixelFormat() const { return m_Format; }

		//! ISurfaceInfo::GetPitch() を参照
		virtual int		GetPitch() const { return m_Pitch; }

	private:
		void*		m_pBits;
		void*		m_pCLUT;
		int			m_Width;
		int			m_Height;
		PIXELFORMAT	m_Format;
		int			m_Pitch;
	};



	/*!
	 	\class	ISurfaceBufferInfoReverse CSurfaceBufferInfoTemplate.h
	 	\brief	イメージ内容が上下反対のもの
	\n			ＢＭＰがこのクラスをついかいます
	 */
	class ISurfaceBufferInfoReverse : public ISurfaceBufferInfo
	{
	public:
		//! コンストラクタ
		/*! 
		 *	@param	pBits	[i ]	イメージの先頭アドレス
		 *	@param	pCLUT	[i ]	パレットの先頭アドレス
		 *	@param	Width	[i ]	イメージの横幅
		 *	@param	Height	[i ]	イメージの縦幅
		 *	@param	Format	[i ]	イメージのピクセルフォーマット
		 *	@param	Pitch	[i ]	イメージのラインサイズ（単位はバイト）
		 */
		ISurfaceBufferInfoReverse( void* pBits, void* pCLUT, int Width, int Height, PIXELFORMAT Format, int Pitch )
			: m_pBits(pBits), m_pCLUT(pCLUT), m_Width(Width), m_Height(Height), m_Format(Format), m_Pitch(Pitch)
		{

		}

		virtual ~ISurfaceBufferInfoReverse(){}	//!<	デストラクタ

		//! ISurfaceInfo::GetLinePtr() を参照
		virtual void* GetLinePtr( int PosY )const 
		{
			MAID_ASSERT(!(PosY<(int)GetHeight()),"指定した範囲を超えています "<< PosY << GetHeight());
			return (unt08*)m_pBits + m_Pitch*(GetHeight()-(PosY+1));
		}

		//! ISurfaceInfo::GetAddress() を参照
		virtual void* GetAddress() const { return m_pBits; }

		//! ISurfaceInfo::GetCLUT() を参照
		virtual void* GetCLUT() const { return m_pCLUT; }

		//! ISurfaceInfo::GetWidth() を参照
		virtual int GetWidth() const { return m_Width; }

		//! ISurfaceInfo::GetHeight() を参照
		virtual int GetHeight() const { return m_Height; }

		//! ISurfaceInfo::GetPixelFormat() を参照
		virtual PIXELFORMAT GetPixelFormat() const { return m_Format; }

		//! ISurfaceInfo::GetPitch() を参照
		virtual int		GetPitch() const { return m_Pitch; }

	private:
		void*		m_pBits;
		void*		m_pCLUT;
		int			m_Width;
		int			m_Height;
		PIXELFORMAT	m_Format;
		int			m_Pitch;
	};
}


#endif