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