| dojo.provide("dojo.gfx.Colorspace"); |
| dojo.require("dojo.lang.common"); |
| dojo.require("dojo.math.matrix"); |
| dojo.gfx.Colorspace=function(){ |
| this.whitePoint="D65"; |
| this.stdObserver="10"; |
| this.chromaticAdaptationAlg="bradford"; |
| this.RGBWorkingSpace="s_rgb"; |
| this.useApproxCIELabMapping=1; |
| this.chainMaps={"RGB_to_xyY":["XYZ"],"xyY_to_RGB":["XYZ"],"RGB_to_Lab":["XYZ"],"Lab_to_RGB":["XYZ"],"RGB_to_LCHab":["XYZ","Lab"],"LCHab_to_RGB":["Lab"],"xyY_to_Lab":["XYZ"],"Lab_to_xyY":["XYZ"],"XYZ_to_LCHab":["Lab"],"LCHab_to_XYZ":["Lab"],"xyY_to_LCHab":["XYZ","Lab"],"LCHab_to_xyY":["Lab","XYZ"],"RGB_to_Luv":["XYZ"],"Luv_to_RGB":["XYZ"],"xyY_to_Luv":["XYZ"],"Luv_to_xyY":["XYZ"],"Lab_to_Luv":["XYZ"],"Luv_to_Lab":["XYZ"],"LCHab_to_Luv":["Lab","XYZ"],"Luv_to_LCHab":["XYZ","Lab"],"RGB_to_LCHuv":["XYZ","Luv"],"LCHuv_to_RGB":["Luv","XYZ"],"XYZ_to_LCHuv":["Luv"],"LCHuv_to_XYZ":["Luv"],"xyY_to_LCHuv":["XYZ","Luv"],"LCHuv_to_xyY":["Luv","XYZ"],"Lab_to_LCHuv":["XYZ","Luv"],"LCHuv_to_Lab":["Luv","XYZ"],"LCHab_to_LCHuv":["Lab","XYZ","Luv"],"LCHuv_to_LCHab":["Luv","XYZ","Lab"],"XYZ_to_CMY":["RGB"],"CMY_to_XYZ":["RGB"],"xyY_to_CMY":["RGB"],"CMY_to_xyY":["RGB"],"Lab_to_CMY":["RGB"],"CMY_to_Lab":["RGB"],"LCHab_to_CMY":["RGB"],"CMY_to_LCHab":["RGB"],"Luv_to_CMY":["RGB"],"CMY_to_Luv":["RGB"],"LCHuv_to_CMY":["RGB"],"CMY_to_LCHuv":["RGB"],"XYZ_to_HSL":["RGB"],"HSL_to_XYZ":["RGB"],"xyY_to_HSL":["RGB"],"HSL_to_xyY":["RGB"],"Lab_to_HSL":["RGB"],"HSL_to_Lab":["RGB"],"LCHab_to_HSL":["RGB"],"HSL_to_LCHab":["RGB"],"Luv_to_HSL":["RGB"],"HSL_to_Luv":["RGB"],"LCHuv_to_HSL":["RGB"],"HSL_to_LCHuv":["RGB"],"CMY_to_HSL":["RGB"],"HSL_to_CMY":["RGB"],"CMYK_to_HSL":["RGB"],"HSL_to_CMYK":["RGB"],"XYZ_to_HSV":["RGB"],"HSV_to_XYZ":["RGB"],"xyY_to_HSV":["RGB"],"HSV_to_xyY":["RGB"],"Lab_to_HSV":["RGB"],"HSV_to_Lab":["RGB"],"LCHab_to_HSV":["RGB"],"HSV_to_LCHab":["RGB"],"Luv_to_HSV":["RGB"],"HSV_to_Luv":["RGB"],"LCHuv_to_HSV":["RGB"],"HSV_to_LCHuv":["RGB"],"CMY_to_HSV":["RGB"],"HSV_to_CMY":["RGB"],"CMYK_to_HSV":["RGB"],"HSV_to_CMYK":["RGB"],"HSL_to_HSV":["RGB"],"HSV_to_HSL":["RGB"],"XYZ_to_CMYK":["RGB"],"CMYK_to_XYZ":["RGB"],"xyY_to_CMYK":["RGB"],"CMYK_to_xyY":["RGB"],"Lab_to_CMYK":["RGB"],"CMYK_to_Lab":["RGB"],"LCHab_to_CMYK":["RGB"],"CMYK_to_LCHab":["RGB"],"Luv_to_CMYK":["RGB"],"CMYK_to_Luv":["RGB"],"LCHuv_to_CMYK":["RGB"],"CMYK_to_LCHuv":["RGB"]}; |
| return this; |
| }; |
| dojo.gfx.Colorspace.prototype.convert=function(_1,_2,_3){ |
| var k=_2+"_to_"+_3; |
| if(this[k]){ |
| return this[k](_1); |
| }else{ |
| if(this.chainMaps[k]){ |
| var _5=_2; |
| var _6=this.chainMaps[k].concat(); |
| _6.push(_3); |
| for(var i=0;i<_6.length;i++){ |
| _1=this.convert(_1,_5,_6[i]); |
| _5=_6[i]; |
| } |
| return _1; |
| }else{ |
| dojo.debug("Can't convert from "+_2+" to "+_3); |
| } |
| } |
| }; |
| dojo.gfx.Colorspace.prototype.munge=function(_8,_9){ |
| if(dojo.lang.isArray(_9[0])){ |
| _9=_9[0]; |
| } |
| var _a=new Array(); |
| for(var i=0;i<_8.length;i++){ |
| _a[_8.charAt(i)]=_9[i]; |
| } |
| return _a; |
| }; |
| dojo.gfx.Colorspace.prototype.getWhitePoint=function(){ |
| var x=0; |
| var y=0; |
| var t=0; |
| switch(this.stdObserver){ |
| case "2": |
| switch(this.whitePoint){ |
| case "E": |
| x=1/3; |
| y=1/3; |
| t=5400; |
| break; |
| case "D50": |
| x=0.34567; |
| y=0.3585; |
| t=5000; |
| break; |
| case "D55": |
| x=0.33242; |
| y=0.34743; |
| t=5500; |
| break; |
| case "D65": |
| x=0.31271; |
| y=0.32902; |
| t=6500; |
| break; |
| case "D75": |
| x=0.29902; |
| y=0.31485; |
| t=7500; |
| break; |
| case "A": |
| x=0.44757; |
| y=0.40745; |
| t=2856; |
| break; |
| case "B": |
| x=0.34842; |
| y=0.35161; |
| t=4874; |
| break; |
| case "C": |
| x=0.31006; |
| y=0.31616; |
| t=6774; |
| break; |
| case "9300": |
| x=0.2848; |
| y=0.2932; |
| t=9300; |
| break; |
| case "F2": |
| x=0.37207; |
| y=0.37512; |
| t=4200; |
| break; |
| case "F7": |
| x=0.31285; |
| y=0.32918; |
| t=6500; |
| break; |
| case "F11": |
| x=0.38054; |
| y=0.37691; |
| t=4000; |
| break; |
| default: |
| dojo.debug("White point "+this.whitePoint+" isn't defined for Std. Observer "+this.strObserver); |
| } |
| break; |
| case "10": |
| switch(this.whitePoint){ |
| case "E": |
| x=1/3; |
| y=1/3; |
| t=5400; |
| break; |
| case "D50": |
| x=0.34773; |
| y=0.35952; |
| t=5000; |
| break; |
| case "D55": |
| x=0.33411; |
| y=0.34877; |
| t=5500; |
| break; |
| case "D65": |
| x=0.31382; |
| y=0.331; |
| t=6500; |
| break; |
| case "D75": |
| x=0.29968; |
| y=0.3174; |
| t=7500; |
| break; |
| case "A": |
| x=0.45117; |
| y=0.40594; |
| t=2856; |
| break; |
| case "B": |
| x=0.3498; |
| y=0.3527; |
| t=4874; |
| break; |
| case "C": |
| x=0.31039; |
| y=0.31905; |
| t=6774; |
| break; |
| case "F2": |
| x=0.37928; |
| y=0.36723; |
| t=4200; |
| break; |
| case "F7": |
| x=0.31565; |
| y=0.32951; |
| t=6500; |
| break; |
| case "F11": |
| x=0.38543; |
| y=0.3711; |
| t=4000; |
| break; |
| default: |
| dojo.debug("White point "+this.whitePoint+" isn't defined for Std. Observer "+this.strObserver); |
| } |
| break; |
| default: |
| dojo.debug("Std. Observer "+this.strObserver+" isn't defined"); |
| } |
| var z=1-x-y; |
| var wp={"x":x,"y":y,"z":z,"t":t}; |
| wp.Y=1; |
| var XYZ=this.xyY_to_XYZ([wp.x,wp.y,wp.Y]); |
| wp.X=XYZ[0]; |
| wp.Y=XYZ[1]; |
| wp.Z=XYZ[2]; |
| return wp; |
| }; |
| dojo.gfx.Colorspace.prototype.getPrimaries=function(){ |
| var m=[]; |
| switch(this.RGBWorkingSpace){ |
| case "adobe_rgb_1998": |
| m=[2.2,"D65",0.64,0.33,0.297361,0.21,0.71,0.627355,0.15,0.06,0.075285]; |
| break; |
| case "apple_rgb": |
| m=[1.8,"D65",0.625,0.34,0.244634,0.28,0.595,0.672034,0.155,0.07,0.083332]; |
| break; |
| case "best_rgb": |
| m=[2.2,"D50",0.7347,0.2653,0.228457,0.215,0.775,0.737352,0.13,0.035,0.034191]; |
| break; |
| case "beta_rgb": |
| m=[2.2,"D50",0.6888,0.3112,0.303273,0.1986,0.7551,0.663786,0.1265,0.0352,0.032941]; |
| break; |
| case "bruce_rgb": |
| m=[2.2,"D65",0.64,0.33,0.240995,0.28,0.65,0.683554,0.15,0.06,0.075452]; |
| break; |
| case "cie_rgb": |
| m=[2.2,"E",0.735,0.265,0.176204,0.274,0.717,0.812985,0.167,0.009,0.010811]; |
| break; |
| case "color_match_rgb": |
| m=[1.8,"D50",0.63,0.34,0.274884,0.295,0.605,0.658132,0.15,0.075,0.066985]; |
| break; |
| case "don_rgb_4": |
| m=[2.2,"D50",0.696,0.3,0.27835,0.215,0.765,0.68797,0.13,0.035,0.03368]; |
| break; |
| case "eci_rgb": |
| m=[1.8,"D50",0.67,0.33,0.32025,0.21,0.71,0.602071,0.14,0.08,0.077679]; |
| break; |
| case "ekta_space_ps5": |
| m=[2.2,"D50",0.695,0.305,0.260629,0.26,0.7,0.734946,0.11,0.005,0.004425]; |
| break; |
| case "ntsc_rgb": |
| m=[2.2,"C",0.67,0.33,0.298839,0.21,0.71,0.586811,0.14,0.08,0.11435]; |
| break; |
| case "pal_secam_rgb": |
| m=[2.2,"D65",0.64,0.33,0.222021,0.29,0.6,0.706645,0.15,0.06,0.071334]; |
| break; |
| case "pro_photo_rgb": |
| m=[1.8,"D50",0.7347,0.2653,0.28804,0.1596,0.8404,0.711874,0.0366,0.0001,0.000086]; |
| break; |
| case "smpte-c_rgb": |
| m=[2.2,"D65",0.63,0.34,0.212395,0.31,0.595,0.701049,0.155,0.07,0.086556]; |
| break; |
| case "s_rgb": |
| m=[2.2,"D65",0.64,0.33,0.212656,0.3,0.6,0.715158,0.15,0.06,0.072186]; |
| break; |
| case "wide_gamut_rgb": |
| m=[2.2,"D50",0.735,0.265,0.258187,0.115,0.826,0.724938,0.157,0.018,0.016875]; |
| break; |
| default: |
| dojo.debug("RGB working space "+this.RGBWorkingSpace+" isn't defined"); |
| } |
| var p={name:this.RGBWorkingSpace,gamma:m[0],wp:m[1],xr:m[2],yr:m[3],Yr:m[4],xg:m[5],yg:m[6],Yg:m[7],xb:m[8],yb:m[9],Yb:m[10]}; |
| if(p.wp!=this.whitePoint){ |
| var r=this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xr,p.yr,p.Yr]),p.wp,this.whitePoint)); |
| var g=this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xg,p.yg,p.Yg]),p.wp,this.whitePoint)); |
| var b=this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xb,p.yb,p.Yb]),p.wp,this.whitePoint)); |
| p.xr=r[0]; |
| p.yr=r[1]; |
| p.Yr=r[2]; |
| p.xg=g[0]; |
| p.yg=g[1]; |
| p.Yg=g[2]; |
| p.xb=b[0]; |
| p.yb=b[1]; |
| p.Yb=b[2]; |
| p.wp=this.whitePoint; |
| } |
| p.zr=1-p.xr-p.yr; |
| p.zg=1-p.xg-p.yg; |
| p.zb=1-p.xb-p.yb; |
| return p; |
| }; |
| dojo.gfx.Colorspace.prototype.epsilon=function(){ |
| return this.useApproxCIELabMapping?0.008856:216/24289; |
| }; |
| dojo.gfx.Colorspace.prototype.kappa=function(){ |
| return this.useApproxCIELabMapping?903.3:24389/27; |
| }; |
| dojo.gfx.Colorspace.prototype.XYZ_to_xyY=function(){ |
| var src=this.munge("XYZ",arguments); |
| var sum=src.X+src.Y+src.Z; |
| if(sum==0){ |
| var wp=this.getWhitePoint(); |
| var x=wp.x; |
| var y=wp.y; |
| }else{ |
| var x=src.X/sum; |
| var y=src.Y/sum; |
| } |
| var Y=src.Y; |
| return [x,y,Y]; |
| }; |
| dojo.gfx.Colorspace.prototype.xyY_to_XYZ=function(){ |
| var src=this.munge("xyY",arguments); |
| if(src.y==0){ |
| var X=0; |
| var Y=0; |
| var Z=0; |
| }else{ |
| var X=(src.x*src.Y)/src.y; |
| var Y=src.Y; |
| var Z=((1-src.x-src.y)*src.Y)/src.y; |
| } |
| return [X,Y,Z]; |
| }; |
| dojo.gfx.Colorspace.prototype.RGB_to_XYZ=function(){ |
| var src=this.munge("RGB",arguments); |
| var m=this.getRGB_XYZ_Matrix(); |
| var pr=this.getPrimaries(); |
| if(this.RGBWorkingSpace=="s_rgb"){ |
| var r=(src.R>0.04045)?Math.pow(((src.R+0.055)/1.055),2.4):src.R/12.92; |
| var g=(src.G>0.04045)?Math.pow(((src.G+0.055)/1.055),2.4):src.G/12.92; |
| var b=(src.B>0.04045)?Math.pow(((src.B+0.055)/1.055),2.4):src.B/12.92; |
| }else{ |
| var r=Math.pow(src.R,pr.gamma); |
| var g=Math.pow(src.G,pr.gamma); |
| var b=Math.pow(src.B,pr.gamma); |
| } |
| var XYZ=dojo.math.matrix.multiply([[r,g,b]],m); |
| return [XYZ[0][0],XYZ[0][1],XYZ[0][2]]; |
| }; |
| dojo.gfx.Colorspace.prototype.XYZ_to_RGB=function(){ |
| var src=this.munge("XYZ",arguments); |
| var mi=this.getXYZ_RGB_Matrix(); |
| var pr=this.getPrimaries(); |
| var rgb=dojo.math.matrix.multiply([[src.X,src.Y,src.Z]],mi); |
| var r=rgb[0][0]; |
| var g=rgb[0][1]; |
| var b=rgb[0][2]; |
| if(this.RGBWorkingSpace=="s_rgb"){ |
| var R=(r>0.0031308)?(1.055*Math.pow(r,1/2.4))-0.055:12.92*r; |
| var G=(g>0.0031308)?(1.055*Math.pow(g,1/2.4))-0.055:12.92*g; |
| var B=(b>0.0031308)?(1.055*Math.pow(b,1/2.4))-0.055:12.92*b; |
| }else{ |
| var R=Math.pow(r,1/pr.gamma); |
| var G=Math.pow(g,1/pr.gamma); |
| var B=Math.pow(b,1/pr.gamma); |
| } |
| return [R,G,B]; |
| }; |
| dojo.gfx.Colorspace.prototype.XYZ_to_Lab=function(){ |
| var src=this.munge("XYZ",arguments); |
| var wp=this.getWhitePoint(); |
| var xr=src.X/wp.X; |
| var yr=src.Y/wp.Y; |
| var zr=src.Z/wp.Z; |
| var fx=(xr>this.epsilon())?Math.pow(xr,1/3):(this.kappa()*xr+16)/116; |
| var fy=(yr>this.epsilon())?Math.pow(yr,1/3):(this.kappa()*yr+16)/116; |
| var fz=(zr>this.epsilon())?Math.pow(zr,1/3):(this.kappa()*zr+16)/116; |
| var L=116*fy-16; |
| var a=500*(fx-fy); |
| var b=200*(fy-fz); |
| return [L,a,b]; |
| }; |
| dojo.gfx.Colorspace.prototype.Lab_to_XYZ=function(){ |
| var src=this.munge("Lab",arguments); |
| var wp=this.getWhitePoint(); |
| var yr=(src.L>(this.kappa()*this.epsilon()))?Math.pow((src.L+16)/116,3):src.L/this.kappa(); |
| var fy=(yr>this.epsilon())?(src.L+16)/116:(this.kappa()*yr+16)/116; |
| var fx=(src.a/500)+fy; |
| var fz=fy-(src.b/200); |
| var _43=Math.pow(fx,3); |
| var _44=Math.pow(fz,3); |
| var xr=(_43>this.epsilon())?_43:(116*fx-16)/this.kappa(); |
| var zr=(_44>this.epsilon())?_44:(116*fz-16)/this.kappa(); |
| var X=xr*wp.X; |
| var Y=yr*wp.Y; |
| var Z=zr*wp.Z; |
| return [X,Y,Z]; |
| }; |
| dojo.gfx.Colorspace.prototype.Lab_to_LCHab=function(){ |
| var src=this.munge("Lab",arguments); |
| var L=src.L; |
| var C=Math.pow(src.a*src.a+src.b*src.b,0.5); |
| var H=Math.atan2(src.b,src.a)*(180/Math.PI); |
| if(H<0){ |
| H+=360; |
| } |
| if(H>360){ |
| H-=360; |
| } |
| return [L,C,H]; |
| }; |
| dojo.gfx.Colorspace.prototype.LCHab_to_Lab=function(){ |
| var src=this.munge("LCH",arguments); |
| var _4f=src.H*(Math.PI/180); |
| var L=src.L; |
| var a=src.C/Math.pow(Math.pow(Math.tan(_4f),2)+1,0.5); |
| if((90<src.H)&&(src.H<270)){ |
| a=-a; |
| } |
| var b=Math.pow(Math.pow(src.C,2)-Math.pow(a,2),0.5); |
| if(src.H>180){ |
| b=-b; |
| } |
| return [L,a,b]; |
| }; |
| dojo.gfx.Colorspace.prototype.chromaticAdaptation=function(col,_54,_55){ |
| col=this.munge("XYZ",[col]); |
| var _56=this.whitePoint; |
| this.whitePoint=_54; |
| var _57=this.getWhitePoint(); |
| this.whitePoint=_55; |
| var _58=this.getWhitePoint(); |
| this.whitePoint=_56; |
| switch(this.chromaticAdaptationAlg){ |
| case "xyz_scaling": |
| var ma=[[1,0,0],[0,1,0],[0,0,1]]; |
| var mai=[[1,0,0],[0,1,0],[0,0,1]]; |
| break; |
| case "bradford": |
| var ma=[[0.8951,-0.7502,0.0389],[0.2664,1.7135,-0.0685],[-0.1614,0.0367,1.0296]]; |
| var mai=[[0.986993,0.432305,-0.008529],[-0.147054,0.51836,0.040043],[0.159963,0.049291,0.968487]]; |
| break; |
| case "von_kries": |
| var ma=[[0.40024,-0.2263,0],[0.7076,1.16532,0],[-0.08081,0.0457,0.91822]]; |
| var mai=[[1.859936,0.361191,0],[-1.129382,0.638812,0],[0.219897,-0.000006,1.089064]]; |
| break; |
| default: |
| dojo.debug("The "+this.chromaticAdaptationAlg+" chromatic adaptation algorithm matricies are not defined"); |
| } |
| var _5b=dojo.math.matrix.multiply([[_57.x,_57.y,_57.z]],ma); |
| var _5c=dojo.math.matrix.multiply([[_58.x,_58.y,_58.z]],ma); |
| var _5d=[[_5c[0][0]/_5b[0][0],0,0],[0,_5c[0][1]/_5b[0][1],0],[0,0,_5c[0][2]/_5b[0][2]]]; |
| var m=dojo.math.matrix.multiply(dojo.math.matrix.multiply(ma,_5d),mai); |
| var dst=dojo.math.matrix.multiply([[col.X,col.Y,col.Z]],m); |
| return dst[0]; |
| }; |
| dojo.gfx.Colorspace.prototype.getRGB_XYZ_Matrix=function(){ |
| var wp=this.getWhitePoint(); |
| var pr=this.getPrimaries(); |
| var Xr=pr.xr/pr.yr; |
| var Yr=1; |
| var Zr=(1-pr.xr-pr.yr)/pr.yr; |
| var Xg=pr.xg/pr.yg; |
| var Yg=1; |
| var Zg=(1-pr.xg-pr.yg)/pr.yg; |
| var Xb=pr.xb/pr.yb; |
| var Yb=1; |
| var Zb=(1-pr.xb-pr.yb)/pr.yb; |
| var m1=[[Xr,Yr,Zr],[Xg,Yg,Zg],[Xb,Yb,Zb]]; |
| var m2=[[wp.X,wp.Y,wp.Z]]; |
| var sm=dojo.math.matrix.multiply(m2,dojo.math.matrix.inverse(m1)); |
| var Sr=sm[0][0]; |
| var Sg=sm[0][1]; |
| var Sb=sm[0][2]; |
| var m4=[[Sr*Xr,Sr*Yr,Sr*Zr],[Sg*Xg,Sg*Yg,Sg*Zg],[Sb*Xb,Sb*Yb,Sb*Zb]]; |
| return m4; |
| }; |
| dojo.gfx.Colorspace.prototype.getXYZ_RGB_Matrix=function(){ |
| var m=this.getRGB_XYZ_Matrix(); |
| return dojo.math.matrix.inverse(m); |
| }; |
| dojo.gfx.Colorspace.prototype.XYZ_to_Luv=function(){ |
| var src=this.munge("XYZ",arguments); |
| var wp=this.getWhitePoint(); |
| var ud=(4*src.X)/(src.X+15*src.Y+3*src.Z); |
| var vd=(9*src.Y)/(src.X+15*src.Y+3*src.Z); |
| var udr=(4*wp.X)/(wp.X+15*wp.Y+3*wp.Z); |
| var vdr=(9*wp.Y)/(wp.X+15*wp.Y+3*wp.Z); |
| var yr=src.Y/wp.Y; |
| var L=(yr>this.epsilon())?116*Math.pow(yr,1/3)-16:this.kappa()*yr; |
| var u=13*L*(ud-udr); |
| var v=13*L*(vd-vdr); |
| return [L,u,v]; |
| }; |
| dojo.gfx.Colorspace.prototype.Luv_to_XYZ=function(){ |
| var src=this.munge("Luv",arguments); |
| var wp=this.getWhitePoint(); |
| var uz=(4*wp.X)/(wp.X+15*wp.Y+3*wp.Z); |
| var vz=(9*wp.Y)/(wp.X+15*wp.Y+3*wp.Z); |
| var Y=(src.L>this.kappa()*this.epsilon())?Math.pow((src.L+16)/116,3):src.L/this.kappa(); |
| var a=(1/3)*(((52*src.L)/(src.u+13*src.L*uz))-1); |
| var b=-5*Y; |
| var c=-(1/3); |
| var d=Y*(((39*src.L)/(src.v+13*src.L*vz))-5); |
| var X=(d-b)/(a-c); |
| var Z=X*a+b; |
| return [X,Y,Z]; |
| }; |
| dojo.gfx.Colorspace.prototype.Luv_to_LCHuv=function(){ |
| var src=this.munge("Luv",arguments); |
| var L=src.L; |
| var C=Math.pow(src.u*src.u+src.v*src.v,0.5); |
| var H=Math.atan2(src.v,src.u)*(180/Math.PI); |
| if(H<0){ |
| H+=360; |
| } |
| if(H>360){ |
| H-=360; |
| } |
| return [L,C,H]; |
| }; |
| dojo.gfx.Colorspace.prototype.LCHuv_to_Luv=function(){ |
| var src=this.munge("LCH",arguments); |
| var _8d=src.H*(Math.PI/180); |
| var L=src.L; |
| var u=src.C/Math.pow(Math.pow(Math.tan(_8d),2)+1,0.5); |
| var v=Math.pow(src.C*src.C-u*u,0.5); |
| if((90<src.H)&&(src.H<270)){ |
| u*=-1; |
| } |
| if(src.H>180){ |
| v*=-1; |
| } |
| return [L,u,v]; |
| }; |
| dojo.gfx.Colorspace.colorTemp_to_whitePoint=function(T){ |
| if(T<4000){ |
| dojo.debug("Can't find a white point for temperatures under 4000K"); |
| return [0,0]; |
| } |
| if(T>25000){ |
| dojo.debug("Can't find a white point for temperatures over 25000K"); |
| return [0,0]; |
| } |
| var T1=T; |
| var T2=T*T; |
| var T3=T2*T; |
| var _95=Math.pow(10,9); |
| var _96=Math.pow(10,6); |
| var _97=Math.pow(10,3); |
| if(T<=7000){ |
| var x=(-4.607*_95/T3)+(2.9678*_96/T2)+(0.09911*_97/T)+0.244063; |
| }else{ |
| var x=(-2.0064*_95/T3)+(1.9018*_96/T2)+(0.24748*_97/T)+0.23704; |
| } |
| var y=-3*x*x+2.87*x-0.275; |
| return [x,y]; |
| }; |
| dojo.gfx.Colorspace.prototype.RGB_to_CMY=function(){ |
| var src=this.munge("RGB",arguments); |
| var C=1-src.R; |
| var M=1-src.G; |
| var Y=1-src.B; |
| return [C,M,Y]; |
| }; |
| dojo.gfx.Colorspace.prototype.CMY_to_RGB=function(){ |
| var src=this.munge("CMY",arguments); |
| var R=1-src.C; |
| var G=1-src.M; |
| var B=1-src.Y; |
| return [R,G,B]; |
| }; |
| dojo.gfx.Colorspace.prototype.RGB_to_CMYK=function(){ |
| var src=this.munge("RGB",arguments); |
| var K=Math.min(1-src.R,1-src.G,1-src.B); |
| var C=(1-src.R-K)/(1-K); |
| var M=(1-src.G-K)/(1-K); |
| var Y=(1-src.B-K)/(1-K); |
| return [C,M,Y,K]; |
| }; |
| dojo.gfx.Colorspace.prototype.CMYK_to_RGB=function(){ |
| var src=this.munge("CMYK",arguments); |
| var R=1-Math.min(1,src.C*(1-src.K)+src.K); |
| var G=1-Math.min(1,src.M*(1-src.K)+src.K); |
| var B=1-Math.min(1,src.Y*(1-src.K)+src.K); |
| return [R,G,B]; |
| }; |
| dojo.gfx.Colorspace.prototype.CMY_to_CMYK=function(){ |
| var src=this.munge("CMY",arguments); |
| var K=Math.min(src.C,src.M,src.Y); |
| var C=(src.C-K)/(1-K); |
| var M=(src.M-K)/(1-K); |
| var Y=(src.Y-K)/(1-K); |
| return [C,M,Y,K]; |
| }; |
| dojo.gfx.Colorspace.prototype.CMYK_to_CMY=function(){ |
| var src=this.munge("CMYK",arguments); |
| var C=Math.min(1,src.C*(1-src.K)+src.K); |
| var M=Math.min(1,src.M*(1-src.K)+src.K); |
| var Y=Math.min(1,src.Y*(1-src.K)+src.K); |
| return [C,M,Y]; |
| }; |
| dojo.gfx.Colorspace.prototype.RGB_to_HSV=function(){ |
| var src=this.munge("RGB",arguments); |
| var min=Math.min(src.R,src.G,src.B); |
| var V=Math.max(src.R,src.G,src.B); |
| var _b7=V-min; |
| var H=null; |
| var S=(V==0)?0:_b7/V; |
| if(S==0){ |
| H=0; |
| }else{ |
| if(src.R==V){ |
| H=60*(src.G-src.B)/_b7; |
| }else{ |
| if(src.G==V){ |
| H=120+60*(src.B-src.R)/_b7; |
| }else{ |
| if(src.B==V){ |
| H=240+60*(src.R-src.G)/_b7; |
| } |
| } |
| } |
| if(H<0){ |
| H+=360; |
| } |
| } |
| H=(H==0)?360:H; |
| return [H,S,V]; |
| }; |
| dojo.gfx.Colorspace.prototype.HSV_to_RGB=function(){ |
| var src=this.munge("HSV",arguments); |
| if(src.H==360){ |
| src.H=0; |
| } |
| var r=null; |
| var g=null; |
| var b=null; |
| if(src.S==0){ |
| var R=src.V; |
| var G=src.V; |
| var B=src.V; |
| }else{ |
| var _c1=src.H/60; |
| var i=Math.floor(_c1); |
| var f=_c1-i; |
| var p=src.V*(1-src.S); |
| var q=src.V*(1-(src.S*f)); |
| var t=src.V*(1-(src.S*(1-f))); |
| switch(i){ |
| case 0: |
| R=src.V; |
| G=t; |
| B=p; |
| break; |
| case 1: |
| R=q; |
| G=src.V; |
| B=p; |
| break; |
| case 2: |
| R=p; |
| G=src.V; |
| B=t; |
| break; |
| case 3: |
| R=p; |
| G=q; |
| B=src.V; |
| break; |
| case 4: |
| R=t; |
| G=p; |
| B=src.V; |
| break; |
| case 5: |
| R=src.V; |
| G=p; |
| B=q; |
| break; |
| } |
| } |
| return [R,G,B]; |
| }; |
| dojo.gfx.Colorspace.prototype.RGB_to_HSL=function(){ |
| var src=this.munge("RGB",arguments); |
| var min=Math.min(src.R,src.G,src.B); |
| var max=Math.max(src.R,src.G,src.B); |
| var _ca=max-min; |
| var H=0; |
| var S=0; |
| var L=(min+max)/2; |
| if((L>0)&&(L<1)){ |
| S=_ca/((L<0.5)?(2*L):(2-2*L)); |
| } |
| if(_ca>0){ |
| if((max==src.R)&&(max!=src.G)){ |
| H+=(src.G-src.B)/_ca; |
| } |
| if((max==src.G)&&(max!=src.B)){ |
| H+=(2+(src.B-src.R)/_ca); |
| } |
| if((max==src.B)&&(max!=src.R)){ |
| H+=(4+(src.R-src.G)/_ca); |
| } |
| H*=60; |
| } |
| H=(H==0)?360:H; |
| return [H,S,L]; |
| }; |
| dojo.gfx.Colorspace.prototype.HSL_to_RGB=function(){ |
| var src=this.munge("HSL",arguments); |
| while(src.H<0){ |
| src.H+=360; |
| } |
| while(src.H>=360){ |
| src.H-=360; |
| } |
| var R=0; |
| var G=0; |
| var B=0; |
| if(src.H<120){ |
| R=(120-src.H)/60; |
| G=src.H/60; |
| B=0; |
| }else{ |
| if(src.H<240){ |
| R=0; |
| G=(240-src.H)/60; |
| B=(src.H-120)/60; |
| }else{ |
| R=(src.H-240)/60; |
| G=0; |
| B=(360-src.H)/60; |
| } |
| } |
| R=2*src.S*Math.min(R,1)+(1-src.S); |
| G=2*src.S*Math.min(G,1)+(1-src.S); |
| B=2*src.S*Math.min(B,1)+(1-src.S); |
| if(src.L<0.5){ |
| R=src.L*R; |
| G=src.L*G; |
| B=src.L*B; |
| }else{ |
| R=(1-src.L)*R+2*src.L-1; |
| G=(1-src.L)*G+2*src.L-1; |
| B=(1-src.L)*B+2*src.L-1; |
| } |
| return [R,G,B]; |
| }; |