Skip to content

Commit 5bc2327

Browse files
committed
add all built-in RGB color spaces.
1 parent 5451f15 commit 5bc2327

File tree

1 file changed

+88
-11
lines changed

1 file changed

+88
-11
lines changed

SDWebImageAVIFCoder/Classes/SDImageAVIFCoder.m

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,19 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
2929
*ref = defaultColorSpace;
3030
*shouldRelease = FALSE;
3131
}
32+
3233
static 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

87164
default_color_space:
88165
*ref = defaultColorSpace;

0 commit comments

Comments
 (0)