Skip to content

Commit 4d297e1

Browse files
committed
[css-color-hdr][editorial] code refactor to eliminate verbose matrix names
1 parent 92032ab commit 4d297e1

File tree

1 file changed

+48
-42
lines changed

1 file changed

+48
-42
lines changed

css-color-hdr-1/ICtCp.js

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,37 @@
1-
const c1 = 3424 / 4096;
2-
const c2 = 2413 / 128;
3-
const c3 = 2392 / 128;
4-
const m1 = 2610 / 16384;
5-
const m2 = 2523 / 32;
6-
const im1 = 16384 / 2610;
7-
const im2 = 32 / 2523;
8-
9-
// The matrix below includes the 4% crosstalk components
10-
// and is from the procedure in the Dolby "What is ICtCp" paper"
11-
const XYZtoICtCp_LMS_M = [
12-
[ 0.3592832590121217, 0.6976051147779502, -0.0358915932320290 ],
13-
[ -0.1920808463704993, 1.1004767970374321, 0.0753748658519118 ],
14-
[ 0.0070797844607479, 0.0748396662186362, 0.8433265453898765 ],
15-
];
16-
17-
// This matrix includes the Ebner LMS coefficients,
18-
// the rotation, and the scaling to [-0.5,0.5] range
19-
// rational terms are from Fröhlich p.97
20-
// and ITU-R BT.2124-0 pp.2-3
21-
const ICtCp_LMStoIPT_M = [
22-
[ 2048 / 4096, 2048 / 4096, 0 ],
23-
[ 6610 / 4096, -13613 / 4096, 7003 / 4096 ],
24-
[ 17933 / 4096, -17390 / 4096, -543 / 4096 ],
25-
];
26-
27-
// inverted matrices, calculated from the above
28-
const IPTtoICtCp_LMS_M = [
29-
[ 0.9999999999999998, 0.0086090370379328, 0.1110296250030260 ],
30-
[ 0.9999999999999998, -0.0086090370379328, -0.1110296250030259 ],
31-
[ 0.9999999999999998, 0.5600313357106791, -0.3206271749873188 ],
32-
];
33-
34-
const ICtCp_LMStoXYZ_M = [
35-
[ 2.0701522183894223, -1.3263473389671563, 0.2066510476294053 ],
36-
[ 0.3647385209748072, 0.6805660249472273, -0.0453045459220347 ],
37-
[ -0.0497472075358123, -0.0492609666966131, 1.1880659249923042 ],
38-
];
391

402
function XYZ_to_ICtCp (XYZ) {
413
// convert an array of absolute, D65 XYZ to the ICtCp form of LMS
424

43-
let LMS = multiplyMatrices(XYZtoICtCp_LMS_M, XYZ);
5+
// The matrix below includes the 4% crosstalk components
6+
// and is from the procedure in the Dolby "What is ICtCp" paper"
7+
const M = [
8+
[ 0.3592832590121217, 0.6976051147779502, -0.0358915932320290 ],
9+
[ -0.1920808463704993, 1.1004767970374321, 0.0753748658519118 ],
10+
[ 0.0070797844607479, 0.0748396662186362, 0.8433265453898765 ],
11+
];
12+
13+
let LMS = multiplyMatrices(M, XYZ);
4414
return LMStoICtCp(LMS);
4515
}
4616

4717
function LMStoICtCp (LMS) {
18+
19+
const c1 = 3424 / 4096;
20+
const c2 = 2413 / 128;
21+
const c3 = 2392 / 128;
22+
const m1 = 2610 / 16384;
23+
const m2 = 2523 / 32;
24+
25+
// This matrix includes the Ebner LMS coefficients,
26+
// the rotation, and the scaling to [-0.5,0.5] range
27+
// rational terms are from Fröhlich p.97
28+
// and ITU-R BT.2124-0 pp.2-3
29+
const M = [
30+
[ 2048 / 4096, 2048 / 4096, 0 ],
31+
[ 6610 / 4096, -13613 / 4096, 7003 / 4096 ],
32+
[ 17933 / 4096, -17390 / 4096, -543 / 4096 ],
33+
];
34+
4835
// apply the PQ EOTF
4936
// we can't ever be dividing by zero because of the "1 +" in the denominator
5037
let PQLMS = LMS.map (function (val) {
@@ -55,18 +42,37 @@ function LMStoICtCp (LMS) {
5542
});
5643

5744
// LMS to IPT, with rotation for Y'C'bC'r compatibility
58-
return multiplyMatrices(LMStoIPT_M, PQLMS);
45+
return multiplyMatrices(M, PQLMS);
5946
}
6047

6148
function ICtCp_to_XYZ (ICtCp) {
6249
// convert ICtCp to an array of absolute, D65 XYZ
6350

51+
const M = [
52+
[ 2.0701522183894223, -1.3263473389671563, 0.2066510476294053 ],
53+
[ 0.3647385209748072, 0.6805660249472273, -0.0453045459220347 ],
54+
[ -0.0497472075358123, -0.0492609666966131, 1.1880659249923042 ],
55+
];
56+
6457
let LMS = ICtCptoLMS(ICtCp);
65-
return multiplyMatrices(ICtCp_LMStoXYZ_M, LMS);
58+
return multiplyMatrices(M, LMS);
6659
}
6760

6861
function ICtCptoLMS (ICtCp) {
69-
let PQLMS = multiplyMatrices(IPTtoICtCp_LMS_M, ICtCp);
62+
63+
const c1 = 3424 / 4096;
64+
const c2 = 2413 / 128;
65+
const c3 = 2392 / 128;
66+
const im1 = 16384 / 2610;
67+
const im2 = 32 / 2523;
68+
69+
const M = [
70+
[ 0.9999999999999998, 0.0086090370379328, 0.1110296250030260 ],
71+
[ 0.9999999999999998, -0.0086090370379328, -0.1110296250030259 ],
72+
[ 0.9999999999999998, 0.5600313357106791, -0.3206271749873188 ],
73+
];
74+
75+
let PQLMS = multiplyMatrices(M, ICtCp);
7076

7177
// Undo PQ encoding, From BT.2124-0 Annex 2 Conversion 3
7278
let LMS = PQLMS.map (function (val) {

0 commit comments

Comments
 (0)