Clazz.declarePackage ("JSV.common");
Clazz.load (["JSV.api.VisibleInterface"], "JSV.common.Visible", ["JU.CU"], function () {
c$ = Clazz.declareType (JSV.common, "Visible", null, JSV.api.VisibleInterface);
Clazz.makeConstructor (c$, 
function () {
});
Clazz.overrideMethod (c$, "getColour", 
function (spec, useFitted) {
var xyCoords = spec.getXYCoords ();
var isAbsorbance = spec.isAbsorbance ();
var xyzd =  Clazz.newDoubleArray (4, 0);
JSV.common.Visible.getXYZfitted (xyCoords, isAbsorbance, xyzd);
xyzd[0] /= xyzd[3];
xyzd[1] /= xyzd[3];
xyzd[2] /= xyzd[3];
var rgb =  Clazz.newDoubleArray (-1, [xyzd[0] * 3.2410 + xyzd[1] * -1.5374 + xyzd[2] * -0.4986, xyzd[0] * -0.9692 + xyzd[1] * 1.8760 + xyzd[2] * 0.0416, xyzd[0] * 0.0556 + xyzd[1] * -0.204 + xyzd[2] * 1.0570]);
var gamma = 2.4;
for (var i = 0; i < 3; i++) rgb[i] = (rgb[i] > 0.00304 ? 1.055 * Math.pow (rgb[i], 1 / gamma) - 0.055 : 12.92 * rgb[i]);

var c = JU.CU.rgb (JSV.common.Visible.fix (rgb[0]), JSV.common.Visible.fix (rgb[1]), JSV.common.Visible.fix (rgb[2]));
return c;
}, "JSV.common.Spectrum,~B");
c$.fix = Clazz.defineMethod (c$, "fix", 
 function (d) {
return (d <= 0 ? 0 : d >= 1 ? 255 : Math.round (255 * d));
}, "~N");
c$.getXYZfitted = Clazz.defineMethod (c$, "getXYZfitted", 
 function (xyCoords, isAbsorbance, xyzd) {
var cie;
var xb;
var yb;
var zb;
for (var i = xyCoords.length; --i >= 0; ) {
var x = xyCoords[i].getXVal ();
if (x < 400 || x > 700) continue;
cie = JSV.common.Visible.gauss (15.2438, 4.99542E-03, x - 412.281) + JSV.common.Visible.gauss (92.747, 1.12996E-05, x - 540.046) + JSV.common.Visible.gauss (13.8872, 5.16966E-04, x - 525.74) + JSV.common.Visible.gauss (16.7377, 5.55018E-03, x - 448.038) + JSV.common.Visible.gauss (23.9973, 1.28306E-03, x - 469.107) + JSV.common.Visible.gauss (5.68614, 1.03616E-02, x - 672.024);
xb = JSV.common.Visible.gauss (1.06561, 0.000500819, x - 598.623) + JSV.common.Visible.gauss (0.283831, 0.00292745, x - 435.734) + JSV.common.Visible.gauss (0.113771, 0.00192849, x - 549.271) + JSV.common.Visible.gauss (0.239103, 0.00255944, x - 460.547);
yb = JSV.common.Visible.gauss (0.239617, 0.00117296, x - 530.517) + JSV.common.Visible.gauss (0.910377, 0.000300984, x - 565.635) + JSV.common.Visible.gauss (0.0311013, 0.00152386, x - 463.833);
zb = JSV.common.Visible.gauss (0.988366, 0.00220336, x - 456.345) + JSV.common.Visible.gauss (0.381551, 0.000848554, x - 450.871) + JSV.common.Visible.gauss (0.355693, 0.000628546, x - 470.668) + JSV.common.Visible.gauss (0.81862, 0.00471059, x - 433.144);
var y = xyCoords[i].getYVal ();
if (isAbsorbance) y = Math.pow (10, -Math.max (y, 0));
xyzd[0] += y * xb * cie;
xyzd[1] += y * yb * cie;
xyzd[2] += y * zb * cie;
xyzd[3] += yb * cie;
}
}, "~A,~B,~A");
c$.gauss = Clazz.defineMethod (c$, "gauss", 
 function (a, b, x) {
return a * Math.exp (-b * x * x);
}, "~N,~N,~N");
});
