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;
|