@@ -32,63 +32,10 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
32
32
33
33
static void CalcColorSpaceRGB (avifImage * avif, CGColorSpaceRef* ref, BOOL * shouldRelease) {
34
34
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 ;
46
35
{
47
36
static dispatch_once_t onceToken;
48
37
dispatch_once (&onceToken, ^{
49
38
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
- }
92
39
});
93
40
}
94
41
@@ -101,79 +48,182 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
101
48
}
102
49
uint16_t colorPrimaries = avif->nclx .colourPrimaries ;
103
50
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 ;
107
58
}
108
59
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT709 &&
109
60
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
+ });
110
70
*ref = bt709;
111
71
*shouldRelease = FALSE ;
112
72
return ;
113
73
}
114
74
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_SRGB &&
115
75
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
+ });
116
85
*ref = sRGB ;
117
86
*shouldRelease = FALSE ;
118
87
return ;
119
88
}
120
89
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_SRGB &&
121
90
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
+ });
122
100
*ref = sRGBlinear ;
123
101
*shouldRelease = FALSE ;
124
102
return ;
125
103
}
126
104
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
127
105
(transferCharacteristics == AVIF_NCLX_TRANSFER_CHARACTERISTICS_BT2020_10BIT ||
128
106
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
+ });
129
116
*ref = bt2020;
130
117
*shouldRelease = FALSE ;
131
118
return ;
132
119
}
133
120
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2020 &&
134
121
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
+ });
135
131
*ref = bt2020linear;
136
132
*shouldRelease = FALSE ;
137
133
return ;
138
134
}
139
135
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
140
136
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
+ });
141
146
*ref = bt2020hlg;
142
147
*shouldRelease = FALSE ;
143
148
return ;
144
149
}
145
150
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_BT2100 &&
146
151
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
+ });
147
161
*ref = bt2020pq;
148
162
*shouldRelease = FALSE ;
149
163
return ;
150
164
}
151
165
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
152
166
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
+ });
153
176
*ref = p3;
154
177
*shouldRelease = FALSE ;
155
178
return ;
156
179
}
157
180
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
158
181
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
+
159
192
*ref = p3hlg;
160
193
*shouldRelease = FALSE ;
161
194
return ;
162
195
}
163
196
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
164
197
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
+ });
165
207
*ref = p3pq;
166
208
*shouldRelease = FALSE ;
167
209
return ;
168
210
}
169
211
if (colorPrimaries == AVIF_NCLX_COLOUR_PRIMARIES_P3 &&
170
212
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
+ });
171
222
*ref = p3linear;
172
223
*shouldRelease = FALSE ;
173
224
return ;
174
225
}
175
226
176
- default_color_space:
177
227
*ref = defaultColorSpace;
178
228
*shouldRelease = FALSE ;
179
229
}
0 commit comments