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 
17 namespace OHOS {
18 namespace Media {
19 enum CicpColorPrimaries {
20     CICP_COLORPRIMARIES_UNKNOWN = 0,
21     CICP_COLORPRIMARIES_SRGB = 1,
22     CICP_COLORPRIMARIES_BT601_P = 5,
23     CICP_COLORPRIMARIES_BT601_N = 6,
24     CICP_COLORPRIMARIES_BT2020 = 9,
25     CICP_COLORPRIMARIES_BT2100 = 9,
26     CICP_COLORPRIMARIES_P3_DCI = 11,
27     CICP_COLORPRIMARIES_P3_D65 = 12,
28 };
29 
30 enum CicpTransfer {
31     CICP_TRANSFER_UNKNOWN = 2,
32     CICP_TRANSFER_BT709_1 = 1,
33     CICP_TRANSFER_BT709_6 = 6,
34     CICP_TRANSFER_BT709_14 = 14,
35     CICP_TRANSFER_BT709_15 = 15,
36     CICP_TRANSFER_SRGB = 13,
37     CICP_TRANSFER_LINEAR = 8,
38     CICP_TRANSFER_PQ = 16,
39     CICP_TRANSFER_HLG = 18,
40 };
41 
42 enum CicpFullRangeFLag {
43     CICP_FULL_RANGE_UNKNOWN = 2,
44     CICP_FULL_RANGE_FULL = 1,
45     CICP_FULL_RANGE_LIMIT = 0,
46 };
47 
48 enum CicpMatrix {
49     CICP_MATRIX_BT709 = 1,
50     CICP_MATRIX_BT601_P = 5,
51     CICP_MATRIX_BT601_N = 6,
52     CICP_MATRIX_P3 = 6,
53     CICP_MATRIX_BT2020 = 9,
54     CICP_MATRIX_BT2100_ICTCP = 14,
55 };
56 
P3ToColorSpace(uint16_t transfer,uint8_t range)57 ColorManager::ColorSpaceName P3ToColorSpace(uint16_t transfer, uint8_t range)
58 {
59     if (transfer == CICP_TRANSFER_PQ) {
60         return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_PQ_LIMIT : ColorManager::P3_PQ;
61     } else if (transfer == CICP_TRANSFER_HLG) {
62         return range == CICP_FULL_RANGE_LIMIT ? ColorManager::P3_HLG_LIMIT : ColorManager::P3_HLG;
63     } else if (transfer == CICP_TRANSFER_SRGB) {
64         return range == CICP_FULL_RANGE_LIMIT ? ColorManager::DISPLAY_P3_LIMIT : ColorManager::DISPLAY_P3;
65     }
66     return ColorManager::NONE;
67 }
68 
BT2020ToColorSpace(uint16_t transfer,uint8_t range)69 ColorManager::ColorSpaceName BT2020ToColorSpace(uint16_t transfer, uint8_t range)
70 {
71     if (transfer == CICP_TRANSFER_PQ) {
72         return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_PQ_LIMIT : ColorManager::BT2020_PQ;
73     } else if (transfer == CICP_TRANSFER_HLG) {
74         return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT2020_HLG_LIMIT : ColorManager::BT2020_HLG;
75     }
76     return ColorManager::NONE;
77 }
78 
CicpToColorSpace(uint16_t primaries,uint16_t transfer,uint16_t matrix,uint8_t range)79 ColorManager::ColorSpaceName ColorUtils::CicpToColorSpace(uint16_t primaries, uint16_t transfer,
80     uint16_t matrix, uint8_t range)
81 {
82     switch (primaries) {
83         case CICP_COLORPRIMARIES_SRGB:
84             return range == CICP_FULL_RANGE_LIMIT ? ColorManager::SRGB_LIMIT : ColorManager::SRGB;
85         case CICP_COLORPRIMARIES_P3_D65:
86             return P3ToColorSpace(transfer, range);
87         case CICP_COLORPRIMARIES_BT2020:
88             return BT2020ToColorSpace(transfer, range);
89         case CICP_COLORPRIMARIES_BT601_N:
90             return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_SMPTE_C_LIMIT : ColorManager::BT601_SMPTE_C;
91         case CICP_COLORPRIMARIES_BT601_P:
92             return range == CICP_FULL_RANGE_LIMIT ? ColorManager::BT601_EBU_LIMIT : ColorManager::BT601_EBU;
93         case CICP_COLORPRIMARIES_P3_DCI:
94             return ColorManager::DCI_P3;
95         default:
96             break;
97     }
98     return ColorManager::NONE;
99 }
100 
GetPrimaries(ColorManager::ColorSpaceName name)101 uint16_t ColorUtils::GetPrimaries(ColorManager::ColorSpaceName name)
102 {
103     switch (name) {
104         case ColorManager::ColorSpaceName::SRGB:
105         case ColorManager::ColorSpaceName::SRGB_LIMIT:
106             return CICP_COLORPRIMARIES_SRGB;
107         case ColorManager::ColorSpaceName::DISPLAY_P3:
108         case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
109         case ColorManager::ColorSpaceName::DCI_P3:
110             return CICP_COLORPRIMARIES_P3_D65;
111         case ColorManager::ColorSpaceName::BT2020:
112         case ColorManager::ColorSpaceName::BT2020_HLG:
113         case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
114         case ColorManager::ColorSpaceName::BT2020_PQ:
115         case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
116             return CICP_COLORPRIMARIES_BT2020;
117         default:
118             return CICP_COLORPRIMARIES_UNKNOWN;
119     }
120 }
121 
GetTransfer(ColorManager::ColorSpaceName name)122 uint16_t GetTransfer(ColorManager::ColorSpaceName name)
123 {
124     switch (name) {
125         case ColorManager::ColorSpaceName::SRGB:
126         case ColorManager::ColorSpaceName::SRGB_LIMIT:
127         case ColorManager::ColorSpaceName::DISPLAY_P3:
128         case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
129         case ColorManager::ColorSpaceName::DCI_P3:
130             return CICP_TRANSFER_SRGB;
131         case ColorManager::ColorSpaceName::BT2020:
132         case ColorManager::ColorSpaceName::BT2020_HLG:
133         case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
134             return CICP_TRANSFER_HLG;
135         case ColorManager::ColorSpaceName::BT2020_PQ:
136         case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
137             return CICP_TRANSFER_PQ;
138         default:
139             return CICP_TRANSFER_UNKNOWN;
140     }
141 }
142 
GetMatrix(ColorManager::ColorSpaceName name)143 uint16_t GetMatrix(ColorManager::ColorSpaceName name)
144 {
145     switch (name) {
146         case ColorManager::ColorSpaceName::SRGB:
147         case ColorManager::ColorSpaceName::SRGB_LIMIT:
148             return CICP_MATRIX_BT601_N;
149         case ColorManager::ColorSpaceName::DISPLAY_P3:
150         case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
151         case ColorManager::ColorSpaceName::DCI_P3:
152             return CICP_MATRIX_P3;
153         case ColorManager::ColorSpaceName::BT2020:
154         case ColorManager::ColorSpaceName::BT2020_HLG:
155         case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
156         case ColorManager::ColorSpaceName::BT2020_PQ:
157         case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
158             return CICP_MATRIX_BT2020;
159         default:
160             return CICP_TRANSFER_UNKNOWN;
161     }
162 }
163 
GetRangeFlag(ColorManager::ColorSpaceName name)164 uint16_t GetRangeFlag(ColorManager::ColorSpaceName name)
165 {
166     switch (name) {
167         case ColorManager::ColorSpaceName::SRGB:
168         case ColorManager::ColorSpaceName::DISPLAY_P3:
169         case ColorManager::ColorSpaceName::DCI_P3:
170         case ColorManager::ColorSpaceName::BT2020:
171         case ColorManager::ColorSpaceName::BT2020_HLG:
172         case ColorManager::ColorSpaceName::BT2020_PQ:
173             return CICP_FULL_RANGE_FULL;
174         case ColorManager::ColorSpaceName::SRGB_LIMIT:
175         case ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT:
176         case ColorManager::ColorSpaceName::BT2020_HLG_LIMIT:
177         case ColorManager::ColorSpaceName::BT2020_PQ_LIMIT:
178             return CICP_FULL_RANGE_LIMIT;
179         default:
180             return CICP_FULL_RANGE_FULL;
181     }
182 }
183 
ColorSpaceGetCicp(ColorManager::ColorSpaceName name,uint16_t & primaries,uint16_t & transfer,uint16_t & matrix,uint8_t & range)184 void ColorUtils::ColorSpaceGetCicp(ColorManager::ColorSpaceName name, uint16_t& primaries, uint16_t& transfer,
185     uint16_t& matrix, uint8_t& range)
186 {
187     primaries = GetPrimaries(name);
188     transfer = GetTransfer(name);
189     matrix = GetMatrix(name);
190     range = GetRangeFlag(name);
191 }
192 
193 } // namespace Media
194 } // namespace OHOS