notes/node_modules/onecolor/lib/XYZ.js

65 lines
2.4 KiB
JavaScript

module.exports = function XYZ(color) {
color.installColorSpace('XYZ', ['x', 'y', 'z', 'alpha'], {
fromRgb: function () {
// http://www.easyrgb.com/index.php?X=MATH&H=02#text2
var convert = function (channel) {
return channel > 0.04045 ?
Math.pow((channel + 0.055) / 1.055, 2.4) :
channel / 12.92;
},
r = convert(this._red),
g = convert(this._green),
b = convert(this._blue);
// Reference white point sRGB D65:
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
return new color.XYZ(
r * 0.4124564 + g * 0.3575761 + b * 0.1804375,
r * 0.2126729 + g * 0.7151522 + b * 0.0721750,
r * 0.0193339 + g * 0.1191920 + b * 0.9503041,
this._alpha
);
},
rgb: function () {
// http://www.easyrgb.com/index.php?X=MATH&H=01#text1
var x = this._x,
y = this._y,
z = this._z,
convert = function (channel) {
return channel > 0.0031308 ?
1.055 * Math.pow(channel, 1 / 2.4) - 0.055 :
12.92 * channel;
};
// Reference white point sRGB D65:
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
return new color.RGB(
convert(x * 3.2404542 + y * -1.5371385 + z * -0.4985314),
convert(x * -0.9692660 + y * 1.8760108 + z * 0.0415560),
convert(x * 0.0556434 + y * -0.2040259 + z * 1.0572252),
this._alpha
);
},
lab: function () {
// http://www.easyrgb.com/index.php?X=MATH&H=07#text7
var convert = function (channel) {
return channel > 0.008856 ?
Math.pow(channel, 1 / 3) :
7.787037 * channel + 4 / 29;
},
x = convert(this._x / 95.047),
y = convert(this._y / 100.000),
z = convert(this._z / 108.883);
return new color.LAB(
(116 * y) - 16,
500 * (x - y),
200 * (y - z),
this._alpha
);
}
});
};