@@ -32,63 +32,10 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
3232
3333static void CalcColorSpaceRGB (avifImage * avif, CGColorSpaceRef* ref, BOOL * shouldRelease) {
3434 static CGColorSpaceRef defaultColorSpace = NULL ;
35- static CGColorSpaceRef sRGB = NULL ;
36- static CGColorSpaceRef sRGBlinear = NULL ;
37- static CGColorSpaceRef bt709 = NULL ;
38- static CGColorSpaceRef bt2020 = NULL ;
39- static CGColorSpaceRef bt2020hlg = NULL ;
40- static CGColorSpaceRef bt2020pq = NULL ;
41- static CGColorSpaceRef bt2020linear = NULL ;
42- static CGColorSpaceRef p3 = NULL ;
43- static CGColorSpaceRef p3hlg = NULL ;
44- static CGColorSpaceRef p3pq = NULL ;
45- static CGColorSpaceRef p3linear = NULL ;
4635 {
4736 static dispatch_once_t onceToken;
4837 dispatch_once (&onceToken, ^{
4938 defaultColorSpace = CGColorSpaceCreateDeviceRGB ();
50- if (@available (macOS 10.5 , iOS 9.0 , tvOS 9.0 , *)) {
51- sRGB = CGColorSpaceCreateWithName (kCGColorSpaceSRGB );
52- } else {
53- sRGB = defaultColorSpace;
54- }
55- if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
56- bt709 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_709 );
57- bt2020 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020 );
58- } else {
59- bt709 = defaultColorSpace;
60- bt2020 = defaultColorSpace;
61- bt2020hlg = defaultColorSpace;
62- }
63- if (@available (macOS 10.11.2 , iOS 9.3 , tvOS 9.3 , *)) {
64- p3 = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3 );
65- } else {
66- p3 = defaultColorSpace;
67- }
68- if (@available (macOS 10.12 , iOS 10.0 , tvOS 10.0 , *)) {
69- sRGBlinear = CGColorSpaceCreateWithName (kCGColorSpaceLinearSRGB );
70- } else {
71- sRGBlinear = defaultColorSpace;
72- }
73- if (@available (macOS 10.14.3 , iOS 12.3 , tvOS 12.3 , *)) {
74- p3linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearDisplayP3 );
75- bt2020linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearITUR_2020 );
76- } else {
77- p3linear = defaultColorSpace;
78- bt2020linear = defaultColorSpace;
79- }
80- if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
81- bt2020hlg = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_HLG );
82- p3hlg = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_HLG );
83- bt2020pq = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_PQ_EOTF );
84- p3pq = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_PQ_EOTF );
85-
86- } else {
87- bt2020hlg = defaultColorSpace;
88- p3hlg = defaultColorSpace;
89- bt2020pq = defaultColorSpace;
90- p3pq = defaultColorSpace;
91- }
9239 });
9340 }
9441
@@ -101,79 +48,182 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
10148 }
10249 uint16_t colorPrimaries = avif->nclx .colourPrimaries ;
10350 uint16_t transferCharacteristics = avif->nclx .transferCharacteristics ;
104- if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_UNKNOWN &&
105- transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_UNKNOWN) {
106- goto default_color_space;
51+ if ((colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_UNKNOWN ||
52+ colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_UNSPECIFIED) &&
53+ (transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_UNKNOWN ||
54+ transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_UNSPECIFIED)) {
55+ *ref = defaultColorSpace;
56+ *shouldRelease = FALSE ;
57+ return ;
10758 }
10859 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT709 &&
10960 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT709) {
61+ static CGColorSpaceRef bt709 = NULL ;
62+ static dispatch_once_t onceToken;
63+ dispatch_once (&onceToken, ^{
64+ if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
65+ bt709 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_709 );
66+ } else {
67+ bt709 = defaultColorSpace;
68+ }
69+ });
11070 *ref = bt709;
11171 *shouldRelease = FALSE ;
11272 return ;
11373 }
11474 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_SRGB &&
11575 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_SRGB) {
76+ static CGColorSpaceRef sRGB = NULL ;
77+ static dispatch_once_t onceToken;
78+ dispatch_once (&onceToken, ^{
79+ if (@available (macOS 10.5 , iOS 9.0 , tvOS 9.0 , *)) {
80+ sRGB = CGColorSpaceCreateWithName (kCGColorSpaceSRGB );
81+ } else {
82+ sRGB = defaultColorSpace;
83+ }
84+ });
11685 *ref = sRGB ;
11786 *shouldRelease = FALSE ;
11887 return ;
11988 }
12089 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_SRGB &&
12190 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_LINEAR) {
91+ static CGColorSpaceRef sRGBlinear = NULL ;
92+ static dispatch_once_t onceToken;
93+ dispatch_once (&onceToken, ^{
94+ if (@available (macOS 10.12 , iOS 10.0 , tvOS 10.0 , *)) {
95+ sRGBlinear = CGColorSpaceCreateWithName (kCGColorSpaceLinearSRGB );
96+ } else {
97+ sRGBlinear = defaultColorSpace;
98+ }
99+ });
122100 *ref = sRGBlinear ;
123101 *shouldRelease = FALSE ;
124102 return ;
125103 }
126104 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
127105 (transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_10BIT ||
128106 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_12BIT)) {
107+ static CGColorSpaceRef bt2020 = NULL ;
108+ static dispatch_once_t onceToken;
109+ dispatch_once (&onceToken, ^{
110+ if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
111+ bt2020 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020 );
112+ } else {
113+ bt2020 = defaultColorSpace;
114+ }
115+ });
129116 *ref = bt2020;
130117 *shouldRelease = FALSE ;
131118 return ;
132119 }
133120 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
134121 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_LINEAR) {
122+ static CGColorSpaceRef bt2020linear = NULL ;
123+ static dispatch_once_t onceToken;
124+ dispatch_once (&onceToken, ^{
125+ if (@available (macOS 10.14.3 , iOS 12.3 , tvOS 12.3 , *)) {
126+ bt2020linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearITUR_2020 );
127+ } else {
128+ bt2020linear = defaultColorSpace;
129+ }
130+ });
135131 *ref = bt2020linear;
136132 *shouldRelease = FALSE ;
137133 return ;
138134 }
139135 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
140136 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_HLG) {
137+ static CGColorSpaceRef bt2020hlg = NULL ;
138+ static dispatch_once_t onceToken;
139+ dispatch_once (&onceToken, ^{
140+ if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
141+ bt2020hlg = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_HLG );
142+ } else {
143+ bt2020hlg = defaultColorSpace;
144+ }
145+ });
141146 *ref = bt2020hlg;
142147 *shouldRelease = FALSE ;
143148 return ;
144149 }
145150 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
146151 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_PQ) {
152+ static CGColorSpaceRef bt2020pq = NULL ;
153+ static dispatch_once_t onceToken;
154+ dispatch_once (&onceToken, ^{
155+ if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
156+ bt2020pq = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020_PQ_EOTF );
157+ } else {
158+ bt2020pq = defaultColorSpace;
159+ }
160+ });
147161 *ref = bt2020pq;
148162 *shouldRelease = FALSE ;
149163 return ;
150164 }
151165 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
152166 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_SRGB) {
167+ static CGColorSpaceRef p3 = NULL ;
168+ static dispatch_once_t onceToken;
169+ dispatch_once (&onceToken, ^{
170+ if (@available (macOS 10.11.2 , iOS 9.3 , tvOS 9.3 , *)) {
171+ p3 = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3 );
172+ } else {
173+ p3 = defaultColorSpace;
174+ }
175+ });
153176 *ref = p3;
154177 *shouldRelease = FALSE ;
155178 return ;
156179 }
157180 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
158181 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_HLG) {
182+ static CGColorSpaceRef p3hlg = NULL ;
183+ static dispatch_once_t onceToken;
184+ dispatch_once (&onceToken, ^{
185+ if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
186+ p3hlg = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_HLG );
187+ } else {
188+ p3hlg = defaultColorSpace;
189+ }
190+ });
191+
159192 *ref = p3hlg;
160193 *shouldRelease = FALSE ;
161194 return ;
162195 }
163196 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
164197 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2100_PQ) {
198+ static CGColorSpaceRef p3pq = NULL ;
199+ static dispatch_once_t onceToken;
200+ dispatch_once (&onceToken, ^{
201+ if (@available (macOS 10.14.6 , iOS 13.0 , tvOS 13.0 , *)) {
202+ p3pq = CGColorSpaceCreateWithName (kCGColorSpaceDisplayP3_PQ_EOTF );
203+ } else {
204+ p3pq = defaultColorSpace;
205+ }
206+ });
165207 *ref = p3pq;
166208 *shouldRelease = FALSE ;
167209 return ;
168210 }
169211 if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
170212 transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_LINEAR) {
213+ static CGColorSpaceRef p3linear = NULL ;
214+ static dispatch_once_t onceToken;
215+ dispatch_once (&onceToken, ^{
216+ if (@available (macOS 10.14.3 , iOS 12.3 , tvOS 12.3 , *)) {
217+ p3linear = CGColorSpaceCreateWithName (kCGColorSpaceExtendedLinearDisplayP3 );
218+ } else {
219+ p3linear = defaultColorSpace;
220+ }
221+ });
171222 *ref = p3linear;
172223 *shouldRelease = FALSE ;
173224 return ;
174225 }
175226
176- default_color_space:
177227 *ref = defaultColorSpace;
178228 *shouldRelease = FALSE ;
179229}
0 commit comments