@@ -29,11 +29,19 @@ static void CalcColorSpaceMono(avifImage * avif, CGColorSpaceRef* ref, BOOL* sho
29
29
*ref = defaultColorSpace;
30
30
*shouldRelease = FALSE ;
31
31
}
32
+
32
33
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 ;
37
45
{
38
46
static dispatch_once_t onceToken;
39
47
dispatch_once (&onceToken, ^{
@@ -45,13 +53,35 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
45
53
}
46
54
if (@available (macOS 10.11 , iOS 9.0 , tvOS 9.0 , *)) {
47
55
bt709 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_709 );
56
+ bt2020 = CGColorSpaceCreateWithName (kCGColorSpaceITUR_2020 );
48
57
} else {
49
58
bt709 = defaultColorSpace;
59
+ bt2020 = defaultColorSpace;
60
+ bt2020hlg = defaultColorSpace;
50
61
}
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 );
53
64
} 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;
55
85
}
56
86
});
57
87
}
@@ -65,24 +95,71 @@ static void CalcColorSpaceRGB(avifImage * avif, CGColorSpaceRef* ref, BOOL* shou
65
95
}
66
96
uint16_t colorPrimaries = avif->nclx .colourPrimaries ;
67
97
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) {
69
100
goto default_color_space;
70
101
}
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) {
72
104
*ref = bt709;
73
105
*shouldRelease = FALSE ;
74
106
return ;
75
107
}
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) {
77
110
*ref = sRGB ;
78
111
*shouldRelease = FALSE ;
79
112
return ;
80
113
}
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)) {
82
117
*ref = bt2020;
83
118
*shouldRelease = FALSE ;
84
119
return ;
85
120
}
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
+ }
86
163
87
164
default_color_space:
88
165
*ref = defaultColorSpace;
0 commit comments