//------------------------------------------------------------------------------
// 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 SPRITE_PICTURE_H_
#define SPRITE_PICTURE_H_

#include <Graphics/System/GraphicsDeviceObjectHolder.h>

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * スプライトピクチャ
 */
class SpritePicture : public GraphicsDeviceObjectHolder{
friend class SpriteRenderState;
friend class Sprite;
public:
	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 */
	SpritePicture();

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

	//--------------------------------------------------------------------------
	// サイズ
	//--------------------------------------------------------------------------
	/**
	 * サイズの設定
	 * @param size サイズ
	 */
	virtual void setSize(const DimensionI& size){
		Assert((size.width > 0) && (size.height > 0));
		size_ = size;
	}

	/**
	 * サイズの取得
	 * @return サイズ
	 */
	virtual const DimensionI& getSize() const{ return size_; }

	//--------------------------------------------------------------------------
	// 参照カウンタ
	//--------------------------------------------------------------------------
	/**
	 * 参照カウントの取得
	 */
	virtual int getReferenceCount() const{ return referenceCount_; }

	//--------------------------------------------------------------------------
	// グラフィックデバイスオブジェクト
	//--------------------------------------------------------------------------
	/**
	 * デバイスオブジェクトの初期化
	 * @return 成功したらtrueを返す
	 */
	virtual bool initializeGraphicsDeviceObjects(){ return true; }

	/**
	 * デバイスオブジェクトの削除
	 */
	virtual void deleteGraphicsDeviceObjects(){ SafeRelease(d3dTexture_); }

	/**
	 * デバイスオブジェクトのリストア
	 * @return 成功したらtrueを返す
	 */
	virtual bool restoreGraphicsDeviceObjects(){ return true; }

	/**
	 * デバイスオブジェクトの無効化
	 */
	virtual void invalidateGraphicsDeviceObjects(){}

protected:
	//--------------------------------------------------------------------------
	// Direct3Dテクスチャ
	//--------------------------------------------------------------------------
	/**
	 * D3Dテクスチャの取得
	 * @return D3Dテクスチャの取得
	 */
	virtual Direct3DTexture* getD3DTexture();

	/**
	 * D3Dテクスチャの設定
	 * @param d3dTexture D3Dテクスチャ
	 */
	virtual void setD3DTexture(Direct3DTexture* d3dTexture){
		SafeRelease(d3dTexture_);
		d3dTexture_ = d3dTexture;
	}

	/**
	 * D3Dテクスチャのコンパイル
	 * @return 成功すればtrueを返す
	 */
	virtual bool compileD3DTexture() = 0;

	//--------------------------------------------------------------------------
	// 参照カウンタ
	//--------------------------------------------------------------------------
	/**
	 * 参照の追加
	 * @return 参照カウント
	 */
	virtual int addReference(){
		referenceCount_++;
		return referenceCount_;
	}

	/**
	 * 参照の削除
	 * @return 参照カウント
	 */
	virtual int removeReference(){
		referenceCount_--;
		Assert(referenceCount_ >= 0);
		return referenceCount_;
	}

private:
	//--------------------------------------------------------------------------
	// コピーコンストラクタの隠蔽
	SpritePicture(const SpritePicture& copy);

	// 代入コピーの隠蔽
	void operator =(const SpritePicture& copy);

	//--------------------------------------------------------------------------
	// サイズ
	DimensionI size_;
	// Direct3Dテクスチャ
	Direct3DTexture* d3dTexture_;
	// 参照カウント
	int referenceCount_;

};

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