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

import	java.awt.Image;
import	java.awt.Toolkit;

import	java.awt.image.BufferedImage;
import	java.awt.image.FilteredImageSource;
import java.awt.image.RGBImageFilter;

import	java.io.IOException;

import	java.net.URL;

import	javax.imageio.ImageIO;

import	tsukuba_bunko.peko.Logger;

import	tsukuba_bunko.peko.resource.ResourceManager;


/**
 * 画像データを管理する機能を提供します。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class ImageManager	{

	/**
	 * 唯一のインスタンス
	 */
	private static ImageManager	_instance = null;


	/**
	 * <code>ImageManager</code> のインスタンスを作成します。
	 */
	protected ImageManager()
	{
		super();
	}


	/**
	 * 画像をキャッシュから取得します。キャッシュにない場合は新規にロードされます。
	 * @param	name	画像名
	 * @return	画像データ
	 */
	public Image getImage( String name )
	{
		return getImage( name, false );
	}

	/**
	 * 画像をキャッシュから取得します。キャッシュにない場合は新規にロードされます。
	 * @param	name	画像名
	 * @return	画像データ
	 */
	public Image getImage( String name, boolean transparentize )
	{
		Image	image = null;

		BufferedImage	source = null;
		try	{
			source = ImageIO.read( getURL(name) );
		}
		catch( IOException ioe )	{
			Logger.debug( "[canvas.stage] fail to load image :" + name, ioe );
			return null;
		}

		if( transparentize )	{
			int	transColor = source.getRGB( 0, 0 );
			if( (transColor & 0xFF000000) != 0 )	{
				TransparencyRGBImageFilter	filter = new TransparencyRGBImageFilter();
				filter.setTransparencyColor( (transColor & 0x00FFFFFF) );
				FilteredImageSource	imageSource = new FilteredImageSource( source.getSource(), filter );
				image = Toolkit.getDefaultToolkit().createImage( imageSource );
				source.flush();
			}
			else	{
				image = source;
			}
		}
		else	{
			image = source;
		}
		return image;
	}

	/**
	 * 画像をキャッシュに戻します。
	 */
	public void putImage( String name, Image image )
	{
		if( image != null )	{
			image.flush();
		}
	}

	/**
	 * 画像名を URL に変換します。
	 * @param	画像名
	 * @return	画像ファイルの URL
	 */
	protected URL getURL( String name )
	{
		ResourceManager	resources = ResourceManager.getInstance();
		try	{
			return new URL( resources.getLocationResources().getImagesDirecotryURL(), name );
		}
		catch( Exception e )	{
			Logger.error( "[scene.stage] fatal error!", e );
			return null;
		}
	}


	/**
	 * 唯一の <code>ImageManager</code> インスタンスを取得します。
	 * @return	<code>ImageManager</code> インスタンス
	 */
	public static ImageManager getInstance()
	{
		if( _instance == null )	{
			synchronized( ImageManager.class )	{
				if( _instance == null )	{
					_instance = new ImageManager();
				}
			}
		}
		return _instance;
	}
}



class TransparencyRGBImageFilter	extends RGBImageFilter	{

	/**
	 * 透明色(デフォルト：#00FF00)
	 */
	private int	_transparencyColor = 0x0000FF00;

	/**
	 * <code>TransparencyRGBImageFilter</code> のインスタンスを生成します。
	 */
	TransparencyRGBImageFilter()
	{
		super();
	}


	public void setTransparencyColor( int transColor )
	{
		_transparencyColor = transColor;
	}

	public int getTransparencyColor()
	{
		return _transparencyColor;
	}


//
//	RGBImageFilter の実装
//
	public int filterRGB( int x, int y, int rgb )
	{
		if( (rgb & 0x00FFFFFF) == _transparencyColor )	{
			return (0x00FFFFFF & rgb);
		}
		else	{
			return rgb;
		}
	}
}