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