1 /*
2 * Copyright (C) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "color_utils.h"
16 #if !defined(CROSS_PLATFORM)
17 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
18 #endif
19
20 namespace OHOS {
21 namespace Media {
22 enum CicpColorPrimaries {
23 CICP_COLORPRIMARIES_UNKNOWN = 0,
24 CICP_COLORPRIMARIES_SRGB = 1,
25 CICP_COLORPRIMARIES_BT601_P = 5,
26 CICP_COLORPRIMARIES_BT601_N = 6,
27 CICP_COLORPRIMARIES_BT2020 = 9,
28 CICP_COLORPRIMARIES_BT2100 = 9,
29 CICP_COLORPRIMARIES_P3_DCI = 11,
30 CICP_COLORPRIMARIES_P3_D65 = 12,
31 };
32
33 enum CicpTransfer {
34 CICP_TRANSFER_UNKNOWN = 2,
35 CICP_TRANSFER_BT709_1 = 1,
36 CICP_TRANSFER_BT709_6 = 6,
37 CICP_TRANSFER_BT709_14 = 14,
38 CICP_TRANSFER_BT709_15 = 15,
39 CICP_TRANSFER_SRGB = 13,
40 CICP_TRANSFER_LINEAR = 8,
41 CICP_TRANSFER_PQ = 16,
42 CICP_TRANSFER_HLG = 18,
43 };
44
45 enum CicpFullRangeFLag {
46 CICP_FULL_RANGE_UNKNOWN = 2,
47 CICP_FULL_RANGE_FULL = 1,
48 CICP_FULL_RANGE_LIMIT = 0,
49 };
50
51 enum CicpMatrix {
52 CICP_MATRIX_BT709 = 1,
53 CICP_MATRIX_BT601_P = 5,
54 CICP_MATRIX_BT601_N = 6,
55 CICP_MATRIX_P3 = 6,
56 CICP_MATRIX_BT2020 = 9,
57 CICP_MATRIX_BT2100_ICTCP = 14,
58 };
59
60 #if !defined(CROSS_PLATFORM)
61 std::map<ColorManager::ColorSpaceName, CM_ColorSpaceInfo> ColorUtils::COLORSPACE_NAME_TO_COLORINFO_MAP = {
62 { ColorManager::BT601_EBU,
63 CM_ColorSpaceInfo {COLORPRIMARIES_BT601_P, TRANSFUNC_BT709, MATRIX_BT601_P, RANGE_FULL} },
64 { ColorManager::BT601_SMPTE_C,
65 CM_ColorSpaceInfo {COLORPRIMARIES_BT601_N, TRANSFUNC_BT709, MATRIX_BT601_N, RANGE_FULL} },
66 { ColorManager::BT709, CM_ColorSpaceInfo {COLORPRIMARIES_BT709, TRANSFUNC_BT709, MATRIX_BT709, RANGE_FULL} },
67 { ColorManager::BT2020_HLG, CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_HLG, MATRIX_BT2020, RANGE_FULL} },
68 { ColorManager::BT2020_PQ, CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_PQ, MATRIX_BT2020, RANGE_FULL} },
69 { ColorManager::BT601_EBU_LIMIT,
70 CM_ColorSpaceInfo {COLORPRIMARIES_BT601_P, TRANSFUNC_BT709, MATRIX_BT601_P, RANGE_LIMITED} },
71 { ColorManager::BT601_SMPTE_C_LIMIT,
72 CM_ColorSpaceInfo {COLORPRIMARIES_BT601_N, TRANSFUNC_BT709, MATRIX_BT601_N, RANGE_LIMITED} },
73 { ColorManager::BT709_LIMIT,
74 CM_ColorSpaceInfo {COLORPRIMARIES_BT709, TRANSFUNC_BT709, MATRIX_BT709, RANGE_LIMITED} },
75 { ColorManager::BT2020_HLG_LIMIT,
76 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_HLG, MATRIX_BT2020, RANGE_LIMITED} },
77 { ColorManager::BT2020_PQ_LIMIT,
78 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_PQ, MATRIX_BT2020, RANGE_LIMITED} },
79 { ColorManager::SRGB, CM_ColorSpaceInfo {COLORPRIMARIES_SRGB, TRANSFUNC_SRGB, MATRIX_BT601_N, RANGE_FULL} },
80 { ColorManager::DISPLAY_P3,
81 CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_SRGB, MATRIX_P3, RANGE_FULL} },
82 { ColorManager::P3_HLG, CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_HLG, MATRIX_P3, RANGE_FULL} },
83 { ColorManager::P3_PQ, CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_PQ, MATRIX_P3, RANGE_FULL} },
84 { ColorManager::ADOBE_RGB,
85 CM_ColorSpaceInfo {COLORPRIMARIES_ADOBERGB, TRANSFUNC_ADOBERGB, MATRIX_ADOBERGB, RANGE_FULL} },
86 { ColorManager::SRGB_LIMIT,
87 CM_ColorSpaceInfo {COLORPRIMARIES_SRGB, TRANSFUNC_SRGB, MATRIX_BT601_N, RANGE_LIMITED} },
88 { ColorManager::DISPLAY_P3_LIMIT,
89 CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_SRGB, MATRIX_P3, RANGE_LIMITED} },
90 { ColorManager::P3_HLG_LIMIT,
91 CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_HLG, MATRIX_P3, RANGE_LIMITED} },
92 { ColorManager::P3_PQ_LIMIT, CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_PQ, MATRIX_P3, RANGE_LIMITED} },
93 { ColorManager::ADOBE_RGB_LIMIT,
94 CM_ColorSpaceInfo {COLORPRIMARIES_ADOBERGB, TRANSFUNC_ADOBERGB, MATRIX_ADOBERGB, RANGE_LIMITED} },
95 { ColorManager::LINEAR_SRGB,
96 CM_ColorSpaceInfo {COLORPRIMARIES_SRGB, TRANSFUNC_LINEAR, MATRIX_BT709, RANGE_LIMITED} },
97 { ColorManager::LINEAR_BT709,
98 CM_ColorSpaceInfo {COLORPRIMARIES_SRGB, TRANSFUNC_LINEAR, MATRIX_BT709, RANGE_LIMITED} },
99 { ColorManager::LINEAR_P3,
100 CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_LINEAR, MATRIX_BT709, RANGE_LIMITED} },
101 { ColorManager::LINEAR_BT2020,
102 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_LINEAR, MATRIX_BT709, RANGE_LIMITED} },
103 { ColorManager::DISPLAY_SRGB,
104 CM_ColorSpaceInfo {COLORPRIMARIES_SRGB, TRANSFUNC_SRGB, MATRIX_BT601_N, RANGE_FULL} },
105 { ColorManager::DISPLAY_P3_SRGB,
106 CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_SRGB, MATRIX_P3, RANGE_FULL} },
107 { ColorManager::DISPLAY_P3_HLG, CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_HLG, MATRIX_P3, RANGE_FULL} },
108 { ColorManager::DISPLAY_P3_PQ, CM_ColorSpaceInfo {COLORPRIMARIES_P3_D65, TRANSFUNC_PQ, MATRIX_P3, RANGE_FULL} },
109 { ColorManager::DISPLAY_BT2020_SRGB,
110 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_SRGB, MATRIX_BT2020, RANGE_FULL} },
111 { ColorManager::DISPLAY_BT2020_HLG,
112 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_HLG, MATRIX_BT2020, RANGE_FULL} },
113 { ColorManager::DISPLAY_BT2020_PQ,
114 CM_ColorSpaceInfo {COLORPRIMARIES_BT2020, TRANSFUNC_PQ, MATRIX_BT2020, RANGE_FULL} },
115 };
116 #endif
117
P3ToColorSpace(uint16_t transfer,uint8_t range)118 ColorManager::ColorSpaceName P3ToColorSpace(uint16_t transfer, uint8_t range)
119 {
120 if (transfer == CICP_TRANSFER_PQ) {
121 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_PQ_LIMIT : ColorManager::P3_PQ;
122 } else if (transfer == CICP_TRANSFER_HLG) {
123 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_HLG_LIMIT : ColorManager::P3_HLG;
124 } else if (transfer == CICP_TRANSFER_SRGB) {
125 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::DISPLAY_P3_LIMIT : ColorManager::DISPLAY_P3;
126 }
127 return ColorManager::NONE;
128 }
129
BT2020ToColorSpace(uint16_t transfer,uint8_t range)130 ColorManager::ColorSpaceName BT2020ToColorSpace(uint16_t transfer, uint8_t range)
131 {
132 if (transfer == CICP_TRANSFER_PQ) {
133 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_PQ_LIMIT : ColorManager::BT2020_PQ;
134 } else if (transfer == CICP_TRANSFER_HLG) {
135 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_HLG_LIMIT : ColorManager::BT2020_HLG;
136 }
137 return ColorManager::NONE;
138 }
139
140 template <>
CicpToColorSpace(uint8_t primaries,uint8_t transfer,uint8_t matrix,uint8_t range)141 ColorManager::ColorSpaceName ColorUtils::CicpToColorSpace(uint8_t primaries, uint8_t transfer,
142 uint8_t matrix, uint8_t range)
143 {
144 switch (primaries) {
145 case CICP_COLORPRIMARIES_SRGB:
146 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::SRGB_LIMIT : ColorManager::SRGB;
147 case CICP_COLORPRIMARIES_P3_D65:
148 return P3ToColorSpace(transfer, range);
149 case CICP_COLORPRIMARIES_BT2020:
150 return BT2020ToColorSpace(transfer, range);
151 case CICP_COLORPRIMARIES_BT601_N:
152 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_SMPTE_C_LIMIT : ColorManager::BT601_SMPTE_C;
153 case CICP_COLORPRIMARIES_BT601_P:
154 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_EBU_LIMIT : ColorManager::BT601_EBU;
155 case CICP_COLORPRIMARIES_P3_DCI:
156 return ColorManager::DCI_P3;
157 default:
158 break;
159 }
160 return ColorManager::NONE;
161 }
162
163 template <>
CicpToColorSpace(uint16_t primaries,uint16_t transfer,uint16_t matrix,uint8_t range)164 ColorManager::ColorSpaceName ColorUtils::CicpToColorSpace(uint16_t primaries, uint16_t transfer,
165 uint16_t matrix, uint8_t range)
166 {
167 switch (primaries) {
168 case CICP_COLORPRIMARIES_SRGB:
169 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::SRGB_LIMIT : ColorManager::SRGB;
170 case CICP_COLORPRIMARIES_P3_D65:
171 return P3ToColorSpace(transfer, range);
172 case CICP_COLORPRIMARIES_BT2020:
173 return BT2020ToColorSpace(transfer, range);
174 case CICP_COLORPRIMARIES_BT601_N:
175 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_SMPTE_C_LIMIT : ColorManager::BT601_SMPTE_C;
176 case CICP_COLORPRIMARIES_BT601_P:
177 return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_EBU_LIMIT : ColorManager::BT601_EBU;
178 case CICP_COLORPRIMARIES_P3_DCI:
179 return ColorManager::DCI_P3;
180 default:
181 break;
182 }
183 return ColorManager::NONE;
184 }
185
GetPrimaries(ColorManager::ColorSpaceName name)186 uint16_t ColorUtils::GetPrimaries(ColorManager::ColorSpaceName name)
187 {
188 switch (name) {
189 case ColorManager::ColorSpaceName::SRGB:
190 case ColorManager::ColorSpaceName::SRGB_LIMIT:
191 return CICP_COLORPRIMARIES_SRGB;
192 case ColorManager::ColorSpaceName::DISPLAY_P3:
193 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
194 case ColorManager::ColorSpaceName::DCI_P3:
195 return CICP_COLORPRIMARIES_P3_D65;
196 case ColorManager::ColorSpaceName::BT2020:
197 case ColorManager::ColorSpaceName::BT2020_HLG:
198 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
199 case ColorManager::ColorSpaceName::BT2020_PQ:
200 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
201 return CICP_COLORPRIMARIES_BT2020;
202 default:
203 return CICP_COLORPRIMARIES_UNKNOWN;
204 }
205 }
206
GetTransfer(ColorManager::ColorSpaceName name)207 uint16_t GetTransfer(ColorManager::ColorSpaceName name)
208 {
209 switch (name) {
210 case ColorManager::ColorSpaceName::SRGB:
211 case ColorManager::ColorSpaceName::SRGB_LIMIT:
212 case ColorManager::ColorSpaceName::DISPLAY_P3:
213 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
214 case ColorManager::ColorSpaceName::DCI_P3:
215 return CICP_TRANSFER_SRGB;
216 case ColorManager::ColorSpaceName::BT2020:
217 case ColorManager::ColorSpaceName::BT2020_HLG:
218 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
219 return CICP_TRANSFER_HLG;
220 case ColorManager::ColorSpaceName::BT2020_PQ:
221 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
222 return CICP_TRANSFER_PQ;
223 default:
224 return CICP_TRANSFER_UNKNOWN;
225 }
226 }
227
GetMatrix(ColorManager::ColorSpaceName name)228 uint16_t GetMatrix(ColorManager::ColorSpaceName name)
229 {
230 switch (name) {
231 case ColorManager::ColorSpaceName::SRGB:
232 case ColorManager::ColorSpaceName::SRGB_LIMIT:
233 return CICP_MATRIX_BT601_N;
234 case ColorManager::ColorSpaceName::DISPLAY_P3:
235 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
236 case ColorManager::ColorSpaceName::DCI_P3:
237 return CICP_MATRIX_P3;
238 case ColorManager::ColorSpaceName::BT2020:
239 case ColorManager::ColorSpaceName::BT2020_HLG:
240 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
241 case ColorManager::ColorSpaceName::BT2020_PQ:
242 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
243 return CICP_MATRIX_BT2020;
244 default:
245 return CICP_TRANSFER_UNKNOWN;
246 }
247 }
248
GetRangeFlag(ColorManager::ColorSpaceName name)249 uint16_t GetRangeFlag(ColorManager::ColorSpaceName name)
250 {
251 switch (name) {
252 case ColorManager::ColorSpaceName::SRGB:
253 case ColorManager::ColorSpaceName::DISPLAY_P3:
254 case ColorManager::ColorSpaceName::DCI_P3:
255 case ColorManager::ColorSpaceName::BT2020:
256 case ColorManager::ColorSpaceName::BT2020_HLG:
257 case ColorManager::ColorSpaceName::BT2020_PQ:
258 return CICP_FULL_RANGE_FULL;
259 case ColorManager::ColorSpaceName::SRGB_LIMIT:
260 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
261 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
262 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
263 return CICP_FULL_RANGE_LIMIT;
264 default:
265 return CICP_FULL_RANGE_FULL;
266 }
267 }
268
269 template <>
ColorSpaceGetCicp(ColorManager::ColorSpaceName name,uint8_t & primaries,uint8_t & transfer,uint8_t & matrix,uint8_t & range)270 void ColorUtils::ColorSpaceGetCicp(ColorManager::ColorSpaceName name, uint8_t& primaries, uint8_t& transfer,
271 uint8_t& matrix, uint8_t& range)
272 {
273 primaries = GetPrimaries(name);
274 transfer = GetTransfer(name);
275 matrix = GetMatrix(name);
276 range = GetRangeFlag(name);
277 }
278
279 template <>
ColorSpaceGetCicp(ColorManager::ColorSpaceName name,uint16_t & primaries,uint16_t & transfer,uint16_t & matrix,uint8_t & range)280 void ColorUtils::ColorSpaceGetCicp(ColorManager::ColorSpaceName name, uint16_t& primaries, uint16_t& transfer,
281 uint16_t& matrix, uint8_t& range)
282 {
283 primaries = GetPrimaries(name);
284 transfer = GetTransfer(name);
285 matrix = GetMatrix(name);
286 range = GetRangeFlag(name);
287 }
288
289 #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
ConvertToCMColor(ColorManager::ColorSpaceName name)290 HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType ColorUtils::ConvertToCMColor(ColorManager::ColorSpaceName name)
291 {
292 switch (name) {
293 case ColorManager::ColorSpaceName::ADOBE_RGB :
294 return HDI::Display::Graphic::Common::V1_0::CM_ADOBERGB_FULL;
295 case ColorManager::ColorSpaceName::SRGB :
296 return HDI::Display::Graphic::Common::V1_0::CM_SRGB_FULL;
297 case ColorManager::ColorSpaceName::SRGB_LIMIT :
298 return HDI::Display::Graphic::Common::V1_0::CM_SRGB_LIMIT;
299 case ColorManager::ColorSpaceName::DISPLAY_P3 :
300 case ColorManager::ColorSpaceName::DCI_P3 :
301 return HDI::Display::Graphic::Common::V1_0::CM_P3_FULL;
302 case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT :
303 return HDI::Display::Graphic::Common::V1_0::CM_P3_LIMIT;
304 case ColorManager::ColorSpaceName::BT2020 :
305 case ColorManager::ColorSpaceName::BT2020_HLG :
306 return HDI::Display::Graphic::Common::V1_0::CM_BT2020_HLG_FULL;
307 case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT :
308 return HDI::Display::Graphic::Common::V1_0::CM_BT2020_HLG_LIMIT;
309 case ColorManager::ColorSpaceName::BT2020_PQ :
310 return HDI::Display::Graphic::Common::V1_0::CM_BT2020_PQ_FULL;
311 case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT :
312 return HDI::Display::Graphic::Common::V1_0::CM_BT2020_PQ_LIMIT;
313 default:
314 return HDI::Display::Graphic::Common::V1_0::CM_COLORSPACE_NONE;
315 }
316 return HDI::Display::Graphic::Common::V1_0::CM_COLORSPACE_NONE;
317 }
318 #endif
319
320 } // namespace Media
321 } // namespace OHOS