Parse CICP tags, and put the HDR metadata in skcms_Profile
Bug: skia:13735
Bug: chromium:1359081
Change-Id: I8288e129687e2f5c1670e8b7d5a62e4e28dbc72d
Reviewed-on: https://skia-review.googlesource.com/c/skcms/+/580818
Commit-Queue: Christopher Cameron <ccameron@google.com>
Auto-Submit: Brian Osman <brianosman@google.com>
Reviewed-by: Christopher Cameron <ccameron@google.com>
diff --git a/profiles/misc/P3_PQ_cicp.icc b/profiles/misc/P3_PQ_cicp.icc
new file mode 100644
index 0000000..e4306c6
--- /dev/null
+++ b/profiles/misc/P3_PQ_cicp.icc
Binary files differ
diff --git a/profiles/misc/P3_PQ_cicp.icc.txt b/profiles/misc/P3_PQ_cicp.icc.txt
new file mode 100644
index 0000000..71a13bf
--- /dev/null
+++ b/profiles/misc/P3_PQ_cicp.icc.txt
@@ -0,0 +1,81 @@
+ Size : 0x00002204 : 8708
+ Data color space : 0x52474220 : 'RGB '
+ PCS : 0x58595A20 : 'XYZ '
+ Tag count : 0x0000000B : 11
+
+ Tag : Type : Size : Offset
+ ------ : ------ : ------ : --------
+ 'desc' : 'mluc' : 68 : 264
+ 'cprt' : 'mluc' : 36 : 332
+ 'wtpt' : 'XYZ ' : 20 : 368
+ 'chad' : 'sf32' : 44 : 388
+ 'cicp' : 'cicp' : 12 : 432
+ 'rXYZ' : 'XYZ ' : 20 : 444
+ 'gXYZ' : 'XYZ ' : 20 : 464
+ 'bXYZ' : 'XYZ ' : 20 : 484
+ 'rTRC' : 'curv' : 8204 : 504
+ 'gTRC' : 'curv' : 8204 : 504
+ 'bTRC' : 'curv' : 8204 : 504
+
+rTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+gTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+bTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+Best : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (D-gap: -8.361e-05) (f(1) = 0.999878)
+Inv : 0.141542, 1, 3.814697e-05, 2624.574, 4.577753e-05, 0, -0 (D-gap: 0.144727) (f(1) = 1.00001)
+Best Error: | 0.150819 0.150819 0.150819 |
+ XYZ : | 0.5151062 0.29196167 0.15715026 |
+ | 0.24118042 0.6922302 0.066589355 |
+ | -0.0010375976 0.041885376 0.78437805 |
+CHAD : | 1.0478515 0.022903442 -0.05014038 |
+ | 0.029571533 0.9904785 -0.017044067 |
+ | -0.009231567 0.015060424 0.7519683 |
+WTPT : | 0.9642028 1. 0.8249054 |
+CICP : CP: 12 TF: 16 MC: 0 FR: 1
+252 random bytes transformed to 84 linear XYZD50 pixels:
+ 0.02 0.04 0.01 0.35 0.68 0.04 0.03 0.06 0.00 0.00 0.00 0.01
+ 0.01 0.00 0.03 0.12 0.06 0.00 0.09 0.21 0.01 0.29 0.13 0.01
+ 0.00 0.00 0.00 0.24 0.11 0.00 0.39 0.27 0.01 0.03 0.04 0.00
+ 0.01 0.02 0.01 0.07 0.03 0.27 0.33 0.19 0.30 0.06 0.07 0.22
+ 0.09 0.10 0.03 0.02 0.03 0.00 0.02 0.01 0.05 0.37 0.19 0.00
+ 0.44 0.20 0.37 0.46 0.22 0.00 0.00 0.00 0.02 0.59 0.83 0.08
+ 0.37 0.17 0.28 0.19 0.38 0.02 0.03 0.01 0.16 0.04 0.09 0.02
+ 0.02 0.02 0.01 0.01 0.01 0.02 0.01 0.00 0.03 0.13 0.12 0.03
+ 0.30 0.67 0.10 0.42 0.20 0.11 0.05 0.13 0.01 0.09 0.14 0.16
+ 0.01 0.02 0.00 0.17 0.08 -0.00 0.12 0.29 0.02 0.00 0.00 0.00
+ 0.02 0.01 0.09 0.01 0.01 0.04 0.04 0.01 0.17 0.01 0.01 0.00
+ 0.04 0.07 0.10 0.00 0.00 0.00 0.01 0.01 0.00 0.08 0.04 0.00
+ 0.27 0.13 0.23 0.48 0.32 0.04 0.51 0.24 0.63 0.15 0.07 0.00
+ 0.04 0.09 0.01 0.08 0.19 0.02 0.00 0.00 0.00 0.25 0.60 0.04
+ 0.06 0.14 0.01 0.23 0.12 0.00 0.01 0.00 0.01 0.02 0.01 0.00
+ 0.00 0.00 0.01 0.00 0.00 0.00 0.03 0.02 0.00 0.06 0.04 0.08
+ 0.06 0.03 0.07 0.03 0.07 0.00 0.08 0.04 0.06 0.02 0.01 0.01
+ 0.01 0.01 0.04 0.06 0.06 0.20 0.01 0.02 0.00 0.04 0.02 0.19
+ 0.00 0.00 0.01 0.19 0.09 -0.00 0.12 0.28 0.02 0.00 0.00 0.00
+ 0.09 0.06 0.40 0.19 0.44 0.03 0.04 0.02 0.01 0.01 0.02 0.01
+ 0.12 0.06 0.00 0.10 0.22 0.02 0.08 0.04 0.00 0.05 0.05 0.17
+40 max error transforming back from XYZ:
+ 8 6 4 8 1 34 2 7 23 12 37 1 12 34 5 8 6 6 3 7 14
+ 5 29 3 8 21 18 6 13 7 3 8 1 2 6 12 29 3 5 2 25 7
+ 5 6 6 27 7 7 8 8 4 4 5 18 3 8 7 3 4 12 3 23 5
+ 1 27 10 14 6 2 4 0 5 4 10 7 6 5 13 17 6 8 22 8 1
+ 3 1 4 0 12 2 9 9 4 8 8 4 1 0 7 2 24 8 32 8 5
+ 1 8 8 8 4 18 7 9 38 5 6 8 35 26 28 4 30 8 27 6 6
+ 30 11 8 4 9 11 30 7 8 37 26 11 22 0 30 8 20 19 6 1 7
+ 2 8 5 3 1 2 7 22 10 7 8 7 28 7 2 7 33 19 33 1 31
+ 14 8 15 6 1 40 6 25 5 3 11 26 2 33 0 3 0 10 6 16 11
+ 7 3 8 7 15 7 24 8 7 8 7 7 4 1 5 19 5 5 2 6 8
+ 23 3 20 12 16 8 25 36 0 6 5 36 15 6 4 2 13 21 17 5 5
+ 17 4 32 7 24 3 9 2 0 8 16 8 35 7 2 8 20 14 13 6 8
+81 edge-case pixels transformed to sRGB 8888 (unpremul):
+ 00000000 0000001b 000000ff 00001900 00001818 000000ff 0000ff00 0000ff00 0000ffff
+ 00190000 0019001b 000000ff 00181900 00181818 000000ff 0000ff00 0000ff00 0000ffff
+ 00ff0000 00ff001b 00ff00ff 00ff1900 00ff1818 00ff00ff 00ffff00 00ffff00 00ffffff
+ 7f000000 7f00001b 7f0000ff 7f001900 7f001818 7f0000ff 7f00ff00 7f00ff00 7f00ffff
+ 7f190000 7f19001b 7f0000ff 7f181900 7f181818 7f0000ff 7f00ff00 7f00ff00 7f00ffff
+ 7fff0000 7fff001b 7fff00ff 7fff1900 7fff1818 7fff00ff 7fffff00 7fffff00 7fffffff
+ ff000000 ff00001b ff0000ff ff001900 ff001818 ff0000ff ff00ff00 ff00ff00 ff00ffff
+ ff190000 ff19001b ff0000ff ff181900 ff181818 ff0000ff ff00ff00 ff00ff00 ff00ffff
+ ffff0000 ffff001b ffff00ff ffff1900 ffff1818 ffff00ff ffffff00 ffffff00 ffffffff
diff --git a/profiles/misc/Rec2020_HLG_cicp.icc b/profiles/misc/Rec2020_HLG_cicp.icc
new file mode 100644
index 0000000..2411a0c
--- /dev/null
+++ b/profiles/misc/Rec2020_HLG_cicp.icc
Binary files differ
diff --git a/profiles/misc/Rec2020_HLG_cicp.icc.txt b/profiles/misc/Rec2020_HLG_cicp.icc.txt
new file mode 100644
index 0000000..3f6733d
--- /dev/null
+++ b/profiles/misc/Rec2020_HLG_cicp.icc.txt
@@ -0,0 +1,81 @@
+ Size : 0x00002204 : 8708
+ Data color space : 0x52474220 : 'RGB '
+ PCS : 0x58595A20 : 'XYZ '
+ Tag count : 0x0000000B : 11
+
+ Tag : Type : Size : Offset
+ ------ : ------ : ------ : --------
+ 'desc' : 'mluc' : 68 : 264
+ 'cprt' : 'mluc' : 36 : 332
+ 'wtpt' : 'XYZ ' : 20 : 368
+ 'chad' : 'sf32' : 44 : 388
+ 'cicp' : 'cicp' : 12 : 432
+ 'rXYZ' : 'XYZ ' : 20 : 444
+ 'gXYZ' : 'XYZ ' : 20 : 464
+ 'bXYZ' : 'XYZ ' : 20 : 484
+ 'rTRC' : 'curv' : 8204 : 504
+ 'gTRC' : 'curv' : 8204 : 504
+ 'bTRC' : 'curv' : 8204 : 504
+
+rTRC : 16-bit table with 4096 entries
+ ~= : 3.924072, 1, -1.443923e-05, 0.05090687, 0.1528694, 0.007171631, 0 (Max error: 0.0850576) (D-gap: 1.89622e-05) (f(1) = 1.00711)
+gTRC : 16-bit table with 4096 entries
+ ~= : 3.924072, 1, -1.443923e-05, 0.05090687, 0.1528694, 0.007171631, 0 (Max error: 0.0850576) (D-gap: 1.89622e-05) (f(1) = 1.00711)
+bTRC : 16-bit table with 4096 entries
+ ~= : 3.924072, 1, -1.443923e-05, 0.05090687, 0.1528694, 0.007171631, 0 (Max error: 0.0850576) (D-gap: 1.89622e-05) (f(1) = 1.00711)
+Best : 3.924072, 1, -1.443923e-05, 0.05090687, 0.1528694, 0.007171631, 0 (D-gap: 1.89622e-05) (f(1) = 1.00711)
+Inv : 0.2548373, 1, -0.007171631, 19.64371, 0.007782101, 7.629395e-06, -0 (D-gap: -0.00120844) (f(1) = 0.998177)
+Best Error: | 0.0850576 0.0850576 0.0850576 |
+ XYZ : | 0.6734619 0.16566467 0.12510681 |
+ | 0.27903747 0.67533874 0.04562377 |
+ | -0.0019226074 0.02998352 0.7971649 |
+CHAD : | 1.0478515 0.022903442 -0.05014038 |
+ | 0.029571533 0.9904785 -0.017044067 |
+ | -0.009231567 0.015060424 0.7519683 |
+WTPT : | 0.9642028 1. 0.8249054 |
+CICP : CP: 9 TF: 18 MC: 0 FR: 1
+252 random bytes transformed to 84 linear XYZD50 pixels:
+ 0.05 0.14 0.07 0.39 0.74 0.03 0.10 0.18 0.03 0.05 0.02 0.08
+ 0.06 0.03 0.14 0.30 0.17 0.00 0.09 0.34 0.05 0.49 0.21 0.07
+ 0.05 0.04 0.03 0.45 0.21 0.06 0.59 0.46 0.01 0.12 0.16 0.01
+ 0.04 0.10 0.07 0.16 0.07 0.43 0.56 0.35 0.46 0.11 0.17 0.39
+ 0.24 0.27 0.12 0.09 0.14 0.03 0.09 0.04 0.17 0.57 0.33 0.01
+ 0.64 0.28 0.52 0.64 0.28 0.05 0.02 0.01 0.10 0.68 0.89 0.17
+ 0.58 0.24 0.44 0.26 0.53 0.06 0.07 0.03 0.32 0.08 0.23 0.10
+ 0.12 0.12 0.07 0.10 0.07 0.10 0.06 0.03 0.13 0.32 0.30 0.13
+ 0.26 0.70 0.21 0.62 0.27 0.26 0.07 0.26 0.01 0.19 0.30 0.32
+ 0.07 0.12 0.03 0.36 0.15 0.00 0.11 0.41 0.07 0.01 0.01 0.01
+ 0.04 0.02 0.24 0.05 0.06 0.15 0.06 0.02 0.34 0.07 0.07 0.00
+ 0.09 0.18 0.24 0.01 0.02 0.04 0.04 0.08 0.01 0.24 0.12 0.03
+ 0.49 0.26 0.40 0.68 0.50 0.14 0.69 0.34 0.70 0.34 0.16 0.05
+ 0.06 0.21 0.07 0.10 0.32 0.09 0.05 0.03 0.03 0.16 0.62 0.04
+ 0.10 0.29 0.05 0.44 0.25 0.01 0.06 0.04 0.06 0.11 0.08 0.02
+ 0.02 0.01 0.09 0.01 0.00 0.05 0.15 0.08 0.04 0.21 0.17 0.22
+ 0.21 0.11 0.20 0.06 0.18 0.01 0.23 0.10 0.19 0.11 0.04 0.06
+ 0.06 0.07 0.14 0.15 0.17 0.37 0.04 0.10 0.03 0.10 0.06 0.36
+ 0.03 0.01 0.08 0.38 0.16 0.00 0.13 0.41 0.02 0.00 0.00 0.02
+ 0.14 0.15 0.55 0.15 0.53 0.03 0.17 0.08 0.07 0.08 0.10 0.09
+ 0.31 0.15 0.05 0.10 0.36 0.09 0.23 0.11 0.04 0.12 0.16 0.33
+22 max error transforming back from XYZ:
+ 6 10 5 11 1 1 2 10 22 14 6 1 15 0 8 10 8 9 3 9 17
+ 6 19 3 10 21 20 7 16 9 4 11 7 4 9 8 19 6 7 4 21 9
+ 7 9 8 20 10 10 11 11 6 5 8 20 3 10 10 4 7 10 4 22 7
+ 2 21 12 9 5 4 6 0 8 5 10 9 9 6 16 19 9 11 22 11 3
+ 5 2 5 2 15 4 12 10 7 11 11 7 1 1 10 3 22 11 14 11 4
+ 2 11 11 11 7 20 9 7 6 9 8 10 2 21 20 9 18 11 21 8 9
+ 17 10 10 4 11 8 18 10 11 4 21 14 21 1 16 11 21 20 8 0 9
+ 2 11 7 3 0 3 10 21 13 8 11 9 20 10 2 9 4 20 7 2 15
+ 17 11 17 7 3 8 7 22 7 6 13 21 7 9 1 9 0 13 9 19 14
+ 10 5 11 11 18 11 22 11 10 11 6 10 6 1 6 21 6 8 3 9 10
+ 22 5 21 15 18 10 22 5 0 8 9 4 18 8 4 2 9 21 19 8 6
+ 19 5 13 10 22 4 12 3 1 10 19 11 3 9 1 11 21 17 16 9 10
+81 edge-case pixels transformed to sRGB 8888 (unpremul):
+ 00000000 00000068 000000ff 00005600 00005254 000000ff 0000ff00 0000ff00 0000ffff
+ 00560000 00550065 004d00ff 00525600 00515151 004900ff 0000ff00 0000ff00 0000ffff
+ 00ff0000 00ff0048 00ff00ff 00ff5200 00ff4d22 00ff00ff 00ffff00 00ffff00 00ffffff
+ 7f000000 7f000068 7f0000ff 7f005600 7f005254 7f0000ff 7f00ff00 7f00ff00 7f00ffff
+ 7f560000 7f550065 7f4d00ff 7f525600 7f515151 7f4900ff 7f00ff00 7f00ff00 7f00ffff
+ 7fff0000 7fff0048 7fff00ff 7fff5200 7fff4d22 7fff00ff 7fffff00 7fffff00 7fffffff
+ ff000000 ff000068 ff0000ff ff005600 ff005254 ff0000ff ff00ff00 ff00ff00 ff00ffff
+ ff560000 ff550065 ff4d00ff ff525600 ff515151 ff4900ff ff00ff00 ff00ff00 ff00ffff
+ ffff0000 ffff0048 ffff00ff ffff5200 ffff4d22 ffff00ff ffffff00 ffffff00 ffffffff
diff --git a/profiles/misc/Rec2020_PQ_cicp.icc b/profiles/misc/Rec2020_PQ_cicp.icc
new file mode 100644
index 0000000..0fb3f4d
--- /dev/null
+++ b/profiles/misc/Rec2020_PQ_cicp.icc
Binary files differ
diff --git a/profiles/misc/Rec2020_PQ_cicp.icc.txt b/profiles/misc/Rec2020_PQ_cicp.icc.txt
new file mode 100644
index 0000000..acfc56c
--- /dev/null
+++ b/profiles/misc/Rec2020_PQ_cicp.icc.txt
@@ -0,0 +1,81 @@
+ Size : 0x00002204 : 8708
+ Data color space : 0x52474220 : 'RGB '
+ PCS : 0x58595A20 : 'XYZ '
+ Tag count : 0x0000000B : 11
+
+ Tag : Type : Size : Offset
+ ------ : ------ : ------ : --------
+ 'desc' : 'mluc' : 68 : 264
+ 'cprt' : 'mluc' : 36 : 332
+ 'wtpt' : 'XYZ ' : 20 : 368
+ 'chad' : 'sf32' : 44 : 388
+ 'cicp' : 'cicp' : 12 : 432
+ 'rXYZ' : 'XYZ ' : 20 : 444
+ 'gXYZ' : 'XYZ ' : 20 : 464
+ 'bXYZ' : 'XYZ ' : 20 : 484
+ 'rTRC' : 'curv' : 8204 : 504
+ 'gTRC' : 'curv' : 8204 : 504
+ 'bTRC' : 'curv' : 8204 : 504
+
+rTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+gTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+bTRC : 16-bit table with 4096 entries
+ ~= : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (Max error: 0.150819) (D-gap: -8.361e-05) (f(1) = 0.999878)
+Best : 7.06504, 1, -1.122057e-05, 0.0003810142, 0.1201465, -3.814697e-05, 0 (D-gap: -8.361e-05) (f(1) = 0.999878)
+Inv : 0.141542, 1, 3.814697e-05, 2624.574, 4.577753e-05, 0, -0 (D-gap: 0.144727) (f(1) = 1.00001)
+Best Error: | 0.150819 0.150819 0.150819 |
+ XYZ : | 0.6734619 0.16566467 0.12510681 |
+ | 0.27903747 0.67533874 0.04562377 |
+ | -0.0019226074 0.02998352 0.7971649 |
+CHAD : | 1.0478515 0.022903442 -0.05014038 |
+ | 0.029571533 0.9904785 -0.017044067 |
+ | -0.009231567 0.015060424 0.7519683 |
+WTPT : | 0.9642028 1. 0.8249054 |
+CICP : CP: 9 TF: 16 MC: 0 FR: 1
+252 random bytes transformed to 84 linear XYZD50 pixels:
+ 0.01 0.04 0.01 0.26 0.67 0.03 0.02 0.05 0.00 0.00 0.00 0.01
+ 0.01 0.00 0.04 0.16 0.07 -0.00 0.05 0.21 0.01 0.37 0.15 0.01
+ 0.00 0.00 0.00 0.31 0.13 0.00 0.47 0.29 0.00 0.03 0.04 0.00
+ 0.01 0.02 0.01 0.06 0.02 0.27 0.39 0.20 0.31 0.05 0.06 0.22
+ 0.09 0.10 0.03 0.01 0.03 0.00 0.02 0.01 0.05 0.47 0.22 -0.00
+ 0.54 0.22 0.38 0.60 0.25 0.00 0.00 0.00 0.02 0.56 0.84 0.07
+ 0.46 0.19 0.28 0.13 0.38 0.02 0.03 0.01 0.16 0.03 0.09 0.02
+ 0.02 0.02 0.01 0.02 0.01 0.02 0.01 0.00 0.03 0.14 0.13 0.03
+ 0.18 0.66 0.09 0.54 0.22 0.11 0.03 0.13 0.01 0.07 0.13 0.16
+ 0.01 0.02 0.00 0.22 0.09 -0.00 0.07 0.28 0.02 0.00 0.00 0.00
+ 0.02 0.01 0.10 0.01 0.01 0.04 0.03 0.01 0.18 0.01 0.01 0.00
+ 0.03 0.06 0.10 0.00 0.00 0.00 0.00 0.01 0.00 0.10 0.04 0.00
+ 0.33 0.14 0.24 0.59 0.35 0.03 0.60 0.25 0.64 0.19 0.08 0.00
+ 0.02 0.09 0.01 0.05 0.18 0.02 0.00 0.00 0.00 0.14 0.58 0.03
+ 0.04 0.14 0.01 0.30 0.14 -0.00 0.01 0.00 0.01 0.02 0.01 0.00
+ 0.00 0.00 0.01 0.00 0.00 0.00 0.04 0.02 0.00 0.07 0.04 0.08
+ 0.07 0.03 0.07 0.02 0.06 0.00 0.09 0.04 0.06 0.02 0.01 0.01
+ 0.01 0.01 0.04 0.05 0.05 0.21 0.01 0.02 0.00 0.03 0.01 0.20
+ 0.00 0.00 0.01 0.25 0.10 -0.00 0.07 0.27 0.01 0.00 0.00 0.00
+ 0.07 0.05 0.41 0.11 0.43 0.02 0.05 0.02 0.01 0.01 0.02 0.01
+ 0.16 0.07 0.00 0.05 0.22 0.02 0.10 0.04 0.00 0.04 0.05 0.17
+39 max error transforming back from XYZ:
+ 8 6 4 8 1 34 2 7 23 12 37 1 12 34 5 8 6 6 3 7 14
+ 5 29 3 8 21 18 6 13 7 3 8 1 2 6 12 29 3 5 2 25 7
+ 5 6 6 27 7 7 8 8 4 4 5 18 3 8 7 3 4 12 3 23 5
+ 1 27 10 14 6 2 4 0 5 4 10 7 6 5 13 17 6 8 22 8 1
+ 3 1 4 0 12 2 9 9 4 8 8 4 1 0 7 2 24 8 32 8 5
+ 1 8 8 8 4 18 7 9 38 5 6 8 35 26 28 4 30 8 27 6 6
+ 30 11 8 4 9 11 30 7 8 37 26 11 22 0 30 8 20 19 6 1 7
+ 2 8 5 3 1 2 7 22 10 7 8 7 28 7 2 7 33 19 33 1 31
+ 14 8 15 6 1 3 6 25 5 3 11 26 39 33 0 3 0 10 6 16 11
+ 7 3 8 7 15 7 24 8 7 8 7 7 4 1 5 19 5 5 2 6 8
+ 23 3 20 12 16 8 25 36 0 6 5 36 15 6 4 2 13 21 17 5 5
+ 17 4 32 7 24 3 9 2 0 8 16 8 35 7 2 8 20 14 13 6 8
+81 edge-case pixels transformed to sRGB 8888 (unpremul):
+ 00000000 00000021 000000ff 00001a00 00001819 000000ff 0000ff00 0000ff00 0000ffff
+ 001a0000 00190020 000000ff 00181a00 00181818 000000ff 0000ff00 0000ff00 0000ffff
+ 00ff0000 00ff0000 00ff00ff 00ff0600 00ff0300 00ff00ff 00ffff00 00ffff00 00ffffff
+ 7f000000 7f000021 7f0000ff 7f001a00 7f001819 7f0000ff 7f00ff00 7f00ff00 7f00ffff
+ 7f1a0000 7f190020 7f0000ff 7f181a00 7f181818 7f0000ff 7f00ff00 7f00ff00 7f00ffff
+ 7fff0000 7fff0000 7fff00ff 7fff0600 7fff0300 7fff00ff 7fffff00 7fffff00 7fffffff
+ ff000000 ff000021 ff0000ff ff001a00 ff001819 ff0000ff ff00ff00 ff00ff00 ff00ffff
+ ff1a0000 ff190020 ff0000ff ff181a00 ff181818 ff0000ff ff00ff00 ff00ff00 ff00ffff
+ ffff0000 ffff0000 ffff00ff ffff0600 ffff0300 ffff00ff ffffff00 ffffff00 ffffffff
diff --git a/skcms.cc b/skcms.cc
index 7d3efa5..4db244d 100644
--- a/skcms.cc
+++ b/skcms.cc
@@ -293,6 +293,8 @@
skcms_Signature_CHAD = 0x63686164,
skcms_Signature_WTPT = 0x77747074,
+ skcms_Signature_CICP = 0x63696370,
+
// Type signatures
skcms_Signature_curv = 0x63757276,
skcms_Signature_mft1 = 0x6D667431,
@@ -1169,6 +1171,29 @@
return true;
}
+typedef struct {
+ uint8_t type [4];
+ uint8_t reserved [4];
+ uint8_t color_primaries [1];
+ uint8_t transfer_characteristics [1];
+ uint8_t matrix_coefficients [1];
+ uint8_t video_full_range_flag [1];
+} CICP_Layout;
+
+static bool read_cicp(const skcms_ICCTag* tag, skcms_CICP* cicp) {
+ if (tag->type != skcms_Signature_CICP || tag->size < SAFE_SIZEOF(CICP_Layout)) {
+ return false;
+ }
+
+ const CICP_Layout* cicpTag = (const CICP_Layout*)tag->buf;
+
+ cicp->color_primaries = cicpTag->color_primaries[0];
+ cicp->transfer_characteristics = cicpTag->transfer_characteristics[0];
+ cicp->matrix_coefficients = cicpTag->matrix_coefficients[0];
+ cicp->video_full_range_flag = cicpTag->video_full_range_flag[0];
+ return true;
+}
+
void skcms_GetTagByIndex(const skcms_ICCProfile* profile, uint32_t idx, skcms_ICCTag* tag) {
if (!profile || !profile->buffer || !tag) { return; }
if (idx > profile->tag_count) { return; }
@@ -1338,6 +1363,15 @@
}
}
+ skcms_ICCTag cicp_tag;
+ if (skcms_GetTagBySignature(profile, skcms_Signature_CICP, &cicp_tag)) {
+ if (!read_cicp(&cicp_tag, &profile->CICP)) {
+ // Malformed CICP tag
+ return false;
+ }
+ profile->has_CICP = true;
+ }
+
return usable_as_src(profile);
}
@@ -1432,6 +1466,9 @@
{{0, {0,0, 0,0,0,0,0}}},
},
},
+
+ false, // has_CICP, followed by cicp itself which we don't care about.
+ { 0, 0, 0, 0 },
};
return &sRGB_profile;
}
@@ -1525,6 +1562,9 @@
{{0, {0,0, 0,0,0,0,0}}},
},
},
+
+ false, // has_CICP, followed by cicp itself which we don't care about.
+ { 0, 0, 0, 0 },
};
return &XYZD50_profile;
diff --git a/skcms.h b/skcms.h
index 3e02d95..2ee5693 100644
--- a/skcms.h
+++ b/skcms.h
@@ -152,6 +152,12 @@
skcms_Curve output_curves[4];
} skcms_B2A;
+typedef struct skcms_CICP {
+ uint8_t color_primaries;
+ uint8_t transfer_characteristics;
+ uint8_t matrix_coefficients;
+ uint8_t video_full_range_flag;
+} skcms_CICP;
typedef struct skcms_ICCProfile {
const uint8_t* buffer;
@@ -185,6 +191,10 @@
bool has_B2A;
skcms_B2A B2A;
+ // If the profile has a valid CICP tag, skcms_Parse() sets CICP to that data,
+ // and has_CICP to true.
+ bool has_CICP;
+ skcms_CICP CICP;
} skcms_ICCProfile;
// The sRGB color profile is so commonly used that we offer a canonical skcms_ICCProfile for it.
diff --git a/test_only.c b/test_only.c
index 992ddbf..c2a00b1 100644
--- a/test_only.c
+++ b/test_only.c
@@ -402,6 +402,12 @@
print_shortest_float(fp, wtpt[2]); fprintf(fp, " |\n");
}
+ if (profile->has_CICP) {
+ fprintf(fp, "CICP : CP: %u TF: %u MC: %u FR: %u\n",
+ profile->CICP.color_primaries, profile->CICP.transfer_characteristics,
+ profile->CICP.matrix_coefficients, profile->CICP.video_full_range_flag);
+ }
+
dump_transform_to_XYZD50(fp, profile);
dump_transform_to_sRGBA (fp, profile);
if (skcms_ApproximatelyEqualProfiles(profile, skcms_sRGB_profile())) {
diff --git a/tests.c b/tests.c
index 1f0f404..92ea0fa 100644
--- a/tests.c
+++ b/tests.c
@@ -636,6 +636,11 @@
// User was (rightly) confused & convinced that profile was being ignored.
"profiles/misc/Calibrated_A2B_XYZ_Mismatch.icc", // chromium:1055154
+ // HDR profiles that include the new 'cicp' tag (from ICC 4.4.0)
+ "profiles/misc/P3_PQ_cicp.icc",
+ "profiles/misc/Rec2020_HLG_cicp.icc",
+ "profiles/misc/Rec2020_PQ_cicp.icc",
+
// fuzzer generated profiles that found parsing bugs
// Bad tag table data - these should not parse