• 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_text_bridge.h"
16 
17 #include "base/utils/string_utils.h"
18 #include "base/utils/utils.h"
19 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
20 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
22 #include "bridge/declarative_frontend/style_string/js_span_string.h"
23 #include "core/components/common/properties/shadow.h"
24 #include "core/components_ng/pattern/text/text_model_ng.h"
25 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_text.h"
27 
28 namespace OHOS::Ace::NG {
29 namespace {
30 constexpr int PARAM_ARR_LENGTH_1 = 1;
31 constexpr int PARAM_ARR_LENGTH_2 = 2;
32 constexpr int SIZE_OF_TEXT_CASES = 2;
33 constexpr int16_t DEFAULT_ALPHA = 255;
34 constexpr double DEFAULT_OPACITY = 0.2;
35 constexpr double DEFAULT_SPAN_FONT_SIZE = 16;
36 constexpr DimensionUnit DEFAULT_SPAN_FONT_UNIT = DimensionUnit::FP;
37 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
38 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
39 const Color DEFAULT_DECORATION_COLOR = Color::BLACK;
40 const std::string DEFAULT_FONT_WEIGHT = "400";
41 constexpr int DEFAULT_VARIABLE_FONT_WEIGHT = 400;
42 constexpr Dimension DEFAULT_MARQUEE_STEP_VALUE = 4.0_vp;
43 constexpr int NUM_0 = 0;
44 constexpr int NUM_1 = 1;
45 constexpr int NUM_2 = 2;
46 constexpr int NUM_3 = 3;
47 constexpr int NUM_4 = 4;
48 constexpr int NUM_5 = 5;
49 constexpr int NUM_6 = 6;
50 constexpr int NUM_7 = 7;
51 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
52     TextOverflow::MARQUEE };
53 const std::vector<std::string> TEXT_DETECT_TYPES = { "phoneNum", "url", "email", "location", "datetime" };
54 } // namespace
55 
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)56 ArkUINativeModuleValue TextBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
57 {
58     EcmaVM* vm = runtimeCallInfo->GetVM();
59     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
60     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
61     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_1);
62     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_2);
63     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
64     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
65 
66     ArkUIFontWeightWithOptionsStruct weightInfo;
67     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
68     std::string weight = DEFAULT_FONT_WEIGHT;
69     if (!weightArg->IsNull()) {
70         if (weightArg->IsNumber()) {
71             weight = std::to_string(weightArg->Int32Value(vm));
72             variableFontWeight = weightArg->Int32Value(vm);
73         } else if ((weightArg->IsString(vm) || weightArg->IsObject(vm)) &&
74             (!ArkTSUtils::ParseJsString(vm, weightArg, weight))) {
75             variableFontWeight = StringUtils::StringToInt(weight);
76         }
77     }
78     weightInfo.weight = weight.c_str();
79     weightInfo.variableFontWeight = variableFontWeight;
80 
81     if (optionsArg->IsBoolean()) {
82         weightInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
83     }
84     GetArkUINodeModifiers()->getTextModifier()->setFontWeightWithOption(nativeNode, &weightInfo);
85     return panda::JSValueRef::Undefined(vm);
86 }
87 
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)88 ArkUINativeModuleValue TextBridge::ResetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
89 {
90     EcmaVM* vm = runtimeCallInfo->GetVM();
91     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
92     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
93     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
94     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
95     GetArkUINodeModifiers()->getTextModifier()->resetFontWeight(nativeNode);
96     return panda::JSValueRef::Undefined(vm);
97 }
98 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)99 ArkUINativeModuleValue TextBridge::SetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
100 {
101     EcmaVM* vm = runtimeCallInfo->GetVM();
102     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
103     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
104     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
105     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
106     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
107     if (secondArg->IsNumber()) {
108         uint32_t fontStyle = secondArg->Uint32Value(vm);
109         if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
110             fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
111             fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
112         }
113         GetArkUINodeModifiers()->getTextModifier()->setFontStyle(nativeNode, fontStyle);
114     } else {
115         GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
116     }
117     return panda::JSValueRef::Undefined(vm);
118 }
119 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)120 ArkUINativeModuleValue TextBridge::ResetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
121 {
122     EcmaVM* vm = runtimeCallInfo->GetVM();
123     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
124     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
125     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
127     GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
128     return panda::JSValueRef::Undefined(vm);
129 }
130 
SetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)131 ArkUINativeModuleValue TextBridge::SetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
132 {
133     EcmaVM* vm = runtimeCallInfo->GetVM();
134     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
136     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
137     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
138     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
139     if (secondArg->IsNumber()) {
140         GetArkUINodeModifiers()->getTextModifier()->setTextAlign(nativeNode, secondArg->ToNumber(vm)->Value());
141     } else {
142         GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
143     }
144     return panda::JSValueRef::Undefined(vm);
145 }
146 
ResetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue TextBridge::ResetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
148 {
149     EcmaVM* vm = runtimeCallInfo->GetVM();
150     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
151     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
152     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
153     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
154     GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
155     return panda::JSValueRef::Undefined(vm);
156 }
157 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)158 ArkUINativeModuleValue TextBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
159 {
160     EcmaVM* vm = runtimeCallInfo->GetVM();
161     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
162     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
163     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
164     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
165     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
166     Color color;
167     RefPtr<ResourceObject> colorResObj;
168     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
169     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo)) {
170         GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
171     } else {
172         GetArkUINodeModifiers()->getTextModifier()->setFontColor(
173             nativeNode, color.GetValue(), AceType::RawPtr(colorResObj));
174     }
175     return panda::JSValueRef::Undefined(vm);
176 }
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)177 ArkUINativeModuleValue TextBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
178 {
179     EcmaVM* vm = runtimeCallInfo->GetVM();
180     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
181     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
182     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
183     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
184     GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
185     return panda::JSValueRef::Undefined(vm);
186 }
187 
SetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue TextBridge::SetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190     EcmaVM *vm = runtimeCallInfo->GetVM();
191     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
192     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
193     auto colorArg = runtimeCallInfo->GetCallArgRef(1);
194     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
195     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
196 
197     ForegroundColorStrategy strategy;
198     if (ArkTSUtils::ParseJsColorStrategy(vm, colorArg, strategy)) {
199         auto strategyInt = static_cast<uint32_t>(ForegroundColorStrategy::INVERT);
200         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(nativeNode, false, strategyInt, nullptr);
201         return panda::JSValueRef::Undefined(vm);
202     }
203     Color foregroundColor;
204     RefPtr<ResourceObject> colorResObj;
205     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
206     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, foregroundColor, colorResObj, nodeInfo)) {
207         GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
208     } else {
209         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(
210             nativeNode, true, foregroundColor.GetValue(), AceType::RawPtr(colorResObj));
211     }
212     return panda::JSValueRef::Undefined(vm);
213 }
214 
ResetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)215 ArkUINativeModuleValue TextBridge::ResetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
216 {
217     EcmaVM* vm = runtimeCallInfo->GetVM();
218     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
219     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
220     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
221     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
222     GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
223     return panda::JSValueRef::Undefined(vm);
224 }
225 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue TextBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
227 {
228     EcmaVM* vm = runtimeCallInfo->GetVM();
229     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
230     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
231     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
232     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
233     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
234     CalcDimension fontSize;
235     RefPtr<ResourceObject> fontSizeResObj;
236     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, fontSizeResObj, false)) {
237         GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
238     } else {
239         GetArkUINodeModifiers()->getTextModifier()->setFontSize(
240             nativeNode, fontSize.Value(), static_cast<int>(fontSize.Unit()), AceType::RawPtr(fontSizeResObj));
241     }
242     return panda::JSValueRef::Undefined(vm);
243 }
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)244 ArkUINativeModuleValue TextBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
245 {
246     EcmaVM* vm = runtimeCallInfo->GetVM();
247     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
248     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
249     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
250     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
251     GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
252     return panda::JSValueRef::Undefined(vm);
253 }
254 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)255 ArkUINativeModuleValue TextBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
256 {
257     EcmaVM* vm = runtimeCallInfo->GetVM();
258     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
259     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
260     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
261     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
262     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
263     CalcDimension lineHeight(0.0, DEFAULT_SPAN_FONT_UNIT);
264     RefPtr<ResourceObject> lineHeightObj;
265     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, lineHeight, lineHeightObj)) {
266         lineHeight.Reset();
267     }
268     if (lineHeight.IsNegative()) {
269         lineHeight.Reset();
270     }
271     GetArkUINodeModifiers()->getTextModifier()->setTextLineHeight(
272         nativeNode, lineHeight.Value(), static_cast<int8_t>(lineHeight.Unit()), AceType::RawPtr(lineHeightObj));
273     return panda::JSValueRef::Undefined(vm);
274 }
275 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue TextBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278     EcmaVM* vm = runtimeCallInfo->GetVM();
279     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
280     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
281     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
282     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
283     GetArkUINodeModifiers()->getTextModifier()->resetTextLineHeight(nativeNode);
284     return panda::JSValueRef::Undefined(vm);
285 }
286 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)287 ArkUINativeModuleValue TextBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
288 {
289     EcmaVM* vm = runtimeCallInfo->GetVM();
290     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
291     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
292     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
293     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
294     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
295     int32_t value;
296     if (secondArg->IsUndefined()) {
297         value = 0;
298     } else if (secondArg->IsNumber()) {
299         value = secondArg->Int32Value(vm);
300     } else {
301         return panda::JSValueRef::Undefined(vm);
302     }
303     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
304         return panda::JSValueRef::Undefined(vm);
305     }
306     GetArkUINodeModifiers()->getTextModifier()->setTextOverflow(nativeNode, value);
307     return panda::JSValueRef::Undefined(vm);
308 }
309 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)310 ArkUINativeModuleValue TextBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
311 {
312     EcmaVM* vm = runtimeCallInfo->GetVM();
313     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
314     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
315     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
316     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
317     GetArkUINodeModifiers()->getTextModifier()->resetTextOverflow(nativeNode);
318     return panda::JSValueRef::Undefined(vm);
319 }
320 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)321 ArkUINativeModuleValue TextBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
322 {
323     EcmaVM* vm = runtimeCallInfo->GetVM();
324     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
325     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
326     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
327     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
328     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
329     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
330     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
331     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
332     int32_t textDecoration = static_cast<int32_t>(TextDecoration::NONE);
333     Color color = DEFAULT_DECORATION_COLOR;
334     int32_t style = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
335     double lineThicknessScale = 1.0;
336     if (secondArg->IsInt()) {
337         textDecoration = secondArg->Int32Value(vm);
338     }
339     RefPtr<ResourceObject> resourceObject;
340     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
341     if (!ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, resourceObject, nodeInfo)) {
342         color = DEFAULT_DECORATION_COLOR;
343     }
344     if (fourthArg->IsInt()) {
345         style = fourthArg->Int32Value(vm);
346     }
347     if (!ArkTSUtils::ParseJsDouble(vm, fifthArg, lineThicknessScale)) {
348         lineThicknessScale = 1.0;
349     }
350     lineThicknessScale = lineThicknessScale < 0 ? 1.0 : lineThicknessScale;
351     GetArkUINodeModifiers()->getTextModifier()->setTextDecoration(nativeNode, textDecoration, color.GetValue(),
352         AceType::RawPtr(resourceObject), style, static_cast<float>(lineThicknessScale));
353     return panda::JSValueRef::Undefined(vm);
354 }
355 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue TextBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358     EcmaVM* vm = runtimeCallInfo->GetVM();
359     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
360     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
361     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
362     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
363     GetArkUINodeModifiers()->getTextModifier()->resetTextDecoration(nativeNode);
364     return panda::JSValueRef::Undefined(vm);
365 }
366 
SetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)367 ArkUINativeModuleValue TextBridge::SetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
368 {
369     EcmaVM* vm = runtimeCallInfo->GetVM();
370     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
371     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
372     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
373     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
374     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
375     if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
376         secondArg->Int32Value(vm) <= SIZE_OF_TEXT_CASES) {
377         GetArkUINodeModifiers()->getTextModifier()->setTextCase(nativeNode, secondArg->Int32Value(vm));
378     } else {
379         GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
380     }
381     return panda::JSValueRef::Undefined(vm);
382 }
383 
ResetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)384 ArkUINativeModuleValue TextBridge::ResetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
385 {
386     EcmaVM* vm = runtimeCallInfo->GetVM();
387     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
388     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
389     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
390     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
391     GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
392     return panda::JSValueRef::Undefined(vm);
393 }
394 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)395 ArkUINativeModuleValue TextBridge::SetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
396 {
397     EcmaVM* vm = runtimeCallInfo->GetVM();
398     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
399     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
400     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
401     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
402     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
403     if (secondArg->IsNumber()) {
404         uint32_t maxLine = secondArg->Uint32Value(vm);
405         GetArkUINodeModifiers()->getTextModifier()->setTextMaxLines(nativeNode, maxLine);
406     } else {
407         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
408     }
409     return panda::JSValueRef::Undefined(vm);
410 }
411 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)412 ArkUINativeModuleValue TextBridge::ResetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
413 {
414     EcmaVM* vm = runtimeCallInfo->GetVM();
415     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
416     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
417     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
418     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
419     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
420     return panda::JSValueRef::Undefined(vm);
421 }
422 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue TextBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425     EcmaVM* vm = runtimeCallInfo->GetVM();
426     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
427     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
428     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
429     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
430     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
431 
432     CalcDimension fontSize;
433     RefPtr<ResourceObject> resourceObject;
434     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, resourceObject, false)) {
435         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontSize(
436             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()), AceType::RawPtr(resourceObject));
437     } else {
438         GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
439     }
440     return panda::JSValueRef::Undefined(vm);
441 }
442 
ReSetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue TextBridge::ReSetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
444 {
445     EcmaVM* vm = runtimeCallInfo->GetVM();
446     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
447     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
448     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
449     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
SetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue TextBridge::SetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
458     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
459     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
460     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
461     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
462     uint32_t draggable = false;
463     if (secondArg->IsBoolean()) {
464         draggable = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
465     }
466     GetArkUINodeModifiers()->getTextModifier()->setTextDraggable(nativeNode, draggable);
467     return panda::JSValueRef::Undefined(vm);
468 }
469 
ResetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)470 ArkUINativeModuleValue TextBridge::ResetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
471 {
472     EcmaVM* vm = runtimeCallInfo->GetVM();
473     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
474     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
475     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
476     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
477     GetArkUINodeModifiers()->getTextModifier()->resetTextDraggable(nativeNode);
478     return panda::JSValueRef::Undefined(vm);
479 }
480 
SetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)481 ArkUINativeModuleValue TextBridge::SetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
482 {
483     EcmaVM* vm = runtimeCallInfo->GetVM();
484     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
485     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
486     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
487     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
488     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
489     uint32_t sensitive = false;
490     if (secondArg->IsBoolean()) {
491         sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
492     }
493     GetArkUINodeModifiers()->getTextModifier()->setTextPrivacySensitive(nativeNode, sensitive);
494     return panda::JSValueRef::Undefined(vm);
495 }
496 
ResetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)497 ArkUINativeModuleValue TextBridge::ResetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
498 {
499     EcmaVM* vm = runtimeCallInfo->GetVM();
500     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
501     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
502     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
503     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
504     GetArkUINodeModifiers()->getTextModifier()->resetTextPrivacySensitive(nativeNode);
505     return panda::JSValueRef::Undefined(vm);
506 }
507 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)508 ArkUINativeModuleValue TextBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
509 {
510     EcmaVM* vm = runtimeCallInfo->GetVM();
511     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
512     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
513     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
514     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
515     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
516     CalcDimension fontSize;
517     RefPtr<ResourceObject> resourceObject;
518     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, resourceObject, false)) {
519         GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontSize(
520             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()), AceType::RawPtr(resourceObject));
521     } else {
522         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
523     }
524 
525     return panda::JSValueRef::Undefined(vm);
526 }
527 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)528 ArkUINativeModuleValue TextBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
529 {
530     EcmaVM* vm = runtimeCallInfo->GetVM();
531     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
532     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
533     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
534     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
535     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
536     return panda::JSValueRef::Undefined(vm);
537 }
538 
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)539 ArkUINativeModuleValue TextBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
540 {
541     EcmaVM* vm = runtimeCallInfo->GetVM();
542     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
543     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
544     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
545     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
546     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
547     double minFontScale;
548     RefPtr<ResourceObject> resourceObject;
549     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale, resourceObject)) {
550         return panda::JSValueRef::Undefined(vm);
551     }
552     if (LessOrEqual(minFontScale, 0.0f)) {
553         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(
554             nativeNode, static_cast<float>(minFontScale), nullptr);
555         minFontScale = 0.0f;
556     } else if (GreatOrEqual(minFontScale, 1.0f)) {
557         minFontScale = 1.0f;
558     }
559     GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(
560         nativeNode, static_cast<float>(minFontScale), AceType::RawPtr(resourceObject));
561     return panda::JSValueRef::Undefined(vm);
562 }
563 
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)564 ArkUINativeModuleValue TextBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
565 {
566     EcmaVM* vm = runtimeCallInfo->GetVM();
567     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
568     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
569     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
570     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
571     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontScale(nativeNode);
572     return panda::JSValueRef::Undefined(vm);
573 }
574 
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)575 ArkUINativeModuleValue TextBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
576 {
577     EcmaVM* vm = runtimeCallInfo->GetVM();
578     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
579     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
580     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
581     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
582     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
583     double maxFontScale;
584     RefPtr<ResourceObject> resourceObject;
585     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale, resourceObject)) {
586         return panda::JSValueRef::Undefined(vm);
587     }
588     if (LessOrEqual(maxFontScale, 1.0f)) {
589         maxFontScale = 1.0f;
590     }
591     GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontScale(
592         nativeNode, static_cast<float>(maxFontScale), AceType::RawPtr(resourceObject));
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue TextBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
600     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
601     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
602     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
603     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontScale(nativeNode);
604     return panda::JSValueRef::Undefined(vm);
605 }
606 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue TextBridge::SetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
608 {
609     EcmaVM* vm = runtimeCallInfo->GetVM();
610     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
611     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
612     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
613     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
614     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
615 
616     std::vector<std::string> fontFamilies;
617     RefPtr<ResourceObject> resourceObject;
618     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies, resourceObject)) {
619         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
620         return panda::JSValueRef::Undefined(vm);
621     }
622     auto families = std::make_unique<char* []>(fontFamilies.size());
623     for (uint32_t i = 0; i < fontFamilies.size(); i++) {
624         families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
625     }
626     GetArkUINodeModifiers()->getTextModifier()->setTextFontFamily(
627         nativeNode, const_cast<const char**>(families.get()), fontFamilies.size(), AceType::RawPtr(resourceObject));
628     return panda::JSValueRef::Undefined(vm);
629 }
630 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)631 ArkUINativeModuleValue TextBridge::ResetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
632 {
633     EcmaVM* vm = runtimeCallInfo->GetVM();
634     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
635     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
636     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
637     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
638 
639     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
640     return panda::JSValueRef::Undefined(vm);
641 }
642 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)643 ArkUINativeModuleValue TextBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
644 {
645     EcmaVM* vm = runtimeCallInfo->GetVM();
646     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
647     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
648     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
649     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
650     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
651     int32_t copyOption = static_cast<int32_t>(CopyOptions::None);
652     if (secondArg->IsInt()) {
653         copyOption = secondArg->Int32Value(vm);
654     }
655     GetArkUINodeModifiers()->getTextModifier()->setTextCopyOption(nativeNode, copyOption);
656     return panda::JSValueRef::Undefined(vm);
657 }
658 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)659 ArkUINativeModuleValue TextBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
660 {
661     EcmaVM* vm = runtimeCallInfo->GetVM();
662     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
663     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
664     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
665     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
666     GetArkUINodeModifiers()->getTextModifier()->resetTextCopyOption(nativeNode);
667     return panda::JSValueRef::Undefined(vm);
668 }
669 
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)670 ArkUINativeModuleValue TextBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
671 {
672     EcmaVM* vm = runtimeCallInfo->GetVM();
673     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
674     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
675     Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(NUM_1);
676     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
677     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
678     Local<JSValueRef> offsetXArg = runtimeCallInfo->GetCallArgRef(NUM_4);
679     Local<JSValueRef> offsetYArg = runtimeCallInfo->GetCallArgRef(NUM_5);
680     Local<JSValueRef> fillArg = runtimeCallInfo->GetCallArgRef(NUM_6);
681     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
682     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
683     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
684     if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
685         return panda::JSValueRef::Undefined(vm);
686     }
687     uint32_t length = lengthArg->Uint32Value(vm);
688     auto radiusArray = std::make_unique<double[]>(length);
689     auto typeArray = std::make_unique<uint32_t[]>(length);
690     auto colorArray = std::make_unique<uint32_t[]>(length);
691     auto offsetXArray = std::make_unique<double[]>(length);
692     auto offsetYArray = std::make_unique<double[]>(length);
693     auto fillArray = std::make_unique<uint32_t[]>(length);
694 
695     std::vector<RefPtr<ResourceObject>> radiusResArr;
696     std::vector<RefPtr<ResourceObject>> colorResArr;
697     std::vector<RefPtr<ResourceObject>> offsetXResArr;
698     std::vector<RefPtr<ResourceObject>> offsetYResArr;
699     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
700 
701     bool radiusParseResult = ArkTSUtils::ParseArrayWithResObj<double>(
702         vm, radiusArg, radiusArray.get(), length, ArkTSUtils::parseShadowRadiusWithResObj, radiusResArr);
703     bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(
704         vm, typeArg, typeArray.get(), length, ArkTSUtils::parseShadowType);
705     bool colorParseResult = ArkTSUtils::ParseArrayWithResObj<uint32_t>(
706         vm, colorArg, colorArray.get(), length, ArkTSUtils::parseShadowColorWithResObj, colorResArr);
707     bool offsetXParseResult = ArkTSUtils::ParseArrayWithResObj<double>(
708         vm, offsetXArg, offsetXArray.get(), length, ArkTSUtils::parseShadowOffsetWithResObj, offsetXResArr);
709     bool offsetYParseResult = ArkTSUtils::ParseArrayWithResObj<double>(
710         vm, offsetYArg, offsetYArray.get(), length, ArkTSUtils::parseShadowOffsetWithResObj, offsetYResArr);
711     bool fillParseResult = ArkTSUtils::ParseArray<uint32_t>(
712         vm, fillArg, fillArray.get(), length, ArkTSUtils::parseShadowFill);
713     if (!radiusParseResult || !colorParseResult || !offsetXParseResult ||
714         !offsetYParseResult || !fillParseResult || !typeParseResult) {
715         return panda::JSValueRef::Undefined(vm);
716     }
717     auto textShadowArray = std::make_unique<ArkUITextShadowStruct[]>(length);
718     CHECK_NULL_RETURN(textShadowArray.get(), panda::JSValueRef::Undefined(vm));
719     for (uint32_t i = 0; i < length; i++) {
720         textShadowArray[i].radius = radiusArray[i];
721         textShadowArray[i].type = typeArray[i];
722         textShadowArray[i].color = colorArray[i];
723         textShadowArray[i].offsetX = offsetXArray[i];
724         textShadowArray[i].offsetY = offsetYArray[i];
725         textShadowArray[i].fill = fillArray[i];
726     }
727     GetArkUINodeModifiers()->getTextModifier()->setTextShadow(nativeNode, textShadowArray.get(), length,
728         static_cast<void*>(&radiusResArr), static_cast<void*>(&colorResArr),
729         static_cast<void*>(&offsetXResArr), static_cast<void*>(&offsetYResArr));
730     return panda::JSValueRef::Undefined(vm);
731 }
732 
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)733 ArkUINativeModuleValue TextBridge::ResetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
734 {
735     EcmaVM* vm = runtimeCallInfo->GetVM();
736     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
737     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
738     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
739     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
740     GetArkUINodeModifiers()->getTextModifier()->resetTextShadow(nativeNode);
741     return panda::JSValueRef::Undefined(vm);
742 }
743 
SetContent(ArkUIRuntimeCallInfo * runtimeCallInfo)744 ArkUINativeModuleValue TextBridge::SetContent(ArkUIRuntimeCallInfo* runtimeCallInfo)
745 {
746     EcmaVM* vm = runtimeCallInfo->GetVM();
747     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
748     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
749     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
750     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
751     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
752     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
753 
754     Framework::JSRef<Framework::JSVal> args = info[1];
755     if (args->IsObject() && Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>()) {
756         auto* spanString = Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>();
757         CHECK_NULL_RETURN(spanString, panda::JSValueRef::Undefined(vm));
758         auto spanStringController = spanString->GetController();
759         if (spanStringController) {
760             TextModelNG::InitSpanStringController(reinterpret_cast<FrameNode*>(nativeNode), spanStringController);
761         }
762         return panda::JSValueRef::Undefined(vm);
763     }
764     std::string content;
765     RefPtr<ResourceObject> resourceObject;
766     if (ArkTSUtils::ParseJsString(vm, secondArg, content, resourceObject)) {
767         GetArkUINodeModifiers()->getTextModifier()->setContent(
768             nativeNode, content.c_str(), AceType::RawPtr(resourceObject));
769     }
770     return panda::JSValueRef::Undefined(vm);
771 }
772 
SetTextController(ArkUIRuntimeCallInfo * runtimeCallInfo)773 ArkUINativeModuleValue TextBridge::SetTextController(ArkUIRuntimeCallInfo* runtimeCallInfo)
774 {
775     EcmaVM* vm = runtimeCallInfo->GetVM();
776     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
777     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
778     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
779     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
780     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
781     Framework::JSRef<Framework::JSVal> args = info[1];
782     if (args->IsObject()) {
783         auto paramObject = Framework::JSRef<Framework::JSObject>::Cast(args);
784         auto controllerObj = paramObject->GetProperty("controller");
785         Framework::JSTextController* jsController = nullptr;
786         if (controllerObj->IsObject()) {
787             jsController =
788                 Framework::JSRef<Framework::JSObject>::Cast(controllerObj)->Unwrap<Framework::JSTextController>();
789         }
790         RefPtr<TextControllerBase> controller =
791             TextModelNG::InitTextController(reinterpret_cast<FrameNode*>(nativeNode));
792         if (jsController) {
793             jsController->SetController(controller);
794         }
795     }
796     return panda::JSValueRef::Undefined(vm);
797 }
798 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)799 ArkUINativeModuleValue TextBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
800 {
801     EcmaVM* vm = runtimeCallInfo->GetVM();
802     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
803     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
804     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
805     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
806     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
807     if (secondArg->IsNumber()
808         && secondArg->Int32Value(vm) >= static_cast<int32_t>(TextHeightAdaptivePolicy::MAX_LINES_FIRST)
809         && secondArg->Int32Value(vm) <= static_cast<int32_t>(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST)) {
810         auto value = secondArg->Int32Value(vm);
811         GetArkUINodeModifiers()->getTextModifier()->setTextHeightAdaptivePolicy(nativeNode, value);
812     } else {
813         GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
814     }
815     return panda::JSValueRef::Undefined(vm);
816 }
817 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)818 ArkUINativeModuleValue TextBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
819 {
820     EcmaVM* vm = runtimeCallInfo->GetVM();
821     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
822     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
823     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
824     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
825     GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
826     return panda::JSValueRef::Undefined(vm);
827 }
828 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)829 ArkUINativeModuleValue TextBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
830 {
831     EcmaVM* vm = runtimeCallInfo->GetVM();
832     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
833     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
834     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
835     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
836     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
837     CalcDimension indent;
838     RefPtr<ResourceObject> resourceObject;
839     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, indent, resourceObject) || indent.IsNegative()) {
840         indent.Reset();
841     }
842 
843     GetArkUINodeModifiers()->getTextModifier()->setTextIndent(
844         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()), AceType::RawPtr(resourceObject));
845     return panda::JSValueRef::Undefined(vm);
846 }
847 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)848 ArkUINativeModuleValue TextBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
849 {
850     EcmaVM* vm = runtimeCallInfo->GetVM();
851     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
852     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
853     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
854     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
855     GetArkUINodeModifiers()->getTextModifier()->resetTextIndent(nativeNode);
856     return panda::JSValueRef::Undefined(vm);
857 }
858 
SetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)859 ArkUINativeModuleValue TextBridge::SetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
860 {
861     EcmaVM* vm = runtimeCallInfo->GetVM();
862     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
863     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
864     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
865     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
866     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
867     CalcDimension baselineOffset;
868     RefPtr<ResourceObject> resourceObject;
869     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, baselineOffset, DimensionUnit::FP, resourceObject, false)) {
870         baselineOffset.Reset();
871     }
872 
873     GetArkUINodeModifiers()->getTextModifier()->setTextBaselineOffset(nativeNode, baselineOffset.Value(),
874         static_cast<int8_t>(baselineOffset.Unit()), AceType::RawPtr(resourceObject));
875     return panda::JSValueRef::Undefined(vm);
876 }
877 
ResetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)878 ArkUINativeModuleValue TextBridge::ResetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
879 {
880     EcmaVM* vm = runtimeCallInfo->GetVM();
881     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
882     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
883     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
884     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
885     GetArkUINodeModifiers()->getTextModifier()->resetTextBaselineOffset(nativeNode);
886     return panda::JSValueRef::Undefined(vm);
887 }
888 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)889 ArkUINativeModuleValue TextBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
890 {
891     EcmaVM* vm = runtimeCallInfo->GetVM();
892     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
893     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
894     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
895     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
896     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
897     CalcDimension letterSpacing;
898     RefPtr<ResourceObject> resourceObject;
899     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, letterSpacing, DimensionUnit::FP, resourceObject, false)) {
900         letterSpacing.Reset();
901     }
902 
903     GetArkUINodeModifiers()->getTextModifier()->setTextLetterSpacing(
904         nativeNode, letterSpacing.Value(), static_cast<int8_t>(letterSpacing.Unit()), AceType::RawPtr(resourceObject));
905     return panda::JSValueRef::Undefined(vm);
906 }
907 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)908 ArkUINativeModuleValue TextBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
909 {
910     EcmaVM* vm = runtimeCallInfo->GetVM();
911     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
912     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
913     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
914     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
915     GetArkUINodeModifiers()->getTextModifier()->resetTextLetterSpacing(nativeNode);
916     return panda::JSValueRef::Undefined(vm);
917 }
918 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)919 ArkUINativeModuleValue TextBridge::SetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
920 {
921     EcmaVM* vm = runtimeCallInfo->GetVM();
922     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
923     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
924     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
925     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
926     Local<JSValueRef> familyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
927     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
928     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_5);
929 
930     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
931     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
932     ArkUIFontWithOptionsStruct fontInfo;
933     CalcDimension fontSize;
934     RefPtr<ResourceObject> fontSizeResObj;
935     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, sizeArg, fontSize, fontSizeResObj, false) || sizeArg->IsNull()) {
936         fontSize.SetValue(DEFAULT_SPAN_FONT_SIZE);
937         fontSize.SetUnit(DEFAULT_SPAN_FONT_UNIT);
938     }
939     if (sizeArg->IsUndefined() || fontSize.IsNegative() || fontSize.Unit() == DimensionUnit::PERCENT) {
940         auto theme = ArkTSUtils::GetTheme<TextTheme>();
941         CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
942         auto size = theme->GetTextStyle().GetFontSize();
943         fontInfo.fontSizeNumber = size.Value();
944         fontInfo.fontSizeUnit = static_cast<int8_t>(size.Unit());
945     } else {
946         fontInfo.fontSizeNumber = fontSize.Value();
947         fontInfo.fontSizeUnit = static_cast<int8_t>(fontSize.Unit());
948     }
949 
950     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
951     std::string weight = DEFAULT_FONT_WEIGHT;
952     if (!weightArg->IsNull()) {
953         if (weightArg->IsNumber()) {
954             weight = std::to_string(weightArg->Int32Value(vm));
955             variableFontWeight = weightArg->Int32Value(vm);
956         } else if (weightArg->IsString(vm)) {
957             weight = weightArg->ToString(vm)->ToString(vm);
958             variableFontWeight = StringUtils::StringToInt(weight);
959         }
960     }
961     fontInfo.fontWeight = static_cast<uint8_t>(Framework::ConvertStrToFontWeight(weight));
962     fontInfo.variableFontWeight = variableFontWeight;
963 
964     if (optionsArg->IsBoolean()) {
965         fontInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
966     }
967 
968     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
969     if (styleArg->IsInt()) {
970         style = styleArg->Int32Value(vm);
971     }
972     fontInfo.fontStyle = static_cast<uint8_t>(style);
973 
974     std::vector<std::string> fontFamilies;
975     RefPtr<ResourceObject> fontFamilyObject;
976     fontInfo.fontFamilies = nullptr;
977     if (!familyArg->IsNull() && ArkTSUtils::ParseJsFontFamilies(vm, familyArg, fontFamilies, fontFamilyObject)) {
978         fontInfo.familyLength = fontFamilies.size();
979         auto families = std::make_unique<const char* []>(fontInfo.familyLength);
980         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
981             families[i] = fontFamilies[i].c_str();
982         }
983         fontInfo.fontFamilies = families.get();
984         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo,
985             AceType::RawPtr(fontSizeResObj), AceType::RawPtr(fontFamilyObject));
986     } else {
987         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo,
988             AceType::RawPtr(fontSizeResObj), AceType::RawPtr(fontFamilyObject));
989     }
990     return panda::JSValueRef::Undefined(vm);
991 }
992 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)993 ArkUINativeModuleValue TextBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
994 {
995     EcmaVM* vm = runtimeCallInfo->GetVM();
996     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
997     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
998     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
999     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1000     GetArkUINodeModifiers()->getTextModifier()->resetTextFont(nativeNode);
1001     return panda::JSValueRef::Undefined(vm);
1002 }
1003 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1004 ArkUINativeModuleValue TextBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1005 {
1006     EcmaVM* vm = runtimeCallInfo->GetVM();
1007     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1008     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1009     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1010     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1011     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1012     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
1013         GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
1014         return panda::JSValueRef::Undefined(vm);
1015     }
1016     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
1017     GetArkUINodeModifiers()->getTextModifier()->setWordBreak(nativeNode, wordBreak);
1018     return panda::JSValueRef::Undefined(vm);
1019 }
1020 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1021 ArkUINativeModuleValue TextBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1022 {
1023     EcmaVM* vm = runtimeCallInfo->GetVM();
1024     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1025     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1026     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1027     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1028     GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
1029     return panda::JSValueRef::Undefined(vm);
1030 }
1031 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1032 ArkUINativeModuleValue TextBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1033 {
1034     EcmaVM* vm = runtimeCallInfo->GetVM();
1035     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1036     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1037     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1038     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1039     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1040     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
1041         GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
1042         return panda::JSValueRef::Undefined(vm);
1043     }
1044     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
1045     GetArkUINodeModifiers()->getTextModifier()->setLineBreakStrategy(nativeNode, lineBreakStrategy);
1046     return panda::JSValueRef::Undefined(vm);
1047 }
1048 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1049 ArkUINativeModuleValue TextBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1050 {
1051     EcmaVM* vm = runtimeCallInfo->GetVM();
1052     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1053     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1054     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1055     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1056     GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
1057     return panda::JSValueRef::Undefined(vm);
1058 }
1059 
SetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1060 ArkUINativeModuleValue TextBridge::SetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1061 {
1062     EcmaVM* vm = runtimeCallInfo->GetVM();
1063     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1064     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1065     Local<JSValueRef> ellipsisModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1066     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1067     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1068     if (ellipsisModeArg->IsNull() || ellipsisModeArg->IsUndefined() || !ellipsisModeArg->IsNumber()) {
1069         GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
1070         return panda::JSValueRef::Undefined(vm);
1071     }
1072     uint32_t ellipsisMode = ellipsisModeArg->Uint32Value(vm);
1073     GetArkUINodeModifiers()->getTextModifier()->setEllipsisMode(nativeNode, ellipsisMode);
1074     return panda::JSValueRef::Undefined(vm);
1075 }
1076 
ResetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1077 ArkUINativeModuleValue TextBridge::ResetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1078 {
1079     EcmaVM* vm = runtimeCallInfo->GetVM();
1080     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1081     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1082     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1083     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1084     GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
1085     return panda::JSValueRef::Undefined(vm);
1086 }
1087 
SetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)1088 ArkUINativeModuleValue TextBridge::SetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
1089 {
1090     EcmaVM* vm = runtimeCallInfo->GetVM();
1091     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1092     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1093     Local<JSValueRef> enableDataDetectorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1094     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1095     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1096     if (enableDataDetectorArg->IsNull() || enableDataDetectorArg->IsUndefined() ||
1097         !enableDataDetectorArg->IsBoolean()) {
1098         GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1099         return panda::JSValueRef::Undefined(vm);
1100     }
1101     uint32_t enableDataDetector = enableDataDetectorArg->Uint32Value(vm);
1102     GetArkUINodeModifiers()->getTextModifier()->setEnableDataDetector(nativeNode, enableDataDetector);
1103     return panda::JSValueRef::Undefined(vm);
1104 }
1105 
ResetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)1106 ArkUINativeModuleValue TextBridge::ResetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
1107 {
1108     EcmaVM* vm = runtimeCallInfo->GetVM();
1109     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1110     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1111     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1112     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1113     GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1114     return panda::JSValueRef::Undefined(vm);
1115 }
1116 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1117 ArkUINativeModuleValue TextBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1118 {
1119     EcmaVM* vm = runtimeCallInfo->GetVM();
1120     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1121     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1122     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1123     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1124     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1125     if (secondArg->IsString(vm)) {
1126         auto value = secondArg->ToString(vm)->ToString(vm);
1127         GetArkUINodeModifiers()->getTextModifier()->setTextFontFeature(nativeNode, value.c_str());
1128     } else {
1129         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1130     }
1131     return panda::JSValueRef::Undefined(vm);
1132 }
1133 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1134 ArkUINativeModuleValue TextBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1135 {
1136     EcmaVM* vm = runtimeCallInfo->GetVM();
1137     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1138     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1139     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1140     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1141     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1142     return panda::JSValueRef::Undefined(vm);
1143 }
1144 
SetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1145 ArkUINativeModuleValue TextBridge::SetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1146 {
1147     EcmaVM* vm = runtimeCallInfo->GetVM();
1148     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1149     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1150     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1151     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1152     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1153     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1154     CalcDimension value;
1155     RefPtr<ResourceObject> resourceObject;
1156     if (!ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, value, resourceObject)) {
1157         GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1158     } else {
1159         if (value.IsNegative()) {
1160             value.Reset();
1161         }
1162         bool isOnlyBetweenLines = optionsArg->IsBoolean() ? optionsArg->ToBoolean(vm)->Value() : false;
1163         GetArkUINodeModifiers()->getTextModifier()->setTextLineSpacing(
1164             nativeNode, value.Value(), static_cast<int>(value.Unit()), isOnlyBetweenLines,
1165             AceType::RawPtr(resourceObject));
1166     }
1167     return panda::JSValueRef::Undefined(vm);
1168 }
1169 
ResetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1170 ArkUINativeModuleValue TextBridge::ResetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1171 {
1172     EcmaVM* vm = runtimeCallInfo->GetVM();
1173     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1174     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1175     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1176     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1177     GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1178     return panda::JSValueRef::Undefined(vm);
1179 }
1180 
SetOptimizeTrailingSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)1181 ArkUINativeModuleValue TextBridge::SetOptimizeTrailingSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
1182 {
1183     EcmaVM* vm = runtimeCallInfo->GetVM();
1184     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1185     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1186     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1187     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1188     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1189     uint32_t optimizeTrailingSpace = false;
1190     if (secondArg->IsBoolean()) {
1191         optimizeTrailingSpace = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1192     }
1193     GetArkUINodeModifiers()->getTextModifier()->setTextOptimizeTrailingSpace(nativeNode, optimizeTrailingSpace);
1194     return panda::JSValueRef::Undefined(vm);
1195 }
1196 
ResetOptimizeTrailingSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)1197 ArkUINativeModuleValue TextBridge::ResetOptimizeTrailingSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
1198 {
1199     EcmaVM* vm = runtimeCallInfo->GetVM();
1200     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1201     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1202     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1203     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1204     GetArkUINodeModifiers()->getTextModifier()->resetTextOptimizeTrailingSpace(nativeNode);
1205     return panda::JSValueRef::Undefined(vm);
1206 }
1207 
SetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1208 ArkUINativeModuleValue TextBridge::SetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1209 {
1210     EcmaVM* vm = runtimeCallInfo->GetVM();
1211     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1212     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1213     Local<JSValueRef> startArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1214     Local<JSValueRef> endArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1215     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1217     if (!startArg->IsNumber() || !endArg->IsNumber()) {
1218         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1219         return panda::JSValueRef::Undefined(vm);
1220     }
1221     int32_t startIndex = startArg->Int32Value(vm);
1222     int32_t endIndex = endArg->Int32Value(vm);
1223     if (startIndex >= endIndex) {
1224         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1225         return panda::JSValueRef::Undefined(vm);
1226     }
1227     GetArkUINodeModifiers()->getTextModifier()->setTextSelection(nativeNode, startIndex, endIndex);
1228     return panda::JSValueRef::Undefined(vm);
1229 }
1230 
ResetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1231 ArkUINativeModuleValue TextBridge::ResetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1232 {
1233     EcmaVM* vm = runtimeCallInfo->GetVM();
1234     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1235     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1236     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1237     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1238     GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1239     return panda::JSValueRef::Undefined(vm);
1240 }
1241 
SetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1242 ArkUINativeModuleValue TextBridge::SetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1243 {
1244     EcmaVM* vm = runtimeCallInfo->GetVM();
1245     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1246     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1247     Local<JSValueRef> textSelectableModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1248     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1249     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1250     if (textSelectableModeArg->IsNull() || textSelectableModeArg->IsUndefined() || !textSelectableModeArg->IsNumber()) {
1251         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1252         return panda::JSValueRef::Undefined(vm);
1253     }
1254     uint32_t textSelectableMode = textSelectableModeArg->Uint32Value(vm);
1255     GetArkUINodeModifiers()->getTextModifier()->setTextSelectableMode(nativeNode, textSelectableMode);
1256     return panda::JSValueRef::Undefined(vm);
1257 }
1258 
ResetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1259 ArkUINativeModuleValue TextBridge::ResetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1260 {
1261     EcmaVM* vm = runtimeCallInfo->GetVM();
1262     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1263     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1264     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1266     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1267     return panda::JSValueRef::Undefined(vm);
1268 }
1269 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1270 ArkUINativeModuleValue TextBridge::SetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1271 {
1272     EcmaVM *vm = runtimeCallInfo->GetVM();
1273     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1275     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1276     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1277     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1278     Color color;
1279     RefPtr<ResourceObject> resourceObject;
1280     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1281     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
1282         GetArkUINodeModifiers()->getTextModifier()->resetTextCaretColor(nativeNode);
1283     } else {
1284         GetArkUINodeModifiers()->getTextModifier()->setTextCaretColor(
1285             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
1286     }
1287     return panda::JSValueRef::Undefined(vm);
1288 }
1289 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1290 ArkUINativeModuleValue TextBridge::ResetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1291 {
1292     EcmaVM *vm = runtimeCallInfo->GetVM();
1293     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1295     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1296     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1297     GetArkUINodeModifiers()->getTextModifier()->resetTextCaretColor(nativeNode);
1298     return panda::JSValueRef::Undefined(vm);
1299 }
1300 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1301 ArkUINativeModuleValue TextBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1302 {
1303     EcmaVM *vm = runtimeCallInfo->GetVM();
1304     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1305     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1306     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1307     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1308     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1309     Color color;
1310     RefPtr<ResourceObject> resourceObject;
1311     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1312     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
1313         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectedBackgroundColor(nativeNode);
1314     } else {
1315         if (color.GetAlpha() == DEFAULT_ALPHA) {
1316             color = color.ChangeOpacity(DEFAULT_OPACITY);
1317         }
1318         GetArkUINodeModifiers()->getTextModifier()->setTextSelectedBackgroundColor(
1319             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
1320     }
1321     return panda::JSValueRef::Undefined(vm);
1322 }
1323 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1324 ArkUINativeModuleValue TextBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1325 {
1326     EcmaVM *vm = runtimeCallInfo->GetVM();
1327     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1328     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1329     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1330     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1331     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectedBackgroundColor(nativeNode);
1332     return panda::JSValueRef::Undefined(vm);
1333 }
1334 
SetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1335 ArkUINativeModuleValue TextBridge::SetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1336 {
1337     EcmaVM* vm = runtimeCallInfo->GetVM();
1338     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1340     Local<JSValueRef> typesArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1341     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1342     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1344     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1345     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1346     if (!typesArg->IsArray(vm)) {
1347         GetArkUINodeModifiers()->getTextModifier()->
1348             resetTextDataDetectorConfigWithEvent(nativeNode);
1349         return panda::JSValueRef::Undefined(vm);
1350     }
1351 
1352     struct ArkUITextDetectConfigStruct arkUITextDetectConfig;
1353     std::string types;
1354     auto array = panda::Local<panda::ArrayRef>(typesArg);
1355     for (size_t i = 0; i < array->Length(vm); i++) {
1356         auto value = panda::ArrayRef::GetValueAt(vm, array, i);
1357         auto index = value->Int32Value(vm);
1358         if (index < 0 || index >= static_cast<int32_t>(TEXT_DETECT_TYPES.size())) {
1359             return panda::JSValueRef::Undefined(vm);
1360         }
1361         if (i != 0) {
1362             types.append(",");
1363         }
1364         types.append(TEXT_DETECT_TYPES[index]);
1365     }
1366     arkUITextDetectConfig.types = types.c_str();
1367     std::function<void(const std::string&)> callback;
1368     if (callbackArg->IsFunction(vm)) {
1369         panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1370         callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const std::string& info) {
1371             panda::LocalScope pandaScope(vm);
1372             panda::TryCatch trycatch(vm);
1373             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1374             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1375                 panda::StringRef::NewFromUtf8(vm, info.c_str()) };
1376             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1377         };
1378         arkUITextDetectConfig.onResult = reinterpret_cast<void*>(&callback);
1379     }
1380     RefPtr<ResourceObject> colorResObj;
1381     RefPtr<ResourceObject> decColorResObj;
1382     ParseAIEntityColorAndPreview(runtimeCallInfo, arkUITextDetectConfig, colorResObj, decColorResObj, nativeNode);
1383     GetArkUINodeModifiers()->getTextModifier()->setTextDataDetectorConfigWithEvent(nativeNode,
1384         &arkUITextDetectConfig, AceType::RawPtr(colorResObj), AceType::RawPtr(decColorResObj));
1385     return panda::JSValueRef::Undefined(vm);
1386 }
1387 
ParseAIEntityColorAndPreview(ArkUIRuntimeCallInfo * runtimeCallInfo,struct ArkUITextDetectConfigStruct & arkUITextDetectConfig,RefPtr<ResourceObject> & colorResObj,RefPtr<ResourceObject> & decColorResObj,ArkUINodeHandle nativeNode)1388 void TextBridge::ParseAIEntityColorAndPreview(
1389     ArkUIRuntimeCallInfo* runtimeCallInfo, struct ArkUITextDetectConfigStruct& arkUITextDetectConfig,
1390     RefPtr<ResourceObject>& colorResObj, RefPtr<ResourceObject>& decColorResObj,
1391     ArkUINodeHandle nativeNode)
1392 {
1393     EcmaVM* vm = runtimeCallInfo->GetVM();
1394     CHECK_NULL_VOID(vm);
1395     TextDetectConfig textDetectConfig;
1396     Local<JSValueRef> entityColorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1397     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1398     ArkTSUtils::ParseJsColorAlpha(vm, entityColorArg, textDetectConfig.entityColor, colorResObj, nodeInfo);
1399     arkUITextDetectConfig.entityColor = textDetectConfig.entityColor.GetValue();
1400 
1401     Local<JSValueRef> entityDecorationTypeArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1402     Local<JSValueRef> entityDecorationColorArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1403     Local<JSValueRef> entityDecorationStyleArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1404     arkUITextDetectConfig.entityDecorationType = static_cast<int32_t>(textDetectConfig.entityDecorationType);
1405     arkUITextDetectConfig.entityDecorationColor = arkUITextDetectConfig.entityColor;
1406     arkUITextDetectConfig.entityDecorationStyle = static_cast<int32_t>(textDetectConfig.entityDecorationStyle);
1407 
1408     if (entityDecorationTypeArg->IsInt()) {
1409         arkUITextDetectConfig.entityDecorationType = entityDecorationTypeArg->Int32Value(vm);
1410     }
1411     if (ArkTSUtils::ParseJsColorAlpha(vm, entityDecorationColorArg, textDetectConfig.entityDecorationColor,
1412         decColorResObj, nodeInfo)) {
1413         arkUITextDetectConfig.entityDecorationColor = textDetectConfig.entityDecorationColor.GetValue();
1414     }
1415     if (entityDecorationStyleArg->IsInt()) {
1416         arkUITextDetectConfig.entityDecorationStyle = entityDecorationStyleArg->Int32Value(vm);
1417     }
1418 
1419     Local<JSValueRef> enablePreviewMenu = runtimeCallInfo->GetCallArgRef(NUM_7);
1420     auto enablePreviewMenuValue = false;
1421     if (enablePreviewMenu->IsBoolean()) {
1422         enablePreviewMenuValue = enablePreviewMenu->ToBoolean(vm)->Value();
1423     }
1424     arkUITextDetectConfig.entityEnablePreviewMenu = enablePreviewMenuValue;
1425 }
1426 
ResetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1427 ArkUINativeModuleValue TextBridge::ResetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1428 {
1429     EcmaVM* vm = runtimeCallInfo->GetVM();
1430     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1431     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1432     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1433     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1434     GetArkUINodeModifiers()->getTextModifier()->
1435         resetTextDataDetectorConfigWithEvent(nativeNode);
1436     return panda::JSValueRef::Undefined(vm);
1437 }
1438 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1439 ArkUINativeModuleValue TextBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1440 {
1441     EcmaVM *vm = runtimeCallInfo->GetVM();
1442     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1443     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1444     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1445     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1446     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1447     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1448     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1449     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1450         GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1451         return panda::JSValueRef::Undefined(vm);
1452     }
1453     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1454     std::function<void(const std::u16string&)> callback = [vm, frameNode,
1455         func = panda::CopyableGlobal(vm, func)](const std::u16string& copyStr) {
1456         panda::LocalScope pandaScope(vm);
1457         panda::TryCatch trycatch(vm);
1458         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1459         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1460             panda::StringRef::NewFromUtf16(vm, copyStr.c_str()) };
1461         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1462     };
1463     GetArkUINodeModifiers()->getTextModifier()->setTextOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1464     return panda::JSValueRef::Undefined(vm);
1465 }
1466 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1467 ArkUINativeModuleValue TextBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1468 {
1469     EcmaVM* vm = runtimeCallInfo->GetVM();
1470     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1471     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1472     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1473     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1474     GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1475     return panda::JSValueRef::Undefined(vm);
1476 }
1477 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1478 ArkUINativeModuleValue TextBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1479 {
1480     EcmaVM *vm = runtimeCallInfo->GetVM();
1481     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1482     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1483     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1484     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1485     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1486     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1487     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1488     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1489         GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1490         return panda::JSValueRef::Undefined(vm);
1491     }
1492     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1493     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1494         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int32_t selectionEnd) {
1495         panda::LocalScope pandaScope(vm);
1496         panda::TryCatch trycatch(vm);
1497         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1498         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1499         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1500         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1501         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1502     };
1503     GetArkUINodeModifiers()->getTextModifier()->setTextOnTextSelectionChange(
1504         nativeNode, reinterpret_cast<void*>(&callback));
1505     return panda::JSValueRef::Undefined(vm);
1506 }
1507 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1508 ArkUINativeModuleValue TextBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1509 {
1510     EcmaVM* vm = runtimeCallInfo->GetVM();
1511     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1512     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1513     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1514     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1515     GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1516     return panda::JSValueRef::Undefined(vm);
1517 }
1518 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1519 ArkUINativeModuleValue TextBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1520 {
1521     EcmaVM* vm = runtimeCallInfo->GetVM();
1522     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1523     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1524     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1525     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1526     NG::OnCreateMenuCallback onCreateMenuCallback;
1527     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1528     NG::OnPrepareMenuCallback onPrepareMenuCallback;
1529     if (!ArkTSUtils::ParseSelectionMenuOptions(
1530         runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback, onPrepareMenuCallback)) {
1531         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1532         return panda::JSValueRef::Undefined(vm);
1533     }
1534     GetArkUINodeModifiers()->getTextModifier()->setTextSelectionMenuOptions(nativeNode,
1535         reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback),
1536         reinterpret_cast<void*>(&onPrepareMenuCallback));
1537     return panda::JSValueRef::Undefined(vm);
1538 }
1539 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1540 ArkUINativeModuleValue TextBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1541 {
1542     EcmaVM* vm = runtimeCallInfo->GetVM();
1543     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1544     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1545     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1546     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1547     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1548     return panda::JSValueRef::Undefined(vm);
1549 }
1550 
SetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1551 ArkUINativeModuleValue TextBridge::SetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1552 {
1553     EcmaVM* vm = runtimeCallInfo->GetVM();
1554     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1555     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1556     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1557     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1558     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1559     bool halfLeading = false;
1560     if (secondArg->IsBoolean()) {
1561         halfLeading = secondArg->ToBoolean(vm)->Value();
1562     }
1563     GetArkUINodeModifiers()->getTextModifier()->setTextHalfLeading(nativeNode, halfLeading);
1564     return panda::JSValueRef::Undefined(vm);
1565 }
1566 
ResetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1567 ArkUINativeModuleValue TextBridge::ResetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1568 {
1569     EcmaVM* vm = runtimeCallInfo->GetVM();
1570     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1571     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1572     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1573     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1574     GetArkUINodeModifiers()->getTextModifier()->resetTextHalfLeading(nativeNode);
1575     return panda::JSValueRef::Undefined(vm);
1576 }
1577 
SetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1578 ArkUINativeModuleValue TextBridge::SetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1579 {
1580     EcmaVM *vm = runtimeCallInfo->GetVM();
1581     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1582     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1583     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1584     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1585     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1586     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1587     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1588     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1589         GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1590         return panda::JSValueRef::Undefined(vm);
1591     }
1592     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1593     auto containerId = Container::CurrentId();
1594     std::function<void(GestureEvent& info)> callback = [vm,
1595         func = panda::CopyableGlobal(vm, func), containerId, node = AceType::WeakClaim(frameNode)]
1596         (GestureEvent& info) {
1597         panda::LocalScope pandaScope(vm);
1598         panda::TryCatch trycatch(vm);
1599         ContainerScope scope(containerId);
1600         PipelineContext::SetCallBackNode(node);
1601         auto obj = FrameNodeBridge::CreateGestureEventInfo(vm, info);
1602         panda::Local<panda::JSValueRef> params[1] = { obj };
1603         func->Call(vm, func.ToLocal(), params, 1);
1604     };
1605     GetArkUINodeModifiers()->getTextModifier()->setTextOnClick(
1606         nativeNode, reinterpret_cast<void*>(&callback));
1607     return panda::JSValueRef::Undefined(vm);
1608 }
1609 
ResetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1610 ArkUINativeModuleValue TextBridge::ResetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1611 {
1612     EcmaVM* vm = runtimeCallInfo->GetVM();
1613     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1614     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1615     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1616     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1617     GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1618     return panda::JSValueRef::Undefined(vm);
1619 }
1620 
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1621 ArkUINativeModuleValue TextBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1622 {
1623     EcmaVM* vm = runtimeCallInfo->GetVM();
1624     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1625     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1626     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1627     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1628     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1629     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1630     int32_t length = thirdArg->Int32Value(vm);
1631     ArkUI_Float32 regionArray[length];
1632     int32_t regionUnits[length];
1633     if (!ArkTSUtils::ParseResponseRegion(vm, secondArg, regionArray, regionUnits, length)) {
1634         GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1635         return panda::JSValueRef::Undefined(vm);
1636     }
1637     GetArkUINodeModifiers()->getTextModifier()->setTextResponseRegion(nativeNode, regionArray, regionUnits, length);
1638     return panda::JSValueRef::Undefined(vm);
1639 }
1640 
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1641 ArkUINativeModuleValue TextBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1642 {
1643     EcmaVM* vm = runtimeCallInfo->GetVM();
1644     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1645     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1646     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1647     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1648     GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1649     return panda::JSValueRef::Undefined(vm);
1650 }
1651 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1652 ArkUINativeModuleValue TextBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1653 {
1654     EcmaVM* vm = runtimeCallInfo->GetVM();
1655     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1656     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1657     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1658     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1659     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1660 
1661     if (secondArg->IsBoolean()) {
1662         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1663         GetArkUINodeModifiers()->getTextModifier()->setTextEnableHapticFeedback(nativeNode, value);
1664     } else {
1665         GetArkUINodeModifiers()->getTextModifier()->resetTextEnableHapticFeedback(nativeNode);
1666     }
1667     return panda::JSValueRef::Undefined(vm);
1668 }
1669 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1670 ArkUINativeModuleValue TextBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1671 {
1672     EcmaVM* vm = runtimeCallInfo->GetVM();
1673     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1674     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1675     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1676     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1677     GetArkUINodeModifiers()->getTextModifier()->resetTextEnableHapticFeedback(nativeNode);
1678     return panda::JSValueRef::Undefined(vm);
1679 }
1680 
SetShaderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1681 ArkUINativeModuleValue TextBridge::SetShaderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1682 {
1683     EcmaVM* vm = runtimeCallInfo->GetVM();
1684     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1685     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1686     auto centerArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1687     auto radiusArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1688     auto angleArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1689     auto directionArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1690     auto repeatingArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1691     auto colorsArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1692     auto colorArg = runtimeCallInfo->GetCallArgRef(NUM_7);
1693     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1694     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1695     if (centerArg->BooleaValue(vm) && (radiusArg->IsNumber() || radiusArg->BooleaValue(vm))) {
1696         std::vector<ArkUIInt32orFloat32> values;
1697         ArkTSUtils::ParseGradientCenter(vm, centerArg, values);
1698         CalcDimension radius;
1699         auto hasRadius = ArkTSUtils::ParseJsDimensionVp(vm, radiusArg, radius, false);
1700         values.push_back({ .i32 = static_cast<ArkUI_Int32>(hasRadius) });
1701         values.push_back({ .f32 = static_cast<ArkUI_Float32>(radius.Value()) });
1702         values.push_back({ .i32 = static_cast<ArkUI_Int32>(radius.Unit()) });
1703         std::vector<ArkUIInt32orFloat32> colors;
1704         ArkTSUtils::ParseGradientColorStops(vm, colorsArg, colors);
1705         auto repeating = repeatingArg->IsBoolean() ? repeatingArg->BooleaValue(vm) : false;
1706         values.push_back({ .i32 = static_cast<ArkUI_Int32>(repeating) });
1707         GetArkUINodeModifiers()->getTextModifier()->setRadialGradient(
1708             nativeNode, values.data(), values.size(), colors.data(), colors.size());
1709     } else if (colorsArg->BooleaValue(vm)) {
1710         std::vector<ArkUIInt32orFloat32> values;
1711         ArkTSUtils::ParseGradientAngle(vm, angleArg, values);
1712         int32_t direction = static_cast<int32_t>(GradientDirection::NONE);
1713         ArkTSUtils::ParseJsInt32(vm, directionArg, direction);
1714         values.push_back({ .i32 = static_cast<ArkUI_Int32>(direction) });
1715 
1716         std::vector<ArkUIInt32orFloat32> colors;
1717         ArkTSUtils::ParseGradientColorStops(vm, colorsArg, colors);
1718         auto repeating = repeatingArg->IsBoolean() ? repeatingArg->BooleaValue(vm) : false;
1719         values.push_back({ .i32 = static_cast<ArkUI_Int32>(repeating) });
1720         GetArkUINodeModifiers()->getTextModifier()->setLinearGradient(
1721             nativeNode, values.data(), values.size(), colors.data(), colors.size());
1722     } else if (colorArg->BooleaValue(vm)) {
1723         Color color;
1724         ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color);
1725         GetArkUINodeModifiers()->getTextModifier()->setColorShaderColor(nativeNode, color.GetValue());
1726     } else {
1727         GetArkUINodeModifiers()->getTextModifier()->resetTextGradient(nativeNode);
1728     }
1729     return panda::JSValueRef::Undefined(vm);
1730 }
1731 
ResetShaderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1732 ArkUINativeModuleValue TextBridge::ResetShaderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1733 {
1734     EcmaVM* vm = runtimeCallInfo->GetVM();
1735     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1736     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1737     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1738     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1739     GetArkUINodeModifiers()->getTextModifier()->resetTextGradient(nativeNode);
1740     return panda::JSValueRef::Undefined(vm);
1741 }
1742 
SetMarqueeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1743 ArkUINativeModuleValue TextBridge::SetMarqueeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1744 {
1745     EcmaVM* vm = runtimeCallInfo->GetVM();
1746     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1747     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1748     Local<JSValueRef> startArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1749     Local<JSValueRef> fromStartArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1750     Local<JSValueRef> stepArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1751     Local<JSValueRef> loopArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1752     Local<JSValueRef> delayArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1753     Local<JSValueRef> fadeoutArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1754     Local<JSValueRef> marqueeStartPolicyArg = runtimeCallInfo->GetCallArgRef(NUM_7);
1755     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1756     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1757 
1758     auto textMarqueeOptions = std::make_unique<ArkUITextMarqueeOptions>();
1759     textMarqueeOptions->start = startArg->IsBoolean() ? startArg->ToBoolean(vm)->Value() : true;
1760     textMarqueeOptions->fromStart = fromStartArg->IsBoolean() ? fromStartArg->ToBoolean(vm)->Value() : true;
1761     textMarqueeOptions->step = stepArg->IsNumber() ?
1762         Dimension(stepArg->ToNumber(vm)->Value(), DimensionUnit::VP).ConvertToPx() :
1763         DEFAULT_MARQUEE_STEP_VALUE.ConvertToPx();
1764     textMarqueeOptions->loop = loopArg->IsNumber() ? loopArg->Int32Value(vm) : -1;
1765     textMarqueeOptions->delay = delayArg->IsNumber() ? delayArg->Int32Value(vm) : 0;
1766     textMarqueeOptions->fadeout = fadeoutArg->IsBoolean() ? fadeoutArg->ToBoolean(vm)->Value() : false;
1767     textMarqueeOptions->marqueeStartPolicy = marqueeStartPolicyArg->IsNumber() ?
1768         marqueeStartPolicyArg->Int32Value(vm) : 0;
1769 
1770     bool isValid = startArg->IsBoolean() || fromStartArg->IsBoolean() || stepArg->IsNumber() || loopArg->IsNumber()
1771         || delayArg->IsNumber() || fadeoutArg->IsBoolean() || marqueeStartPolicyArg->IsNumber();
1772     if (isValid) {
1773         GetArkUINodeModifiers()->getTextModifier()->setTextMarqueeOptions(nativeNode, textMarqueeOptions.get());
1774     } else {
1775         GetArkUINodeModifiers()->getTextModifier()->resetTextMarqueeOptions(nativeNode);
1776     }
1777     return panda::JSValueRef::Undefined(vm);
1778 }
1779 
ResetMarqueeOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1780 ArkUINativeModuleValue TextBridge::ResetMarqueeOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1781 {
1782     EcmaVM* vm = runtimeCallInfo->GetVM();
1783     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1784     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1785     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1786     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1787     GetArkUINodeModifiers()->getTextModifier()->resetTextMarqueeOptions(nativeNode);
1788     return panda::JSValueRef::Undefined(vm);
1789 }
1790 
SetOnMarqueeStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1791 ArkUINativeModuleValue TextBridge::SetOnMarqueeStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1792 {
1793     EcmaVM *vm = runtimeCallInfo->GetVM();
1794     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1795     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1796     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1797     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1798     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1799     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1800     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1801     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1802         GetArkUINodeModifiers()->getTextModifier()->resetOnMarqueeStateChange(nativeNode);
1803         return panda::JSValueRef::Undefined(vm);
1804     }
1805     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1806     std::function<void(int32_t)> callback = [vm, frameNode,
1807         func = panda::CopyableGlobal(vm, func)](int32_t state) {
1808         panda::LocalScope pandaScope(vm);
1809         panda::TryCatch trycatch(vm);
1810         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1811         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, state);
1812         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { stateParam };
1813         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1814     };
1815     GetArkUINodeModifiers()->getTextModifier()->setOnMarqueeStateChange(nativeNode, reinterpret_cast<void*>(&callback));
1816     return panda::JSValueRef::Undefined(vm);
1817 }
1818 
ResetOnMarqueeStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1819 ArkUINativeModuleValue TextBridge::ResetOnMarqueeStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1820 {
1821     EcmaVM* vm = runtimeCallInfo->GetVM();
1822     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1823     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1824     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1825     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1826     GetArkUINodeModifiers()->getTextModifier()->resetOnMarqueeStateChange(nativeNode);
1827     return panda::JSValueRef::Undefined(vm);
1828 }
1829 
SetEnableAutoSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1830 ArkUINativeModuleValue TextBridge::SetEnableAutoSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1831 {
1832     EcmaVM* vm = runtimeCallInfo->GetVM();
1833     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1834     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1835     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1836     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1837     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1838     uint32_t enableAutoSpacing = false;
1839     if (secondArg->IsBoolean()) {
1840         enableAutoSpacing = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1841     }
1842     GetArkUINodeModifiers()->getTextModifier()->setEnableAutoSpacing(nativeNode, enableAutoSpacing);
1843     return panda::JSValueRef::Undefined(vm);
1844 }
1845 
ResetEnableAutoSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1846 ArkUINativeModuleValue TextBridge::ResetEnableAutoSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1847 {
1848     EcmaVM* vm = runtimeCallInfo->GetVM();
1849     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1850     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1851     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1852     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1853     GetArkUINodeModifiers()->getTextModifier()->resetEnableAutoSpacing(nativeNode);
1854     return panda::JSValueRef::Undefined(vm);
1855 }
1856 
SetTextVerticalAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)1857 ArkUINativeModuleValue TextBridge::SetTextVerticalAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
1858 {
1859     EcmaVM* vm = runtimeCallInfo->GetVM();
1860     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1861     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1862     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1863     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1864     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1865     uint32_t textVerticalAlign = static_cast<uint32_t>(TextVerticalAlign::BASELINE);
1866     if (secondArg->IsNumber()) {
1867         textVerticalAlign = static_cast<uint32_t>(secondArg->Int32Value(vm));
1868     }
1869     GetArkUINodeModifiers()->getTextModifier()->setTextVerticalAlign(nativeNode, textVerticalAlign);
1870     return panda::JSValueRef::Undefined(vm);
1871 }
1872 
ResetTextVerticalAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)1873 ArkUINativeModuleValue TextBridge::ResetTextVerticalAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
1874 {
1875     EcmaVM* vm = runtimeCallInfo->GetVM();
1876     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1877     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1878     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1879     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1880     GetArkUINodeModifiers()->getTextModifier()->resetTextVerticalAlign(nativeNode);
1881     return panda::JSValueRef::Undefined(vm);
1882 }
1883 
SetTextContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1884 ArkUINativeModuleValue TextBridge::SetTextContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1885 {
1886     EcmaVM* vm = runtimeCallInfo->GetVM();
1887     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1888     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1889     Local<JSValueRef> directionArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1890     Local<JSValueRef> enableArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1891     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1892     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1893     int32_t direction = static_cast<int32_t>(TextFlipDirection::DOWN);
1894     auto enableBlur = false;
1895     if (directionArg->IsNumber()) {
1896         direction = static_cast<int32_t>(directionArg->Int32Value(vm));
1897     }
1898     if (enableArg->IsBoolean()) {
1899         enableBlur = enableArg->BooleaValue(vm);
1900     }
1901     GetArkUINodeModifiers()->getTextModifier()->setTextContentTransition(nativeNode, direction, enableBlur);
1902     return panda::JSValueRef::Undefined(vm);
1903 }
1904 
ResetTextContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)1905 ArkUINativeModuleValue TextBridge::ResetTextContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1906 {
1907     EcmaVM* vm = runtimeCallInfo->GetVM();
1908     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1909     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1910     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1911     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1912     GetArkUINodeModifiers()->getTextModifier()->resetTextContentTransition(nativeNode);
1913     return panda::JSValueRef::Undefined(vm);
1914 }
1915 } // namespace OHOS::Ace::NG
1916