• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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