/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.display;

import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

import net.cellcomputing.himawari.util.HimawariLogger;

import com.keypoint.PngEncoder;

/**
 * @author NTT DATA Corporation
 * PNG形式の命令を管理するクラス。
 * 画像イメージ、ファイル名を持つ。
 */
public strictfp class PngRequest extends DisplayRequest {

	private static final String IMAGE_EXT = "png";

	/**
	 * コンストラクタ
	 * Request
	 * @param name pngファイルの名前
	 * @param type 保存形式
	 * @param mode RGB,RGBAなどのカラー情報がはいる
	 * @param modeID modeのhash
	 * @param dataOffset 
	 * @param dataSize
	 * @param imageData このRequestが管理するImageData (BufferedImage)
	 */
	public PngRequest(String name, final String type,final String mode,
			int modeID, int dataOffset, int dataSize ,ImageData imageData){
		super(name,type,mode,modeID,dataOffset,dataSize,imageData);
	}
	

	/**
	 * 何も行わない
	 */
	public void openRequest() {

	}

	/**
	 * 何も行わない
	 */
	public void display() {

	}
	
	/**
	 * 引数で指定されたimageを
	 * pngファイルに出力する
	 * @param image
	 */
	public void saveImage(BufferedImage image){
//		Iterator writers = ImageIO.getImageWritersByFormatName(IMAGE_EXT);
//		
//		if (writers.hasNext()) {
//			ImageWriter writer = (ImageWriter)writers.next();
//			
//			try {
////				ImageOutputStream stream = ImageIO.createImageOutputStream( new FileOutputStream(name) );
//				ImageOutputStream stream = ImageIO.createImageOutputStream(new File(name));
//				writer.setOutput(stream);
//				
//				writer.write(image);
//				writer.dispose();
//				
//				//2006.08.31 nttdata add
//				stream.close();
//				System.out.println(System.currentTimeMillis() - time);
//				return;
//
//			} catch (FileNotFoundException e) {
//				HimawariLogger.outputException(e);
//				HimawariLogger.getLogger().error( "Cannot open output image file: " + name + "\n");
//				
//			} catch (IOException e) {
//				HimawariLogger.outputException(e);
//				HimawariLogger.getLogger().error( "Cannot open output image file: " + name + "\n");
//			}
//		}

		//--追加
		int num = image.getSampleModel().getNumBands();
		boolean alpha = (num == 4) ? true: false;
	       PngEncoder png =  new PngEncoder( image,
	               (alpha) ? PngEncoder.ENCODE_ALPHA : PngEncoder.NO_ALPHA
	               ,0,9);
           try
           {
               FileOutputStream outfile = new FileOutputStream( name );
               byte[] pngbytes = png.pngEncode();
               if (pngbytes == null)
               {
            	   HimawariLogger.getLogger().error( "Cannot open output image file: " + name + "\n");
               }
               else
               {
                   outfile.write( pngbytes );
               }
               outfile.flush();
               outfile.close();
           }				
           catch (IOException e)
           {
        	   HimawariLogger.outputException(e);
           }
		//--
	}

	/**
	 * 画像データをpng形式のファイルに
	 * 出力する。
	 */
	public void closeRequest() {
		BufferedImage image = (BufferedImage) imageData.getImage();
		saveImage(image);
		imageData = null;
	}

}
