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
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_render_node_bridge.h"
17
18 #include <cstdint>
19
20 #include "base/geometry/dimension.h"
21 #include "base/geometry/ng/rect_t.h"
22 #include "base/geometry/shape.h"
23 #include "core/components/common/layout/constants.h"
24 #include "core/components_ng/pattern/render_node/render_node_properties.h"
25 #include "core/interfaces/native/node/api.h"
26
27 namespace OHOS::Ace::NG {
AppendChild(ArkUIRuntimeCallInfo * runtimeCallInfo)28 ArkUINativeModuleValue RenderNodeBridge::AppendChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
29 {
30 EcmaVM* vm = runtimeCallInfo->GetVM();
31 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
32 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
33 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
34 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
35 void* childNativeNode = secondArg->ToNativePointer(vm)->Value();
36 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().AppendChild(nativeNode, childNativeNode);
37 return panda::JSValueRef::Undefined(vm);
38 }
39
InsertChildAfter(ArkUIRuntimeCallInfo * runtimeCallInfo)40 ArkUINativeModuleValue RenderNodeBridge::InsertChildAfter(ArkUIRuntimeCallInfo* runtimeCallInfo)
41 {
42 EcmaVM* vm = runtimeCallInfo->GetVM();
43 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
44 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
45 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
46 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
47 void* child = secondArg->ToNativePointer(vm)->Value();
48 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
49 if (thirdArg.IsNull()) {
50 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().InsertChildAfter(nativeNode, child, nullptr);
51 return panda::JSValueRef::Undefined(vm);
52 }
53 void* sibling = thirdArg->ToNativePointer(vm)->Value();
54 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().InsertChildAfter(nativeNode, child, sibling);
55 return panda::JSValueRef::Undefined(vm);
56 }
57
RemoveChild(ArkUIRuntimeCallInfo * runtimeCallInfo)58 ArkUINativeModuleValue RenderNodeBridge::RemoveChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
59 {
60 EcmaVM* vm = runtimeCallInfo->GetVM();
61 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
62 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
63 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
64 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
65 void* childNativeNode = secondArg->ToNativePointer(vm)->Value();
66 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().RemoveChild(nativeNode, childNativeNode);
67 return panda::JSValueRef::Undefined(vm);
68 }
69
ClearChildren(ArkUIRuntimeCallInfo * runtimeCallInfo)70 ArkUINativeModuleValue RenderNodeBridge::ClearChildren(ArkUIRuntimeCallInfo* runtimeCallInfo)
71 {
72 EcmaVM* vm = runtimeCallInfo->GetVM();
73 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
74 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
75 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
76 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().ClearChildren(nativeNode);
77 return panda::JSValueRef::Undefined(vm);
78 }
79
SetClipToFrame(ArkUIRuntimeCallInfo * runtimeCallInfo)80 ArkUINativeModuleValue RenderNodeBridge::SetClipToFrame(ArkUIRuntimeCallInfo* runtimeCallInfo)
81 {
82 EcmaVM* vm = runtimeCallInfo->GetVM();
83 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
84 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
85 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
86 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
87 bool useClip = false;
88 if (secondArg->IsBoolean()) {
89 useClip = secondArg->ToBoolean(vm)->Value();
90 }
91 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetClipToFrame(nativeNode, useClip);
92 return panda::JSValueRef::Undefined(vm);
93 }
94
SetRotation(ArkUIRuntimeCallInfo * runtimeCallInfo)95 ArkUINativeModuleValue RenderNodeBridge::SetRotation(ArkUIRuntimeCallInfo* runtimeCallInfo)
96 {
97 EcmaVM* vm = runtimeCallInfo->GetVM();
98 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
99 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
100 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
101 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
102 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
103 Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(3);
104 double rotationX = 0.0;
105 double rotationY = 0.0;
106 double rotationZ = 0.0;
107 if (secondArg->IsNumber()) {
108 rotationX = secondArg->ToNumber(vm)->Value();
109 }
110 if (thirdArg->IsNumber()) {
111 rotationY = thirdArg->ToNumber(vm)->Value();
112 }
113 if (fourthArg->IsNumber()) {
114 rotationZ = fourthArg->ToNumber(vm)->Value();
115 }
116 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetRotation(nativeNode, rotationX, rotationY, rotationZ);
117 return panda::JSValueRef::Undefined(vm);
118 }
119
SetShadowColor(ArkUIRuntimeCallInfo * runtimeCallInfo)120 ArkUINativeModuleValue RenderNodeBridge::SetShadowColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
121 {
122 EcmaVM* vm = runtimeCallInfo->GetVM();
123 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
124 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
125 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
126 Local<JSValueRef> color = runtimeCallInfo->GetCallArgRef(1);
127 uint32_t colorValue = 0;
128 if (color->IsNumber()) {
129 colorValue = color->Uint32Value(vm);
130 }
131 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetShadowColor(nativeNode, colorValue);
132 return panda::JSValueRef::Undefined(vm);
133 }
134
SetShadowOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)135 ArkUINativeModuleValue RenderNodeBridge::SetShadowOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
136 {
137 EcmaVM* vm = runtimeCallInfo->GetVM();
138 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
139 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
140 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
141 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
142 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
143 double offsetX = 0.0;
144 double offsetY = 0.0;
145 if (secondArg->IsNumber()) {
146 offsetX = secondArg->ToNumber(vm)->Value();
147 }
148 if (thirdArg->IsNumber()) {
149 offsetY = thirdArg->ToNumber(vm)->Value();
150 }
151 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetShadowOffset(nativeNode, offsetX, offsetY);
152 return panda::JSValueRef::Undefined(vm);
153 }
SetShadowAlpha(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue RenderNodeBridge::SetShadowAlpha(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156 EcmaVM* vm = runtimeCallInfo->GetVM();
157 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
159 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
160 Local<JSValueRef> alpha = runtimeCallInfo->GetCallArgRef(1);
161 float alphaValue = 1.0;
162 if (alpha->IsNumber()) {
163 alphaValue = alpha->ToNumber(vm)->Value();
164 }
165 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetShadowAlpha(nativeNode, alphaValue);
166 return panda::JSValueRef::Undefined(vm);
167 }
SetShadowElevation(ArkUIRuntimeCallInfo * runtimeCallInfo)168 ArkUINativeModuleValue RenderNodeBridge::SetShadowElevation(ArkUIRuntimeCallInfo* runtimeCallInfo)
169 {
170 EcmaVM* vm = runtimeCallInfo->GetVM();
171 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
172 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
173 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
174 Local<JSValueRef> elevation = runtimeCallInfo->GetCallArgRef(1);
175 float elevationValue = 0;
176 if (elevation->IsNumber()) {
177 elevationValue = elevation->ToNumber(vm)->Value();
178 }
179 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetShadowElevation(nativeNode, elevationValue);
180 return panda::JSValueRef::Undefined(vm);
181 }
SetShadowRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)182 ArkUINativeModuleValue RenderNodeBridge::SetShadowRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
183 {
184 EcmaVM* vm = runtimeCallInfo->GetVM();
185 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
186 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
187 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
188 Local<JSValueRef> radius = runtimeCallInfo->GetCallArgRef(1);
189 float radiusValue = 0;
190 if (radius->IsNumber()) {
191 radiusValue = radius->ToNumber(vm)->Value();
192 }
193
194 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetShadowRadius(nativeNode, radiusValue);
195 return panda::JSValueRef::Undefined(vm);
196 }
197
SetScale(ArkUIRuntimeCallInfo * runtimeCallInfo)198 ArkUINativeModuleValue RenderNodeBridge::SetScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200 EcmaVM* vm = runtimeCallInfo->GetVM();
201 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
202 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
203 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
204
205 Local<JSValueRef> scaleX = runtimeCallInfo->GetCallArgRef(1);
206 float scaleXValue = 0;
207 if (scaleX->IsNumber()) {
208 scaleXValue = scaleX->ToNumber(vm)->Value();
209 }
210
211 Local<JSValueRef> scaleY = runtimeCallInfo->GetCallArgRef(2);
212 float scaleYValue = 0;
213 if (scaleY->IsNumber()) {
214 scaleYValue = scaleY->ToNumber(vm)->Value();
215 }
216
217 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetScale(nativeNode, scaleXValue, scaleYValue);
218 return panda::JSValueRef::Undefined(vm);
219 }
220
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue RenderNodeBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223 EcmaVM* vm = runtimeCallInfo->GetVM();
224 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
226 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
227 Local<JSValueRef> color = runtimeCallInfo->GetCallArgRef(1);
228 uint32_t colorValue = 0;
229 if (color->IsNumber()) {
230 colorValue = color->Uint32Value(vm);
231 }
232
233 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetRenderNodeBackgroundColor(nativeNode, colorValue);
234 return panda::JSValueRef::Undefined(vm);
235 }
236
SetPivot(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue RenderNodeBridge::SetPivot(ArkUIRuntimeCallInfo* runtimeCallInfo)
238 {
239 EcmaVM* vm = runtimeCallInfo->GetVM();
240 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
241 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
242 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
243
244 Local<JSValueRef> pivotX = runtimeCallInfo->GetCallArgRef(1);
245 float pivotXValue = 0;
246 if (pivotX->IsNumber()) {
247 pivotXValue = pivotX->ToNumber(vm)->Value();
248 }
249
250 Local<JSValueRef> pivotY = runtimeCallInfo->GetCallArgRef(2);
251 float pivotYValue = 0;
252 if (pivotY->IsNumber()) {
253 pivotYValue = pivotY->ToNumber(vm)->Value();
254 }
255
256 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetPivot(nativeNode, pivotXValue, pivotYValue);
257 return panda::JSValueRef::Undefined(vm);
258 }
259
SetFrame(ArkUIRuntimeCallInfo * runtimeCallInfo)260 ArkUINativeModuleValue RenderNodeBridge::SetFrame(ArkUIRuntimeCallInfo* runtimeCallInfo)
261 {
262 EcmaVM* vm = runtimeCallInfo->GetVM();
263 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
264 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
265 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
266
267 Local<JSValueRef> positionX = runtimeCallInfo->GetCallArgRef(1);
268 float positionXValue = 0;
269 if (positionX->IsNumber()) {
270 positionXValue = positionX->ToNumber(vm)->Value();
271 }
272
273 Local<JSValueRef> positionY = runtimeCallInfo->GetCallArgRef(2);
274 float positionYValue = 0;
275 if (positionY->IsNumber()) {
276 positionYValue = positionY->ToNumber(vm)->Value();
277 }
278
279 Local<JSValueRef> width = runtimeCallInfo->GetCallArgRef(3);
280 float widthValue = 0;
281 if (width->IsNumber()) {
282 widthValue = width->ToNumber(vm)->Value();
283 }
284
285 Local<JSValueRef> height = runtimeCallInfo->GetCallArgRef(4);
286 float heightValue = 0;
287 if (height->IsNumber()) {
288 heightValue = height->ToNumber(vm)->Value();
289 }
290
291 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetFrame(
292 nativeNode, positionXValue, positionYValue, widthValue, heightValue);
293 return panda::JSValueRef::Undefined(vm);
294 }
295
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)296 ArkUINativeModuleValue RenderNodeBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
297 {
298 EcmaVM* vm = runtimeCallInfo->GetVM();
299 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
300 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
301 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
302
303 Local<JSValueRef> width = runtimeCallInfo->GetCallArgRef(1);
304 float widthValue = 0;
305 if (width->IsNumber()) {
306 widthValue = width->ToNumber(vm)->Value();
307 }
308
309 Local<JSValueRef> height = runtimeCallInfo->GetCallArgRef(2);
310 float heightValue = 0;
311 if (height->IsNumber()) {
312 heightValue = height->ToNumber(vm)->Value();
313 }
314
315 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetSize(nativeNode, widthValue, heightValue);
316 return panda::JSValueRef::Undefined(vm);
317 }
318
SetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue RenderNodeBridge::SetOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321 EcmaVM* vm = runtimeCallInfo->GetVM();
322 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
324 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
325 Local<JSValueRef> opacity = runtimeCallInfo->GetCallArgRef(1);
326 float opacityValue = 0;
327 if (opacity->IsNumber()) {
328 opacityValue = opacity->ToNumber(vm)->Value();
329 }
330
331 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetOpacity(nativeNode, opacityValue);
332 return panda::JSValueRef::Undefined(vm);
333 }
334
SetTranslate(ArkUIRuntimeCallInfo * runtimeCallInfo)335 ArkUINativeModuleValue RenderNodeBridge::SetTranslate(ArkUIRuntimeCallInfo* runtimeCallInfo)
336 {
337 EcmaVM* vm = runtimeCallInfo->GetVM();
338 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
339 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
340 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
341
342 Local<JSValueRef> translateX = runtimeCallInfo->GetCallArgRef(1);
343 float translateXValue = 0;
344 if (translateX->IsNumber()) {
345 translateXValue = translateX->ToNumber(vm)->Value();
346 }
347
348 Local<JSValueRef> translateY = runtimeCallInfo->GetCallArgRef(2);
349 float translateYValue = 0;
350 if (translateY->IsNumber()) {
351 translateYValue = translateY->ToNumber(vm)->Value();
352 }
353
354 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetTranslate(
355 nativeNode, translateXValue, translateYValue, 0);
356 return panda::JSValueRef::Undefined(vm);
357 }
358
SetBorderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)359 ArkUINativeModuleValue RenderNodeBridge::SetBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
360 {
361 EcmaVM* vm = runtimeCallInfo->GetVM();
362 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
363 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
364 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
365
366 auto leftStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 1);
367 auto leftStyleValue = static_cast<BorderStyle>(leftStyle);
368
369 auto topStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2);
370 auto topStyleValue = static_cast<BorderStyle>(topStyle);
371
372 auto rightStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3);
373 auto rightStyleValue = static_cast<BorderStyle>(rightStyle);
374
375 auto bottomStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4);
376 auto bottomStyleValue = static_cast<BorderStyle>(bottomStyle);
377
378 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetBorderStyle(
379 nativeNode, leftStyleValue, topStyleValue, rightStyleValue, bottomStyleValue);
380 return panda::JSValueRef::Undefined(vm);
381 }
382
SetBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)383 ArkUINativeModuleValue RenderNodeBridge::SetBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
384 {
385 EcmaVM* vm = runtimeCallInfo->GetVM();
386 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
387 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
388 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
389
390 auto leftWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1);
391 auto topWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2);
392 auto rightWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3);
393 auto bottomWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4);
394
395 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetBorderWidth(
396 nativeNode, leftWidthValue, topWidthValue, rightWidthValue, bottomWidthValue);
397 return panda::JSValueRef::Undefined(vm);
398 }
399
SetBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)400 ArkUINativeModuleValue RenderNodeBridge::SetBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
401 {
402 EcmaVM* vm = runtimeCallInfo->GetVM();
403 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
404 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
405 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
406
407 auto leftColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 1);
408 auto topColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2);
409 auto rightColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3);
410 auto bottomColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4);
411
412 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetBorderColor(
413 nativeNode, leftColorValue, topColorValue, rightColorValue, bottomColorValue);
414 return panda::JSValueRef::Undefined(vm);
415 }
416
SetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)417 ArkUINativeModuleValue RenderNodeBridge::SetBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
418 {
419 EcmaVM* vm = runtimeCallInfo->GetVM();
420 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
421 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
422 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
423
424 auto topLeftRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 1);
425 auto topRightRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 2);
426 auto bottomLeftRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 3);
427 auto bottomRightRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 4);
428
429 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetBorderRadius(
430 nativeNode, topLeftRadiusValue, topRightRadiusValue, bottomLeftRadiusValue, bottomRightRadiusValue);
431 return panda::JSValueRef::Undefined(vm);
432 }
433
SetRectMask(ArkUIRuntimeCallInfo * runtimeCallInfo)434 ArkUINativeModuleValue RenderNodeBridge::SetRectMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
435 {
436 EcmaVM* vm = runtimeCallInfo->GetVM();
437 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
438 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
439 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
440
441 auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1);
442 auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2);
443 auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3);
444 auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4);
445 auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5);
446 auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 6);
447 auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7);
448
449 RectF rect(leftValue, topValue, rightValue - leftValue, bottomValue - topValue);
450 ShapeMaskProperty property { fillColorValue, strokeColorValue, strokeWidthValue };
451
452 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetRectMask(
453 nativeNode, rect, property);
454 return panda::JSValueRef::Undefined(vm);
455 }
456
SetCircleMask(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue RenderNodeBridge::SetCircleMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459 EcmaVM* vm = runtimeCallInfo->GetVM();
460 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
462 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
463
464 auto centerXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1);
465 auto centerYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2);
466 auto radiusValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3);
467 auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4);
468 auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5);
469 auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 6);
470
471 Circle circle;
472 Dimension centerX(centerXValue, DimensionUnit::VP);
473 circle.SetAxisX(centerX);
474 Dimension centerY(centerYValue, DimensionUnit::VP);
475 circle.SetAxisY(centerY);
476 Dimension radius(radiusValue, DimensionUnit::VP);
477 circle.SetRadius(radius);
478
479 ShapeMaskProperty property { fillColorValue, strokeColorValue, strokeWidthValue };
480
481 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetCircleMask(
482 nativeNode, circle, property);
483 return panda::JSValueRef::Undefined(vm);
484 }
485
SetRoundRectMask(ArkUIRuntimeCallInfo * runtimeCallInfo)486 ArkUINativeModuleValue RenderNodeBridge::SetRoundRectMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
487 {
488 EcmaVM* vm = runtimeCallInfo->GetVM();
489 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
490 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
491 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
492
493 RoundRect roundRect;
494 auto topLeftXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1);
495 auto topLeftYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2);
496 roundRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, topLeftXValue, topLeftYValue);
497
498 auto topRightXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3);
499 auto topRightYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4);
500 roundRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, topRightXValue, topRightYValue);
501
502 auto bottomLeftXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 5);
503 auto bottomLeftYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 6);
504 roundRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, bottomLeftXValue, bottomLeftYValue);
505
506 auto bottomRightXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7);
507 auto bottomRightYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 8);
508 roundRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, bottomRightXValue, bottomRightYValue);
509
510 auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 9);
511 auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 10);
512 auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 11);
513 auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 12);
514
515 auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 13);
516 auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 14);
517 auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 15);
518
519 RectF rect(leftValue, topValue, rightValue - leftValue, bottomValue - topValue);
520 roundRect.SetRect(rect);
521
522 ShapeMaskProperty property { fillColorValue, strokeColorValue, strokeWidthValue };
523
524 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetRoundRectMask(
525 nativeNode, roundRect, property);
526 return panda::JSValueRef::Undefined(vm);
527 }
528
SetOvalMask(ArkUIRuntimeCallInfo * runtimeCallInfo)529 ArkUINativeModuleValue RenderNodeBridge::SetOvalMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
530 {
531 EcmaVM* vm = runtimeCallInfo->GetVM();
532 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
533 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
534 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
535
536 auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1);
537 auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2);
538 auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3);
539 auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4);
540 RectF rect(leftValue, topValue, rightValue - leftValue, bottomValue - topValue);
541
542 auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5);
543 auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 6);
544 auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7);
545
546 ShapeMaskProperty property { fillColorValue, strokeColorValue, strokeWidthValue };
547
548 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetOvalMask(
549 nativeNode, rect, property);
550 return panda::JSValueRef::Undefined(vm);
551 }
552
SetCommandPathMask(ArkUIRuntimeCallInfo * runtimeCallInfo)553 ArkUINativeModuleValue RenderNodeBridge::SetCommandPathMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
554 {
555 EcmaVM* vm = runtimeCallInfo->GetVM();
556 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
557 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
558 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
559
560 Local<JSValueRef> path = runtimeCallInfo->GetCallArgRef(1);
561 std::string pathValue;
562 if (path->IsString()) {
563 pathValue = path->ToString(vm)->ToString();
564 }
565
566 auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2);
567 auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3);
568 auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4);
569
570 ShapeMaskProperty property { fillColorValue, strokeColorValue, strokeWidthValue };
571
572 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().SetCommandPathMask(
573 nativeNode, pathValue, property);
574 return panda::JSValueRef::Undefined(vm);
575 }
576
Invalidate(ArkUIRuntimeCallInfo * runtimeCallInfo)577 ArkUINativeModuleValue RenderNodeBridge::Invalidate(ArkUIRuntimeCallInfo* runtimeCallInfo)
578 {
579 EcmaVM* vm = runtimeCallInfo->GetVM();
580 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
581 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
582 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
583 GetArkUIInternalNodeAPI()->GetRenderNodeModifier().Invalidate(nativeNode);
584 return panda::JSValueRef::Undefined(vm);
585 }
586 } // namespace OHOS::Ace::NG
587