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_span_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
17
18 #include <string>
19 #include "base/geometry/calc_dimension.h"
20 #include "base/geometry/dimension.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include "core/components/common/layout/constants.h"
23 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
24
25 #include "core/common/resource/resource_object.h"
26 #include "core/common/resource/resource_parse_utils.h"
27
28 namespace OHOS::Ace::NG {
29 namespace {
30 constexpr int SIZE_OF_TEXT_CASES = 2;
31 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
32 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
33 constexpr Color DEFAULT_DECORATION_COLOR = Color(0xff000000);
34 const std::string DEFAULT_FONT_WEIGHT = "400";
35 constexpr int NUM_0 = 0;
36 constexpr int NUM_1 = 1;
37 constexpr int NUM_2 = 2;
38 constexpr int NUM_3 = 3;
39 constexpr int NUM_4 = 4;
40 constexpr int NUM_5 = 5;
41 constexpr int NUM_6 = 6;
42 constexpr int NUM_7 = 7;
43 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
44
ParseTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo,uint32_t length,std::vector<ArkUITextShadowStruct> & textShadowArray,std::vector<RefPtr<ResourceObject>> & radiusResArr,std::vector<RefPtr<ResourceObject>> & colorResArr,std::vector<RefPtr<ResourceObject>> & offsetXResArr,std::vector<RefPtr<ResourceObject>> & offsetYResArr,const std::optional<NodeInfo> & nodeInfo=std::nullopt)45 bool ParseTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo, uint32_t length,
46 std::vector<ArkUITextShadowStruct>& textShadowArray,
47 std::vector<RefPtr<ResourceObject>>& radiusResArr, std::vector<RefPtr<ResourceObject>>& colorResArr,
48 std::vector<RefPtr<ResourceObject>>& offsetXResArr, std::vector<RefPtr<ResourceObject>>& offsetYResArr,
49 const std::optional<NodeInfo>& nodeInfo = std::nullopt)
50 {
51 EcmaVM* vm = runtimeCallInfo->GetVM();
52 CHECK_NULL_RETURN(vm, false);
53 Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(NUM_1);
54 Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
55 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
56 Local<JSValueRef> offsetXArg = runtimeCallInfo->GetCallArgRef(NUM_4);
57 Local<JSValueRef> offsetYArg = runtimeCallInfo->GetCallArgRef(NUM_5);
58 Local<JSValueRef> fillArg = runtimeCallInfo->GetCallArgRef(NUM_6);
59 auto radiusArray = std::make_unique<double[]>(length);
60 auto typeArray = std::make_unique<uint32_t[]>(length);
61 auto colorArray = std::make_unique<uint32_t[]>(length);
62 auto offsetXArray = std::make_unique<double[]>(length);
63 auto offsetYArray = std::make_unique<double[]>(length);
64 auto fillArray = std::make_unique<uint32_t[]>(length);
65
66 bool radiusParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, radiusArg, radiusArray.get(), length,
67 ArkTSUtils::parseShadowRadiusWithResObj, radiusResArr);
68 bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(vm, typeArg, typeArray.get(), length,
69 ArkTSUtils::parseShadowType);
70 bool colorParseResult = ArkTSUtils::ParseArrayWithResObj<uint32_t>(vm, colorArg, colorArray.get(), length,
71 ArkTSUtils::parseShadowColorWithResObj, colorResArr, nodeInfo);
72 bool offsetXParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, offsetXArg, offsetXArray.get(), length,
73 ArkTSUtils::parseShadowOffsetWithResObj, offsetXResArr);
74 bool offsetYParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, offsetYArg, offsetYArray.get(), length,
75 ArkTSUtils::parseShadowOffsetWithResObj, offsetYResArr);
76 bool fillParseResult =
77 ArkTSUtils::ParseArray<uint32_t>(vm, fillArg, fillArray.get(), length, ArkTSUtils::parseShadowFill);
78 if (!radiusParseResult || !colorParseResult || !offsetXParseResult || !offsetYParseResult || !fillParseResult ||
79 !typeParseResult) {
80 return false;
81 }
82 for (uint32_t i = 0; i < length; i++) {
83 ArkUITextShadowStruct textShadow;
84 textShadow.radius = radiusArray[i];
85 textShadow.type = typeArray[i];
86 textShadow.color = colorArray[i];
87 textShadow.offsetX = offsetXArray[i];
88 textShadow.offsetY = offsetYArray[i];
89 textShadow.fill = fillArray[i];
90 textShadowArray.emplace_back(textShadow);
91 }
92 return true;
93 }
94 } // namespace
95
SetSpanSrc(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue SpanBridge::SetSpanSrc(ArkUIRuntimeCallInfo *runtimeCallInfo)
97 {
98 EcmaVM *vm = runtimeCallInfo->GetVM();
99 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
100 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
101 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
102 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104 std::string src;
105 if (!ArkTSUtils::ParseJsString(vm, secondArg, src)) {
106 return panda::JSValueRef::Undefined(vm);
107 }
108 GetArkUINodeModifiers()->getSpanModifier()->setSpanSrc(nativeNode, src.c_str());
109 return panda::JSValueRef::Undefined(vm);
110 }
111
SetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue SpanBridge::SetTextCase(ArkUIRuntimeCallInfo *runtimeCallInfo)
113 {
114 EcmaVM *vm = runtimeCallInfo->GetVM();
115 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
116 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
117 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
118 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
119 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
120 if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
121 secondArg->Int32Value(vm) <= SIZE_OF_TEXT_CASES) {
122 GetArkUINodeModifiers()->getSpanModifier()->setSpanTextCase(nativeNode, secondArg->Int32Value(vm));
123 } else {
124 GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextCase(nativeNode);
125 }
126 return panda::JSValueRef::Undefined(vm);
127 }
128
ResetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)129 ArkUINativeModuleValue SpanBridge::ResetTextCase(ArkUIRuntimeCallInfo *runtimeCallInfo)
130 {
131 EcmaVM *vm = runtimeCallInfo->GetVM();
132 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
133 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
134 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
135 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136 GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextCase(nativeNode);
137 return panda::JSValueRef::Undefined(vm);
138 }
139
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)140 ArkUINativeModuleValue SpanBridge::SetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
141 {
142 EcmaVM *vm = runtimeCallInfo->GetVM();
143 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
144 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
145 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
146 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
147 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
148
149 std::string weight = DEFAULT_FONT_WEIGHT;
150 RefPtr<ResourceObject> resObj;
151 if (!secondArg->IsNull()) {
152 if (secondArg->IsNumber()) {
153 weight = std::to_string(secondArg->Int32Value(vm));
154 } else if ((secondArg->IsString(vm) || secondArg->IsObject(vm)) &&
155 (!(ArkTSUtils::ParseJsString(vm, secondArg, weight, resObj)))) {
156 return panda::JSValueRef::Undefined(vm);
157 }
158 }
159
160 GetArkUINodeModifiers()->getSpanModifier()->setSpanFontWeight(nativeNode,
161 static_cast<ArkUI_Int32>(Framework::ConvertStrToFontWeight(weight)), AceType::RawPtr(resObj));
162 return panda::JSValueRef::Undefined(vm);
163 }
164
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue SpanBridge::ResetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
166 {
167 EcmaVM *vm = runtimeCallInfo->GetVM();
168 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
169 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
170 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
171 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
172 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontWeight(nativeNode);
173 return panda::JSValueRef::Undefined(vm);
174 }
175
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)176 ArkUINativeModuleValue SpanBridge::SetLineHeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
177 {
178 EcmaVM *vm = runtimeCallInfo->GetVM();
179 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
180 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
181 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
182 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
183 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
184 CalcDimension lineHeight(0.0, DimensionUnit::PX);
185 RefPtr<ResourceObject> lineHeightObj;
186 if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, lineHeight, lineHeightObj) || lineHeight.IsNegative()) {
187 lineHeight.Reset();
188 }
189 GetArkUINodeModifiers()->getSpanModifier()->setSpanLineHeight(
190 nativeNode, lineHeight.Value(), static_cast<int8_t>(lineHeight.Unit()), AceType::RawPtr(lineHeightObj));
191 return panda::JSValueRef::Undefined(vm);
192 }
193
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)194 ArkUINativeModuleValue SpanBridge::ResetLineHeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
195 {
196 EcmaVM *vm = runtimeCallInfo->GetVM();
197 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
198 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
199 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
200 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
201 GetArkUINodeModifiers()->getSpanModifier()->resetSpanLineHeight(nativeNode);
202 return panda::JSValueRef::Undefined(vm);
203 }
204
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue SpanBridge::SetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
206 {
207 EcmaVM *vm = runtimeCallInfo->GetVM();
208 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
209 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
210 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
211 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
212 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
213 if (secondArg->IsNumber()) {
214 int32_t value = secondArg->Int32Value(vm);
215 if (value >= 0 && value < static_cast<int32_t>(FONT_STYLES.size())) {
216 GetArkUINodeModifiers()->getSpanModifier()->setSpanFontStyle(nativeNode, value);
217 } else {
218 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
219 return panda::JSValueRef::Undefined(vm);
220 }
221 } else {
222 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
223 }
224 return panda::JSValueRef::Undefined(vm);
225 }
226
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)227 ArkUINativeModuleValue SpanBridge::ResetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
228 {
229 EcmaVM *vm = runtimeCallInfo->GetVM();
230 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
231 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
232 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
233 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
234 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
235 return panda::JSValueRef::Undefined(vm);
236 }
237
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue SpanBridge::SetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
239 {
240 EcmaVM *vm = runtimeCallInfo->GetVM();
241 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
242 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
243 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
244 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
245 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
246 auto theme = GetTheme<TextTheme>();
247 CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
248
249 CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
250 RefPtr<ResourceObject> fontSizeResObj;
251 if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, fontSizeResObj, false) || fontSize.IsNegative()) {
252 fontSize = theme->GetTextStyle().GetFontSize();
253 }
254 GetArkUINodeModifiers()->getSpanModifier()->setSpanFontSize(nativeNode, fontSize.Value(),
255 static_cast<int8_t>(fontSize.Unit()), AceType::RawPtr(fontSizeResObj));
256 return panda::JSValueRef::Undefined(vm);
257 }
258
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue SpanBridge::ResetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
260 {
261 EcmaVM *vm = runtimeCallInfo->GetVM();
262 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
263 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
264 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
265 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontSize(nativeNode);
267 return panda::JSValueRef::Undefined(vm);
268 }
269
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue SpanBridge::SetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
271 {
272 EcmaVM *vm = runtimeCallInfo->GetVM();
273 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
274 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
275 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
276 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
277 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278
279 std::vector<std::string> fontFamilies;
280 RefPtr<ResourceObject> resourceObject;
281 if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies, resourceObject)) {
282 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontFamily(nativeNode);
283 return panda::JSValueRef::Undefined(vm);
284 }
285 auto families = std::make_unique<char *[]>(fontFamilies.size());
286 for (uint32_t i = 0; i < fontFamilies.size(); i++) {
287 families[i] = const_cast<char *>(fontFamilies.at(i).c_str());
288 }
289 GetArkUINodeModifiers()->getSpanModifier()->setSpanFontFamily(nativeNode,
290 const_cast<const char **>(families.get()), fontFamilies.size(), AceType::RawPtr(resourceObject));
291 return panda::JSValueRef::Undefined(vm);
292 }
293
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue SpanBridge::ResetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
295 {
296 EcmaVM *vm = runtimeCallInfo->GetVM();
297 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
298 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
299 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
300 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
301
302 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontFamily(nativeNode);
303 return panda::JSValueRef::Undefined(vm);
304 }
305
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue SpanBridge::SetDecoration(ArkUIRuntimeCallInfo *runtimeCallInfo)
307 {
308 EcmaVM *vm = runtimeCallInfo->GetVM();
309 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
310 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
311 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
312 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
313 Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
314 Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
315 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
316 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
317 int32_t textDecoration = static_cast<int32_t>(TextDecoration::NONE);
318 Color color = DEFAULT_DECORATION_COLOR;
319 int32_t style = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
320 double lineThicknessScale = 1.0;
321 if (secondArg->IsInt()) {
322 textDecoration = secondArg->Int32Value(vm);
323 }
324 RefPtr<ResourceObject> resourceObject;
325 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
326 if (!ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, resourceObject, nodeInfo)) {
327 color = DEFAULT_DECORATION_COLOR;
328 }
329 if (fourthArg->IsInt()) {
330 style = fourthArg->Int32Value(vm);
331 }
332 if (!ArkTSUtils::ParseJsDouble(vm, fifthArg, lineThicknessScale)) {
333 lineThicknessScale = 1.0;
334 }
335 lineThicknessScale = lineThicknessScale < 0 ? 1.0 : lineThicknessScale;
336 GetArkUINodeModifiers()->getSpanModifier()->setSpanDecoration(
337 nativeNode, textDecoration, color.GetValue(), AceType::RawPtr(resourceObject),
338 style, static_cast<float>(lineThicknessScale));
339 return panda::JSValueRef::Undefined(vm);
340 }
341
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)342 ArkUINativeModuleValue SpanBridge::ResetDecoration(ArkUIRuntimeCallInfo *runtimeCallInfo)
343 {
344 EcmaVM *vm = runtimeCallInfo->GetVM();
345 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
346 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
347 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
348 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
349 GetArkUINodeModifiers()->getSpanModifier()->resetSpanDecoration(nativeNode);
350 return panda::JSValueRef::Undefined(vm);
351 }
352
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue SpanBridge::SetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
354 {
355 EcmaVM *vm = runtimeCallInfo->GetVM();
356 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
357 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
358 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
359 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
360 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
361 auto theme = GetTheme<TextTheme>();
362 CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
363
364 Color textColor = theme->GetTextStyle().GetTextColor();
365 RefPtr<ResourceObject> colorResObj;
366 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
367 if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, textColor, colorResObj, nodeInfo)) {
368 textColor = theme->GetTextStyle().GetTextColor();
369 }
370 GetArkUINodeModifiers()->getSpanModifier()->setSpanFontColor(
371 nativeNode, textColor.GetValue(), AceType::RawPtr(colorResObj));
372 return panda::JSValueRef::Undefined(vm);
373 }
374
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue SpanBridge::ResetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
376 {
377 EcmaVM *vm = runtimeCallInfo->GetVM();
378 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
379 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
380 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
381 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
382
383 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontColor(nativeNode);
384 return panda::JSValueRef::Undefined(vm);
385 }
386
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)387 ArkUINativeModuleValue SpanBridge::SetLetterSpacing(ArkUIRuntimeCallInfo *runtimeCallInfo)
388 {
389 EcmaVM *vm = runtimeCallInfo->GetVM();
390 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
391 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
392 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
393 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
394 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
395 struct ArkUIStringAndFloat letterSpacingValue = { 0.0, nullptr };
396 std::string tempValueStr = "";
397 RefPtr<ResourceObject> resObj;
398 if (secondArg->IsNumber()) {
399 letterSpacingValue.value = secondArg->ToNumber(vm)->Value();
400 GetArkUINodeModifiers()->getSpanModifier()->setSpanLetterSpacing(nativeNode, &letterSpacingValue,
401 AceType::RawPtr(resObj));
402 } else if ((secondArg->IsString(vm) || secondArg->IsObject(vm)) &&
403 ArkTSUtils::ParseJsString(vm, secondArg, tempValueStr, resObj)) {
404 letterSpacingValue.valueStr = tempValueStr.c_str();
405 GetArkUINodeModifiers()->getSpanModifier()->setSpanLetterSpacing(nativeNode, &letterSpacingValue,
406 AceType::RawPtr(resObj));
407 } else {
408 GetArkUINodeModifiers()->getSpanModifier()->resetSpanLetterSpacing(nativeNode);
409 }
410 return panda::JSValueRef::Undefined(vm);
411 }
412
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)413 ArkUINativeModuleValue SpanBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo *runtimeCallInfo)
414 {
415 EcmaVM *vm = runtimeCallInfo->GetVM();
416 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
417 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
418 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
419 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
420 GetArkUINodeModifiers()->getSpanModifier()->resetSpanLetterSpacing(nativeNode);
421 return panda::JSValueRef::Undefined(vm);
422 }
423
SetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue SpanBridge::SetBaselineOffset(ArkUIRuntimeCallInfo *runtimeCallInfo)
425 {
426 EcmaVM *vm = runtimeCallInfo->GetVM();
427 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
428 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
429 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
430 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
431 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
432 CalcDimension result;
433 RefPtr<ResourceObject> resourceObject;
434 if (secondArg->IsObject(vm) && ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, result, resourceObject) &&
435 result.Unit() != DimensionUnit::PERCENT && !std::isnan(result.Value())) {
436 GetArkUINodeModifiers()->getSpanModifier()->setSpanBaselineOffset(
437 nativeNode, result.Value(), static_cast<int8_t>(result.Unit()), AceType::RawPtr(resourceObject));
438 } else {
439 GetArkUINodeModifiers()->getSpanModifier()->resetSpanBaselineOffset(nativeNode);
440 }
441 return panda::JSValueRef::Undefined(vm);
442 }
443
ResetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue SpanBridge::ResetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446 EcmaVM* vm = runtimeCallInfo->GetVM();
447 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
448 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
449 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
450 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
451 GetArkUINodeModifiers()->getSpanModifier()->resetSpanBaselineOffset(nativeNode);
452 return panda::JSValueRef::Undefined(vm);
453 }
454
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)455 ArkUINativeModuleValue SpanBridge::SetFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
456 {
457 EcmaVM *vm = runtimeCallInfo->GetVM();
458 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
459 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
460 Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
461 Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
462 Local<JSValueRef> familyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
463 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
464 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
465 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
466 ArkUIFontStruct fontInfo;
467 auto theme = GetTheme<TextTheme>();
468 CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
469
470 CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
471 RefPtr<ResourceObject> fontSizeObj;
472 if (sizeArg->IsNull() || !ArkTSUtils::ParseJsDimensionFpNG(vm, sizeArg, fontSize, fontSizeObj, false) ||
473 fontSize.IsNegative()) {
474 fontSize = theme->GetTextStyle().GetFontSize();
475 }
476 fontInfo.fontSizeNumber = fontSize.Value();
477 fontInfo.fontSizeUnit = static_cast<int8_t>(fontSize.Unit());
478
479 std::string weight = DEFAULT_FONT_WEIGHT;
480 if (!weightArg->IsNull()) {
481 if (weightArg->IsNumber()) {
482 weight = std::to_string(weightArg->Int32Value(vm));
483 } else if (weightArg->IsString(vm)) {
484 weight = weightArg->ToString(vm)->ToString(vm);
485 }
486 }
487 fontInfo.fontWeight = static_cast<uint8_t>(Framework::ConvertStrToFontWeight(weight));
488 int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
489 if (styleArg->IsInt()) {
490 style = styleArg->Int32Value(vm);
491 if (style <= 0 || style > static_cast<int32_t>(FONT_STYLES.size())) {
492 style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
493 }
494 }
495 fontInfo.fontStyle = static_cast<uint8_t>(style);
496 std::vector<std::string> fontFamilies;
497 RefPtr<ResourceObject> fontFamiliesObject;
498 fontInfo.fontFamilies = nullptr;
499 if (!familyArg->IsNull() && ArkTSUtils::ParseJsFontFamilies(vm, familyArg, fontFamilies, fontFamiliesObject)) {
500 fontInfo.familyLength = fontFamilies.size();
501 auto families = std::make_unique<const char* []>(fontInfo.familyLength);
502 for (uint32_t i = 0; i < fontFamilies.size(); i++) {
503 families[i] = fontFamilies[i].c_str();
504 }
505 fontInfo.fontFamilies = families.get();
506 GetArkUINodeModifiers()->getSpanModifier()->setSpanFont(nativeNode, &fontInfo);
507 } else {
508 GetArkUINodeModifiers()->getSpanModifier()->setSpanFont(nativeNode, &fontInfo);
509 }
510 return panda::JSValueRef::Undefined(vm);
511 }
512
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue SpanBridge::ResetFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
514 {
515 EcmaVM *vm = runtimeCallInfo->GetVM();
516 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
517 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
518 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
519 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
520 GetArkUINodeModifiers()->getSpanModifier()->resetSpanFont(nativeNode);
521 return panda::JSValueRef::Undefined(vm);
522 }
523
SetTextBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue SpanBridge::SetTextBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526 EcmaVM* vm = runtimeCallInfo->GetVM();
527 Color color;
528 std::vector<ArkUI_Float32> radiusArray;
529 std::vector<ArkUI_Int32> valueUnits;
530 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
531 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
532 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
533 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
534 std::shared_ptr<TextBackgroundStyle> style = std::make_shared<TextBackgroundStyle>();
535 RefPtr<ResourceObject> colorResObj;
536 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
537 if (!(ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo))) {
538 color = Color::TRANSPARENT;
539 }
540 ArkTSUtils::ParseOuterBorderRadius(runtimeCallInfo, vm, radiusArray, valueUnits, NUM_2, style);
541 ArkTSUtils::SetTextBackgroundStyle(style, color, colorResObj, radiusArray.data(), valueUnits.data());
542 GetArkUINodeModifiers()->getSpanModifier()->setSpanTextBackgroundStyle(
543 nativeNode, color.GetValue(), radiusArray.data(), valueUnits.data(), static_cast<int32_t>(radiusArray.size()),
544 style.get());
545 return panda::JSValueRef::Undefined(vm);
546 }
547
ResetTextBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)548 ArkUINativeModuleValue SpanBridge::ResetTextBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
549 {
550 EcmaVM* vm = runtimeCallInfo->GetVM();
551 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
552 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
553 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
554 GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextBackgroundStyle(nativeNode);
555 return panda::JSValueRef::Undefined(vm);
556 }
557
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)558 ArkUINativeModuleValue SpanBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
559 {
560 EcmaVM* vm = runtimeCallInfo->GetVM();
561 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
562 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
563 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
564 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
565 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
566 uint32_t length;
567 if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
568 return panda::JSValueRef::Undefined(vm);
569 }
570 length = lengthArg->Uint32Value(vm);
571 std::vector<ArkUITextShadowStruct> textShadowArray;
572 std::vector<RefPtr<ResourceObject>> radiusResArr;
573 std::vector<RefPtr<ResourceObject>> colorResArr;
574 std::vector<RefPtr<ResourceObject>> offsetXResArr;
575 std::vector<RefPtr<ResourceObject>> offsetYResArr;
576 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
577 ParseTextShadow(runtimeCallInfo, length, textShadowArray, radiusResArr, colorResArr, offsetXResArr, offsetYResArr,
578 nodeInfo);
579 GetArkUINodeModifiers()->getSpanModifier()->setTextShadow(nativeNode, textShadowArray.data(), length,
580 static_cast<void*>(&radiusResArr), static_cast<void*>(&colorResArr),
581 static_cast<void*>(&offsetXResArr), static_cast<void*>(&offsetYResArr));
582 return panda::JSValueRef::Undefined(vm);
583 }
584
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)585 ArkUINativeModuleValue SpanBridge::ResetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
586 {
587 EcmaVM* vm = runtimeCallInfo->GetVM();
588 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
589 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
590 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
591 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
592 GetArkUINodeModifiers()->getSpanModifier()->resetTextShadow(nativeNode);
593 return panda::JSValueRef::Undefined(vm);
594 }
595
SetAccessibilityText(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue SpanBridge::SetAccessibilityText(ArkUIRuntimeCallInfo *runtimeCallInfo)
597 {
598 EcmaVM* vm = runtimeCallInfo->GetVM();
599 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
600 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
601 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
602 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
603 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
604 if (secondArg->IsString(vm)) {
605 std::string stringValue = secondArg->ToString(vm)->ToString(vm);
606 GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityText(nativeNode, stringValue.c_str());
607 } else {
608 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityText(nativeNode);
609 }
610 return panda::JSValueRef::Undefined(vm);
611 }
612
ResetAccessibilityText(ArkUIRuntimeCallInfo * runtimeCallInfo)613 ArkUINativeModuleValue SpanBridge::ResetAccessibilityText(ArkUIRuntimeCallInfo *runtimeCallInfo)
614 {
615 EcmaVM* vm = runtimeCallInfo->GetVM();
616 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
617 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
618 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
619 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
620 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityText(nativeNode);
621 return panda::JSValueRef::Undefined(vm);
622 }
623
SetAccessibilityDescription(ArkUIRuntimeCallInfo * runtimeCallInfo)624 ArkUINativeModuleValue SpanBridge::SetAccessibilityDescription(ArkUIRuntimeCallInfo *runtimeCallInfo)
625 {
626 EcmaVM* vm = runtimeCallInfo->GetVM();
627 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
628 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
629 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
630 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
631 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
632 if (secondArg->IsString(vm)) {
633 std::string stringValue = secondArg->ToString(vm)->ToString(vm);
634 GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityDescription(nativeNode, stringValue.c_str());
635 } else {
636 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityDescription(nativeNode);
637 }
638 return panda::JSValueRef::Undefined(vm);
639 }
640
ResetAccessibilityDescription(ArkUIRuntimeCallInfo * runtimeCallInfo)641 ArkUINativeModuleValue SpanBridge::ResetAccessibilityDescription(ArkUIRuntimeCallInfo *runtimeCallInfo)
642 {
643 EcmaVM* vm = runtimeCallInfo->GetVM();
644 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
645 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
646 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
647 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
648 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityDescription(nativeNode);
649 return panda::JSValueRef::Undefined(vm);
650 }
651
SetAccessibilityLevel(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue SpanBridge::SetAccessibilityLevel(ArkUIRuntimeCallInfo *runtimeCallInfo)
653 {
654 EcmaVM* vm = runtimeCallInfo->GetVM();
655 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
656 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
657 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
658 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
659 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
660 if (secondArg->IsString(vm)) {
661 std::string stringValue = secondArg->ToString(vm)->ToString(vm);
662 GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityLevel(nativeNode, stringValue.c_str());
663 } else {
664 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityLevel(nativeNode);
665 }
666 return panda::JSValueRef::Undefined(vm);
667 }
668
ResetAccessibilityLevel(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue SpanBridge::ResetAccessibilityLevel(ArkUIRuntimeCallInfo *runtimeCallInfo)
670 {
671 EcmaVM* vm = runtimeCallInfo->GetVM();
672 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
673 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
674 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
675 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
676 GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityLevel(nativeNode);
677 return panda::JSValueRef::Undefined(vm);
678 }
679
SetOnHover(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue SpanBridge::SetOnHover(ArkUIRuntimeCallInfo *runtimeCallInfo)
681 {
682 EcmaVM* vm = runtimeCallInfo->GetVM();
683 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
686 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
687 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
688 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
689 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
690 if (secondArg->IsFunction(vm)) {
691 panda::Local<panda::FunctionRef> func = secondArg->ToObject(vm);
692 OnHoverFunc callback = [vm, frameNode,
693 func = panda::CopyableGlobal(vm, func)](bool isHover, HoverInfo& info) {
694 panda::LocalScope pandaScope(vm);
695 panda::TryCatch trycatch(vm);
696 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
697
698 auto obj = FrameNodeBridge::CreateHoverInfo(vm, info);
699 obj->SetNativePointerFieldCount(vm, 1);
700 obj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
701
702 panda::Local<panda::JSValueRef> params[NUM_2] = {
703 panda::BooleanRef::New(vm, isHover), obj };
704 func->Call(vm, func.ToLocal(), params, NUM_2);
705 };
706 GetArkUINodeModifiers()->getSpanModifier()->setSpanOnHover(nativeNode, reinterpret_cast<void*>(&callback));
707 } else {
708 GetArkUINodeModifiers()->getSpanModifier()->resetSpanOnHover(nativeNode);
709 }
710 return panda::JSValueRef::Undefined(vm);
711 }
712
ResetOnHover(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue SpanBridge::ResetOnHover(ArkUIRuntimeCallInfo *runtimeCallInfo)
714 {
715 EcmaVM* vm = runtimeCallInfo->GetVM();
716 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
718 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
719 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
720 GetArkUINodeModifiers()->getSpanModifier()->resetSpanOnHover(nativeNode);
721 return panda::JSValueRef::Undefined(vm);
722 }
723 } // namespace OHOS::Ace::NG
724