• 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 #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     RefPtr<ResourceObject> resObj;
41     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusWidth, resObj, isSupportPercent)) {
42         GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusWidth(nativeNode);
43         return panda::JSValueRef::Undefined(vm);
44     }
45     GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWidth(
46         nativeNode, radiusWidth.Value(), static_cast<int32_t>(radiusWidth.Unit()), AceType::RawPtr(resObj));
47     return panda::JSValueRef::Undefined(vm);
48 }
49 
ResetRadiusWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)50 ArkUINativeModuleValue RectBridge::ResetRadiusWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
51 {
52     EcmaVM* vm = runtimeCallInfo->GetVM();
53     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
54     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
55     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
56     GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusWidth(nativeNode);
57     return panda::JSValueRef::Undefined(vm);
58 }
59 
SetRadiusHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue RectBridge::SetRadiusHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
65     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
66     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
67     CalcDimension radiusHeight;
68     bool isSupportPercent = true;
69     RefPtr<ResourceObject> resObj;
70     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, radiusHeight, resObj, isSupportPercent)) {
71         GetArkUINodeModifiers()->getRectModifier()->resetRectRadiusHeight(nativeNode);
72         return panda::JSValueRef::Undefined(vm);
73     }
74     GetArkUINodeModifiers()->getRectModifier()->setRectRadiusHeight(
75         nativeNode, radiusHeight.Value(), static_cast<int32_t>(radiusHeight.Unit()), AceType::RawPtr(resObj));
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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
85     GetArkUINodeModifiers()->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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
95     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
96     std::vector<ArkUI_Float32> radiusValues;
97     std::vector<int32_t> radiusUnits;
98     std::vector<uint32_t> radiusValidPairs;
99     if (jsValue->IsArray(vm)) {
100         std::vector<RefPtr<ResourceObject>> radiusXResObjArray;
101         std::vector<RefPtr<ResourceObject>> radiusYResObjArray;
102         RectBridge::SetRadiusWithArray(
103             vm, jsValue, radiusValues, radiusUnits, radiusValidPairs, radiusXResObjArray, radiusYResObjArray);
104         GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWithArray(nativeNode, radiusValues.data(),
105             radiusUnits.data(), radiusValidPairs.data(), radiusValidPairs.size(), radiusXResObjArray.data(),
106             radiusYResObjArray.data());
107         return panda::JSValueRef::Undefined(vm);
108     }
109     if (jsValue->IsNumber() || jsValue->IsString(vm) || jsValue->IsObject(vm)) {
110         CalcDimension parsedValue;
111         bool isSupportPercent = true;
112         RefPtr<ResourceObject> resObj;
113         if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, parsedValue, resObj, isSupportPercent)) {
114             parsedValue.Reset();
115         }
116         GetArkUINodeModifiers()->getRectModifier()->setRectRadiusWithValue(
117             nativeNode, parsedValue.Value(), static_cast<int32_t>(parsedValue.Unit()), AceType::RawPtr(resObj));
118     }
119     return panda::JSValueRef::Undefined(vm);
120 }
121 
ResetRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue RectBridge::ResetRadius(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124     EcmaVM* vm = runtimeCallInfo->GetVM();
125     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
127     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
128     GetArkUINodeModifiers()->getRectModifier()->resetRectRadius(nativeNode);
129     return panda::JSValueRef::Undefined(vm);
130 }
131 
SetRadiusWithArray(const EcmaVM * vm,const Local<JSValueRef> & jsValue,std::vector<ArkUI_Float32> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs,std::vector<RefPtr<ResourceObject>> & radiusXResObjArray,std::vector<RefPtr<ResourceObject>> & radiusYResObjArray)132 void RectBridge::SetRadiusWithArray(const EcmaVM* vm, const Local<JSValueRef>& jsValue,
133     std::vector<ArkUI_Float32>& radiusValues, std::vector<int32_t>& radiusUnits,
134     std::vector<uint32_t>& radiusValidPairs, std::vector<RefPtr<ResourceObject>>& radiusXResObjArray,
135     std::vector<RefPtr<ResourceObject>>& radiusYResObjArray)
136 {
137     if (!jsValue->IsArray(vm)) {
138         return;
139     }
140     auto arrayVal = panda::Local<panda::ArrayRef>(jsValue);
141     auto length = arrayVal->Length(vm);
142     if (length <= 0) {
143         return;
144     }
145     size_t radiusPairsCount = 4;
146     size_t dataCount = 2;
147     for (size_t i = 0; i < radiusPairsCount; i++) {
148         if (i >= length && length < radiusPairsCount) {
149             SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
150             break;
151         }
152         Local<JSValueRef> radiusItem = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
153         if (!radiusItem->IsArray(vm)) {
154             SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
155             break;
156         }
157         auto radiusArray = panda::Local<panda::ArrayRef>(radiusItem);
158         if (radiusArray->Length(vm) != dataCount) {
159             SetRadiusArraysInvalidValue(radiusValues, radiusUnits, radiusValidPairs, i);
160             break;
161         }
162         uint32_t indexX = 0;
163         uint32_t indexY = 1;
164         Local<JSValueRef> radiusX = panda::ArrayRef::GetValueAt(vm, radiusArray, indexX);
165         Local<JSValueRef> radiusY = panda::ArrayRef::GetValueAt(vm, radiusArray, indexY);
166         CalcDimension radiusXValue;
167         CalcDimension radiusYValue;
168         RefPtr<ResourceObject> radiusXResObj;
169         RefPtr<ResourceObject> radiusYResObj;
170         bool isSupportPercent = true;
171         if (!ArkTSUtils::ParseJsDimensionVpNG(vm, radiusX, radiusXValue, radiusXResObj, isSupportPercent)) {
172             radiusXValue.Reset();
173         }
174         if (!ArkTSUtils::ParseJsDimensionVpNG(vm, radiusY, radiusYValue, radiusYResObj, isSupportPercent)) {
175             radiusYValue.Reset();
176         }
177         radiusValidPairs.push_back(VALID_RADIUS_PAIR_FLAG);
178         radiusValues.push_back(static_cast<ArkUI_Float32>(radiusXValue.Value()));
179         radiusValues.push_back(static_cast<ArkUI_Float32>(radiusYValue.Value()));
180         radiusUnits.push_back(static_cast<int32_t>(radiusXValue.Unit()));
181         radiusUnits.push_back(static_cast<int32_t>(radiusYValue.Unit()));
182         radiusXResObjArray.push_back(radiusXResObj);
183         radiusYResObjArray.push_back(radiusYResObj);
184     }
185 }
186 
SetRadiusArraysInvalidValue(std::vector<ArkUI_Float32> & radiusValues,std::vector<int32_t> & radiusUnits,std::vector<uint32_t> & radiusValidPairs,int index)187 void RectBridge::SetRadiusArraysInvalidValue(std::vector<ArkUI_Float32>& radiusValues,
188     std::vector<int32_t>& radiusUnits, std::vector<uint32_t>& radiusValidPairs, int index)
189 {
190     radiusValidPairs.push_back(INVALID_RADIUS_PAIR_FLAG);
191     CalcDimension radiusXValue;
192     CalcDimension radiusYValue;
193     radiusXValue.Reset();
194     radiusYValue.Reset();
195     radiusValues.push_back(static_cast<ArkUI_Float32>(radiusXValue.Value()));
196     radiusValues.push_back(static_cast<ArkUI_Float32>(radiusYValue.Value()));
197     radiusUnits.push_back(static_cast<int32_t>(radiusXValue.Unit()));
198     radiusUnits.push_back(static_cast<int32_t>(radiusYValue.Unit()));
199 }
200 } // namespace OHOS::Ace::NG
201