@@ -29,11 +29,19 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
2929 *ref = defaultColorSpace;
3030 *shouldRelease = FALSE ;
3131}
32+
3233static void CalcColorSpaceRGB (avifImage * avif, CGColorSpaceRef* ref, BOOL * shouldRelease) {
33- static CGColorSpaceRef defaultColorSpace;
34- static CGColorSpaceRef sRGB ;
35- static CGColorSpaceRef bt709;
36- static CGColorSpaceRef bt2020;
34+ static CGColorSpaceRef defaultColorSpace = NULL ;
35+ static CGColorSpaceRef sRGB = NULL ;
36+ static CGColorSpaceRef bt709 = NULL ;
37+ static CGColorSpaceRef bt2020 = NULL ;
38+ static CGColorSpaceRef bt2020hlg = NULL ;
39+ static CGColorSpaceRef bt2020pq = NULL ;
40+ static CGColorSpaceRef bt2020linear = NULL ;
41+ static CGColorSpaceRef p3 = NULL ;
42+ static CGColorSpaceRef p3hlg = NULL ;
43+ static CGColorSpaceRef p3pq = NULL ;
44+ static CGColorSpaceRef p3linear = NULL ;
3745 {
3846 static dispatch_once_t onceToken;
3947 dispatch_once (&onceToken, ^{
@@ -45,13 +53,35 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
4553 }
4654 if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
4755 bt709 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_709 );
56+ bt2020 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020 );
4857 } else {
4958 bt709 = defaultColorSpace;
59+ bt2020 = defaultColorSpace;
60+ bt2020hlg = defaultColorSpace;
5061 }
51- if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
52- bt2020 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020 );
62+ if (@available (macOS 10.11.2 , iOS 9.3 , tvOS 9.3 , *)) {
63+ p3 = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3 );
5364 } else {
54- bt2020 = defaultColorSpace;
65+ p3 = defaultColorSpace;
66+ }
67+ if (@available (macOS 10.14.3 , iOS 12.3 , tvOS 12.3 , *)) {
68+ p3linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearDisplayP3 );
69+ bt2020linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearITUR_2020 );
70+ } else {
71+ p3linear = defaultColorSpace;
72+ bt2020linear = defaultColorSpace;
73+ }
74+ if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
75+ bt2020hlg = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_HLG );
76+ p3hlg = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_HLG );
77+ bt2020pq = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_PQ_EOTF );
78+ p3pq = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_PQ_EOTF );
79+
80+ } else {
81+ bt2020hlg = defaultColorSpace;
82+ p3hlg = defaultColorSpace;
83+ bt2020pq = defaultColorSpace;
84+ p3pq = defaultColorSpace;
5585 }
5686 });
5787 }
@@ -65,24 +95,71 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
6595 }
6696 uint16_t colorPrimaries = avif->nclx .colourPrimaries ;
6797 uint16_t transferCharacteristics = avif->nclx .transferCharacteristics ;
68- if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_UNKNOWN && transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_UNKNOWN) {
98+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_UNKNOWN &&
99+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_UNKNOWN) {
69100 goto default_color_space;
70101 }
71- if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT709 && transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT709) {
102+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT709 &&
103+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT709) {
72104 *ref = bt709;
73105 *shouldRelease = FALSE ;
74106 return ;
75107 }
76- if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT709 && transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_SRGB) {
108+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_SRGB &&
109+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_SRGB) {
77110 *ref = sRGB ;
78111 *shouldRelease = FALSE ;
79112 return ;
80113 }
81- if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 && (transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_10BIT || transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_12BIT)) {
114+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
115+ (transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_10BIT ||
116+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_12BIT)) {
82117 *ref = bt2020;
83118 *shouldRelease = FALSE ;
84119 return ;
85120 }
121+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
122+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_LINEAR) {
123+ *ref = bt2020linear;
124+ *shouldRelease = FALSE ;
125+ return ;
126+ }
127+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
128+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_HLG) {
129+ *ref = bt2020hlg;
130+ *shouldRelease = FALSE ;
131+ return ;
132+ }
133+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
134+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_PQ) {
135+ *ref = bt2020pq;
136+ *shouldRelease = FALSE ;
137+ return ;
138+ }
139+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
140+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_SRGB) {
141+ *ref = p3;
142+ *shouldRelease = FALSE ;
143+ return ;
144+ }
145+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
146+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_HLG) {
147+ *ref = p3hlg;
148+ *shouldRelease = FALSE ;
149+ return ;
150+ }
151+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
152+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_PQ) {
153+ *ref = p3pq;
154+ *shouldRelease = FALSE ;
155+ return ;
156+ }
157+ if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
158+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_LINEAR) {
159+ *ref = p3linear;
160+ *shouldRelease = FALSE ;
161+ return ;
162+ }
86163
87164default_color_space:
88165 *ref = defaultColorSpace;
0 commit comments