/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: Effect.java,v 1.1.2.1 2003/12/11 10:23:10 ppoi Exp $
 */
package tsukuba_bunko.peko.canvas.stage;

import	java.awt.Dimension;
import	java.awt.Image;

import	java.awt.image.BufferedImage;


/**
 * エフェクトを実行するクラスの基本クラスです。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public abstract class Effect	{

	/**
	 * キャンバス
	 */
	private StageCanvas	_canvas = null;

	/**
	 * サイズキャッシュ
	 */
	private Dimension	_size = new Dimension();


	/**
	 * <code>Effect</code> のインスタンスを作成するためにサブクラスのコンストラクタから呼ばれます。
	 */
	protected Effect()
	{
		super();
	}


	/**
	 * 初期化します。
	 */
	public void initialize()
	{
		_canvas = null;
	}

	/**
	 * オフスクリーンバッファを描画するステージキャンバスを取得します。
	 * @return	ステージキャンバス
	 */
	protected StageCanvas getStageCanvas()
	{
		return _canvas;
	}

	/**
	 * ステージキャンバスのサイズを取得します。
	 * @return	サイズを格納した Dimension インスタンス
	 */
	protected Dimension getCanvasSize()
	{
		return _canvas.getSize( _size );
	}

	/**
	 * <code>screen</code> をキャンバスに描画します。
	 */
	protected void drawImage( Image screen )
	{
//		_g.drawImage( screen, 0, 0, _canvas );
		_canvas.repaint();
	}

	/**
	 * 実行手順のテンプレートメソッドです。
	 * @param	canvas	オフスクリーンバッファを描画するキャンバス
	 * @param	screen	オフスクリーンバッファ
	 * @param	next	コピー元画像
	 */
	public final void process( StageCanvas canvas, BufferedImage screen, BufferedImage next )
	{
		_canvas = canvas;
		perform( screen, next );
		initialize();
	}

	/**
	 * この <code>Effect</code> の名前を取得します。
	 * @return	エフェクト名
	 */
	public abstract String getName();

	/**
	 * <code>next</code> の内容をエフェクトをかけながら <code>screen</code> にコピーします。
	 * @param	screen	オフスクリーンバッファ
	 * @param	next	コピー元画像
	 */
	protected abstract void perform( BufferedImage screen, BufferedImage next );
}
