//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * ビューポートスプライトステートヘッダ
 * @author Junpee
 */

#ifndef VIEWPORT_SPRITE_STATE_H_
#define VIEWPORT_SPRITE_STATE_H_

#include "Graphics2D/SpriteState/SpriteState.h"

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * ビューポートスプライトステート
 */
class ViewportSpriteState : public SpriteState{
public:
	//--------------------------------------------------------------------------
	// テンプレートステート
	//--------------------------------------------------------------------------
	/// 無効
	static const ViewportSpriteState disableState;

	/// デフォルト
	static const ViewportSpriteState defaultState;

	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 */
	ViewportSpriteState();

	/**
	 * コンストラクタ
	 * @param rectangle 矩形
	 */
	ViewportSpriteState(const RectangleI& rectangle);

	/**
	 * デストラクタ
	 */
	virtual ~ViewportSpriteState();

	//--------------------------------------------------------------------------
	// デフォルトステート
	//--------------------------------------------------------------------------
	/**
	 * デフォルトステートの取得
	 * @return デフォルトステート
	 */
	virtual const SpriteRequest* getDefaultState() const{
		return &defaultState;
	}

	//--------------------------------------------------------------------------
	// 描画
	//--------------------------------------------------------------------------
	/**
	 * 適用
	 * @param renderState レンダーステート
	 */
	virtual void apply(SpriteRenderState* renderState);

	//--------------------------------------------------------------------------
	// クリップ
	//--------------------------------------------------------------------------
	/**
	 * 矩形の設定
	 * @param rectangle 設定する矩形
	 */
	virtual void setRectangle(const RectangleI& rectangle){
		rectangle_ = rectangle;
	}

	/**
	 * 矩形の設定
	 * @param position 設定する矩形の位置
	 * @param size 設定する矩形のサイズ
	 */
	virtual void setRectangle(
		const Point2i& position, const DimensionI& size){
		rectangle_.set(position.x, position.y, size.width, size.height);
	}

	/**
	 * 矩形の設定
	 * @param x 設定する矩形のX位置
	 * @param y 設定する矩形のY位置
	 * @param width 設定する矩形の幅
	 * @param height 設定する矩形の高さ
	 */
	virtual void setRectangle(int x, int y, int width, int height){
		rectangle_.set(x, y, width, height);
	}

	/**
	 * 矩形の取得
	 * @return 矩形
	 */
	virtual const RectangleI& getRectangle() const{
		return rectangle_;
	}

	/**
	 * クリップが有効か
	 * @return クリップが有効ならtrue
	 */
	virtual bool isEnabled() const{
		return (rectangle_ != RectangleI::zero);
	}

	//--------------------------------------------------------------------------
	/**
	 * クリップ位置の設定
	 * @param position 設定するクリップ位置
	 */
	virtual void setPosition(const Point2i& position){
		rectangle_.x = position.x;
		rectangle_.y = position.y;
	}

	/**
	 * クリップ位置の設定
	 * @param x Xクリップ位置
	 * @param y Yクリップ位置
	 */
	virtual void setPosition(int x, int y){
		rectangle_.x = x;
		rectangle_.y = y;
	}

	/**
	 * クリップ位置の取得
	 * @return クリップ位置
	 */
	virtual Point2i getPosition() const{
		return Point2i(rectangle_.x, rectangle_.y);
	}

	//--------------------------------------------------------------------------
	/**
	 * サイズの設定
	 * @param size 設定するサイズ
	 */
	virtual void setSize(const DimensionI& size){
		rectangle_.width = size.width;
		rectangle_.height = size.height;
	}

	/**
	 * サイズの設定
	 * @param width 幅
	 * @param height 高さ
	 */
	virtual void setSize(int width, int height){
		rectangle_.width = width;
		rectangle_.height = height;
	}

	/**
	 * サイズの取得
	 * @return サイズ
	 */
	virtual DimensionI getSize() const{
		return DimensionI(rectangle_.width, rectangle_.height);
	}

private:
	//--------------------------------------------------------------------------
	// 矩形
	RectangleI rectangle_;

};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of VIEWPORT_SPRITE_STATE_H_
//------------------------------------------------------------------------------
