• 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 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_rect_bridge.h"
17 
18 #include "ecmascript/napi/include/jsnapi.h"
19 
20 #include "base/geometry/calc_dimension.h"
21 #include "base/geometry/dimension.h"
22 #include "core/interfaces/native/node/api.h"
23 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
24 using namespace OHOS::Ace::Framework;
25 
26 namespace OHOS::Ace::NG {
27 namespace {
28 constexpr int CALL_ARG_0 = 0;
29 constexpr int CALL_ARG_1 = 1;
30 constexpr uint32_t VALID_RADIUS_PAIR_FLAG = 1;
31 constexpr uint32_t INVALID_RADIUS_PAIR_FLAG = 0;
32 } // namespace
SetRadiusWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)33 ArkUINativeModuleValue RectBridge::SetRadiusWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
34 {
35     EcmaVM* vm = runtimeCallInfo->GetVM();
36     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
37     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
38     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
39     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
40     CalcDimension radiusWidth;
41     bool isSupportPercent = true;
42     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusWidth, isSupportPercent)) {
43         GetArkUIInternalNodeAPI()->GetRectModifier().ResetRectRadiusWidth(nativeNode);
44         return panda::JSValueRef::Undefined(vm);
45     }
46     GetArkUIInternalNodeAPI()->GetRectModifier().SetRectRadiusWidth(
47         nativeNode, radiusWidth.Value(), static_cast<int32_t>(radiusWidth.Unit()));
48     return panda::JSValueRef::Undefined(vm);
49 }
50 
ResetRadiusWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)51 ArkUINativeModuleValue RectBridge::ResetRadiusWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
52 {
53     EcmaVM* vm = runtimeCallInfo->GetVM();
54     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
55     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
56     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
57     GetArkUIInternalNodeAPI()->GetRectModifier().ResetRectRadiusWidth(nativeNode);
58     return panda::JSValueRef::Undefined(vm);
59 }
60 
SetRadiusHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)61 ArkUINativeModuleValue RectBridge::SetRadiusHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
62 {
63     EcmaVM* vm = runtimeCallInfo->GetVM();
64     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
65     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
66     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
67     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
68     CalcDimension radiusHeight;
69     bool isSupportPercent = true;
70     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusHeight, isSupportPercent)) {
71         GetArkUIInternalNodeAPI()->GetRectModifier().ResetRectRadiusHeight(nativeNode);
72         return panda::JSValueRef::Undefined(vm);
73     }
74     GetArkUIInternalNodeAPI()->GetRectModifier().SetRectRadiusHeight(
75         nativeNode, radiusHeight.Value(), static_cast<int32_t>(radiusHeight.Unit()));
76     return panda::JSValueRef::Undefined(vm);
77 }
78 
ResetRadiusHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)79 ArkUINativeModuleValue RectBridge::ResetRadiusHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
80 {
81     EcmaVM* vm = runtimeCallInfo->GetVM();
82     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
83     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
84     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
85     GetArkUIInternalNodeAPI()->GetRectModifier().ResetRectRadiusHeight(nativeNode);
86     return panda::JSValueRef::Undefined(vm);
87 }
88 
SetRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue RectBridge::SetRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91     EcmaVM* vm = runtimeCallInfo->GetVM();
92     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
94     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
95     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
96     std::vector<double> radiusValues;
97     std::vector<int32_t> radiusUnits;
98     std::vector<uint32_t> radiusValidPairs;
99     if (jsValue->IsArray(vm)) {
100         RectBridge::SetRadiusWithArray(vm, jsValue, radiusValues, radiusUnits, radiusValidPairs);
101         GetArkUIInternalNodeAPI()->GetRectModifier().SetRectRadiusWithArray(
102             nativeNode, radiusValues.data(), radiusUnits.data(), radiusValidPairs.data(), radiusValidPairs.size());
103         return panda::JSValueRef::Undefined(vm);
104     }
105     if (jsValue->IsNumber() || jsValue->IsString() || jsValue->IsObject()) {
106         CalcDimension parsedValue;
107         bool isSupportPercent = true;
108         if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, parsedValue, isSupportPercent)) {
109             parsedValue.Reset();
110         }
111         GetArkUIInternalNodeAPI()->GetRectModifier().SetRectRadiusWithValue(
112             nativeNode, parsedValue.Value(), static_cast<int32_t>(parsedValue.Unit()));
113     }
114     return panda::JSValueRef::Undefined(vm);
115 }
116 
ResetRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)117 ArkUINativeModuleValue RectBridge::ResetRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
118 {
119     EcmaVM* vm = runtimeCallInfo->GetVM();
120     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
121     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
122     void* nativeNode = firstArg->ToNativePointer(vm)->Value();
123     GetArkUIInternalNodeAPI()->GetRectModifier().ResetRectRadius(nativeNode);
124     return panda::JSValueRef::Undefined(vm);
125 }
126 
SetRadiusWithArray(const EcmaVM * vm,const Local<JSValueRef> & jsValue,std::vector<double> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs)127 void RectBridge::SetRadiusWithArray(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
128     std::vector<double>& radiusValues, std::vector<int32_t>& radiusUnits, 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(radiusXValue.Value());
170         radiusValues.push_back(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<double> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs,int index)176 void RectBridge::SetRadiusArraysInvalidValue(std::vector<double>& radiusValues, std::vector<int32_t>& radiusUnits,
177     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(radiusXValue.Value());
185     radiusValues.push_back(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