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