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 "color_space_object_convertor.h"
16
17 #include "native_engine/native_reference.h"
18
19 #include "js_color_space.h"
20 #include "js_color_space_utils.h"
21
22 namespace {
23 constexpr int SENDABLE_PROPERTIES_NUM = 3;
24 }
25
26 namespace OHOS {
27 namespace ColorManager {
CreateJsColorSpaceObject(napi_env env,std::shared_ptr<ColorSpace> & colorSpace)28 napi_value CreateJsColorSpaceObject(napi_env env, std::shared_ptr<ColorSpace>& colorSpace)
29 {
30 if (colorSpace == nullptr) {
31 CMLOGE("[NAPI]colorSpace is nullptr");
32 napi_throw(env,
33 CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
34 "BusinessError 401: Parameter error, the value of colorSpace must not be nullptr"));
35 return nullptr;
36 }
37 napi_value object = nullptr;
38 napi_create_object(env, &object);
39 if (object == nullptr) {
40 CMLOGE("[NAPI]Fail to convert to js object");
41 napi_throw(env,
42 CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
43 "BusinessError 401: Parameter error, the value of env error. Can not create object."));
44 napi_get_undefined(env, &object);
45 return object;
46 }
47
48 std::unique_ptr<JsColorSpace> jsColorSpace = std::make_unique<JsColorSpace>(colorSpace);
49 NAPI_CALL_DEFAULT(napi_wrap(env, object, jsColorSpace.release(), JsColorSpace::Finalizer, nullptr, nullptr));
50 if (BindFunctions(env, object) != napi_ok) {
51 return nullptr;
52 }
53
54 std::shared_ptr<NativeReference> jsColorSpaceNativeRef;
55 napi_ref jsColorSpaceRef = nullptr;
56 NAPI_CALL_DEFAULT(napi_create_reference(env, object, 1, &jsColorSpaceRef));
57 jsColorSpaceNativeRef.reset(reinterpret_cast<NativeReference*>(jsColorSpaceRef));
58 return object;
59 }
60
61
CreateJsSendableColorSpaceObject(napi_env env,std::shared_ptr<ColorSpace> & colorSpace)62 napi_value CreateJsSendableColorSpaceObject(napi_env env, std::shared_ptr<ColorSpace>& colorSpace)
63 {
64 if (colorSpace == nullptr) {
65 CMLOGE("[NAPI]colorSpace is nullptr");
66 napi_throw(env,
67 CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
68 "BusinessError 401: Parameter error, the value of colorSpace must not be nullptr"));
69 return nullptr;
70 }
71 napi_property_descriptor properties[] = {
72 DECLARE_NAPI_FUNCTION("getColorSpaceName", JsColorSpace::GetSendableColorSpaceName),
73 DECLARE_NAPI_FUNCTION("getWhitePoint", JsColorSpace::GetSendableWhitePoint),
74 DECLARE_NAPI_FUNCTION("getGamma", JsColorSpace::GetSendableGamma),
75 };
76 napi_value object = nullptr;
77 NAPI_CALL_DEFAULT(
78 napi_create_sendable_object_with_properties(env, SENDABLE_PROPERTIES_NUM, properties, &object));
79 if (object == nullptr) {
80 CMLOGE("[NAPI]Fail to convert to js object");
81 napi_throw(env,
82 CreateJsError(env, static_cast<int32_t>(JS_TO_ERROR_CODE_MAP.at(CMError::CM_ERROR_INVALID_PARAM)),
83 "BusinessError 401: Parameter error, the value of env error. Can not create object."));
84 napi_get_undefined(env, &object);
85 return object;
86 }
87
88 std::unique_ptr<JsColorSpace> jsColorSpace = std::make_unique<JsColorSpace>(colorSpace);
89 NAPI_CALL_DEFAULT(napi_wrap_sendable(env, object, jsColorSpace.release(), JsColorSpace::Finalizer, nullptr));
90
91 return object;
92 }
93
GetColorSpaceByJSObject(napi_env env,napi_value object)94 std::shared_ptr<ColorSpace> GetColorSpaceByJSObject(napi_env env, napi_value object)
95 {
96 if (object == nullptr) {
97 CMLOGE("[NAPI]GetColorSpaceByJSObject::jsObject is nullptr");
98 return nullptr;
99 }
100 JsColorSpace* jsColorSpace = nullptr;
101 NAPI_CALL_DEFAULT(napi_unwrap(env, object, (void **)&jsColorSpace));
102 if (jsColorSpace == nullptr) {
103 CMLOGE("[NAPI]GetColorSpaceByJSObject::jsColorSpace is nullptr");
104 return nullptr;
105 }
106 return jsColorSpace->GetColorSpaceToken();
107 }
108 } // namespace ColorManager
109 } // namespace OHOS
110