mirror of https://github.com/thangisme/notes.git
65 lines
2.4 KiB
JavaScript
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
|
|
);
|
|
}
|
|
});
|
|
};
|