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