Moved the color functions to their own .js file.
parent
e075ee3ad3
commit
291584e336
@ -0,0 +1,79 @@
|
||||
var $color = {};
|
||||
(function () {
|
||||
function Lab (l, a, b) { this.l = l; this.a = a; this.b = b; }
|
||||
$color.Lab = function (l,a,b) { return new Lab(l,a,b); };
|
||||
|
||||
function XYZ (x, y, z) { this.x = x; this.y = y; this.z = z; }
|
||||
$color.XYZ = function (l,a,b) { return new XYZ(x, y, z); };
|
||||
|
||||
function sRGBLinear (r, g, b) { this.r = r; this.g = g; this.b = b; }
|
||||
$color.sRGBLinear = function (r,g,b) { return new sRGBLinear(r,g,b); };
|
||||
|
||||
function sRGBPrime (r, g, b) { this.r = r; this.g = g; this.b = b; }
|
||||
$color.sRGBPrime = function (r,g,b) { return new sRGBPrime(r,g,b); };
|
||||
|
||||
function sRGB8 (r, g, b) { this.r = r; this.g = g; this.b = b; }
|
||||
$color.sRGB8 = function (r,g,b) { return new sRGB8(r,g,b); };
|
||||
$color.hex = function(color) { var num = parseInt(color.slice(1), 16); return new sRGB8((num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xFF); };
|
||||
|
||||
var D65 = new XYZ(0.9504, 1.0000, 1.0888);
|
||||
|
||||
Lab.prototype.XYZ = function () {
|
||||
var p = (this.l + 16.0) / 116.0;
|
||||
var x_part = p + this.a / 500.0;
|
||||
var z_part = (p - this.b / 200.0);
|
||||
return new XYZ( D65.x * x_part * x_part * x_part,
|
||||
D65.y * p * p * p,
|
||||
D65.z * z_part * z_part * z_part);
|
||||
};
|
||||
Lab.prototype.sRGB8 = function () { return this.XYZ().sRGBLinear().sRGBPrime().sRGB8(); };
|
||||
|
||||
function _XYZf(t) { if (t > 0.008856) { return Math.pow(t, 1.0/3.0); } else { return 7.787 * t + 16.0/116.0; } }
|
||||
XYZ.prototype.Lab = function () {
|
||||
var x_xn = this.x / D65.x;
|
||||
var y_yn = this.y / D65.y;
|
||||
var z_zn = this.z / D65.z;
|
||||
|
||||
var f_x_xn = _XYZf(x_xn);
|
||||
var f_y_yn = _XYZf(y_yn);
|
||||
var f_z_zn = _XYZf(z_zn);
|
||||
|
||||
return new Lab( y_yn > 0.008856 ? 116.8 * Math.pow(y_yn, 1.0/3.0) - 16 : 903.3 * y_yn,
|
||||
500.0 * (f_x_xn - f_y_yn),
|
||||
200.0 * (f_y_yn - f_z_zn) );
|
||||
};
|
||||
|
||||
var XYZ_TO_RGB = [
|
||||
[ 3.240479, -1.537150, -0.498535],
|
||||
[-0.969256, 1.875992, 0.041556],
|
||||
[ 0.055648, -0.204043, 1.057311]
|
||||
];
|
||||
|
||||
XYZ.prototype.sRGBLinear = function () {
|
||||
return new sRGBLinear( this.x * XYZ_TO_RGB[0][0] + this.y * XYZ_TO_RGB[0][1] + this.z * XYZ_TO_RGB[0][2],
|
||||
this.x * XYZ_TO_RGB[1][0] + this.y * XYZ_TO_RGB[1][1] + this.z * XYZ_TO_RGB[1][2],
|
||||
this.x * XYZ_TO_RGB[2][0] + this.y * XYZ_TO_RGB[2][1] + this.z * XYZ_TO_RGB[2][2] );
|
||||
};
|
||||
|
||||
var RGB_TO_XYZ = [
|
||||
[0.412453, 0.357580, 0.180423],
|
||||
[0.212671, 0.715160, 0.072169],
|
||||
[0.019334, 0.119193, 0.950227]
|
||||
];
|
||||
|
||||
sRGBLinear.prototype.XYZ = function () {
|
||||
return new XYZ( this.r * RGB_TO_XYZ[0][0] + this.g * RGB_TO_XYZ[0][1] + this.b * RGB_TO_XYZ[0][2],
|
||||
this.r * RGB_TO_XYZ[1][0] + this.g * RGB_TO_XYZ[1][1] + this.b * RGB_TO_XYZ[1][2],
|
||||
this.r * RGB_TO_XYZ[2][0] + this.g * RGB_TO_XYZ[2][1] + this.b * RGB_TO_XYZ[2][2] );
|
||||
};
|
||||
|
||||
var ALPHA = 0.055;
|
||||
function _linearToLog(c) { if ( c <= 0.0031308) { return 12.92 * c; } else { return (1 + ALPHA) * Math.pow(c, 1/2.4) - ALPHA; } }
|
||||
function _logToLinear(c) { if ( c <= 0.04045) { return c / 12.92; } else { return Math.pow((c + ALPHA) / (1 + ALPHA), 2.4); } }
|
||||
sRGBLinear.prototype.sRGBPrime = function () { return new sRGBPrime(_linearToLog(this.r), _linearToLog(this.g), _linearToLog(this.b)); };
|
||||
sRGBPrime.prototype.sRGBLinear = function () { return new sRGBLinear(_logToLinear(this.r), _logToLinear(this.g), _logToLinear(this.b)); };
|
||||
sRGBPrime.prototype.sRGB8 = function () { return new sRGB8(this.r * 255.0, this.g * 255.0, this.b * 255.0); };
|
||||
sRGB8.prototype.sRGBPrime = function () { return new sRGBPrime(this.r/255.0, this.g/255.0, this.b/255.0); };
|
||||
sRGB8.prototype.Lab = function () { return this.sRGBPrime().sRGBLinear().XYZ().Lab(); };
|
||||
sRGB8.prototype.hex = function () { return "#" + (0x1000000 + (((Math.min(this.r,0xff)&0xff) << 16) + ((Math.min(this.g,0xff)&0xff) << 8) + (Math.min(this.b,0xff)&0xff))).toString(16).slice(1); };
|
||||
})();
|
Loading…
Reference in New Issue