Skip to content

Commit 53e5f15

Browse files
committed
Make color spaces as lazy as possible.
1 parent 8188d8b commit 53e5f15

File tree

1 file changed

+107
-57
lines changed

1 file changed

+107
-57
lines changed

SDWebImageAVIFCoder/Classes/SDImageAVIFCoder.m

Lines changed: 107 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -32,63 +32,10 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
3232

3333
static 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

Comments
 (0)