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
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_rect_bridge.h"
17 #include "ecmascript/napi/include/jsnapi.h"
18 #include "base/geometry/calc_dimension.h"
19 #include "base/geometry/dimension.h"
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21
22 using namespace OHOS::Ace::Framework;
23
24 namespace OHOS::Ace::NG {
25 namespace {
26 constexpr int CALL_ARG_0 = 0;
27 constexpr int CALL_ARG_1 = 1;
28 constexpr uint32_t VALID_RADIUS_PAIR_FLAG = 1;
29 constexpr uint32_t INVALID_RADIUS_PAIR_FLAG = 0;
30 } // namespace
SetRadiusWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)31 ArkUINativeModuleValue RectBridge::SetRadiusWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
32 {
33 EcmaVM* vm = runtimeCallInfo->GetVM();
34 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
35 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
36 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
37 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
38 CalcDimension radiusWidth;
39 bool isSupportPercent = true;
40 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusWidth, isSupportPercent)) {
41 GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusWidth(nativeNode);
42 return panda::JSValueRef::Undefined(vm);
43 }
44 GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWidth(
45 nativeNode, radiusWidth.Value(), static_cast<int32_t>(radiusWidth.Unit()));
46 return panda::JSValueRef::Undefined(vm);
47 }
48
ResetRadiusWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)49 ArkUINativeModuleValue RectBridge::ResetRadiusWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
50 {
51 EcmaVM* vm = runtimeCallInfo->GetVM();
52 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
53 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
54 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
55 GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusWidth(nativeNode);
56 return panda::JSValueRef::Undefined(vm);
57 }
58
SetRadiusHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)59 ArkUINativeModuleValue RectBridge::SetRadiusHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
60 {
61 EcmaVM* vm = runtimeCallInfo->GetVM();
62 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
63 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
64 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
65 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
66 CalcDimension radiusHeight;
67 bool isSupportPercent = true;
68 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusHeight, isSupportPercent)) {
69 GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusHeight(nativeNode);
70 return panda::JSValueRef::Undefined(vm);
71 }
72 GetArkUINodeModifiers()->getRectModifier()->setRectRadiusHeight(
73 nativeNode, radiusHeight.Value(), static_cast<int32_t>(radiusHeight.Unit()));
74 return panda::JSValueRef::Undefined(vm);
75 }
76
ResetRadiusHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)77 ArkUINativeModuleValue RectBridge::ResetRadiusHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
78 {
79 EcmaVM* vm = runtimeCallInfo->GetVM();
80 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
81 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
82 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
83 GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusHeight(nativeNode);
84 return panda::JSValueRef::Undefined(vm);
85 }
86
SetRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)87 ArkUINativeModuleValue RectBridge::SetRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
88 {
89 EcmaVM* vm = runtimeCallInfo->GetVM();
90 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
91 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
92 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
93 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
94 std::vector<ArkUI_Float32> radiusValues;
95 std::vector<int32_t> radiusUnits;
96 std::vector<uint32_t> radiusValidPairs;
97 if (jsValue->IsArray(vm)) {
98 RectBridge::SetRadiusWithArray(vm, jsValue, radiusValues, radiusUnits, radiusValidPairs);
99 GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWithArray(
100 nativeNode, radiusValues.data(), radiusUnits.data(), radiusValidPairs.data(), radiusValidPairs.size());
101 return panda::JSValueRef::Undefined(vm);
102 }
103 if (jsValue->IsNumber() || jsValue->IsString(vm) || jsValue->IsObject(vm)) {
104 CalcDimension parsedValue;
105 bool isSupportPercent = true;
106 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, parsedValue, isSupportPercent)) {
107 parsedValue.Reset();
108 }
109 GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWithValue(
110 nativeNode, parsedValue.Value(), static_cast<int32_t>(parsedValue.Unit()));
111 }
112 return panda::JSValueRef::Undefined(vm);
113 }
114
ResetRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)115 ArkUINativeModuleValue RectBridge::ResetRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
116 {
117 EcmaVM* vm = runtimeCallInfo->GetVM();
118 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
119 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
120 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
121 GetArkUINodeModifiers()->getRectModifier()->resetRectRadius(nativeNode);
122 return panda::JSValueRef::Undefined(vm);
123 }
124
SetRadiusWithArray(const EcmaVM * vm,const Local<JSValueRef> & jsValue,std::vector<ArkUI_Float32> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs)125 void RectBridge::SetRadiusWithArray(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
126 std::vector<ArkUI_Float32>& radiusValues,
127 std::vector<int32_t>& radiusUnits,
128 std::vector<uint32_t>& radiusValidPairs)
129 {
130 if (!jsValue->IsArray(vm)) {
131 return;
132 }
133 auto arrayVal = panda::Local<panda::ArrayRef>(jsValue);
134 auto length = arrayVal->Length(vm);
135 if (length <= 0) {
136 return;
137 }
138 size_t radiusPairsCount = 4;
139 size_t dataCount = 2;
140 for (size_t i = 0; i < radiusPairsCount; i++) {
141 if (i >= length && length < radiusPairsCount) {
142 SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
143 break;
144 }
145 Local<JSValueRef> radiusItem = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
146 if (!radiusItem->IsArray(vm)) {
147 SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
148 break;
149 }
150 auto radiusArray = panda::Local<panda::ArrayRef>(radiusItem);
151 if (radiusArray->Length(vm) != dataCount) {
152 SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
153 break;
154 }
155 uint32_t indexX = 0;
156 uint32_t indexY = 1;
157 Local<JSValueRef> radiusX = panda::ArrayRef::GetValueAt(vm, radiusArray, indexX);
158 Local<JSValueRef> radiusY = panda::ArrayRef::GetValueAt(vm, radiusArray, indexY);
159 CalcDimension radiusXValue;
160 CalcDimension radiusYValue;
161 bool isSupportPercent = true;
162 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, radiusX, radiusXValue, isSupportPercent)) {
163 radiusXValue.Reset();
164 }
165 if (!ArkTSUtils::ParseJsDimensionVpNG(vm, radiusY, radiusYValue, isSupportPercent)) {
166 radiusYValue.Reset();
167 }
168 radiusValidPairs.push_back(VALID_RADIUS_PAIR_FLAG);
169 radiusValues.push_back(static_cast<ArkUI_Float32>(radiusXValue.Value()));
170 radiusValues.push_back(static_cast<ArkUI_Float32>(radiusYValue.Value()));
171 radiusUnits.push_back(static_cast<int32_t>(radiusXValue.Unit()));
172 radiusUnits.push_back(static_cast<int32_t>(radiusYValue.Unit()));
173 }
174 }
175
SetRadiusArraysInvalidValue(std::vector<ArkUI_Float32> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs,int index)176 void RectBridge::SetRadiusArraysInvalidValue(std::vector<ArkUI_Float32>& radiusValues,
177 std::vector<int32_t>& radiusUnits, std::vector<uint32_t>& radiusValidPairs, int index)
178 {
179 radiusValidPairs.push_back(INVALID_RADIUS_PAIR_FLAG);
180 CalcDimension radiusXValue;
181 CalcDimension radiusYValue;
182 radiusXValue.Reset();
183 radiusYValue.Reset();
184 radiusValues.push_back(static_cast<ArkUI_Float32>(radiusXValue.Value()));
185 radiusValues.push_back(static_cast<ArkUI_Float32>(radiusYValue.Value()));
186 radiusUnits.push_back(static_cast<int32_t>(radiusXValue.Unit()));
187 radiusUnits.push_back(static_cast<int32_t>(radiusYValue.Unit()));
188 }
189 } // namespace OHOS::Ace::NG
190