#pragma once

//! @file Mix/Graphics/ITexture.h
//! @brief テクスチャインターフェースインクルードファイル

#include "Mix/Graphics/IDeviceObject.h"

namespace Mix{ namespace Graphics{

	//! @class ITexture
	//! @brief テクスチャインターフェース
	class ITexture : public Mix::Graphics::IDeviceObject
	{
	public:
		//! @enum DIMENSION_TYPE
		//! @brief ディメンジョンタイプ列挙定数
		enum DIMENSION_TYPE
		{
			DIMENSION_PLANE		= 0,	//!< プレーン ( 2D )
			DIMENSION_VOLUME	= 1,	//!< ボリューム ( 3D )
			DIMENSION_CUBE		= 2,	//!< キューブ
		};

		//! @enum BIND_TYPE
		//! @brief バインドタイプ列挙定数
		enum BIND_TYPE
		{
			//! @brief デフォルト
			//! @note Mix::Graphics::IDevice::SetTexture で設定することができます。
			BIND_DEFAULT	= 0,
			//! @brief ターゲット
			//! @note Mix::Graphics::IDevice::SetTarget で設定することができます。
			BIND_TARGET		= 1,
			//! @brief デプス
			//! @note Mix::Graphics::IDevice::SetTarget で設定することができます。
			BIND_DEPTH		= 2,
		};

		//! @enum ACCESS_FLAG
		//! @brief アクセスフラグ列挙定数
		enum ACCESS_FLAG
		{
			//! @brief CPU による読み取りができます
			//! @see Mix::Graphics::ITexture::Lock
			ACCESS_CPU_READ		= 0x00000001,
			//! @brief CPU による書き込みができます
			//! @see Mix::Graphics::ITexture::Lock
			ACCESS_CPU_WRITE	= 0x00000002,

			//! @brief GPU による読み取りができます
			ACCESS_GPU_READ		= 0x00000004,
			//! @brief GPU による書き込みができます
			ACCESS_GPU_WRITE	= 0x00000008,
		};

		//! @struct LOCK
		//! @brief ロック構造体
		struct LOCK
		{
			UInt32 pitch;	//!< ピッチ ( バイト単位 )
			void* bits;		//!< ビットへのポインタ
		};

	protected:
		//! @brief デストラクタ
		virtual ~ITexture( void ){}

	public:
		//! @brief ディメンジョンタイプを取得します
		//! @return ディメンジョンタイプを表す Mix::Graphics::ITexture::DIMENSION_TYPE を返します
		virtual Mix::Graphics::ITexture::DIMENSION_TYPE GetDimensionType( void ) const = 0;
		//! @brief バインドタイプを取得します
		//! @return バインドタイプを表す Mix::Graphics::ITexture::BIND_TYPE を返します
		virtual Mix::Graphics::ITexture::BIND_TYPE GetBindType( void ) const = 0;
		//! @brief アクセスのフラグを取得します
		//! @return アクセスのフラグを表す Mix::Graphics::ITexture::ACCESS_FLAG の組み合わせを返します
		virtual UInt32 GetAccessFlags( void ) const = 0;

		//! @brief 幅を取得します
		//! @return 幅を返します
		virtual UInt32 GetWidth( void ) const = 0;
		//! @brief 高さを取得します
		//! @return 高さを返します
		virtual UInt32 GetHeight( void ) const = 0;

		//! @brief フォーマットを取得します
		//! @return フォーマットを表す Mix::Graphics::FORMAT 列挙定数を返します
		virtual Mix::Graphics::FORMAT GetFormat( void ) const = 0;

		//! @brief ファイルパスを取得します
		//! @return ファイルパスを返します
		//! @note
		//! ファイル、もしくわメモリ上のファイルから作成している場合のみ有効です。<br>
		//! それ以外の場合は、空の文字列を返します。
		virtual const wchar_t* GetFilePath( void ) const = 0;

		//! @brief ロックして、読み込み または 書き込みができる状態にします
		//! @param[out] lock ロックを表す Mix::Graphics::ITexture::LOCK 構造体
		//! @return 成功した場合は True を返します
		//! @note
		//! このメソッドが成功するのは CPU による読み込みが可能な Mix::Graphics::ITexture::ACCESS_CPU_READ<br>
		//! CPU による書き込みが可能な Mix::Graphics::ITexture::ACCESS_CPU_WRITE のどちらかが Mix::Graphics::ITexture::GetAccessFlags で指定されている場合に限ります。
		virtual Boolean Lock( Mix::Graphics::ITexture::LOCK& lock ) = 0;
		//! @brief ロックを解除します。
		virtual void Unlock( void ) = 0;
	};

}}
