#pragma once

//! @file Mix/Rectangle.h
//! @brief 矩形クラスインクルードファイル

namespace Mix{

	class RectangleF;

	//! @class Rectangle
	//! @brief 矩形クラス
	class _MIX_DLL_API Rectangle
	{
	public:
		Int32 x;		//!< X軸上の位置
		Int32 y;		//!< Y軸上の位置
		Int32 width;	//!< 幅
		Int32 height;	//!< 高さ

	public:
		//! @brief コンストラクタ
		Rectangle( void );
		//! @brief コンストラクタ
		//! @param[in] rx X軸上の位置
		//! @param[in] ry Y軸上の位置
		//! @param[in] rw 幅
		//! @param[in] rh 高さ
		Rectangle( Int32 rx, Int32 ry, Int32 rw, Int32 rh );
		//! @brief コピーコンストラクタ
		//! @param[in] rect 矩形
		Rectangle( const Mix::Rectangle& rect );
		//! @brief コピーコンストラクタ
		//! @param[in] rect 矩形
		Rectangle( const Mix::RectangleF& rect );

		//! @brief 等価比較
		//! @param[in] rect 比較する矩形
		//! @return 値が等しい場合は True を返します
		Boolean operator == ( const Rectangle& rect ) const;
		//! @brief 等価比較
		//! @param[in] rect 比較する矩形
		//! @return 値が等しくない場合は True を返します
		Boolean operator != ( const Rectangle& rect ) const;

		//! @brief 代入( = )
		//! @param[in] rect 代入元
		//! @return 結果
		Mix::Rectangle& operator = ( const Mix::Rectangle& rect );
		//! @brief 代入( = )
		//! @param[in] rect 代入元
		//! @return 結果
		Mix::Rectangle& operator = ( const Mix::RectangleF& rect );

		//! @brief 矩形を設定します
		//! @param[in] rx 矩形の左上の X 座標
		//! @param[in] ry 矩形の左上の Y 座標
		//! @param[in] rw 矩形の幅
		//! @param[in] rh 矩形の高さ
		void Set( Int32 rx, Int32 ry, Int32 rw, Int32 rh );

		//! @brief 指定した点が含まれているかチェックします
		//! @param[in] p 点を表す Mix::Point クラス
		//! @return 点が含まれている場合は True を返します
		Boolean Contains( const Mix::Point& p ) const;
		//! @brief 指定した矩形が含まれているかチェックします
		//! @param[in] rect 矩形を表す Mix::Rectangle クラス
		//! @param[out] pOverlapRect 重なっている矩形を表す Mix::Rectangle クラスのポインタ
		//! @return 矩形が含まれている場合は True を返します
		Boolean Contains( const Mix::Rectangle& rect, Mix::Rectangle* pOverlapRect = NULL ) const;

		//! @brief 矩形の右端のX座標を取得します
		//! @return 右端のX座標
		Int32 GetRight( void ) const;
		//! @brief 矩形の右端のX座標を設定します
		//! @param[in] right 右端のX座標
		void SetRight( Int32 right );
		//! @brief 矩形の下端のY座標を取得します
		//! @return 下端のY座標
		Int32 GetBottom( void ) const;
		//! @brief 矩形の下端のY座標を設定します
		//! @param[in] bottom 下端のY座標
		void SetBottom( Int32 bottom );

	public:
		//! @brief 初期値( 0, 0, 0, 0 )を取得します
		//! @return 初期値を表す Mix::Rectangle クラスを返します
		static const Mix::Rectangle& Zero( void )
		{
			static const Mix::Rectangle zero( 0, 0, 0, 0 );

			return zero;
		}
	};

}
