• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 
17 #include "interfaces/napi/kits/utils/napi_utils.h"
18 
19 #include "frameworks/bridge/common/utils/engine_helper.h"
20 
21 #include "napi/native_api.h"
22 
23 namespace OHOS::Ace::Napi {
24 namespace {
25 constexpr size_t STR_BUFFER_SIZE = 1024;
26 }
JSGetRectangleById(napi_env env,napi_callback_info info)27 static napi_value JSGetRectangleById(napi_env env, napi_callback_info info)
28 {
29     size_t argc = 1;
30     napi_value argv = nullptr;
31     napi_value thisVar = nullptr;
32     void* data = nullptr;
33     napi_get_cb_info(env, info, &argc, &argv, &thisVar, &data);
34     NAPI_ASSERT(env, argc == 1, "requires 1 parameter");
35     napi_valuetype type = napi_undefined;
36     napi_typeof(env, argv, &type);
37     NAPI_ASSERT(env, type == napi_string, "the type of arg is not string");
38     char outBuffer[STR_BUFFER_SIZE] = { 0 };
39     size_t outSize = 0;
40     napi_get_value_string_utf8(env, argv, outBuffer, STR_BUFFER_SIZE, &outSize);
41     std::string key = std::string(outBuffer);
42     OHOS::Ace::NG::Rectangle rectangle;
43     auto delegate = EngineHelper::GetCurrentDelegateSafely();
44     if (!delegate) {
45         NapiThrow(env, "UI execution context not found.", ERROR_CODE_INTERNAL_ERROR);
46         return nullptr;
47     }
48     delegate->GetRectangleById(key, rectangle);
49 
50     napi_value obj = nullptr;
51     napi_value size = nullptr;
52     napi_value localOffset = nullptr;
53     napi_value windowOffset = nullptr;
54     napi_value screenOffset = nullptr;
55     napi_value translate = nullptr;
56     napi_value scale = nullptr;
57     napi_value rotate = nullptr;
58     napi_value transform = nullptr;
59 
60     napi_value width = nullptr;
61     napi_value height = nullptr;
62     napi_value localOffsetX = nullptr;
63     napi_value localOffsetY = nullptr;
64     napi_value windowOffsetX = nullptr;
65     napi_value windowOffsetY = nullptr;
66     napi_value screenOffsetX = nullptr;
67     napi_value screenOffsetY = nullptr;
68     napi_value translateX = nullptr;
69     napi_value translateY = nullptr;
70     napi_value translateZ = nullptr;
71     napi_value scaleX = nullptr;
72     napi_value scaleY = nullptr;
73     napi_value scaleZ = nullptr;
74     napi_value scaleCenterX = nullptr;
75     napi_value scaleCenterY = nullptr;
76     napi_value rotateX = nullptr;
77     napi_value rotateY = nullptr;
78     napi_value rotateZ = nullptr;
79     napi_value rotateAngle = nullptr;
80     napi_value rotateCenterX = nullptr;
81     napi_value rotateCenterY = nullptr;
82     napi_value matrix4[16] = { nullptr };
83 
84     const int m00 = 0;
85     const int m01 = 1;
86     const int m02 = 2;
87     const int m03 = 3;
88     const int m10 = 4;
89     const int m11 = 5;
90     const int m12 = 6;
91     const int m13 = 7;
92     const int m20 = 8;
93     const int m21 = 9;
94     const int m22 = 10;
95     const int m23 = 11;
96     const int m30 = 12;
97     const int m31 = 13;
98     const int m32 = 14;
99     const int m33 = 15;
100 
101     napi_create_array(env, &transform);
102 
103     napi_create_double(env, rectangle.size.Width(), &width);
104     napi_create_double(env, rectangle.size.Height(), &height);
105     napi_create_double(env, rectangle.localOffset.GetX(), &localOffsetX);
106     napi_create_double(env, rectangle.localOffset.GetY(), &localOffsetY);
107     napi_create_double(env, rectangle.windowOffset.GetX(), &windowOffsetX);
108     napi_create_double(env, rectangle.windowOffset.GetY(), &windowOffsetY);
109     napi_create_double(env, rectangle.windowOffset.GetX() + rectangle.screenRect.GetOffset().GetX(), &screenOffsetX);
110     napi_create_double(env, rectangle.windowOffset.GetY() + rectangle.screenRect.GetOffset().GetY(), &screenOffsetY);
111     napi_create_double(env, rectangle.translate.x, &translateX);
112     napi_create_double(env, rectangle.translate.y, &translateY);
113     napi_create_double(env, rectangle.translate.z, &translateZ);
114     napi_create_double(env, rectangle.scale.x, &scaleX);
115     napi_create_double(env, rectangle.scale.y, &scaleY);
116     napi_create_double(env, rectangle.scale.z, &scaleZ);
117     napi_create_double(env, rectangle.scale.centerX, &scaleCenterX);
118     napi_create_double(env, rectangle.scale.centerY, &scaleCenterY);
119     napi_create_double(env, rectangle.rotate.x, &rotateX);
120     napi_create_double(env, rectangle.rotate.y, &rotateY);
121     napi_create_double(env, rectangle.rotate.z, &rotateZ);
122     napi_create_double(env, rectangle.rotate.angle, &rotateAngle);
123     napi_create_double(env, rectangle.rotate.centerX, &rotateCenterX);
124     napi_create_double(env, rectangle.rotate.centerY, &rotateCenterY);
125 
126     napi_create_double(env, rectangle.matrix4[m00], &matrix4[m00]);
127     napi_create_double(env, rectangle.matrix4[m01], &matrix4[m10]);
128     napi_create_double(env, rectangle.matrix4[m02], &matrix4[m20]);
129     napi_create_double(env, rectangle.matrix4[m03], &matrix4[m30]);
130     napi_create_double(env, rectangle.matrix4[m10], &matrix4[m01]);
131     napi_create_double(env, rectangle.matrix4[m11], &matrix4[m11]);
132     napi_create_double(env, rectangle.matrix4[m12], &matrix4[m21]);
133     napi_create_double(env, rectangle.matrix4[m13], &matrix4[m31]);
134     napi_create_double(env, rectangle.matrix4[m20], &matrix4[m02]);
135     napi_create_double(env, rectangle.matrix4[m21], &matrix4[m12]);
136     napi_create_double(env, rectangle.matrix4[m22], &matrix4[m22]);
137     napi_create_double(env, rectangle.matrix4[m23], &matrix4[m32]);
138     napi_create_double(env, rectangle.matrix4[m30], &matrix4[m03]);
139     napi_create_double(env, rectangle.matrix4[m31], &matrix4[m13]);
140     napi_create_double(env, rectangle.matrix4[m32], &matrix4[m23]);
141     napi_create_double(env, rectangle.matrix4[m33], &matrix4[m33]);
142 
143     napi_set_element(env, transform, m00, matrix4[m00]);
144     napi_set_element(env, transform, m01, matrix4[m10]);
145     napi_set_element(env, transform, m02, matrix4[m20]);
146     napi_set_element(env, transform, m03, matrix4[m30]);
147     napi_set_element(env, transform, m10, matrix4[m01]);
148     napi_set_element(env, transform, m11, matrix4[m11]);
149     napi_set_element(env, transform, m12, matrix4[m21]);
150     napi_set_element(env, transform, m13, matrix4[m31]);
151     napi_set_element(env, transform, m20, matrix4[m02]);
152     napi_set_element(env, transform, m21, matrix4[m12]);
153     napi_set_element(env, transform, m22, matrix4[m22]);
154     napi_set_element(env, transform, m23, matrix4[m32]);
155     napi_set_element(env, transform, m30, matrix4[m03]);
156     napi_set_element(env, transform, m31, matrix4[m13]);
157     napi_set_element(env, transform, m32, matrix4[m23]);
158     napi_set_element(env, transform, m33, matrix4[m33]);
159 
160     constexpr size_t kTwoPropties = 2;
161     std::array<const char*, kTwoPropties> sizePropKey = { "width", "height" };
162     std::array<napi_value, kTwoPropties> sizePropValue = { width, height };
163     napi_create_object_with_named_properties(env, &size, kTwoPropties, sizePropKey.data(), sizePropValue.data());
164 
165     std::array<const char*, kTwoPropties> localOffsetPropKey = { "x", "y" };
166     std::array<napi_value, kTwoPropties> localOffsetPropValue = { localOffsetX, localOffsetY };
167     napi_create_object_with_named_properties(env, &localOffset, kTwoPropties,
168                                              localOffsetPropKey.data(), localOffsetPropValue.data());
169 
170     // same key with local offset { "x", "y" }
171     std::array<napi_value, kTwoPropties> windowOffsetPropValue = { windowOffsetX, windowOffsetY };
172     napi_create_object_with_named_properties(env, &windowOffset, kTwoPropties,
173                                              localOffsetPropKey.data(), windowOffsetPropValue.data());
174 
175     // same key with local offset { "x", "y" }
176     std::array<napi_value, kTwoPropties> screenOffsetPropValue = { screenOffsetX, screenOffsetY };
177     napi_create_object_with_named_properties(env, &screenOffset, kTwoPropties,
178                                              localOffsetPropKey.data(), screenOffsetPropValue.data());
179 
180     constexpr size_t kThreePropties = 3;
181     std::array<const char*, kThreePropties> translatePropKey = { "x", "y", "z" };
182     std::array<napi_value, kThreePropties> translatePropValue = { translateX, translateY, translateZ };
183     napi_create_object_with_named_properties(env, &translate, kThreePropties,
184                                              translatePropKey.data(), translatePropValue.data());
185 
186     constexpr size_t kFivePropties = 5;
187     std::array<const char*, kFivePropties> scalePropKey = { "x", "y", "z", "centerX", "centerY" };
188     std::array<napi_value, kFivePropties> scalePropValue = { scaleX, scaleY, scaleZ, scaleCenterX, scaleCenterY };
189     napi_create_object_with_named_properties(env, &scale, kFivePropties, scalePropKey.data(), scalePropValue.data());
190 
191     constexpr size_t kSixPropties = 6;
192     std::array<const char*, kSixPropties> rotatePropKey = { "x", "y", "z", "angle", "centerX", "centerY" };
193     std::array<napi_value, kSixPropties> rotatePropValue = { rotateX, rotateY, rotateZ, rotateAngle,
194                                                              rotateCenterX, rotateCenterY };
195     napi_create_object_with_named_properties(env, &rotate, kSixPropties, rotatePropKey.data(), rotatePropValue.data());
196 
197     constexpr size_t kEightPropties = 8;
198     std::array<const char*, kEightPropties> objPropKey = { "size", "localOffset", "windowOffset", "screenOffset",
199                                                            "translate", "scale", "rotate", "transform" };
200     std::array<napi_value, kEightPropties> objPropValue = { size, localOffset, windowOffset, screenOffset,
201                                                             translate, scale, rotate, transform };
202     napi_create_object_with_named_properties(env, &obj, kEightPropties, objPropKey.data(), objPropValue.data());
203 
204     return obj;
205 }
206 
registerFunc(napi_env env,napi_value exports)207 static napi_value registerFunc(napi_env env, napi_value exports)
208 {
209     napi_property_descriptor animatorDesc[] = {
210         DECLARE_NAPI_FUNCTION("getRectangleById", JSGetRectangleById),
211     };
212     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(animatorDesc) / sizeof(animatorDesc[0]), animatorDesc));
213     return exports;
214 }
215 
216 static napi_module componentUtilsModule = {
217     .nm_version = 1,
218     .nm_flags = 0,
219     .nm_filename = nullptr,
220     .nm_register_func = registerFunc,
221     .nm_modname = "arkui.componentUtils",
222     .nm_priv = ((void*)0),
223     .reserved = { 0 },
224 };
225 
ComponentUtilsRegister()226 extern "C" __attribute__((constructor)) void ComponentUtilsRegister()
227 {
228     napi_module_register(&componentUtilsModule);
229 }
230 } // namespace OHOS::Ace::Napi
231