• 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 "canvas_napi/js_canvas.h"
21 #include "jsnapi_expo.h"
22 
23 #include "base/geometry/dimension.h"
24 #include "base/geometry/ng/rect_t.h"
25 #include "base/geometry/shape.h"
26 #include "bridge/common/utils/engine_helper.h"
27 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_bridge.h"
28 #include "bridge/declarative_frontend/jsview/js_utils.h"
29 #include "core/components_ng/pattern/render_node/render_node_pattern.h"
30 
31 namespace OHOS::Ace::NG {
32 namespace {
33 const uint32_t DEFAULT_COLOR = 0xFF000000;
34 
SetRectShape(ArkUIRuntimeCallInfo * runtimeCallInfo,bool isClip)35 ArkUINativeModuleValue SetRectShape(ArkUIRuntimeCallInfo* runtimeCallInfo, bool isClip)
36 {
37     EcmaVM* vm = runtimeCallInfo->GetVM();
38     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
39     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
40 
41     auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1, 0.0f);
42     auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2, 0.0f);
43     auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3, 0.0f);
44     auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4, 0.0f);
45     if (isClip) {
46         GetArkUINodeModifiers()->getRenderNodeModifier()->setRectClip(
47             nativeNode, leftValue, topValue, rightValue - leftValue, bottomValue - topValue);
48         return panda::JSValueRef::Undefined(vm);
49     }
50     auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5, DEFAULT_COLOR);
51     auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 6, DEFAULT_COLOR);
52     auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7, 0.0f);
53 
54     GetArkUINodeModifiers()->getRenderNodeModifier()->setRectMask(nativeNode, leftValue, topValue,
55         rightValue - leftValue, bottomValue - topValue, fillColorValue, strokeColorValue, strokeWidthValue);
56     return panda::JSValueRef::Undefined(vm);
57 }
58 
SetCircleShape(ArkUIRuntimeCallInfo * runtimeCallInfo,bool isClip)59 ArkUINativeModuleValue SetCircleShape(ArkUIRuntimeCallInfo* runtimeCallInfo, bool isClip)
60 {
61     EcmaVM* vm = runtimeCallInfo->GetVM();
62     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
63     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
64 
65     auto centerXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1, 0.0f);
66     auto centerYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2, 0.0f);
67     auto radiusValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3, 0.0f);
68     if (isClip) {
69         GetArkUINodeModifiers()->getRenderNodeModifier()->setCircleClip(
70             nativeNode, centerXValue, centerYValue, radiusValue);
71         return panda::JSValueRef::Undefined(vm);
72     }
73     auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4, DEFAULT_COLOR);
74     auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5, DEFAULT_COLOR);
75     auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 6, 0.0f);
76 
77     GetArkUINodeModifiers()->getRenderNodeModifier()->setCircleMask(
78         nativeNode, centerXValue, centerYValue, radiusValue, fillColorValue, strokeColorValue, strokeWidthValue);
79     return panda::JSValueRef::Undefined(vm);
80 }
81 
SetRoundRectShape(ArkUIRuntimeCallInfo * runtimeCallInfo,bool isClip)82 ArkUINativeModuleValue SetRoundRectShape(ArkUIRuntimeCallInfo* runtimeCallInfo, bool isClip)
83 {
84     EcmaVM* vm = runtimeCallInfo->GetVM();
85     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
86     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
87 
88     auto topLeftXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1, 0.0f);
89     auto topLeftYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2, 0.0f);
90 
91     auto topRightXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3, 0.0f);
92     auto topRightYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4, 0.0f);
93 
94     auto bottomLeftXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 5, 0.0f);
95     auto bottomLeftYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 6, 0.0f);
96 
97     auto bottomRightXValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7, 0.0f);
98     auto bottomRightYValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 8, 0.0f);
99 
100     auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 9, 0.0f);
101     auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 10, 0.0f);
102     auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 11, 0.0f);
103     auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 12, 0.0f);
104 
105     ArkUI_Float32 roundRect[] = { topLeftXValue, topLeftYValue, topRightXValue, topRightYValue, bottomLeftXValue,
106         bottomLeftYValue, bottomRightXValue, bottomRightYValue, leftValue, topValue, rightValue - leftValue,
107         bottomValue - topValue };
108 
109     if (isClip) {
110         GetArkUINodeModifiers()->getRenderNodeModifier()->setRoundRectClip(nativeNode, roundRect, sizeof(roundRect));
111         return panda::JSValueRef::Undefined(vm);
112     }
113 
114     auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 13, DEFAULT_COLOR);
115     auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 14, DEFAULT_COLOR);
116     auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 15, 0.0f);
117 
118     GetArkUINodeModifiers()->getRenderNodeModifier()->setRoundRectMask(
119         nativeNode, roundRect, sizeof(roundRect), fillColorValue, strokeColorValue, strokeWidthValue);
120     return panda::JSValueRef::Undefined(vm);
121 }
122 
SetOvalShape(ArkUIRuntimeCallInfo * runtimeCallInfo,bool isClip)123 ArkUINativeModuleValue SetOvalShape(ArkUIRuntimeCallInfo* runtimeCallInfo, bool isClip)
124 {
125     EcmaVM* vm = runtimeCallInfo->GetVM();
126     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
127     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
128 
129     auto leftValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1, 0.0f);
130     auto topValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2, 0.0f);
131     auto rightValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3, 0.0f);
132     auto bottomValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4, 0.0f);
133     if (isClip) {
134         GetArkUINodeModifiers()->getRenderNodeModifier()->setOvalClip(
135             nativeNode, leftValue, topValue, rightValue - leftValue, bottomValue - topValue);
136         return panda::JSValueRef::Undefined(vm);
137     }
138     auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 5, DEFAULT_COLOR);
139     auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 6, DEFAULT_COLOR);
140     auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 7, 0.0f);
141 
142     GetArkUINodeModifiers()->getRenderNodeModifier()->setOvalMask(nativeNode, leftValue, topValue,
143         rightValue - leftValue, bottomValue - topValue, fillColorValue, strokeColorValue, strokeWidthValue);
144     return panda::JSValueRef::Undefined(vm);
145 }
146 
SetCommandPathShape(ArkUIRuntimeCallInfo * runtimeCallInfo,bool isClip)147 ArkUINativeModuleValue SetCommandPathShape(ArkUIRuntimeCallInfo* runtimeCallInfo, bool isClip)
148 {
149     EcmaVM* vm = runtimeCallInfo->GetVM();
150     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
151     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
152 
153     Local<JSValueRef> path = runtimeCallInfo->GetCallArgRef(1);
154     std::string pathValue;
155     if (path->IsString(vm)) {
156         pathValue = path->ToString(vm)->ToString(vm);
157     }
158 
159     if (isClip) {
160         GetArkUINodeModifiers()->getRenderNodeModifier()->setCommandPathClip(nativeNode, pathValue.c_str());
161         return panda::JSValueRef::Undefined(vm);
162     }
163     auto fillColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2, DEFAULT_COLOR);
164     auto strokeColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3, DEFAULT_COLOR);
165     auto strokeWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4, 0.0f);
166 
167     GetArkUINodeModifiers()->getRenderNodeModifier()->setCommandPathMask(
168         nativeNode, pathValue.c_str(), fillColorValue, strokeColorValue, strokeWidthValue);
169     return panda::JSValueRef::Undefined(vm);
170 }
171 } // namespace
172 
CreateRenderNode(ArkUIRuntimeCallInfo * runtimeCallInfo)173 ArkUINativeModuleValue RenderNodeBridge::CreateRenderNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
174 {
175     EcmaVM* vm = runtimeCallInfo->GetVM();
176     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
177     auto frameNode = NG::FrameNode::GetOrCreateFrameNode(
178         V2::RENDER_NODE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NG::RenderNodePattern>(); });
179     frameNode->SetIsArkTsRenderNode(true);
180     RenderNodeBridge::SetOnDraw(frameNode, runtimeCallInfo);
181     return NativeUtilsBridge::CreateStrongRef(vm, frameNode);
182 }
183 
FireDrawCallback(EcmaVM * vm,JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,NG::DrawingContext & context,Local<panda::StringRef> funcName)184 void RenderNodeBridge::FireDrawCallback(EcmaVM* vm, JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,
185     NG::DrawingContext& context, Local<panda::StringRef> funcName)
186 {
187     auto obj = object.Lock();
188     CHECK_NULL_VOID(!obj.IsEmpty());
189     CHECK_NULL_VOID(obj->IsObject(vm));
190     auto funcObj = obj->Get(vm, funcName);
191     CHECK_NULL_VOID(funcObj->IsFunction(vm));
192     panda::Local<panda::FunctionRef> func = funcObj;
193     auto engine = EngineHelper::GetCurrentEngine();
194     CHECK_NULL_VOID(engine);
195     NativeEngine* nativeEngine = engine->GetNativeEngine();
196     napi_env env = reinterpret_cast<napi_env>(nativeEngine);
197     Framework::ScopeRAII scope(env);
198 
199     const char* keysOfSize[] = { "height", "width" };
200     Local<JSValueRef> valuesOfSize[] = {
201         panda::NumberRef::New(vm, static_cast<double>(PipelineBase::Px2VpWithCurrentDensity(context.height))),
202         panda::NumberRef::New(vm, static_cast<double>(PipelineBase::Px2VpWithCurrentDensity(context.width)))
203     };
204     auto sizeObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSize), keysOfSize, valuesOfSize);
205 
206     Local<JSValueRef> valuesOfSizeInPixel[] = {
207         panda::NumberRef::New(vm, static_cast<double>(context.height)),
208         panda::NumberRef::New(vm, static_cast<double>(context.width))
209     };
210     auto sizeInPixelObj =
211         panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSize), keysOfSize, valuesOfSizeInPixel);
212 
213     auto jsCanvas = OHOS::Rosen::Drawing::JsCanvas::CreateJsCanvas(env, &context.canvas);
214     OHOS::Rosen::Drawing::JsCanvas* unwrapCanvas = nullptr;
215     napi_unwrap(env, jsCanvas, reinterpret_cast<void**>(&unwrapCanvas));
216     if (unwrapCanvas) {
217         unwrapCanvas->SaveCanvas();
218         unwrapCanvas->ClipCanvas(context.width, context.height);
219     }
220 
221     auto jsCanvasVal = NapiValueToLocalValue(jsCanvas);
222     Local<JSValueRef> values[] = { sizeObj, sizeInPixelObj, jsCanvasVal };
223     const char* keys[] = { "size", "sizeInPixel", "canvas" };
224     auto contextObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
225     contextObj->SetNativePointerFieldCount(vm, 1);
226     JSValueWrapper valueWrapper = contextObj;
227     napi_value nativeValue = nativeEngine->ValueToNapiValue(valueWrapper);
228     napi_wrap(
229         env, nativeValue, &context.canvas, [](napi_env, void*, void*) {}, nullptr, nullptr);
230     panda::Local<panda::JSValueRef> params[1] = { contextObj };
231     func->Call(vm, obj.ToLocal(), params, 1);
232     if (unwrapCanvas) {
233         unwrapCanvas->RestoreCanvas();
234         unwrapCanvas->ResetCanvas();
235     }
236 }
237 
SetOnDraw(const RefPtr<FrameNode> & frameNode,ArkUIRuntimeCallInfo * runtimeCallInfo)238 void RenderNodeBridge::SetOnDraw(const RefPtr<FrameNode>& frameNode, ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240     EcmaVM* vm = runtimeCallInfo->GetVM();
241     CHECK_NULL_VOID(vm);
242     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
243     CHECK_NULL_VOID(firstArg->IsObject(vm));
244     auto obj = Local<panda::ObjectRef>(firstArg);
245     auto funcName = panda::StringRef::NewFromUtf8(vm, "draw");
246     auto funcObj = obj->Get(vm, funcName);
247     CHECK_NULL_VOID(funcObj->IsFunction(vm));
248     auto drawCallback = [vm, object = JsWeak(panda::CopyableGlobal(vm, obj))](NG::DrawingContext& context) {
249         panda::LocalScope pandaScope(vm);
250         panda::TryCatch trycatch(vm);
251         auto funcName = panda::StringRef::NewFromUtf8(vm, "draw");
252         RenderNodeBridge::FireDrawCallback(vm, object, context, funcName);
253     };
254     auto pattern = frameNode->GetPattern<NG::RenderNodePattern>();
255     pattern->SetDrawCallback(std::move(drawCallback));
256 }
257 
AppendChild(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue RenderNodeBridge::AppendChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260     EcmaVM* vm = runtimeCallInfo->GetVM();
261     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
262     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
263     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
264     auto childNativeNode = nodePtr(secondArg->ToNativePointer(vm)->Value());
265     GetArkUINodeModifiers()->getRenderNodeModifier()->appendChild(nativeNode, childNativeNode);
266     return panda::JSValueRef::Undefined(vm);
267 }
268 
InsertChildAfter(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue RenderNodeBridge::InsertChildAfter(ArkUIRuntimeCallInfo* runtimeCallInfo)
270 {
271     EcmaVM* vm = runtimeCallInfo->GetVM();
272     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
273     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
274     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
275     auto child = nodePtr(secondArg->ToNativePointer(vm)->Value());
276     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
277     if (thirdArg.IsNull()) {
278         GetArkUINodeModifiers()->getRenderNodeModifier()->insertChildAfter(nativeNode, child, nullptr);
279         return panda::JSValueRef::Undefined(vm);
280     }
281     auto sibling = nodePtr(thirdArg->ToNativePointer(vm)->Value());
282     GetArkUINodeModifiers()->getRenderNodeModifier()->insertChildAfter(nativeNode, child, sibling);
283     return panda::JSValueRef::Undefined(vm);
284 }
285 
RemoveChild(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue RenderNodeBridge::RemoveChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288     EcmaVM* vm = runtimeCallInfo->GetVM();
289     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
290     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
291     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
292     auto childNativeNode = nodePtr(secondArg->ToNativePointer(vm)->Value());
293     GetArkUINodeModifiers()->getRenderNodeModifier()->removeChild(nativeNode, childNativeNode);
294     return panda::JSValueRef::Undefined(vm);
295 }
296 
ClearChildren(ArkUIRuntimeCallInfo * runtimeCallInfo)297 ArkUINativeModuleValue RenderNodeBridge::ClearChildren(ArkUIRuntimeCallInfo* runtimeCallInfo)
298 {
299     EcmaVM* vm = runtimeCallInfo->GetVM();
300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
301     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
302     GetArkUINodeModifiers()->getRenderNodeModifier()->clearChildren(nativeNode);
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
SetClipToFrame(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue RenderNodeBridge::SetClipToFrame(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308     EcmaVM* vm = runtimeCallInfo->GetVM();
309     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
310     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
312     bool useClip = false;
313     if (secondArg->IsBoolean()) {
314         useClip = secondArg->ToBoolean(vm)->Value();
315     }
316     GetArkUINodeModifiers()->getRenderNodeModifier()->setClipToFrame(nativeNode, useClip);
317     return panda::JSValueRef::Undefined(vm);
318 }
319 
SetRotation(ArkUIRuntimeCallInfo * runtimeCallInfo)320 ArkUINativeModuleValue RenderNodeBridge::SetRotation(ArkUIRuntimeCallInfo* runtimeCallInfo)
321 {
322     EcmaVM* vm = runtimeCallInfo->GetVM();
323     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
324     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
325     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
326     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
327     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(3);
328     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(4);
329     double rotationX = 0.0;
330     double rotationY = 0.0;
331     double rotationZ = 0.0;
332     int32_t unit = 0;
333     if (secondArg->IsNumber()) {
334         rotationX = secondArg->ToNumber(vm)->Value();
335     }
336     if (thirdArg->IsNumber()) {
337         rotationY = thirdArg->ToNumber(vm)->Value();
338     }
339     if (fourthArg->IsNumber()) {
340         rotationZ = fourthArg->ToNumber(vm)->Value();
341     }
342     if (fifthArg->IsNumber()) {
343         unit = fifthArg->Int32Value(vm);
344     }
345     GetArkUINodeModifiers()->getRenderNodeModifier()->setRotation(nativeNode, rotationX, rotationY, rotationZ, unit);
346     return panda::JSValueRef::Undefined(vm);
347 }
348 
SetShadowColor(ArkUIRuntimeCallInfo * runtimeCallInfo)349 ArkUINativeModuleValue RenderNodeBridge::SetShadowColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
350 {
351     EcmaVM* vm = runtimeCallInfo->GetVM();
352     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
353     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
354     Local<JSValueRef> color = runtimeCallInfo->GetCallArgRef(1);
355     uint32_t colorValue = 0;
356     if (color->IsNumber()) {
357         colorValue = color->Uint32Value(vm);
358     }
359     GetArkUINodeModifiers()->getRenderNodeModifier()->setShadowColor(nativeNode, colorValue);
360     return panda::JSValueRef::Undefined(vm);
361 }
362 
SetShadowOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)363 ArkUINativeModuleValue RenderNodeBridge::SetShadowOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
364 {
365     EcmaVM* vm = runtimeCallInfo->GetVM();
366     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
367     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
368     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
369     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
370     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(3);
371     double offsetX = 0.0;
372     double offsetY = 0.0;
373     int32_t unit = 0;
374     if (secondArg->IsNumber()) {
375         offsetX = secondArg->ToNumber(vm)->Value();
376     }
377     if (thirdArg->IsNumber()) {
378         offsetY = thirdArg->ToNumber(vm)->Value();
379     }
380     if (fourthArg->IsNumber()) {
381         unit = fourthArg->Int32Value(vm);
382     }
383     GetArkUINodeModifiers()->getRenderNodeModifier()->setShadowOffset(nativeNode, offsetX, offsetY, unit);
384     return panda::JSValueRef::Undefined(vm);
385 }
SetLabel(ArkUIRuntimeCallInfo * runtimeCallInfo)386 ArkUINativeModuleValue RenderNodeBridge::SetLabel(ArkUIRuntimeCallInfo* runtimeCallInfo)
387 {
388     EcmaVM* vm = runtimeCallInfo->GetVM();
389     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
390     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
391     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
392     Local<JSValueRef> label = runtimeCallInfo->GetCallArgRef(1);
393     std::string labelValue;
394     if (label->IsString(vm)) {
395         labelValue = label->ToString(vm)->ToString(vm);
396     } else {
397         labelValue = "";
398         LOGW("The label of the node should be a string!");
399     }
400     GetArkUINodeModifiers()->getRenderNodeModifier()->setLabel(nativeNode, labelValue.c_str());
401     return panda::JSValueRef::Undefined(vm);
402 }
SetShadowAlpha(ArkUIRuntimeCallInfo * runtimeCallInfo)403 ArkUINativeModuleValue RenderNodeBridge::SetShadowAlpha(ArkUIRuntimeCallInfo* runtimeCallInfo)
404 {
405     EcmaVM* vm = runtimeCallInfo->GetVM();
406     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
407     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
408     Local<JSValueRef> alpha = runtimeCallInfo->GetCallArgRef(1);
409     float alphaValue = 1.0;
410     if (alpha->IsNumber()) {
411         alphaValue = alpha->ToNumber(vm)->Value();
412     }
413     GetArkUINodeModifiers()->getRenderNodeModifier()->setShadowAlpha(nativeNode, alphaValue);
414     return panda::JSValueRef::Undefined(vm);
415 }
SetShadowElevation(ArkUIRuntimeCallInfo * runtimeCallInfo)416 ArkUINativeModuleValue RenderNodeBridge::SetShadowElevation(ArkUIRuntimeCallInfo* runtimeCallInfo)
417 {
418     EcmaVM* vm = runtimeCallInfo->GetVM();
419     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
420     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
421     Local<JSValueRef> elevation = runtimeCallInfo->GetCallArgRef(1);
422     float elevationValue = 0;
423     if (elevation->IsNumber()) {
424         elevationValue = elevation->ToNumber(vm)->Value();
425     }
426     GetArkUINodeModifiers()->getRenderNodeModifier()->setShadowElevation(nativeNode, elevationValue);
427     return panda::JSValueRef::Undefined(vm);
428 }
SetShadowRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)429 ArkUINativeModuleValue RenderNodeBridge::SetShadowRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
430 {
431     EcmaVM* vm = runtimeCallInfo->GetVM();
432     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
433     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
434     Local<JSValueRef> radius = runtimeCallInfo->GetCallArgRef(1);
435     float radiusValue = 0;
436     if (radius->IsNumber()) {
437         radiusValue = radius->ToNumber(vm)->Value();
438     }
439 
440     GetArkUINodeModifiers()->getRenderNodeModifier()->setShadowRadius(nativeNode, radiusValue);
441     return panda::JSValueRef::Undefined(vm);
442 }
443 
SetScale(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue RenderNodeBridge::SetScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
448     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
449 
450     Local<JSValueRef> scaleX = runtimeCallInfo->GetCallArgRef(1);
451     float scaleXValue = 0;
452     if (scaleX->IsNumber()) {
453         scaleXValue = scaleX->ToNumber(vm)->Value();
454     }
455 
456     Local<JSValueRef> scaleY = runtimeCallInfo->GetCallArgRef(2);
457     float scaleYValue = 0;
458     if (scaleY->IsNumber()) {
459         scaleYValue = scaleY->ToNumber(vm)->Value();
460     }
461 
462     GetArkUINodeModifiers()->getRenderNodeModifier()->setScale(nativeNode, scaleXValue, scaleYValue);
463     return panda::JSValueRef::Undefined(vm);
464 }
465 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)466 ArkUINativeModuleValue RenderNodeBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
467 {
468     EcmaVM* vm = runtimeCallInfo->GetVM();
469     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
470     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
471     Local<JSValueRef> color = runtimeCallInfo->GetCallArgRef(1);
472     uint32_t colorValue = 0;
473     if (color->IsNumber()) {
474         colorValue = color->Uint32Value(vm);
475     }
476 
477     GetArkUINodeModifiers()->getRenderNodeModifier()->setRenderNodeBackgroundColor(nativeNode, colorValue);
478     return panda::JSValueRef::Undefined(vm);
479 }
480 
SetPivot(ArkUIRuntimeCallInfo * runtimeCallInfo)481 ArkUINativeModuleValue RenderNodeBridge::SetPivot(ArkUIRuntimeCallInfo* runtimeCallInfo)
482 {
483     EcmaVM* vm = runtimeCallInfo->GetVM();
484     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
485     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
486 
487     Local<JSValueRef> pivotX = runtimeCallInfo->GetCallArgRef(1);
488     float pivotXValue = 0;
489     if (pivotX->IsNumber()) {
490         pivotXValue = pivotX->ToNumber(vm)->Value();
491     }
492 
493     Local<JSValueRef> pivotY = runtimeCallInfo->GetCallArgRef(2);
494     float pivotYValue = 0;
495     if (pivotY->IsNumber()) {
496         pivotYValue = pivotY->ToNumber(vm)->Value();
497     }
498 
499     GetArkUINodeModifiers()->getRenderNodeModifier()->setPivot(nativeNode, pivotXValue, pivotYValue);
500     return panda::JSValueRef::Undefined(vm);
501 }
502 
SetFrame(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue RenderNodeBridge::SetFrame(ArkUIRuntimeCallInfo* runtimeCallInfo)
504 {
505     EcmaVM* vm = runtimeCallInfo->GetVM();
506     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
507     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
508 
509     Local<JSValueRef> positionX = runtimeCallInfo->GetCallArgRef(1);
510     float positionXValue = 0;
511     if (positionX->IsNumber()) {
512         positionXValue = positionX->ToNumber(vm)->Value();
513     }
514 
515     Local<JSValueRef> positionY = runtimeCallInfo->GetCallArgRef(2);
516     float positionYValue = 0;
517     if (positionY->IsNumber()) {
518         positionYValue = positionY->ToNumber(vm)->Value();
519     }
520 
521     Local<JSValueRef> width = runtimeCallInfo->GetCallArgRef(3);
522     float widthValue = 0;
523     if (width->IsNumber()) {
524         widthValue = width->ToNumber(vm)->Value();
525     }
526 
527     Local<JSValueRef> height = runtimeCallInfo->GetCallArgRef(4);
528     float heightValue = 0;
529     if (height->IsNumber()) {
530         heightValue = height->ToNumber(vm)->Value();
531     }
532 
533     GetArkUINodeModifiers()->getRenderNodeModifier()->setFrame(
534         nativeNode, positionXValue, positionYValue, widthValue, heightValue);
535     return panda::JSValueRef::Undefined(vm);
536 }
537 
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)538 ArkUINativeModuleValue RenderNodeBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
539 {
540     EcmaVM* vm = runtimeCallInfo->GetVM();
541     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
542     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
543 
544     Local<JSValueRef> width = runtimeCallInfo->GetCallArgRef(1);
545     float widthValue = 0;
546     if (width->IsNumber()) {
547         widthValue = width->ToNumber(vm)->Value();
548     }
549 
550     Local<JSValueRef> height = runtimeCallInfo->GetCallArgRef(2);
551     float heightValue = 0;
552     if (height->IsNumber()) {
553         heightValue = height->ToNumber(vm)->Value();
554     }
555 
556     Local<JSValueRef> unit = runtimeCallInfo->GetCallArgRef(3);
557     int32_t unitValue = 0;
558     if (unit->IsNumber()) {
559         unitValue = unit->Int32Value(vm);
560     }
561 
562     GetArkUINodeModifiers()->getRenderNodeModifier()->setSize(nativeNode, widthValue, heightValue, unitValue);
563     return panda::JSValueRef::Undefined(vm);
564 }
565 
SetPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)566 ArkUINativeModuleValue RenderNodeBridge::SetPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
567 {
568     EcmaVM* vm = runtimeCallInfo->GetVM();
569     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
570     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
571 
572     Local<JSValueRef> xAxis = runtimeCallInfo->GetCallArgRef(1);
573     float xAxisValue = 0;
574     if (xAxis->IsNumber()) {
575         xAxisValue = xAxis->ToNumber(vm)->Value();
576     }
577 
578     Local<JSValueRef> yAxis = runtimeCallInfo->GetCallArgRef(2);
579     float yAxisValue = 0;
580     if (yAxis->IsNumber()) {
581         yAxisValue = yAxis->ToNumber(vm)->Value();
582     }
583 
584     Local<JSValueRef> unit = runtimeCallInfo->GetCallArgRef(3);
585     int32_t unitValue = 0;
586     if (unit->IsNumber()) {
587         unitValue = unit->Int32Value(vm);
588     }
589 
590     GetArkUINodeModifiers()->getRenderNodeModifier()->setPosition(nativeNode, xAxisValue, yAxisValue, unitValue);
591     return panda::JSValueRef::Undefined(vm);
592 }
593 
SetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)594 ArkUINativeModuleValue RenderNodeBridge::SetOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
595 {
596     EcmaVM* vm = runtimeCallInfo->GetVM();
597     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
598     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
599     Local<JSValueRef> opacity = runtimeCallInfo->GetCallArgRef(1);
600     float opacityValue = 0;
601     if (opacity->IsNumber()) {
602         opacityValue = opacity->ToNumber(vm)->Value();
603     }
604 
605     GetArkUINodeModifiers()->getRenderNodeModifier()->setOpacity(nativeNode, opacityValue);
606     return panda::JSValueRef::Undefined(vm);
607 }
608 
SetTranslate(ArkUIRuntimeCallInfo * runtimeCallInfo)609 ArkUINativeModuleValue RenderNodeBridge::SetTranslate(ArkUIRuntimeCallInfo* runtimeCallInfo)
610 {
611     EcmaVM* vm = runtimeCallInfo->GetVM();
612     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
613     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
614 
615     Local<JSValueRef> translateX = runtimeCallInfo->GetCallArgRef(1);
616     float translateXValue = 0;
617     if (translateX->IsNumber()) {
618         translateXValue = translateX->ToNumber(vm)->Value();
619     }
620 
621     Local<JSValueRef> translateY = runtimeCallInfo->GetCallArgRef(2);
622     float translateYValue = 0;
623     if (translateY->IsNumber()) {
624         translateYValue = translateY->ToNumber(vm)->Value();
625     }
626 
627     GetArkUINodeModifiers()->getRenderNodeModifier()->setTranslate(nativeNode, translateXValue, translateYValue, 0);
628     return panda::JSValueRef::Undefined(vm);
629 }
630 
SetBorderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)631 ArkUINativeModuleValue RenderNodeBridge::SetBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
632 {
633     EcmaVM* vm = runtimeCallInfo->GetVM();
634     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
635     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
636 
637     auto leftStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 1, 0);
638     auto leftStyleValue = static_cast<BorderStyle>(leftStyle);
639 
640     auto topStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2, 0);
641     auto topStyleValue = static_cast<BorderStyle>(topStyle);
642 
643     auto rightStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3, 0);
644     auto rightStyleValue = static_cast<BorderStyle>(rightStyle);
645 
646     auto bottomStyle = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4, 0);
647     auto bottomStyleValue = static_cast<BorderStyle>(bottomStyle);
648 
649     GetArkUINodeModifiers()->getRenderNodeModifier()->setBorderStyle(nativeNode,
650         static_cast<ArkUI_Int32>(leftStyleValue), static_cast<ArkUI_Int32>(topStyleValue),
651         static_cast<ArkUI_Int32>(rightStyleValue), static_cast<ArkUI_Int32>(bottomStyleValue));
652     return panda::JSValueRef::Undefined(vm);
653 }
654 
SetBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)655 ArkUINativeModuleValue RenderNodeBridge::SetBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
656 {
657     EcmaVM* vm = runtimeCallInfo->GetVM();
658     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
659     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
660 
661     auto leftWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 1, 0.0f);
662     auto topWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 2, 0.0f);
663     auto rightWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 3, 0.0f);
664     auto bottomWidthValue = RenderNodeBridge::GetNumber<float>(vm, runtimeCallInfo, 4, 0.0f);
665     auto unitValue = RenderNodeBridge::GetNumber<int32_t>(vm, runtimeCallInfo, 5, 0);
666 
667     GetArkUINodeModifiers()->getRenderNodeModifier()->setBorderWidth(
668         nativeNode, leftWidthValue, topWidthValue, rightWidthValue, bottomWidthValue, unitValue);
669     return panda::JSValueRef::Undefined(vm);
670 }
671 
SetBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)672 ArkUINativeModuleValue RenderNodeBridge::SetBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
673 {
674     EcmaVM* vm = runtimeCallInfo->GetVM();
675     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
676     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
677 
678     auto leftColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 1, DEFAULT_COLOR);
679     auto topColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 2, DEFAULT_COLOR);
680     auto rightColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 3, DEFAULT_COLOR);
681     auto bottomColorValue = RenderNodeBridge::GetNumber<uint32_t>(vm, runtimeCallInfo, 4, DEFAULT_COLOR);
682 
683     GetArkUINodeModifiers()->getRenderNodeModifier()->setBorderColor(
684         nativeNode, leftColorValue, topColorValue, rightColorValue, bottomColorValue);
685     return panda::JSValueRef::Undefined(vm);
686 }
687 
SetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)688 ArkUINativeModuleValue RenderNodeBridge::SetBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
689 {
690     EcmaVM* vm = runtimeCallInfo->GetVM();
691     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
692     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
693 
694     auto topLeftRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 1, 0.0);
695     auto topRightRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 2, 0.0);
696     auto bottomLeftRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 3, 0.0);
697     auto bottomRightRadiusValue = RenderNodeBridge::GetNumber<double>(vm, runtimeCallInfo, 4, 0.0);
698     auto unitValue = RenderNodeBridge::GetNumber<int32_t>(vm, runtimeCallInfo, 5, 0);
699 
700     GetArkUINodeModifiers()->getRenderNodeModifier()->setBorderRadius(
701         nativeNode, topLeftRadiusValue, topRightRadiusValue, bottomLeftRadiusValue, bottomRightRadiusValue, unitValue);
702     return panda::JSValueRef::Undefined(vm);
703 }
704 
SetRectMask(ArkUIRuntimeCallInfo * runtimeCallInfo)705 ArkUINativeModuleValue RenderNodeBridge::SetRectMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
706 {
707     return SetRectShape(runtimeCallInfo, false);
708 }
709 
SetCircleMask(ArkUIRuntimeCallInfo * runtimeCallInfo)710 ArkUINativeModuleValue RenderNodeBridge::SetCircleMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
711 {
712     return SetCircleShape(runtimeCallInfo, false);
713 }
714 
SetRoundRectMask(ArkUIRuntimeCallInfo * runtimeCallInfo)715 ArkUINativeModuleValue RenderNodeBridge::SetRoundRectMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
716 {
717     return SetRoundRectShape(runtimeCallInfo, false);
718 }
719 
SetOvalMask(ArkUIRuntimeCallInfo * runtimeCallInfo)720 ArkUINativeModuleValue RenderNodeBridge::SetOvalMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
721 {
722     return SetOvalShape(runtimeCallInfo, false);
723 }
724 
SetCommandPathMask(ArkUIRuntimeCallInfo * runtimeCallInfo)725 ArkUINativeModuleValue RenderNodeBridge::SetCommandPathMask(ArkUIRuntimeCallInfo* runtimeCallInfo)
726 {
727     return SetCommandPathShape(runtimeCallInfo, false);
728 }
729 
SetRectClip(ArkUIRuntimeCallInfo * runtimeCallInfo)730 ArkUINativeModuleValue RenderNodeBridge::SetRectClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
731 {
732     return SetRectShape(runtimeCallInfo, true);
733 }
734 
SetCircleClip(ArkUIRuntimeCallInfo * runtimeCallInfo)735 ArkUINativeModuleValue RenderNodeBridge::SetCircleClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
736 {
737     return SetCircleShape(runtimeCallInfo, true);
738 }
739 
SetRoundRectClip(ArkUIRuntimeCallInfo * runtimeCallInfo)740 ArkUINativeModuleValue RenderNodeBridge::SetRoundRectClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
741 {
742     return SetRoundRectShape(runtimeCallInfo, true);
743 }
744 
SetOvalClip(ArkUIRuntimeCallInfo * runtimeCallInfo)745 ArkUINativeModuleValue RenderNodeBridge::SetOvalClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
746 {
747     return SetOvalShape(runtimeCallInfo, true);
748 }
749 
SetCommandPathClip(ArkUIRuntimeCallInfo * runtimeCallInfo)750 ArkUINativeModuleValue RenderNodeBridge::SetCommandPathClip(ArkUIRuntimeCallInfo* runtimeCallInfo)
751 {
752     return SetCommandPathShape(runtimeCallInfo, true);
753 }
754 
Invalidate(ArkUIRuntimeCallInfo * runtimeCallInfo)755 ArkUINativeModuleValue RenderNodeBridge::Invalidate(ArkUIRuntimeCallInfo* runtimeCallInfo)
756 {
757     EcmaVM* vm = runtimeCallInfo->GetVM();
758     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
759     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
760     GetArkUINodeModifiers()->getRenderNodeModifier()->invalidate(nativeNode);
761     return panda::JSValueRef::Undefined(vm);
762 }
763 
SetMarkNodeGroup(ArkUIRuntimeCallInfo * runtimeCallInfo)764 ArkUINativeModuleValue RenderNodeBridge::SetMarkNodeGroup(ArkUIRuntimeCallInfo* runtimeCallInfo)
765 {
766     EcmaVM* vm = runtimeCallInfo->GetVM();
767     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
768     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
769 
770     Local<JSValueRef> isNodeGroup = runtimeCallInfo->GetCallArgRef(1);
771     bool isNodeGroupValue = false;
772     if (isNodeGroup->IsBoolean()) {
773         isNodeGroupValue = isNodeGroup->ToBoolean(vm)->Value();
774     }
775 
776     GetArkUINodeModifiers()->getRenderNodeModifier()->setMarkNodeGroup(nativeNode, isNodeGroupValue);
777     return panda::JSValueRef::Undefined(vm);
778 }
779 } // namespace OHOS::Ace::NG
780