• 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 
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