44 lines
994 B
JavaScript
44 lines
994 B
JavaScript
/*
|
||
Convert Rec. 2020 values to CIE XYZ D65
|
||
|
||
References:
|
||
* https://drafts.csswg.org/css-color/#color-conversion-code
|
||
* http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
|
||
* https://www.itu.int/rec/R-REC-BT.2020/en
|
||
*/
|
||
|
||
const α = 1.09929682680944;
|
||
const β = 0.018053968510807;
|
||
|
||
const linearize = v => {
|
||
let abs = Math.abs(v);
|
||
if (abs < β * 4.5) {
|
||
return v / 4.5;
|
||
}
|
||
return (Math.sign(v) || 1) * Math.pow((abs + α - 1) / α, 1 / 0.45);
|
||
};
|
||
|
||
const convertRec2020ToXyz65 = rec2020 => {
|
||
let r = linearize(rec2020.r);
|
||
let g = linearize(rec2020.g);
|
||
let b = linearize(rec2020.b);
|
||
let res = {
|
||
mode: 'xyz65',
|
||
x:
|
||
0.6369580483012911 * r +
|
||
0.1446169035862083 * g +
|
||
0.1688809751641721 * b,
|
||
y:
|
||
0.262700212011267 * r +
|
||
0.6779980715188708 * g +
|
||
0.059301716469862 * b,
|
||
z: 0 * r + 0.0280726930490874 * g + 1.0609850577107909 * b
|
||
};
|
||
if (rec2020.alpha !== undefined) {
|
||
res.alpha = rec2020.alpha;
|
||
}
|
||
return res;
|
||
};
|
||
|
||
export default convertRec2020ToXyz65;
|