#pragma once

//! @file Mix/Graphics/Utility/ICanvasRenderer.h
//! @brief キャンバスレンダラーインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Graphics{ namespace Utility{

	//! @class ICanvasRenderer
	//! @brief キャンバスレンダラーインターフェース
	class ICanvasRenderer : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~ICanvasRenderer( void ){}

	public:
		//! @brief 現在設定されているフォントを取得します
		//! @param[out] ppFont 取得したフォントを渡す Mix::Graphics::Utility::IFont インターフェースのポインタのアドレス
		//! @return 取得に成功した場合は True を返します
		virtual Boolean GetFont( Mix::Graphics::Utility::IFont** ppFont ) const = 0;
		//! @brief フォントを設定します
		//! @param[in] pFont Mix::Graphics::Utility::IFont インターフェースのポインタ
		virtual void SetFont( Mix::Graphics::Utility::IFont* pFont ) = 0;

		//! @brief 現在設定されているカラーを取得します
		//! @return カラーを表す Mix::Vector4 クラスを返します
		virtual const Mix::Vector4& GetColor( void ) const = 0;
		//! @brief カラーを設定します
		//! @param[in] color カラーを表す Mix::Vector4 クラス
		virtual void SetColor( const Mix::Vector4& color ) = 0;

		//! @brief ブレンドタイプを取得します
		//! @return ブレンドタイプを表す Mix::Graphics::BLEND_TYPE 列挙定数を返します
		virtual Mix::Graphics::BLEND_TYPE GetBlendType( void ) const = 0;
		//! @brief ブレンドタイプを設定します
		//! @param[in] type ブレンドタイプを表す Mix::Graphics::BLEND_TYPE 列挙定数
		virtual void SetBlendType( Mix::Graphics::BLEND_TYPE type ) = 0;

		//! @brief 現在設定されている変換行列を取得します
		//! @return 行列を表す Mix::Matrix3x3 クラスを返します
		virtual const Mix::Matrix3x3& GetMatrix( void ) const = 0;
		//! @brief 変換行列を設定します
		//! @param[in] mat 行列
		virtual void SetMatrix( const Mix::Matrix3x3& mat ) = 0;
		//! @brief 現在の変換行列を保存します
		//! @return スタックに積まれていた直前の変換行列の数を返します
		virtual UInt32 PushMatrix( void ) = 0;
		//! @brief 現在の変換行列を破棄します
		//! @return スタックに積まれていた直前の変換行列の数を返します
		virtual UInt32 PopMatrix( void ) = 0;
		//! @brief スタックに積まれている全ての行列を排出します
		//! @return 排出した行列の数を返します
		virtual UInt32 DrainMatrix( void ) = 0;

		//! @brief 現在のクリップを取得します
		//! @return クリップを表す Mix::Rectangle クラスを返します
		virtual const Mix::Rectangle& GetClip( void ) const = 0;
		//! @brief クリップを設定します
		//! @param[in] x 左上Ｘ座標
		//! @param[in] y 左上Ｙ座標
		//! @param[in] width 幅
		//! @param[in] height 高さ
		virtual void SetClip( Int32 x, Int32 y, Int32 width, Int32 height ) = 0;
		//! @brief クリップを設定します
		//! @param[in] rect クリップを表す Mix::RectangleF クラス
		virtual void SetClip( const Mix::Rectangle& rect ) = 0;
		//! @brief 現在のクリップを保存します
		//! @return スタックに積まれていた直前のクリップの数を返します
		virtual UInt32 PushClip( void ) = 0;
		//! @brief 現在のクリップを破棄します
		//! @return スタックに積まれていた直前のクリップの数を返します
		virtual UInt32 PopClip( void ) = 0;
		//! @brief スタックに積まれている全てのクリップを排出します
		//! @return 排出したクリップの数を返します
		virtual UInt32 DrainClip( void ) = 0;

		//! @brief ラインを追加します
		//! @param[in] p1 ラインの1番目の点を表す Mix::Vector2 クラス
		//! @param[in] p2 ラインの2番目の点を表す Mix::Vector2 クラス
		virtual void AddLine( const Mix::Vector2& p1, const Mix::Vector2& p2 ) = 0;
		//! @brief ラインを追加します
		//! @param[in] points ラインの点を表す Mix::Vector2 クラスの配列
		//! @param[in] numPoints ラインの点の数
		virtual void AddLines( const Mix::Vector2 points[], UInt16 numPoints ) = 0;

		//! @brief 矩形を追加します
		//! @param[in] rect 矩形を表す Mix::RectangleF クラス
		virtual void AddRectangle( const Mix::RectangleF& rect ) = 0;
		//! @brief 多角形を追加します
		//! @param[in] points 多角形の点を表す Mix::Vector2 クラスの配列
		//! @param[in] numPoints 多角形の点の数
		virtual void AddPolygon( const Mix::Vector2 points[], UInt16 numPoints ) = 0;

		//! @brief 塗りつぶした矩形を追加します
		//! @param[in] rect 矩形を表す Mix::RectangleF クラス
		virtual void AddFillRectangle( const Mix::RectangleF& rect ) = 0;
		//! @brief 塗りつぶした多角形を追加します
		//! @param[in] points 多角形の点を表す Mix::Vector2 クラスの配列
		//! @param[in] numPoints 多角形の点の数
		virtual void AddFillPolygon( const Mix::Vector2 points[], UInt16 numPoints ) = 0;

		//! @brief イメージを追加します
		//! @param[in] pTexture イメージを表す Mix::Graphics::ITexture インターフェースのポインタ
		//! @param[in] dx 描画先の左上Ｘ座標
		//! @param[in] dy 描画先の左上Ｙ座標
		//! @param[in] width 描画先の幅
		//! @param[in] height 描画先の高さ
		//! @param[in] sx 描画元の左上Ｘ座標
		//! @param[in] sy 描画元の左上Ｙ座標
		virtual void AddImage( Mix::Graphics::ITexture* pTexture, Float32 dx, Float32 dy, Float32 width, Float32 height, Float32 sx, Float32 sy ) = 0;
		//! @brief イメージを追加します
		//! @param[in] pTexture イメージを表す Mix::Graphics::ITexture インターフェースのポインタ
		//! @param[in] dst 描画先矩形を表す Mix::RectangleF クラス
		//! @param[in] src 描画元座標を表す Mix::Vector2 クラス
		virtual void AddImage( Mix::Graphics::ITexture* pTexture, const Mix::RectangleF& dst, const Mix::Vector2& src ) = 0;
		//! @brief イメージを追加します
		//! @param[in] pTexture イメージを表す Mix::Graphics::ITexture インターフェースのポインタ
		//! @param[in] dx 描画先の左上Ｘ座標
		//! @param[in] dy 描画先の左上Ｙ座標
		//! @param[in] dw 描画先の幅
		//! @param[in] dh 描画先の高さ
		//! @param[in] sx 描画元の左上Ｘ座標
		//! @param[in] sy 描画元の左上Ｙ座標
		//! @param[in] sw 描画元の幅
		//! @param[in] sh 描画元の高さ
		virtual void AddImage( Mix::Graphics::ITexture* pTexture, Float32 dx, Float32 dy, Float32 dw, Float32 dh, Float32 sx, Float32 sy, Float32 sw, Float32 sh ) = 0;
		//! @brief イメージを描画します
		//! @param[in] pTexture 描画するイメージを表す Mix::Graphics::ITexture インターフェースのポインタ
		//! @param[in] dst 描画先矩形を表す Mix::RectangleF クラス
		//! @param[in] src 描画元矩形 Mix::RectangleF クラス
		virtual void AddImage( Mix::Graphics::ITexture* pTexture, const Mix::RectangleF& dst, const Mix::RectangleF& src ) = 0;

		//! @brief 文字列を追加します
		//! @param[in] x 描画先のX座標
		//! @param[in] y 描画先のY座標
		//! @param[in] pStr 文字列
		virtual void AddString( Float32 x, Float32 y, const wchar_t* pStr ) = 0;
		//! @brief 文字列を追加します
		//! @param[in] pos 描画先の座標を表す Mix::Vector2 クラス
		//! @param[in] pStr 文字列
		virtual void AddString( const Mix::Vector2& pos, const wchar_t* pStr ) = 0;
		//! @brief 文字列を追加します
		//! @param[in] rect 描画先の矩形を表す Mix::RectangleF クラス
		//! @param[in] pStr 文字列
		//! @param[in] flags フラグを表す Mix::Graphics::Utility::STRING_FLAGS 列挙定数の組み合わせ
		virtual void AddString( const Mix::RectangleF& rect, const wchar_t* pStr, UInt32 flags = 0 ) = 0;

		//! @brief キャンバスレンダラーを更新します
		virtual void Update( void ) = 0;
		//! @brief キャンバスレンダラーを描画します
		virtual void Draw( void ) = 0;
	};

}}}
