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 #include "js_color_space.h"
16 
17 #include <array>
18 
19 #include "color_space.h"
20 #include "js_color_space_utils.h"
21 
22 namespace OHOS {
23 namespace ColorManager {
Finalizer(napi_env env,void * data,void * hint)24 void JsColorSpace::Finalizer(napi_env env, void* data, void* hint)
25 {
26     auto jsColorSpace = std::unique_ptr<JsColorSpace>(static_cast<JsColorSpace*>(data));
27     if (jsColorSpace == nullptr) {
28         CMLOGE("[NAPI]Finalizer jsColorSpace is nullptr");
29         return;
30     }
31     auto csToken = jsColorSpace->colorSpaceToken_;
32     if (csToken == nullptr) {
33         CMLOGE("[NAPI]Finalizer colorSpaceToken_ is nullptr");
34         return;
35     }
36 }
37 
GetColorSpaceName(napi_env env,napi_callback_info info)38 napi_value JsColorSpace::GetColorSpaceName(napi_env env, napi_callback_info info)
39 {
40     JsColorSpace* me = CheckParamsAndGetThis<JsColorSpace>(env, info);
41     if (me == nullptr) {
42         napi_throw(env,
43             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
44             "Parameter check fails. Js color space object is nullptr."));
45         return nullptr;
46     }
47     return me->OnGetColorSpaceName(env, info);
48 }
49 
GetSendableColorSpaceName(napi_env env,napi_callback_info info)50 napi_value JsColorSpace::GetSendableColorSpaceName(napi_env env, napi_callback_info info)
51 {
52     JsColorSpace* me = CheckSendableParamsAndGetThis<JsColorSpace>(env, info);
53     if (me == nullptr) {
54         napi_throw(env,
55             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
56             "Parameter check fails. Js color space object is nullptr."));
57         return nullptr;
58     }
59     return me->OnGetSendableColorSpaceName(env, info);
60 }
61 
GetWhitePoint(napi_env env,napi_callback_info info)62 napi_value JsColorSpace::GetWhitePoint(napi_env env, napi_callback_info info)
63 {
64     JsColorSpace* me = CheckParamsAndGetThis<JsColorSpace>(env, info);
65     if (me == nullptr) {
66         napi_throw(env,
67             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
68             "Parameter check fails. Js color space object is nullptr."));
69         return nullptr;
70     }
71     return me->OnGetWhitePoint(env, info);
72 }
73 
GetSendableWhitePoint(napi_env env,napi_callback_info info)74 napi_value JsColorSpace::GetSendableWhitePoint(napi_env env, napi_callback_info info)
75 {
76     JsColorSpace* me = CheckSendableParamsAndGetThis<JsColorSpace>(env, info);
77     if (me == nullptr) {
78         napi_throw(env,
79             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
80             "Parameter check fails. Js color space object is nullptr."));
81         return nullptr;
82     }
83     return me->OnGetSendableWhitePoint(env, info);
84 }
85 
GetGamma(napi_env env,napi_callback_info info)86 napi_value JsColorSpace::GetGamma(napi_env env, napi_callback_info info)
87 {
88     JsColorSpace* me = CheckParamsAndGetThis<JsColorSpace>(env, info);
89     if (me == nullptr) {
90         napi_throw(env,
91             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
92             "Parameter check fails. Js color space object is nullptr."));
93         return nullptr;
94     }
95     return me->OnGetGamma(env, info);
96 }
97 
GetSendableGamma(napi_env env,napi_callback_info info)98 napi_value JsColorSpace::GetSendableGamma(napi_env env, napi_callback_info info)
99 {
100     JsColorSpace* me = CheckSendableParamsAndGetThis<JsColorSpace>(env, info);
101     if (me == nullptr) {
102         napi_throw(env,
103             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
104             "Parameter check fails. Js color space object is nullptr."));
105         return nullptr;
106     }
107     return me->OnGetSendableGamma(env, info);
108 }
109 
OnGetColorSpaceName(napi_env env,napi_callback_info info)110 napi_value JsColorSpace::OnGetColorSpaceName(napi_env env, napi_callback_info info)
111 {
112     napi_value value = nullptr;
113     if (colorSpaceToken_ == nullptr) {
114         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
115         napi_throw(env,
116             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
117             "Parameter check fails. Native color space object is nullptr."));
118         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
119         return value;
120     }
121     ColorSpaceName csName = colorSpaceToken_->GetColorSpaceName();
122     auto iter = NATIVE_TO_JS_COLOR_SPACE_TYPE_MAP.find(csName);
123     if (iter != NATIVE_TO_JS_COLOR_SPACE_TYPE_MAP.end()) {
124         CMLOGI("[NAPI]get color space name %{public}u, api type %{public}u",
125             csName, iter->second);
126         return CreateJsValue(env, iter->second);
127     }
128     CMLOGE("[NAPI]get color space name %{public}u, but not in api type", csName);
129     std::string errMsg = "BusinessError 401: Parameter error, the type of colorspace " +
130         std::to_string(static_cast<int32_t>(csName)) + "must be in supported type list.";
131     napi_throw(env,
132         CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
133         errMsg));
134     NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
135     return value;
136 }
137 
OnGetSendableColorSpaceName(napi_env env,napi_callback_info info)138 napi_value JsColorSpace::OnGetSendableColorSpaceName(napi_env env, napi_callback_info info)
139 {
140     napi_value value = nullptr;
141     if (colorSpaceToken_ == nullptr) {
142         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
143         napi_throw(env,
144             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
145             "Parameter check fails. Native color space object is nullptr."));
146         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
147         return value;
148     }
149     ColorSpaceName csName = colorSpaceToken_->GetColorSpaceName();
150     auto iter = NATIVE_TO_JS_COLOR_SPACE_TYPE_MAP.find(csName);
151     if (iter != NATIVE_TO_JS_COLOR_SPACE_TYPE_MAP.end()) {
152         CMLOGI("[NAPI]get color space name %{public}u, api type %{public}u",
153             csName, iter->second);
154         return CreateJsValue(env, iter->second);
155     }
156     CMLOGE("[NAPI]get color space name %{public}u, but not in api type", csName);
157     std::string errMsg = "BusinessError 401: Parameter error, the type of colorspace " +
158         std::to_string(static_cast<int32_t>(csName)) + "must be in supported type list.";
159     napi_throw(env,
160         CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
161         errMsg));
162     NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
163     return value;
164 }
165 
OnGetWhitePoint(napi_env env,napi_callback_info info)166 napi_value JsColorSpace::OnGetWhitePoint(napi_env env, napi_callback_info info)
167 {
168     napi_value arrayValue = nullptr;
169     if (colorSpaceToken_ == nullptr) {
170         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
171         napi_throw(env,
172             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
173             "Parameter check fails. Native color space object is nullptr."));
174         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &arrayValue));
175         return arrayValue;
176     }
177     std::array<float, DIMES_2> wp = colorSpaceToken_->GetWhitePoint();
178     NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_create_array_with_length(env, DIMES_2, &arrayValue));
179     for (uint32_t i = 0; i < DIMES_2; i++) {
180         napi_value eleValue = CreateJsValue(env, wp[i]);
181         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_set_element(env, arrayValue, i, eleValue));
182     }
183     return arrayValue;
184 }
185 
OnGetSendableWhitePoint(napi_env env,napi_callback_info info)186 napi_value JsColorSpace::OnGetSendableWhitePoint(napi_env env, napi_callback_info info)
187 {
188     napi_value arrayValue = nullptr;
189     if (colorSpaceToken_ == nullptr) {
190         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
191         napi_throw(env,
192             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
193             "Parameter check fails. Native color space object is nullptr."));
194         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &arrayValue));
195         return arrayValue;
196     }
197     std::array<float, DIMES_2> wp = colorSpaceToken_->GetWhitePoint();
198     NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_create_sendable_array_with_length(env, DIMES_2, &arrayValue));
199     for (uint32_t i = 0; i < DIMES_2; i++) {
200         napi_value eleValue = CreateJsValue(env, wp[i]);
201         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_set_element(env, arrayValue, i, eleValue));
202     }
203     return arrayValue;
204 }
205 
OnGetGamma(napi_env env,napi_callback_info info)206 napi_value JsColorSpace::OnGetGamma(napi_env env, napi_callback_info info)
207 {
208     napi_value value = nullptr;
209     if (colorSpaceToken_ == nullptr) {
210         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
211         napi_throw(env,
212             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
213             "Parameter check fails. Native color space object is nullptr."));
214         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
215         return value;
216     }
217     float gamma = colorSpaceToken_->GetGamma();
218     return CreateJsValue(env, gamma);
219 }
220 
OnGetSendableGamma(napi_env env,napi_callback_info info)221 napi_value JsColorSpace::OnGetSendableGamma(napi_env env, napi_callback_info info)
222 {
223     napi_value value = nullptr;
224     if (colorSpaceToken_ == nullptr) {
225         CMLOGE("[NAPI]colorSpaceToken_ is nullptr");
226         napi_throw(env,
227             CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_NULLPTR)),
228             "Parameter check fails. Native color space object is nullptr."));
229         NAPI_CALL_WITH_ERRCODE_DEFAULT(env, napi_get_undefined(env, &value));
230         return value;
231     }
232     float gamma = colorSpaceToken_->GetGamma();
233     return CreateJsValue(env, gamma);
234 }
235 
BindFunctions(napi_env env,napi_value object)236 napi_status BindFunctions(napi_env env, napi_value object)
237 {
238     napi_status status = napi_ok;
239     status = BindNativeFunction(env, object, "getColorSpaceName", nullptr, JsColorSpace::GetColorSpaceName);
240     if (status != napi_ok) {
241         return status;
242     }
243     status = BindNativeFunction(env, object, "getWhitePoint", nullptr, JsColorSpace::GetWhitePoint);
244     if (status != napi_ok) {
245         return status;
246     }
247     status = BindNativeFunction(env, object, "getGamma", nullptr, JsColorSpace::GetGamma);
248     if (status != napi_ok) {
249         return status;
250     }
251     return status;
252 }
253 } // namespace ColorManager
254 } // namespace OHOS
255