• 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_gauge_bridge.h"
16 
17 #include "base/geometry/dimension.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "bridge/declarative_frontend/jsview/js_linear_gradient.h"
20 #include "core/components/common/properties/color.h"
21 #include "core/components_ng/pattern/gauge/gauge_paint_property.h"
22 #include "core/components_ng/pattern/gauge/gauge_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/pattern/gauge/gauge_model_ng.h"
25 
26 namespace OHOS::Ace::NG {
27 namespace {
28 constexpr Color ERROR_COLOR = Color(0xFFE84026);
29 constexpr uint32_t NUM_0 = 0;
30 constexpr uint32_t NUM_1 = 1;
31 constexpr uint32_t NUM_2 = 2;
32 const char* GAUGE_NODEPTR_OF_UINODE = "nodePtr_";
33 
ResetColor(ArkUINodeHandle nativeNode)34 void ResetColor(ArkUINodeHandle nativeNode)
35 {
36     auto nodeModifiers = GetArkUINodeModifiers();
37     CHECK_NULL_VOID(nodeModifiers);
38     if (!Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
39         nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
40     } else {
41         nodeModifiers->getGaugeModifier()->resetColors(nativeNode);
42     }
43 }
44 }
45 
SortColorStopOffset(std::vector<NG::ColorStopArray> & colors)46 void SortColorStopOffset(std::vector<NG::ColorStopArray>& colors)
47 {
48     for (auto& colorStopArray : colors) {
49         std::sort(colorStopArray.begin(), colorStopArray.end(),
50             [](const std::pair<Color, Dimension>& left, const std::pair<Color, Dimension>& right) {
51                 return left.second.Value() < right.second.Value();
52             });
53 
54         auto iter = std::unique(colorStopArray.begin(), colorStopArray.end(),
55             [](const std::pair<Color, Dimension>& left, const std::pair<Color, Dimension>& right) {
56                 return left.second.Value() == right.second.Value();
57             });
58         colorStopArray.erase(iter, colorStopArray.end());
59     }
60 }
61 
ConvertResourceColor(const EcmaVM * vm,const Local<JSValueRef> & item,std::vector<NG::ColorStopArray> & colors)62 void ConvertResourceColor(const EcmaVM* vm, const Local<JSValueRef>& item, std::vector<NG::ColorStopArray>& colors)
63 {
64     Color color;
65     if (!ArkTSUtils::ParseJsColorAlpha(vm, item, color)) {
66         color = ERROR_COLOR;
67     }
68     NG::ColorStopArray colorStopArray;
69     colorStopArray.emplace_back(std::make_pair(color, Dimension(0.0)));
70     colors.emplace_back(colorStopArray);
71 }
72 
ConvertGradientColor(const EcmaVM * vm,const Local<JSValueRef> & itemParam,std::vector<NG::ColorStopArray> & colors,NG::GaugeType & type,bool & isGradientColor)73 void ConvertGradientColor(const EcmaVM* vm, const Local<JSValueRef>& itemParam, std::vector<NG::ColorStopArray>& colors,
74     NG::GaugeType& type, bool& isGradientColor)
75 {
76     if (!itemParam->IsObject(vm)) {
77         type = NG::GaugeType::TYPE_CIRCULAR_MONOCHROME;
78         return ConvertResourceColor(vm, itemParam, colors);
79     }
80     Framework::JSLinearGradient* jsLinearGradient =
81         static_cast<Framework::JSLinearGradient*>(itemParam->ToObject(vm)->GetNativePointerField(vm, 0));
82     if (!jsLinearGradient) {
83         type = NG::GaugeType::TYPE_CIRCULAR_MONOCHROME;
84         return ConvertResourceColor(vm, itemParam, colors);
85     }
86 
87     type = NG::GaugeType::TYPE_CIRCULAR_SINGLE_SEGMENT_GRADIENT;
88     if (jsLinearGradient->GetGradient().size() == 0) {
89         NG::ColorStopArray colorStopArray;
90         colorStopArray.emplace_back(std::make_pair(ERROR_COLOR, Dimension(0.0)));
91         colors.emplace_back(colorStopArray);
92     } else {
93         isGradientColor = true;
94         colors.emplace_back(jsLinearGradient->GetGradient());
95     }
96 }
97 
SetGradientColorsObject(const EcmaVM * vm,const Local<JSValueRef> & info,std::vector<NG::ColorStopArray> & colors,std::vector<float> & weights,NG::GaugeType & type,ArkUINodeHandle nativeNode)98 void SetGradientColorsObject(const EcmaVM* vm, const Local<JSValueRef>& info, std::vector<NG::ColorStopArray>& colors,
99     std::vector<float>& weights, NG::GaugeType& type, ArkUINodeHandle nativeNode)
100 {
101     ArkUIGradientType gradient;
102     bool isGradientColor = false;
103     ConvertGradientColor(vm, info, colors, type, isGradientColor);
104     auto colorStruct = std::make_unique<uint32_t[]>(colors[0].size());
105     auto colorResourceIdStruct = std::make_unique<uint32_t[]>(colors[0].size());
106     auto offsetStruct = std::make_unique<ArkUILengthType[]>(colors[0].size());
107     std::vector<uint32_t> linearLengths { colors[0].size() };
108     for (uint32_t i = 0; i < colors[0].size(); i++) {
109         colorStruct[i] = colors[0][i].first.GetValue();
110         colorResourceIdStruct[i] = colors[0][i].first.GetResourceId();
111         offsetStruct[i].number = colors[0][i].second.Value();
112         offsetStruct[i].unit = static_cast<int8_t>(colors[0][i].second.Unit());
113     }
114     gradient.color = colorStruct.get();
115     gradient.colorResourceId = colorResourceIdStruct.get();
116     gradient.offset = offsetStruct.get();
117     gradient.gradientLength = &(*linearLengths.begin());
118     gradient.weight = nullptr;
119     gradient.type = static_cast<uint32_t>(type);
120     gradient.length = 1;
121     gradient.isGradientColor = isGradientColor;
122     auto nodeModifiers = GetArkUINodeModifiers();
123     CHECK_NULL_VOID(nodeModifiers);
124     nodeModifiers->getGaugeModifier()->setGradientColors(nativeNode, &gradient, 0);
125 }
126 
127 struct GradientParams {
128     std::vector<float>& weights;
129     std::vector<NG::ColorStopArray>& colors;
130     bool& isGradientColor;
131 };
132 
SetGradientColorsArray(const EcmaVM * vm,const Local<JSValueRef> & info,ArkUINodeHandle nativeNode,NG::GaugeType & type,const GradientParams & params)133 void SetGradientColorsArray(const EcmaVM* vm, const Local<JSValueRef>& info, ArkUINodeHandle nativeNode,
134     NG::GaugeType& type, const GradientParams& params)
135 {
136     ArkUIGradientType gradient;
137     uint32_t totalLength = 0;
138     std::vector<uint32_t> linearLengths(params.colors.size(), 0);
139     for (uint32_t i = 0; i < params.colors.size(); i++) {
140         linearLengths[i] = params.colors[i].size();
141         totalLength += params.colors[i].size();
142     }
143     auto colorStruct = std::make_unique<uint32_t[]>(totalLength);
144     auto colorResourceIdStruct = std::make_unique<uint32_t[]>(totalLength);
145     auto offsetStruct = std::make_unique<ArkUILengthType[]>(totalLength);
146     int32_t pos = 0;
147     for (uint32_t i = 0; i < params.colors.size(); i++) {
148         for (uint32_t j = 0; j < params.colors[i].size(); j++, pos++) {
149             colorStruct[pos] = params.colors[i][j].first.GetValue();
150             colorResourceIdStruct[pos] = params.colors[i][j].first.GetResourceId();
151             offsetStruct[pos].number = params.colors[i][j].second.Value();
152             offsetStruct[pos].unit = static_cast<int8_t>(params.colors[i][j].second.Unit());
153         }
154     }
155     gradient.color = colorStruct.get();
156     gradient.colorResourceId = colorResourceIdStruct.get();
157     gradient.offset = offsetStruct.get();
158     gradient.gradientLength = &(*linearLengths.begin());
159     gradient.weight = &(*params.weights.begin());
160     gradient.type = static_cast<uint32_t>(type);
161     gradient.length = params.colors.size();
162     gradient.isGradientColor = params.isGradientColor;
163     auto nodeModifiers = GetArkUINodeModifiers();
164     CHECK_NULL_VOID(nodeModifiers);
165     nodeModifiers->getGaugeModifier()->setGradientColors(nativeNode, &gradient, params.weights.size());
166 }
167 
SetGradientColors(const EcmaVM * vm,const Local<JSValueRef> & info,ArkUINodeHandle nativeNode)168 void SetGradientColors(const EcmaVM* vm, const Local<JSValueRef>& info, ArkUINodeHandle nativeNode)
169 {
170     auto nodeModifiers = GetArkUINodeModifiers();
171     CHECK_NULL_VOID(nodeModifiers);
172     if (info->IsNull() || info->IsUndefined()) {
173         nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
174         return;
175     }
176     NG::GaugeType type = NG::GaugeType::TYPE_CIRCULAR_MULTI_SEGMENT_GRADIENT;
177     std::vector<NG::ColorStopArray> colors;
178     std::vector<float> weights;
179     if (!info->IsArray(vm)) {
180         SetGradientColorsObject(vm, info, colors, weights, type, nativeNode);
181         return;
182     }
183     auto jsColorsArray = panda::CopyableGlobal<panda::ArrayRef>(vm, info);
184     if (jsColorsArray.IsEmpty() || jsColorsArray->IsUndefined()
185         || jsColorsArray->IsNull() || jsColorsArray->Length(vm) == 0) {
186         nodeModifiers->getGaugeModifier()->resetGradientColors(nativeNode);
187         return;
188     }
189     bool isGradientColor = false;
190     for (size_t i = 0; i < jsColorsArray->Length(vm); ++i) {
191         if (static_cast<int32_t>(i) >= NG::COLORS_MAX_COUNT) {
192             break;
193         }
194         auto jsValue = jsColorsArray->GetValueAt(vm, info, i);
195         if (!jsValue->IsArray(vm)) {
196             continue;
197         }
198         auto tempColors = panda::CopyableGlobal<panda::ArrayRef>(vm, jsValue);
199         if (tempColors.IsEmpty() || tempColors->IsUndefined() || tempColors->IsNull()) {
200             continue;
201         }
202         // Get weight
203         float weight = tempColors->GetValueAt(vm, jsValue, 1)->ToNumber(vm)->Value();
204         if (NonPositive(weight)) {
205             continue;
206         }
207         weights.push_back(weight);
208         // Get color
209         auto jsColorValue = tempColors->GetValueAt(vm, jsValue, 0);
210         ConvertGradientColor(vm, jsColorValue, colors, type, isGradientColor);
211     }
212     type = NG::GaugeType::TYPE_CIRCULAR_MULTI_SEGMENT_GRADIENT;
213     SortColorStopOffset(colors);
214     SetGradientColorsArray(vm, info, nativeNode, type, { weights, colors, isGradientColor });
215 }
216 
SetColors(ArkUIRuntimeCallInfo * runtimeCallInfo)217 ArkUINativeModuleValue GaugeBridge::SetColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
218 {
219     EcmaVM* vm = runtimeCallInfo->GetVM();
220     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
221     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
222     Local<JSValueRef> jsArg = runtimeCallInfo->GetCallArgRef(NUM_1);
223     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
224     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
225 
226     if (!Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
227         SetGradientColors(vm, jsArg, nativeNode);
228         return panda::JSValueRef::Undefined(vm);
229     }
230 
231     if (!jsArg->IsArray(vm)) {
232         ResetColor(nativeNode);
233         return panda::JSValueRef::Undefined(vm);
234     }
235     auto jsColor = panda::CopyableGlobal<panda::ArrayRef>(vm, jsArg);
236     if (jsColor.IsEmpty() || jsColor->IsUndefined() || jsColor->IsNull()) {
237         return panda::JSValueRef::Undefined(vm);
238     }
239     size_t length = jsColor->Length(vm);
240     auto colors = std::make_unique<uint32_t[]>(length);
241     auto weights = std::make_unique<float[]>(length);
242 
243     auto theme = ArkTSUtils::GetTheme<ProgressTheme>();
244     for (size_t i = 0; i < length; i++) {
245         auto jsValue = jsColor->GetValueAt(vm, jsArg, i);
246         if (!jsValue->IsArray(vm)) {
247             ResetColor(nativeNode);
248             return panda::JSValueRef::Undefined(vm);
249         }
250         auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, jsValue);
251         if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
252             return panda::JSValueRef::Undefined(vm);
253         }
254         float weight = handle->GetValueAt(vm, jsValue, 1)->ToNumber(vm)->Value();
255         Color selectedColor;
256         if (!ArkTSUtils::ParseJsColorAlpha(vm, handle->GetValueAt(vm, jsValue, 1), selectedColor)) {
257             selectedColor = ERROR_COLOR;
258         }
259         colors[i] = selectedColor.GetValue();
260         if (weight > 0) {
261             weights[i] = weight;
262         } else {
263             weights[i] = 0.0f;
264         }
265     }
266     auto nodeModifiers = GetArkUINodeModifiers();
267     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
268     nodeModifiers->getGaugeModifier()->setColors(nativeNode, colors.get(), weights.get(), length);
269     return panda::JSValueRef::Undefined(vm);
270 }
271 
ResetColors(ArkUIRuntimeCallInfo * runtimeCallInfo)272 ArkUINativeModuleValue GaugeBridge::ResetColors(ArkUIRuntimeCallInfo* runtimeCallInfo)
273 {
274     EcmaVM* vm = runtimeCallInfo->GetVM();
275     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
276     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
277     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
278     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
279     ResetColor(nativeNode);
280     return panda::JSValueRef::Undefined(vm);
281 }
282 
SetGaugeValue(ArkUIRuntimeCallInfo * runtimeCallInfo)283 ArkUINativeModuleValue GaugeBridge::SetGaugeValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
284 {
285     EcmaVM* vm = runtimeCallInfo->GetVM();
286     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
287     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
288     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
289     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
290     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
291 
292     auto nodeModifiers = GetArkUINodeModifiers();
293     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
294     if (!secondArg->IsNumber()) {
295         nodeModifiers->getGaugeModifier()->resetGaugeValue(nativeNode);
296         return panda::JSValueRef::Undefined(vm);
297     }
298 
299     float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
300     nodeModifiers->getGaugeModifier()->setGaugeValue(nativeNode, value);
301     return panda::JSValueRef::Undefined(vm);
302 }
303 
ResetGaugeValue(ArkUIRuntimeCallInfo * runtimeCallInfo)304 ArkUINativeModuleValue GaugeBridge::ResetGaugeValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
305 {
306     EcmaVM* vm = runtimeCallInfo->GetVM();
307     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
308     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
309     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
310     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311     auto nodeModifiers = GetArkUINodeModifiers();
312     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
313     nodeModifiers->getGaugeModifier()->resetGaugeValue(nativeNode);
314     return panda::JSValueRef::Undefined(vm);
315 }
316 
SetGaugeStartAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)317 ArkUINativeModuleValue GaugeBridge::SetGaugeStartAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
318 {
319     EcmaVM* vm = runtimeCallInfo->GetVM();
320     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
321     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
322     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
323     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
324     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
325 
326     auto nodeModifiers = GetArkUINodeModifiers();
327     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
328     if (!secondArg->IsNumber()) {
329         nodeModifiers->getGaugeModifier()->resetGaugeStartAngle(nativeNode);
330         return panda::JSValueRef::Undefined(vm);
331     }
332 
333     float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
334     nodeModifiers->getGaugeModifier()->setGaugeStartAngle(nativeNode, value);
335     return panda::JSValueRef::Undefined(vm);
336 }
337 
ResetGaugeStartAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)338 ArkUINativeModuleValue GaugeBridge::ResetGaugeStartAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
339 {
340     EcmaVM* vm = runtimeCallInfo->GetVM();
341     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
342     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
343     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
344     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
345     auto nodeModifiers = GetArkUINodeModifiers();
346     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
347     nodeModifiers->getGaugeModifier()->resetGaugeStartAngle(nativeNode);
348     return panda::JSValueRef::Undefined(vm);
349 }
350 
SetGaugeEndAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)351 ArkUINativeModuleValue GaugeBridge::SetGaugeEndAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
352 {
353     EcmaVM* vm = runtimeCallInfo->GetVM();
354     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
356     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
357     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
358     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359 
360     auto nodeModifiers = GetArkUINodeModifiers();
361     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
362     if (!secondArg->IsNumber()) {
363         nodeModifiers->getGaugeModifier()->resetGaugeEndAngle(nativeNode);
364         return panda::JSValueRef::Undefined(vm);
365     }
366 
367     float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
368     nodeModifiers->getGaugeModifier()->setGaugeEndAngle(nativeNode, value);
369     return panda::JSValueRef::Undefined(vm);
370 }
371 
ResetGaugeEndAngle(ArkUIRuntimeCallInfo * runtimeCallInfo)372 ArkUINativeModuleValue GaugeBridge::ResetGaugeEndAngle(ArkUIRuntimeCallInfo* runtimeCallInfo)
373 {
374     EcmaVM* vm = runtimeCallInfo->GetVM();
375     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
376     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
377     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
378     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
379     auto nodeModifiers = GetArkUINodeModifiers();
380     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
381     nodeModifiers->getGaugeModifier()->resetGaugeEndAngle(nativeNode);
382     return panda::JSValueRef::Undefined(vm);
383 }
384 
SetGaugeStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)385 ArkUINativeModuleValue GaugeBridge::SetGaugeStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
386 {
387     EcmaVM* vm = runtimeCallInfo->GetVM();
388     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
389     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
390     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
391     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
392     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
393 
394     CalcDimension strokeWidth;
395     RefPtr<ResourceObject> strokeWidthResObj;
396     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, strokeWidth, strokeWidthResObj) ||
397         strokeWidth.Unit() == DimensionUnit::PERCENT) {
398         strokeWidth = CalcDimension(0);
399     }
400     auto nodeModifiers = GetArkUINodeModifiers();
401     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
402     auto strokeWidthRawPtr = AceType::RawPtr(strokeWidthResObj);
403     nodeModifiers->getGaugeModifier()->setGaugeStrokeWidthPtr(
404         nativeNode, strokeWidth.Value(), static_cast<int>(strokeWidth.Unit()), strokeWidthRawPtr);
405     return panda::JSValueRef::Undefined(vm);
406 }
407 
ResetGaugeStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)408 ArkUINativeModuleValue GaugeBridge::ResetGaugeStrokeWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
409 {
410     EcmaVM* vm = runtimeCallInfo->GetVM();
411     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
412     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
413     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
414     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
415     auto nodeModifiers = GetArkUINodeModifiers();
416     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
417     nodeModifiers->getGaugeModifier()->resetGaugeStrokeWidth(nativeNode);
418     return panda::JSValueRef::Undefined(vm);
419 }
420 
SetGaugeTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)421 ArkUINativeModuleValue GaugeBridge::SetGaugeTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
422 {
423     EcmaVM* vm = runtimeCallInfo->GetVM();
424     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
425     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
426     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
427     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
428     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
429     auto radiusArg = runtimeCallInfo->GetCallArgRef(2);
430     auto offsetXArg = runtimeCallInfo->GetCallArgRef(3);
431     auto offsetYArg = runtimeCallInfo->GetCallArgRef(4);
432 
433     auto nodeModifiers = GetArkUINodeModifiers();
434     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
435     if (jsValue->IsNull()) {
436         nodeModifiers->getGaugeModifier()->setShadowOptions(nativeNode, DEFAULT_GAUGE_SHADOW_RADIUS,
437             DEFAULT_GAUGE_SHADOW_OFFSETX, DEFAULT_GAUGE_SHADOW_OFFSETY, false);
438         return panda::JSValueRef::Undefined(vm);
439     }
440 
441     if (!jsValue->IsObject(vm)) {
442         nodeModifiers->getGaugeModifier()->resetShadowOptions(nativeNode);
443         nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
444         return panda::JSValueRef::Undefined(vm);
445     }
446     ArkUIGaugeShadowOptions shadowOptions = { .radius = 0.0, .offsetX = 0.0, .offsetY = 0.0, .isShadowVisible = true };
447     ArkUIShadowOptionsResource shadowOptionsResource;
448     RefPtr<ResourceObject> radiusResObj;
449     if (!ArkTSUtils::ParseJsDouble(vm, radiusArg, shadowOptions.radius, radiusResObj)) {
450         shadowOptions.radius = DEFAULT_GAUGE_SHADOW_RADIUS;
451     }
452     if (NonPositive(shadowOptions.radius)) {
453         shadowOptions.radius = DEFAULT_GAUGE_SHADOW_RADIUS;
454     }
455     RefPtr<ResourceObject> offsetXResObj;
456     if (!ArkTSUtils::ParseJsDouble(vm, offsetXArg, shadowOptions.offsetX, offsetXResObj)) {
457         shadowOptions.offsetX = DEFAULT_GAUGE_SHADOW_OFFSETX;
458     }
459     RefPtr<ResourceObject> offsetYResObj;
460     if (!ArkTSUtils::ParseJsDouble(vm, offsetYArg, shadowOptions.offsetY, offsetYResObj)) {
461         shadowOptions.offsetY = DEFAULT_GAUGE_SHADOW_OFFSETY;
462     }
463     shadowOptionsResource.radiusRawPtr = AceType::RawPtr(radiusResObj);
464     shadowOptionsResource.offsetXRawPtr = AceType::RawPtr(offsetXResObj);
465     shadowOptionsResource.offsetYRawPtr = AceType::RawPtr(offsetYResObj);
466 
467     nodeModifiers->getGaugeModifier()->setShadowOptionsPtr(nativeNode, shadowOptions, shadowOptionsResource);
468     return panda::JSValueRef::Undefined(vm);
469 }
470 
ResetGaugeTrackShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue GaugeBridge::ResetGaugeTrackShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473     EcmaVM* vm = runtimeCallInfo->GetVM();
474     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
475     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
476     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
477     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
478     auto nodeModifiers = GetArkUINodeModifiers();
479     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
480     nodeModifiers->getGaugeModifier()->resetShadowOptions(nativeNode);
481     return panda::JSValueRef::Undefined(vm);
482 }
483 
SetGaugeIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue GaugeBridge::SetGaugeIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486     EcmaVM* vm = runtimeCallInfo->GetVM();
487     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
489     auto iconArg = runtimeCallInfo->GetCallArgRef(1);
490     auto spaceArg = runtimeCallInfo->GetCallArgRef(2);
491     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
492     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
493     auto nodeModifiers = GetArkUINodeModifiers();
494     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
495     nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
496     std::string iconPath;
497     RefPtr<ResourceObject> iconPathResObj;
498     if (ArkTSUtils::ParseJsMedia(vm, iconArg, iconPath, iconPathResObj)) {
499         std::string bundleName;
500         std::string moduleName;
501         auto iconPathRawPtr = AceType::RawPtr(iconPathResObj);
502         ArkTSUtils::GetJsMediaBundleInfo(vm, iconArg, bundleName, moduleName);
503         nodeModifiers->getGaugeModifier()->setIndicatorIconPathPtr(
504             nativeNode, iconPath.c_str(), bundleName.c_str(), moduleName.c_str(), iconPathRawPtr);
505     } else {
506         nodeModifiers->getGaugeModifier()->resetIndicatorIconPath(nativeNode);
507     }
508     CalcDimension space;
509     RefPtr<ResourceObject> spaceResObj;
510     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, spaceArg, space, false)) {
511         space = NG::INDICATOR_DISTANCE_TO_TOP;
512     }
513     if (space.IsNegative()) {
514         space = NG::INDICATOR_DISTANCE_TO_TOP;
515     }
516     auto spaceRawPtr = AceType::RawPtr(spaceResObj);
517     nodeModifiers->getGaugeModifier()->setIndicatorSpacePtr(
518         nativeNode, space.CalcValue().c_str(), space.Value(), static_cast<int32_t>(space.Unit()), spaceRawPtr);
519     return panda::JSValueRef::Undefined(vm);
520 }
521 
ResetGaugeIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue GaugeBridge::ResetGaugeIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524     EcmaVM* vm = runtimeCallInfo->GetVM();
525     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
527     auto valueArg = runtimeCallInfo->GetCallArgRef(1);
528     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
529     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
530     auto nodeModifiers = GetArkUINodeModifiers();
531     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
532     if (valueArg->IsNull()) {
533         nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, false);
534     } else if (valueArg->IsUndefined() || (!valueArg->IsObject(vm))) {
535         nodeModifiers->getGaugeModifier()->resetIndicatorIconPath(nativeNode);
536         nodeModifiers->getGaugeModifier()->resetIndicatorSpace(nativeNode);
537         nodeModifiers->getGaugeModifier()->setIsShowIndicator(nativeNode, true);
538     }
539     return panda::JSValueRef::Undefined(vm);
540 }
541 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue GaugeBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544     EcmaVM* vm = runtimeCallInfo->GetVM();
545     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
547     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
548     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
549     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
550     if (!secondArg->IsObject(vm)) {
551         GaugeModelNG::SetBuilderFunc(frameNode, nullptr);
552         return panda::JSValueRef::Undefined(vm);
553     }
554     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
555     auto containerId = Container::CurrentId();
556     GaugeModelNG::SetBuilderFunc(frameNode,
557         [vm, frameNode, obj = std::move(obj), containerId](
558             GaugeConfiguration config) -> RefPtr<FrameNode> {
559             ContainerScope scope(containerId);
560             auto context = ArkTSUtils::GetContext(vm);
561             const char* keyOfGauge[] = { "value", "min", "max" };
562             Local<JSValueRef> valuesOfGauge[] = { panda::NumberRef::New(vm, config.value_),
563                 panda::NumberRef::New(vm, config.min_), panda::NumberRef::New(vm, config.max_) };
564             auto gauge = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keyOfGauge),
565                 keyOfGauge, valuesOfGauge);
566             gauge->SetNativePointerFieldCount(vm, 1);
567             gauge->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
568             panda::Local<panda::JSValueRef> params[NUM_2] = { context, gauge };
569             LocalScope pandaScope(vm);
570             panda::TryCatch trycatch(vm);
571             auto jsObject = obj.ToLocal();
572             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
573             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
574             panda::Local<panda::FunctionRef> func = makeFunc;
575             auto result = func->Call(vm, jsObject, params, NUM_2);
576             JSNApi::ExecutePendingJob(vm);
577             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
578             auto resultObj = result->ToObject(vm);
579             panda::Local<panda::JSValueRef> nodeptr =
580                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, GAUGE_NODEPTR_OF_UINODE));
581             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
582             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
583             CHECK_NULL_RETURN(frameNode, nullptr);
584             return AceType::Claim(frameNode);
585         });
586     return panda::JSValueRef::Undefined(vm);
587 }
588 
SetGaugePrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)589 ArkUINativeModuleValue GaugeBridge::SetGaugePrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
590 {
591     EcmaVM* vm = runtimeCallInfo->GetVM();
592     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
593     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
594     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
595     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
596     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
597     uint32_t sensitive = false;
598     if (secondArg->IsBoolean()) {
599         sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
600     }
601     auto nodeModifiers = GetArkUINodeModifiers();
602     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
603     nodeModifiers->getCommonModifier()->setPrivacySensitive(nativeNode, sensitive);
604     return panda::JSValueRef::Undefined(vm);
605 }
606 
ResetGaugePrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue GaugeBridge::ResetGaugePrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
608 {
609     EcmaVM* vm = runtimeCallInfo->GetVM();
610     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
611     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
612     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
613     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
614     auto nodeModifiers = GetArkUINodeModifiers();
615     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
616     nodeModifiers->getCommonModifier()->resetPrivacySensitive(nativeNode);
617     return panda::JSValueRef::Undefined(vm);
618 }
619 } // namespace OHOS::Ace::NG
620