package com.guru.component.bitmap
{
	import flash.display.BitmapData;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class BitmapUtil
	{
		
		public function BitmapUtil() 
		{
			
		}
		
		public static function hsv2rgb(pHue_num:Number, pSat_num:Number, pVal_num:Number):Object
		{
			var red_num, grn_num, blu_num, i, f, p, q, t;
			pHue_num%=360;
			if(pVal_num==0) {return({r:0, g:0, v:0});}
			pSat_num/=100;
			pVal_num/=100;
			pHue_num/=60;
			i = Math.floor(pHue_num);
			f = pHue_num-i;
			p = pVal_num*(1-pSat_num);
			q = pVal_num*(1-(pSat_num*f));
			t = pVal_num*(1-(pSat_num*(1-f)));
			if (i==0) {red_num=pVal_num; grn_num=t; blu_num=p;}
			else if (i==1) {red_num=q; grn_num=pVal_num; blu_num=p;}
			else if (i==2) {red_num=p; grn_num=pVal_num; blu_num=t;}
			else if (i==3) {red_num=p; grn_num=q; blu_num=pVal_num;}
			else if (i==4) {red_num=t; grn_num=p; blu_num=pVal_num;}
			else if (i==5) {red_num=pVal_num; grn_num=p; blu_num=q;}
			red_num = Math.floor(red_num*255);
			grn_num = Math.floor(grn_num*255);
			blu_num = Math.floor(blu_num*255);
			return {r:red_num, g:grn_num, b:blu_num};
		}
		
		public static function rgb2hsv(pRed_num:Number, pGrn_num:Number, pBlu_num:Number):Object
		{
			var x, val_num, f, i, hue_num, sat_num;
			pRed_num/=255;
			pGrn_num/=255;
			pBlu_num/=255;
			x = Math.min(Math.min(pRed_num, pGrn_num), pBlu_num);
			val_num = Math.max(Math.max(pRed_num, pGrn_num), pBlu_num);
			if (x==val_num){
				return({h:undefined, s:0, v:val_num*100});
			}
			f = (pRed_num == x) ? pGrn_num-pBlu_num : ((pGrn_num == x) ? pBlu_num-pRed_num : pRed_num-pGrn_num);
			i = (pRed_num == x) ? 3 : ((pGrn_num == x) ? 5 : 1);
			hue_num = Math.floor((i-f/(val_num-x))*60)%360;
			sat_num = Math.floor(((val_num-x)/val_num)*100);
			val_num = Math.floor(val_num*100);
			return {h:hue_num, s:sat_num, v:val_num};
		}
		
		//0:A
		//1:R
		//2:G
		//3:B
		public static function getColor(pColor_str:String, pColorIndex_num:Number):Number
		{
			if (pColor_str.indexOf("0x") >= 0)
				pColor_str = pColor_str.substr(pColor_str.indexOf("0x") + 2);
			
			return parseInt(pColor_str.substr(pColorIndex_num*2, 2), 16);
			
		}
		
		public static function removeBackground(pSourceBmpData:BitmapData, pFromH_num:Number, pToH_num:Number, pHOffset_num:Number, pSBOffset_num:Number):BitmapData
		{
			var newBmpData:BitmapData = new BitmapData(pSourceBmpData.width, pSourceBmpData.height);
			trace("H from: " + (pFromH_num - pHOffset_num));
			trace("H to: " + (pFromH_num + pHOffset_num));
			trace("H offset: " + pHOffset_num);
			trace("SB offset: " + pSBOffset_num);
			
			
			for (var i:Number = 0; i < pSourceBmpData.width; i++ )
			{
				for (var j:Number = 0; j < pSourceBmpData.height; j++ )
				{
					var argb_str:String = pSourceBmpData.getPixel32(i, j).toString(16);
					var hsb_obj = ColorUtils.rgb2hsv(ColorUtils.getColor(argb_str, 1), ColorUtils.getColor(argb_str, 2), ColorUtils.getColor(argb_str, 3));
					if (pFromH_num - pHOffset_num <= hsb_obj["h"] && hsb_obj["h"] <= pToH_num + pHOffset_num && (hsb_obj["s"] >= pSBOffset_num || hsb_obj["b"] >= pSBOffset_num))
					{
						newBmpData.setPixel32(i, j, 0x00000000);
					}
					else
					{
						newBmpData.setPixel32(i, j, pSourceBmpData.getPixel32(i, j));
					}
				}
			}
			return newBmpData;
		}
		
	}

}