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