/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.images;

import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;

/**
 * 画像の種類を表す列挙型です。
 * 
 * @author 杉澤 浩二
 */
public enum ImageType {

	/**
	 * 1ビット(白黒2階調) GIF (Graphic Interchange Format) を表します。
	 */
	GIF_1BIT {
		@Override
		public String getFormatName() { return "gif"; }
		@Override
		public String getMimeType() { return "image/gif"; }
		@Override
		public String getSuffix() { return "gif"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_BINARY; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * 2ビット(白黒4階調) GIF (Graphic Interchange Format) を表します。
	 */
	GIF_2BIT {
		@Override
		public String getFormatName() { return "gif"; }
		@Override
		public String getMimeType() { return "image/gif"; }
		@Override
		public String getSuffix() { return "gif"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_BINARY; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * 一般的な 8ビット(256色) GIF (Graphic Interchange Format) を表します。
	 */
	GIF_8BIT {
		@Override
		public String getFormatName() { return "gif"; }
		@Override
		public String getMimeType() { return "image/gif"; }
		@Override
		public String getSuffix() { return "gif"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_INDEXED; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * JPEG (Joint Photographic Experts Group) を表します。
	 */
	JPEG {
		@Override
		public String getFormatName() { return "jpeg"; }
		@Override
		public String getMimeType() { return "image/jpeg"; }
		@Override
		public String getSuffix() { return "jpg"; }
		@Override
		public int getBufferedImageType() { return -1; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * 1ビット(白黒) BMP (ビットマップ) を表します。
	 */
	BMP_1BIT {
		@Override
		public String getFormatName() { return "bmp"; }
		@Override
		public String getMimeType() { return "image/bmp"; }
		@Override
		public String getSuffix() { return "bmp"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_BINARY; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * 2ビット(4色) BMP (ビットマップ) を表します。
	 */
	BMP_2BIT {
		@Override
		public String getFormatName() { return "bmp"; }
		@Override
		public String getMimeType() { return "image/bmp"; }
		@Override
		public String getSuffix() { return "bmp"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_BINARY; }
		@Override
		public IndexColorModel getIndexColorModel() { return createIndexColorModel(2); }
	},

	/**
	 * 8ビット(256色) PNG (Portable Network Graphics) を表します。
	 */
	PNG_8BIT {
		@Override
		public String getFormatName() { return "png"; }
		@Override
		public String getMimeType() { return "image/png"; }
		@Override
		public String getSuffix() { return "png"; }
		@Override
		public int getBufferedImageType() { return BufferedImage.TYPE_BYTE_INDEXED; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	},

	/**
	 * PNG (Portable Network Graphics) を表します。
	 */
	PNG {
		@Override
		public String getFormatName() { return "png"; }
		@Override
		public String getMimeType() { return "image/png"; }
		@Override
		public String getSuffix() { return "png"; }
		@Override
		public int getBufferedImageType() { return -1; }
		@Override
		public IndexColorModel getIndexColorModel() { return null; }
	};

	/**
	 * 画像形式を識別する "gif" や "jpeg" などの文字列を返します。
	 *  
	 * @return 画像形式を識別する文字列
	 */
	public abstract String getFormatName();

	/**
	 * この画像形式が使用する標準的な MIME タイプを返します。
	 *  
	 * @return MIME タイプ
	 */
	public abstract String getMimeType();

	/**
	 * この画像形式の標準的な接尾辞(ファイル拡張子)を返します。
	 * 
	 * @return 接尾辞(ファイル拡張子)
	 */
	public abstract String getSuffix();

	/**
	 * この列挙型に対応する BufferedImage クラスのイメージの形式を返します。
	 * 対応するイメージの形式がない場合は、<code>-1</code> を返します。
	 * 
	 * @return この列挙型に対応する BufferedImage クラスのイメージの形式。又は <code>-1</code>
	 * @see BufferedImage
	 */
	public abstract int getBufferedImageType();

	/**
	 * この列挙型に対応する独自のインデックスカラーモデルを返します。
	 * 独自のインデックスカラーモデルがない場合は、<code>null</code> を返します。
	 * 
	 * @return この列挙型に対応するインデックスカラーモデル。又は <code>null</code>
	 */
	public abstract IndexColorModel getIndexColorModel();

	private static IndexColorModel createIndexColorModel(final int bits) {
		final int size = 2 << (bits - 1);
		final int inc = 255 / (size - 1);
        byte[] bytes = new byte[size];
        bytes[0]		= (byte)   0;
        bytes[size - 1]	= (byte) 255;

        int value = inc;
        for (int i = 1; i < (size - 1); i++) {
       		bytes[i] = (byte) value;
       		value = value + inc;
        }

        return new IndexColorModel(bits, size, bytes, bytes, bytes);
	}

}
