1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_shape_bridge.h"
16 #include "base/image/pixel_map.h"
17 #include "base/memory/referenced.h"
18 #include "base/utils/utils.h"
19 #include "bridge/common/utils/engine_helper.h"
20 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
21 #include "bridge/declarative_frontend/engine/js_types.h"
22 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
23 #include "bridge/declarative_frontend/jsview/js_utils.h"
24 #include "core/components_ng/pattern/shape/shape_model_ng.h"
25 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
26
27 namespace OHOS::Ace::NG {
28 constexpr int NUM_0 = 0;
29 constexpr int NUM_1 = 1;
30 constexpr int NUM_2 = 2;
31 constexpr int NUM_3 = 3;
32 constexpr int NUM_4 = 4;
33
SetViewPort(ArkUIRuntimeCallInfo * runtimeCallInfo)34 ArkUINativeModuleValue ShapeBridge::SetViewPort(ArkUIRuntimeCallInfo* runtimeCallInfo)
35 {
36 EcmaVM* vm = runtimeCallInfo->GetVM();
37 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
38 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
39 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
40 Local<JSValueRef> xArg = runtimeCallInfo->GetCallArgRef(NUM_1);
41 Local<JSValueRef> yArg = runtimeCallInfo->GetCallArgRef(NUM_2);
42 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
43 Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(NUM_4);
44 CalcDimension dimLeft;
45 RefPtr<ResourceObject> dimLeftResObj;
46 ArkTSUtils::ParseJsDimensionVp(vm, xArg, dimLeft, dimLeftResObj);
47 CalcDimension dimTop;
48 RefPtr<ResourceObject> dimTopResObj;
49 ArkTSUtils::ParseJsDimensionVp(vm, yArg, dimTop, dimLeftResObj);
50 CalcDimension dimWidth;
51 RefPtr<ResourceObject> dimWidthResObj;
52 ArkTSUtils::ParseJsDimensionVp(vm, widthArg, dimWidth, dimLeftResObj);
53 CalcDimension dimHeight;
54 RefPtr<ResourceObject> dimHeightResObj;
55 ArkTSUtils::ParseJsDimensionVp(vm, heightArg, dimHeight, dimLeftResObj);
56 std::vector<ArkUI_Float32> dimValues;
57 std::vector<int32_t> dimUnits;
58 dimValues.push_back(static_cast<ArkUI_Float32>(dimLeft.Value()));
59 dimValues.push_back(static_cast<ArkUI_Float32>(dimTop.Value()));
60 dimValues.push_back(static_cast<ArkUI_Float32>(dimWidth.Value()));
61 dimValues.push_back(static_cast<ArkUI_Float32>(dimHeight.Value()));
62 dimUnits.push_back(static_cast<int32_t>(dimLeft.Unit()));
63 dimUnits.push_back(static_cast<int32_t>(dimTop.Unit()));
64 dimUnits.push_back(static_cast<int32_t>(dimWidth.Unit()));
65 dimUnits.push_back(static_cast<int32_t>(dimHeight.Unit()));
66 std::vector<RefPtr<ResourceObject>> resObjArray = { dimLeftResObj, dimTopResObj, dimWidthResObj, dimHeightResObj };
67 GetArkUINodeModifiers()->getShapeModifier()->setShapeViewPort(
68 nativeNode, dimValues.data(), dimUnits.data(), resObjArray.data());
69 return panda::JSValueRef::Undefined(vm);
70 }
71
ResetViewPort(ArkUIRuntimeCallInfo * runtimeCallInfo)72 ArkUINativeModuleValue ShapeBridge::ResetViewPort(ArkUIRuntimeCallInfo* runtimeCallInfo)
73 {
74 EcmaVM* vm = runtimeCallInfo->GetVM();
75 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
76 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
77 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
78 GetArkUINodeModifiers()->getShapeModifier()->resetShapeViewPort(nativeNode);
79 return panda::JSValueRef::Undefined(vm);
80 }
81
SetMesh(ArkUIRuntimeCallInfo * runtimeCallInfo)82 ArkUINativeModuleValue ShapeBridge::SetMesh(ArkUIRuntimeCallInfo* runtimeCallInfo)
83 {
84 EcmaVM* vm = runtimeCallInfo->GetVM();
85 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
86 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
87 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
88 Local<JSValueRef> valueArrayArg = runtimeCallInfo->GetCallArgRef(NUM_1);
89 Local<JSValueRef> columnArg = runtimeCallInfo->GetCallArgRef(NUM_2);
90 Local<JSValueRef> rowArg = runtimeCallInfo->GetCallArgRef(NUM_3);
91 std::vector<ArkUI_Float32> mesh;
92 if (valueArrayArg->IsArray(vm)) {
93 auto arrayVal = panda::Local<panda::ArrayRef>(valueArrayArg);
94 auto length = arrayVal->Length(vm);
95 if (length <= 0) {
96 return panda::JSValueRef::Undefined(vm);
97 }
98 for (size_t i = 0; i < length; i++) {
99 Local<JSValueRef> radiusItem = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
100 double vert;
101 if (ArkTSUtils::ParseJsDouble(vm, radiusItem, vert)) {
102 mesh.push_back(static_cast<ArkUI_Float32>(vert));
103 }
104 }
105 }
106 int32_t column = 0;
107 int32_t row = 0;
108 if (!ArkTSUtils::ParseJsInteger(vm, columnArg, column)) {
109 return panda::JSValueRef::Undefined(vm);
110 }
111 if (!ArkTSUtils::ParseJsInteger(vm, rowArg, row)) {
112 return panda::JSValueRef::Undefined(vm);
113 }
114 GetArkUINodeModifiers()->getShapeModifier()->setShapeMesh(nativeNode, mesh.data(), mesh.size(), column, row);
115 return panda::JSValueRef::Undefined(vm);
116 }
117
ResetMesh(ArkUIRuntimeCallInfo * runtimeCallInfo)118 ArkUINativeModuleValue ShapeBridge::ResetMesh(ArkUIRuntimeCallInfo* runtimeCallInfo)
119 {
120 EcmaVM* vm = runtimeCallInfo->GetVM();
121 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
122 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
123 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
124 GetArkUINodeModifiers()->getShapeModifier()->resetShapeMesh(nativeNode);
125 return panda::JSValueRef::Undefined(vm);
126 }
127
SetShapeInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)128 ArkUINativeModuleValue ShapeBridge::SetShapeInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
129 {
130 EcmaVM* vm = runtimeCallInfo->GetVM();
131 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
132 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
133 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
134 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
135 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
136 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
137 RefPtr<PixelMap> pixMap = nullptr;
138 #if defined(PIXEL_MAP_SUPPORTED)
139 if (info.Length() == NUM_2 && info[NUM_1]->IsObject()) {
140 pixMap = Framework::CreatePixelMapFromNapiValue(info[NUM_1]);
141 }
142 #endif
143 ShapeModelNG::InitBox(reinterpret_cast<FrameNode*>(nativeNode), pixMap);
144 return panda::JSValueRef::Undefined(vm);
145 }
146
ResetShapeInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue ShapeBridge::ResetShapeInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149 EcmaVM* vm = runtimeCallInfo->GetVM();
150 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
151 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
152 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
153 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
154 ShapeModelNG::InitBox(reinterpret_cast<FrameNode*>(nativeNode), nullptr);
155 return panda::JSValueRef::Undefined(vm);
156 }
157 } // namespace OHOS::Ace::NG
158