• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 
16 #ifndef OHOS_JS_COLOR_SPACE_UTILS_H
17 #define OHOS_JS_COLOR_SPACE_UTILS_H
18 
19 #include <map>
20 #include <string>
21 #include <hilog/log.h>
22 
23 #include "color_space.h"
24 #include "color_manager_common.h"
25 #include "napi/native_api.h"
26 #include "napi/native_node_api.h"
27 
28 namespace OHOS {
29 namespace ColorManager {
30 #ifndef TITLE
31 #define TITLE __func__
32 #endif
33 
34 constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = {LOG_CORE, 0xD001400, "JsColorSpace"};
35 #define CMLOGE(fmt, args...) \
36     (void)OHOS::HiviewDFX::HiLog::Error(LOG_LABEL, "%{public}s: " fmt, TITLE, ##args)
37 #define CMLOGI(fmt, args...) \
38     (void)OHOS::HiviewDFX::HiLog::Info(LOG_LABEL, "%{public}s: " fmt, TITLE, ##args)
39 
40 enum class ApiColorSpaceType : uint32_t {
41     UNKNOWN = 0,
42     ADOBE_RGB_1998 = 1,
43     DCI_P3 = 2,
44     DISPLAY_P3 = 3,
45     SRGB = 4,
46     BT709 = 6,
47     BT601_EBU = 7,
48     BT601_SMPTE_C = 8,
49     BT2020_HLG = 9,
50     BT2020_PQ = 10,
51     P3_HLG = 11,
52     P3_PQ = 12,
53     ADOBE_RGB_1998_LIMIT = 13,
54     DISPLAY_P3_LIMIT = 14,
55     SRGB_LIMIT = 15,
56     BT709_LIMIT = 16,
57     BT601_EBU_LIMIT = 17,
58     BT601_SMPTE_C_LIMIT = 18,
59     BT2020_HLG_LIMIT = 19,
60     BT2020_PQ_LIMIT = 20,
61     P3_HLG_LIMIT = 21,
62     P3_PQ_LIMIT = 22,
63     LINEAR_P3 = 23,
64     LINEAR_SRGB = 24,
65     LINEAR_BT709 = LINEAR_SRGB,
66     LINEAR_BT2020 = 25,
67     DISPLAY_SRGB = SRGB,
68     DISPLAY_P3_SRGB = DISPLAY_P3,
69     DISPLAY_P3_HLG = P3_HLG,
70     DISPLAY_P3_PQ = P3_PQ,
71     CUSTOM = 5,
72     TYPE_END = 26
73 };
74 
75 const std::map<ColorSpaceName, ApiColorSpaceType> NATIVE_TO_JS_COLOR_SPACE_TYPE_MAP {
76     { ColorSpaceName::NONE, ApiColorSpaceType::UNKNOWN },
77     { ColorSpaceName::ADOBE_RGB, ApiColorSpaceType::ADOBE_RGB_1998 },
78     { ColorSpaceName::DCI_P3, ApiColorSpaceType::DCI_P3 },
79     { ColorSpaceName::DISPLAY_P3, ApiColorSpaceType::DISPLAY_P3 },
80     { ColorSpaceName::SRGB, ApiColorSpaceType::SRGB },
81     { ColorSpaceName::BT709, ApiColorSpaceType::BT709 },
82     { ColorSpaceName::BT601_EBU, ApiColorSpaceType::BT601_EBU },
83     { ColorSpaceName::BT601_SMPTE_C, ApiColorSpaceType::BT601_SMPTE_C },
84     { ColorSpaceName::BT2020_HLG, ApiColorSpaceType::BT2020_HLG },
85     { ColorSpaceName::BT2020_PQ, ApiColorSpaceType::BT2020_PQ },
86     { ColorSpaceName::P3_HLG, ApiColorSpaceType::P3_HLG },
87     { ColorSpaceName::P3_PQ, ApiColorSpaceType::P3_PQ },
88     { ColorSpaceName::ADOBE_RGB_LIMIT, ApiColorSpaceType::ADOBE_RGB_1998_LIMIT },
89     { ColorSpaceName::DISPLAY_P3_LIMIT, ApiColorSpaceType::DISPLAY_P3_LIMIT },
90     { ColorSpaceName::SRGB_LIMIT, ApiColorSpaceType::SRGB_LIMIT },
91     { ColorSpaceName::BT709_LIMIT, ApiColorSpaceType::BT709_LIMIT },
92     { ColorSpaceName::BT601_EBU_LIMIT, ApiColorSpaceType::BT601_EBU_LIMIT },
93     { ColorSpaceName::BT601_SMPTE_C_LIMIT, ApiColorSpaceType::BT601_SMPTE_C_LIMIT },
94     { ColorSpaceName::BT2020_HLG_LIMIT, ApiColorSpaceType::BT2020_HLG_LIMIT },
95     { ColorSpaceName::BT2020_PQ_LIMIT, ApiColorSpaceType::BT2020_PQ_LIMIT },
96     { ColorSpaceName::P3_HLG_LIMIT, ApiColorSpaceType::P3_HLG_LIMIT },
97     { ColorSpaceName::P3_PQ_LIMIT, ApiColorSpaceType::P3_PQ_LIMIT },
98     { ColorSpaceName::LINEAR_P3, ApiColorSpaceType::LINEAR_P3 },
99     { ColorSpaceName::LINEAR_SRGB, ApiColorSpaceType::LINEAR_SRGB },
100     { ColorSpaceName::LINEAR_BT709, ApiColorSpaceType::LINEAR_BT709 },
101     { ColorSpaceName::LINEAR_BT2020, ApiColorSpaceType::LINEAR_BT2020 },
102     { ColorSpaceName::DISPLAY_SRGB, ApiColorSpaceType::DISPLAY_SRGB },
103     { ColorSpaceName::DISPLAY_P3_SRGB, ApiColorSpaceType::DISPLAY_P3_SRGB },
104     { ColorSpaceName::DISPLAY_P3_HLG, ApiColorSpaceType::DISPLAY_P3_HLG },
105     { ColorSpaceName::DISPLAY_P3_PQ, ApiColorSpaceType::DISPLAY_P3_PQ },
106     { ColorSpaceName::CUSTOM, ApiColorSpaceType::CUSTOM },
107 };
108 
109 const std::map<ApiColorSpaceType, ColorSpaceName> JS_TO_NATIVE_COLOR_SPACE_NAME_MAP {
110     { ApiColorSpaceType::UNKNOWN, ColorSpaceName::NONE },
111     { ApiColorSpaceType::ADOBE_RGB_1998, ColorSpaceName::ADOBE_RGB },
112     { ApiColorSpaceType::DCI_P3, ColorSpaceName::DCI_P3 },
113     { ApiColorSpaceType::DISPLAY_P3, ColorSpaceName::DISPLAY_P3 },
114     { ApiColorSpaceType::SRGB, ColorSpaceName::SRGB },
115     { ApiColorSpaceType::BT709, ColorSpaceName::BT709 },
116     { ApiColorSpaceType::BT601_EBU, ColorSpaceName::BT601_EBU },
117     { ApiColorSpaceType::BT601_SMPTE_C, ColorSpaceName::BT601_SMPTE_C },
118     { ApiColorSpaceType::BT2020_HLG, ColorSpaceName::BT2020_HLG },
119     { ApiColorSpaceType::BT2020_PQ, ColorSpaceName::BT2020_PQ },
120     { ApiColorSpaceType::P3_HLG, ColorSpaceName::P3_HLG },
121     { ApiColorSpaceType::P3_PQ, ColorSpaceName::P3_PQ },
122     { ApiColorSpaceType::ADOBE_RGB_1998_LIMIT, ColorSpaceName::ADOBE_RGB_LIMIT },
123     { ApiColorSpaceType::DISPLAY_P3_LIMIT, ColorSpaceName::DISPLAY_P3_LIMIT },
124     { ApiColorSpaceType::SRGB_LIMIT, ColorSpaceName::SRGB_LIMIT },
125     { ApiColorSpaceType::BT709_LIMIT, ColorSpaceName::BT709_LIMIT },
126     { ApiColorSpaceType::BT601_EBU_LIMIT, ColorSpaceName::BT601_EBU_LIMIT },
127     { ApiColorSpaceType::BT601_SMPTE_C_LIMIT, ColorSpaceName::BT601_SMPTE_C_LIMIT },
128     { ApiColorSpaceType::BT2020_HLG_LIMIT, ColorSpaceName::BT2020_HLG_LIMIT },
129     { ApiColorSpaceType::BT2020_PQ_LIMIT, ColorSpaceName::BT2020_PQ_LIMIT },
130     { ApiColorSpaceType::P3_HLG_LIMIT, ColorSpaceName::P3_HLG_LIMIT },
131     { ApiColorSpaceType::P3_PQ_LIMIT, ColorSpaceName::P3_PQ_LIMIT },
132     { ApiColorSpaceType::LINEAR_P3, ColorSpaceName::LINEAR_P3 },
133     { ApiColorSpaceType::LINEAR_SRGB, ColorSpaceName::LINEAR_SRGB },
134     { ApiColorSpaceType::LINEAR_BT709, ColorSpaceName::LINEAR_BT709 },
135     { ApiColorSpaceType::LINEAR_BT2020, ColorSpaceName::LINEAR_BT2020 },
136     { ApiColorSpaceType::DISPLAY_SRGB, ColorSpaceName::DISPLAY_SRGB },
137     { ApiColorSpaceType::DISPLAY_P3_SRGB, ColorSpaceName::DISPLAY_P3_SRGB },
138     { ApiColorSpaceType::DISPLAY_P3_HLG, ColorSpaceName::DISPLAY_P3_HLG },
139     { ApiColorSpaceType::DISPLAY_P3_PQ, ColorSpaceName::DISPLAY_P3_PQ },
140     { ApiColorSpaceType::CUSTOM, ColorSpaceName::CUSTOM },
141 };
142 
143 const std::map<std::string, ApiColorSpaceType> STRING_TO_JS_MAP = {
144     { "UNKNOWN", ApiColorSpaceType::UNKNOWN },
145     { "ADOBE_RGB_1998", ApiColorSpaceType::ADOBE_RGB_1998 },
146     { "DCI_P3", ApiColorSpaceType::DCI_P3 },
147     { "DISPLAY_P3", ApiColorSpaceType::DISPLAY_P3 },
148     { "SRGB", ApiColorSpaceType::SRGB },
149     { "BT709", ApiColorSpaceType::BT709 },
150     { "BT601_EBU", ApiColorSpaceType::BT601_EBU },
151     { "BT601_SMPTE_C", ApiColorSpaceType::BT601_SMPTE_C },
152     { "BT2020_HLG", ApiColorSpaceType::BT2020_HLG },
153     { "BT2020_PQ", ApiColorSpaceType::BT2020_PQ },
154     { "P3_HLG", ApiColorSpaceType::P3_HLG },
155     { "P3_PQ", ApiColorSpaceType::P3_PQ },
156     { "ADOBE_RGB_1998_LIMIT", ApiColorSpaceType::ADOBE_RGB_1998_LIMIT },
157     { "DISPLAY_P3_LIMIT", ApiColorSpaceType::DISPLAY_P3_LIMIT },
158     { "SRGB_LIMIT", ApiColorSpaceType::SRGB_LIMIT },
159     { "BT709_LIMIT", ApiColorSpaceType::BT709_LIMIT },
160     { "BT601_EBU_LIMIT", ApiColorSpaceType::BT601_EBU_LIMIT },
161     { "BT601_SMPTE_C_LIMIT", ApiColorSpaceType::BT601_SMPTE_C_LIMIT },
162     { "BT2020_HLG_LIMIT", ApiColorSpaceType::BT2020_HLG_LIMIT },
163     { "BT2020_PQ_LIMIT", ApiColorSpaceType::BT2020_PQ_LIMIT },
164     { "P3_HLG_LIMIT", ApiColorSpaceType::P3_HLG_LIMIT },
165     { "P3_PQ_LIMIT", ApiColorSpaceType::P3_PQ_LIMIT },
166     { "LINEAR_P3", ApiColorSpaceType::LINEAR_P3 },
167     { "LINEAR_SRGB", ApiColorSpaceType::LINEAR_SRGB },
168     { "LINEAR_BT709", ApiColorSpaceType::LINEAR_BT709 },
169     { "LINEAR_BT2020", ApiColorSpaceType::LINEAR_BT2020 },
170     { "DISPLAY_SRGB", ApiColorSpaceType::DISPLAY_SRGB },
171     { "DISPLAY_P3_SRGB", ApiColorSpaceType::DISPLAY_P3_SRGB },
172     { "DISPLAY_P3_HLG", ApiColorSpaceType::DISPLAY_P3_HLG },
173     { "DISPLAY_P3_PQ", ApiColorSpaceType::DISPLAY_P3_PQ },
174     { "CUSTOM", ApiColorSpaceType::CUSTOM },
175 };
176 
177 template<class T>
178 T* CheckParamsAndGetThis(const napi_env env, napi_callback_info info, const char* name = nullptr)
179 {
180     if (env == nullptr || info == nullptr) {
181         return nullptr;
182     }
183     napi_value object = nullptr;
184     napi_value propertyNameValue = nullptr;
185     napi_value pointerValue = nullptr;
186     napi_get_cb_info(env, info, nullptr, nullptr, &object, nullptr);
187     if (object != nullptr && name != nullptr) {
188         napi_create_string_utf8(env, name, NAPI_AUTO_LENGTH, &propertyNameValue);
189     }
190     napi_value& resObject = propertyNameValue ? propertyNameValue : object;
191     if (resObject) {
192         return napi_unwrap(env, resObject, (void **)(&pointerValue)) == napi_ok ?
193             reinterpret_cast<T*>(pointerValue) : nullptr;
194     }
195     return nullptr;
196 }
197 
198 template<typename T, size_t N>
ArraySize(T (&)[N])199 inline constexpr size_t ArraySize(T (&)[N]) noexcept
200 {
201     return N;
202 }
203 
CreateJsUndefined(napi_env env)204 inline napi_value CreateJsUndefined(napi_env env)
205 {
206     napi_value result = nullptr;
207     napi_get_undefined(env, &result);
208     return result;
209 }
210 
CreateJsNull(napi_env env)211 inline napi_value CreateJsNull(napi_env env)
212 {
213     napi_value result = nullptr;
214     napi_get_null(env, &result);
215     return result;
216 }
217 
CreateJsNumber(napi_env env,int32_t value)218 inline napi_value CreateJsNumber(napi_env env, int32_t value)
219 {
220     napi_value result = nullptr;
221     napi_create_int32(env, value, &result);
222     return result;
223 }
224 
CreateJsNumber(napi_env env,uint32_t value)225 inline napi_value CreateJsNumber(napi_env env, uint32_t value)
226 {
227     napi_value result = nullptr;
228     napi_create_uint32(env, value, &result);
229     return result;
230 }
231 
CreateJsNumber(napi_env env,int64_t value)232 inline napi_value CreateJsNumber(napi_env env, int64_t value)
233 {
234     napi_value result = nullptr;
235     napi_create_int64(env, value, &result);
236     return result;
237 }
238 
CreateJsNumber(napi_env env,double value)239 inline napi_value CreateJsNumber(napi_env env, double value)
240 {
241     napi_value result = nullptr;
242     napi_create_double(env, value, &result);
243     return result;
244 }
245 
246 template<class T>
CreateJsValue(napi_env env,const T & value)247 napi_value CreateJsValue(napi_env env, const T& value)
248 {
249     using ValueType = std::remove_cv_t<std::remove_reference_t<T>>;
250     napi_value result = nullptr;
251     if constexpr (std::is_same_v<ValueType, bool>) {
252         napi_get_boolean(env, value, &result);
253         return result;
254     } else if constexpr (std::is_arithmetic_v<ValueType>) {
255         return CreateJsNumber(env, value);
256     } else if constexpr (std::is_same_v<ValueType, std::string>) {
257         napi_create_string_utf8(env, value.c_str(), value.length(), &result);
258         return result;
259     } else if constexpr (std::is_enum_v<ValueType>) {
260         return CreateJsNumber(env, static_cast<std::make_signed_t<ValueType>>(value));
261     } else if constexpr (std::is_same_v<ValueType, const char*>) {
262         (value != nullptr) ? napi_create_string_utf8(env, value, strlen(value), &result) :
263             napi_get_undefined(env, &result);
264         return result;
265     }
266 }
267 
ConvertFromJsNumber(napi_env env,napi_value jsValue,int32_t & value)268 inline bool ConvertFromJsNumber(napi_env env, napi_value jsValue, int32_t& value)
269 {
270     return napi_get_value_int32(env, jsValue, &value) == napi_ok;
271 }
272 
ConvertFromJsNumber(napi_env env,napi_value jsValue,uint32_t & value)273 inline bool ConvertFromJsNumber(napi_env env, napi_value jsValue, uint32_t& value)
274 {
275     return napi_get_value_uint32(env, jsValue, &value) == napi_ok;
276 }
277 
ConvertFromJsNumber(napi_env env,napi_value jsValue,int64_t & value)278 inline bool ConvertFromJsNumber(napi_env env, napi_value jsValue, int64_t& value)
279 {
280     return napi_get_value_int64(env, jsValue, &value) == napi_ok;
281 }
282 
ConvertFromJsNumber(napi_env env,napi_value jsValue,double & value)283 inline bool ConvertFromJsNumber(napi_env env, napi_value jsValue, double& value)
284 {
285     return napi_get_value_double(env, jsValue, &value) == napi_ok;
286 }
287 
288 template<class T>
ConvertFromJsValue(napi_env env,napi_value jsValue,T & value)289 bool ConvertFromJsValue(napi_env env, napi_value jsValue, T& value)
290 {
291     if (jsValue == nullptr) {
292         return false;
293     }
294 
295     using ValueType = std::remove_cv_t<std::remove_reference_t<T>>;
296     if constexpr (std::is_same_v<ValueType, bool>) {
297         return napi_get_value_bool(env, jsValue, &value) == napi_ok;
298     } else if constexpr (std::is_arithmetic_v<ValueType>) {
299         return ConvertFromJsNumber(env, jsValue, value);
300     } else if constexpr (std::is_same_v<ValueType, std::string>) {
301         size_t len = 0;
302         if (napi_get_value_string_utf8(env, jsValue, nullptr, 0, &len) != napi_ok) {
303             return false;
304         }
305         auto buffer = std::make_unique<char[]>(len + 1);
306         size_t strLength = 0;
307         if (napi_get_value_string_utf8(env, jsValue, buffer.get(), len + 1, &strLength) == napi_ok) {
308             value = buffer.get();
309             return true;
310         }
311         return false;
312     } else if constexpr (std::is_enum_v<ValueType>) {
313         std::make_signed_t<ValueType> numberValue = 0;
314         if (!ConvertFromJsNumber(env, jsValue, numberValue)) {
315             return false;
316         }
317         value = static_cast<ValueType>(numberValue);
318         return true;
319     }
320     return false;
321 }
322 
323 napi_value CreateJsError(napi_env env, int32_t errCode, const std::string& message = std::string());
324 void BindNativeFunction(napi_env env, napi_value object, const char* name, const char* moduleName, napi_callback func);
325 bool CheckParamMinimumValid(napi_env env, const size_t paramNum, const size_t minNum);
326 
327 napi_value ColorSpaceTypeInit(napi_env env);
328 napi_value CMErrorInit(napi_env env);
329 napi_value CMErrorCodeInit(napi_env env);
330 bool ParseJsDoubleValue(napi_value jsObject, napi_env env, const std::string& name, double& data);
331 }  // namespace ColorManager
332 }  // namespace OHOS
333 #endif // OHOS_JS_COLOR_SPACE_UTILS_H
334