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

import static net.cellcomputing.himawari.library.EqSampleIndices.Sample_Alpha;
import static net.cellcomputing.himawari.library.RiGlobal.QGetRenderContext;

import java.awt.image.BufferedImage;

import net.cellcomputing.himawari.library.CqImageBuffer;
import net.cellcomputing.himawari.library.IqBucket;
import net.cellcomputing.himawari.library.types.CqColor;

/**
 * @author NTT DATA Corporation
 * RGBAのBufferedImageを持つクラス。
 * RGBA形式の画像を管理する。
 */
public strictfp class RGBAImageData extends ImageData<BufferedImage> {
	/**
	 * 1pixelに格納するデータのサイズ
	 */
	private static final int DATA_SIZE = 4;
	
	/**
	 * コンストラクタ
	 * データ幅を初期化する
	 */
	protected RGBAImageData(int offset){
		super(offset);			// 2006/11/10 offset用変更
		this.dataSize = DATA_SIZE;								//pixelのデータサイズを取得
		pixelData = new float[DATA_SIZE];	
	}
	

	/**
	 * 引数が持つpixelデータをもとに
	 * イメージへの描画を行う。
	 * @param pBucket 描画データ
	 */
	public void setBucket(IqBucket pBucket) {

		
		if( (pBucket.Width() == 0) || (pBucket.Height() == 0) )
			return;
		
		int	xmin = pBucket.XOrigin();
		int	ymin = pBucket.YOrigin();
		int	xmaxplus1 = xmin + pBucket.Width();
		int	ymaxplus1 = ymin + pBucket.Height();
		
//nttdata 高速化
//		// If completely outside the crop rectangle, don't bother sending.
//		//共通のエラー処理
//		if( xmaxplus1 <= QGetRenderContext().pImage().CropWindowXMin() ||
//			ymaxplus1 <= QGetRenderContext().pImage().CropWindowYMin() ||
//			xmin > QGetRenderContext().pImage().CropWindowXMax() ||
//			ymin > QGetRenderContext().pImage().CropWindowYMax() )
//			return;
//		//--ここまで
//		for ( int y = ymin; y < ymaxplus1; y++ )
//		{
//			for ( int x = xmin; x < xmaxplus1; x++ )
//			{
//				//描画範囲かどうかのチェックを行う
//				//共通のエラー処理
//				if(x < QGetRenderContext().pImage().CropWindowXMin() || y < QGetRenderContext().pImage().CropWindowYMin() ||
//					x >= QGetRenderContext().pImage().CropWindowXMax() || y >= QGetRenderContext().pImage().CropWindowYMax())
//					continue;
//				//--ここまで
//				CqColor col = pBucket.Color(x,y);
//				pixelData[0] = col.fRed();
//				pixelData[1] = col.fGreen();
//				pixelData[2] = col.fBlue();
//				pixelData[3] =  pBucket.Data(x,y).valueAt(Sample_Alpha);
//				raster.setPixel( x - QGetRenderContext().pImage().CropWindowXMin() , y - QGetRenderContext().pImage().CropWindowYMin(), pixelData);
//				
//			}
//		}

//		共通のエラー処理
		CqImageBuffer img = QGetRenderContext().pImage();
		if( xmaxplus1 <= img.CropWindowXMin() ||
			ymaxplus1 <= img.CropWindowYMin() ||
			xmin > img.CropWindowXMax() ||
			ymin > img.CropWindowYMax() )
			return;
		//--ここまで
		for ( int y = ymin; y < ymaxplus1; y++ )
		{
			for ( int x = xmin; x < xmaxplus1; x++ )
			{
				//描画範囲かどうかのチェックを行う
				//共通のエラー処理
				if(x < img.CropWindowXMin() || y < img.CropWindowYMin() ||
					x >= img.CropWindowXMax() || y >= img.CropWindowYMax())
					continue;
				//--ここまで
				CqColor col = pBucket.Color(x,y);
				pixelData[0] = col.fRed();
				pixelData[1] = col.fGreen();
				pixelData[2] = col.fBlue();
				pixelData[3] =  pBucket.Data(x,y).valueAt(Sample_Alpha);
				raster.setPixel( x - img.CropWindowXMin() , y - img.CropWindowYMin(), pixelData);
				
			}
		}

	}

	/**
	 * 画像データであるBufferedImageを取得する
	 * @return 描画したBufferedImage
	 */
	public BufferedImage getImage() {

		return imageData;
	}

	/**
	 * 初期化する。
	 * 外部で指定された値から画像の幅、高さを決定し、
	 * BufferedImageを作成している。
	 */
	public void init() {
		super.init();
		imageData = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);				//imageを作成する
		raster = imageData.getRaster();	
	}

}
