#pragma once

//! @file Mix/Graphics/IManager.h
//! @brief グラフィックスマネージャインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Graphics{

	//! @class IManager
	//! @brief グラフィックスマネージャインターフェース
	class IManager : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IManager( void ){}

	public:
		//! @brief グラフィックスデバイスを取得します
		//! @param[out] ppDevice 取得したグラフィックスデバイスを渡す Mix::Graphics::IDevice インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean GetDevice( Mix::Graphics::IDevice** ppDevice ) = 0;

		//! @brief ターゲットテクスチャチェインを作成します
		//! @param[in] width ターゲットテクスチャの幅
		//! @param[in] height ターゲットテクスチャの高さ
		//! @param[in] format ターゲットテクスチャのフォーマット
		//! @param[out] ppTargetTextureChain 作成したターゲットテクスチャチェインを渡す Mix::Graphics::Utility::ITargetTextureChain インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateTargetTextureChain(	UInt32 width,
													UInt32 height,
													Mix::Graphics::FORMAT format,
													Mix::Graphics::Utility::ITargetTextureChain** ppTargetTextureChain,
													const wchar_t* pDebugName = NULL ) = 0;

		//! @brief フォントをファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppFont 作成したフォントを渡す Mix::Graphics::Utility::IFont インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateFontFromFile( const wchar_t* pFilePath, Mix::Graphics::Utility::IFont** ppFont ) = 0;
		//! @brief フォントをメモリ上のファイルから作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[in] pBuffer メモリ内のファイルを表す Mix::Memory::IBuffer インターフェースのポインタ
		//! @param[out] ppFont 作成したフォントを渡す Mix::Graphics::Utility::IFont インターフェースのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note 作成に成功した場合、pBuffer の参照カウンタを +1 します
		virtual Boolean CreateFontFromMemory( const wchar_t* pFilePath, Mix::Memory::IBuffer* pBuffer, Mix::Graphics::Utility::IFont** ppFont ) = 0;

		//! @brief キャンバスレンダラーを作成します
		//! @param[out] ppCanvasRenderer 作成したキャンバスレンダラーを渡す Mix::Graphics::Utility::ICanvasRenderer インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreateCanvasRenderer( Mix::Graphics::Utility::ICanvasRenderer** ppCanvasRenderer, const wchar_t* pDebugName = NULL ) = 0;
		//! @brief パースペクティブレンダラーを作成します
		//! @param[out] ppPerspectiveRenderer 作成したパースペクティブレンダラーを渡す Mix::Graphics::Utility::IPerspectiveRenderer インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 成功した場合は True を返します
		virtual Boolean CreatePerspectiveRenderer( Mix::Graphics::Utility::IPerspectiveRenderer** ppPerspectiveRenderer, const wchar_t* pDebugName = NULL ) = 0;
	};

}}
