/**
 * 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.RiGlobal.QGetRenderContext;
import net.cellcomputing.himawari.accessory.Valarray;
import net.cellcomputing.himawari.library.CqBucket;
import net.cellcomputing.himawari.library.IqBucket;
import net.cellcomputing.himawari.library.types.CqColor;
/**
 * @author NTT DATA Corporation
 * AOVでfloat及びint型の画像データを管理するクラス。
 * CqColor[][]のデータを持つ。
 * データ自身は1チャネルだがHDR形式に保存するため
 * 3チャネルの中に同じ値がはいることになる。
 * 
 */

public strictfp class AOVSingleImageData extends ImageData<CqColor[][]> {

	/**
	 * コンストラクタ
	 *
	 */
	protected AOVSingleImageData(int offset){
		super(offset);			// 2006/11/10 offset用変更 渡辺
	}
	
	/**
	 * Bucketからpixel毎のColor情報を取得し、
	 * imageDataに格納する。
	 */
	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();
		
		// 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;
				//通常の出力指定であれば、
				if( offset==0 ){
					//CqColorを取得する
					col = ((CqBucket)pBucket).getFColor(x,y);
				}
				//AOVであれば、
				else{
					//Valarrayオブジェクトを取得する
					Valarray val = ((CqBucket)pBucket).Data(x,y);
					
					//Offsetの指し示す値を取得
					float val0 = val.valueAt(offset+0);
					
					
					//量子化オプションが指定されていたら、
					// If special quantization instructions have been given for this display, do it now.
					if( !( m_QuantizeZeroVal == 0.0f &&
							m_QuantizeOneVal  == 0.0f &&
							m_QuantizeMinVal  == 0.0f &&
							m_QuantizeMaxVal  == 0.0f ) )
					{
						val0 = quantize(val0);
					}
					
					//取得した値からCqColorを生成、全てのチャネルに同じ値をいれる
					col = new CqColor( val0, val0, val0 );
				}

				imageData[y - QGetRenderContext().pImage().CropWindowYMin()][x - QGetRenderContext().pImage().CropWindowXMin()] = new CqColor(col);
			}
		}
	}
	
	/**
	 * HDR用の画像情報を返す
	 */
	public CqColor[][] getImage() {
		return imageData;
	}
	
	/** 
	 * フィールドの初期化を行う。
	 * setBucketを行う前に必ず呼ばれる必要がある。
	 */
	public void init() {
//		width = QGetRenderContext() .optCurrent().GetIntegerOption( "System", "Resolution" ) [ 0 ];		//imageの幅を取得
//		height = QGetRenderContext() .optCurrent().GetIntegerOption( "System", "Resolution" ) [ 1 ];	//imageの高さを取得
		super.init();
		imageData = new CqColor[height][width];
	}

}
