1 /*
2 * Copyright (c) 2024 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_symbol_glyph_bridge.h"
16 #include <cstdint>
17 #include "arkts_native_symbol_glyph_bridge.h"
18 #include "bridge/declarative_frontend/jsview/js_symbol.h"
19 #include "base/utils/string_utils.h"
20 #include "base/utils/utils.h"
21 #include "core/components/common/properties/shadow.h"
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/pattern/symbol/symbol_model_ng.h"
24 #include "frameworks/base/geometry/calc_dimension.h"
25 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
26
27 namespace OHOS::Ace::NG {
28 namespace {
29 constexpr int NUM_0 = 0;
30 constexpr int NUM_1 = 1;
31 constexpr int NUM_2 = 2;
32 constexpr int32_t SYSTEM_SYMBOL_BOUNDARY = 0XFFFFF;
33 } // namespace
34
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)35 ArkUINativeModuleValue SymbolGlyphBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
36 {
37 EcmaVM* vm = runtimeCallInfo->GetVM();
38 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
39 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
40 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
41
42 if (!secondArg->IsArray(vm)) {
43 return panda::JSValueRef::Undefined(vm);
44 }
45 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
46 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
47 auto array = Local<panda::ArrayRef>(secondArg);
48 auto length = array->Length(vm);
49
50 std::vector<ArkUI_Uint32> colorArray;
51 std::vector<Color> colorArr;
52 std::vector<std::pair<int32_t, RefPtr<ResourceObject>>> resObjArr;
53 for (uint32_t index = 0; index < length; index++) {
54 Local<JSValueRef> value = panda::ArrayRef::GetValueAt(vm, array, index);
55 Color color;
56 RefPtr<ResourceObject> resObj;
57 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
58 if (!ArkTSUtils::ParseJsSymbolColorAlpha(vm, value, color, resObj, nodeInfo)) {
59 colorArray.clear();
60 break;
61 }
62 colorArray.emplace_back(color.GetValue());
63 colorArr.emplace_back(color);
64 if (SystemProperties::ConfigChangePerform() && resObj) {
65 std::pair<int32_t, RefPtr<ResourceObject>> pair(index, resObj);
66 resObjArr.push_back(pair);
67 }
68 }
69
70 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setFontColor(nativeNode, colorArray.data(), colorArray.size());
71
72 if (SystemProperties::ConfigChangePerform()) {
73 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
74 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
75 auto pattern = frameNode->GetPattern();
76 CHECK_NULL_RETURN(pattern, panda::JSValueRef::Undefined(vm));
77 if (!resObjArr.empty()) {
78 SymbolModelNG::RegisterSymbolFontColorResource(frameNode, "symbolColor", colorArr, resObjArr);
79 } else {
80 pattern->UnRegisterResource("symbolColor");
81 }
82 }
83
84 return panda::JSValueRef::Undefined(vm);
85 }
86
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)87 ArkUINativeModuleValue SymbolGlyphBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
88 {
89 EcmaVM* vm = runtimeCallInfo->GetVM();
90 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
91 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
92 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
93 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
94 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetFontColor(nativeNode);
95 return panda::JSValueRef::Undefined(vm);
96 }
97
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)98 ArkUINativeModuleValue SymbolGlyphBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
99 {
100 EcmaVM* vm = runtimeCallInfo->GetVM();
101 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
102 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
103 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
105 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
106 CalcDimension fontSize;
107 RefPtr<ResourceObject> fontSizeResObj;
108 if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, fontSizeResObj, false)) {
109 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetFontSize(nativeNode);
110 } else {
111 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setFontSize(
112 nativeNode, fontSize.Value(), static_cast<int>(fontSize.Unit()), AceType::RawPtr(fontSizeResObj));
113 }
114 return panda::JSValueRef::Undefined(vm);
115 }
116
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)117 ArkUINativeModuleValue SymbolGlyphBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
118 {
119 EcmaVM* vm = runtimeCallInfo->GetVM();
120 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
121 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
122 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
123 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
124 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetFontSize(nativeNode);
125 return panda::JSValueRef::Undefined(vm);
126 }
127
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)128 ArkUINativeModuleValue SymbolGlyphBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
129 {
130 EcmaVM* vm = runtimeCallInfo->GetVM();
131 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
132 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
133 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
134 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
135 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136 if (secondArg->IsString(vm)) {
137 std::string weight = secondArg->ToString(vm)->ToString(vm);
138 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setFontWeightStr(nativeNode, weight.c_str());
139 } else if (secondArg->IsNumber()) {
140 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setFontWeight(nativeNode, secondArg->Int32Value(vm));
141 } else {
142 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetFontWeight(nativeNode);
143 }
144 return panda::JSValueRef::Undefined(vm);
145 }
146
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)147 ArkUINativeModuleValue SymbolGlyphBridge::ResetFontWeight(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()->getSymbolGlyphModifier()->resetFontWeight(nativeNode);
155 return panda::JSValueRef::Undefined(vm);
156 }
157
SetRenderingStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)158 ArkUINativeModuleValue SymbolGlyphBridge::SetRenderingStrategy(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 if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
167 secondArg->Int32Value(vm) <= NUM_2) {
168 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setRenderingStrategy(nativeNode, secondArg->Int32Value(vm));
169 } else {
170 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetRenderingStrategy(nativeNode);
171 }
172 return panda::JSValueRef::Undefined(vm);
173 }
174
ResetRenderingStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue SymbolGlyphBridge::ResetRenderingStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177 EcmaVM* vm = runtimeCallInfo->GetVM();
178 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
179 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
180 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
181 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
182 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetRenderingStrategy(nativeNode);
183 return panda::JSValueRef::Undefined(vm);
184 }
185
SetEffectStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)186 ArkUINativeModuleValue SymbolGlyphBridge::SetEffectStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
187 {
188 EcmaVM* vm = runtimeCallInfo->GetVM();
189 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
190 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
191 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
192 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
193 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
194 if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
195 secondArg->Int32Value(vm) <= NUM_2) {
196 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setEffectStrategy(nativeNode, secondArg->Int32Value(vm));
197 } else {
198 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetEffectStrategy(nativeNode);
199 }
200 return panda::JSValueRef::Undefined(vm);
201 }
202
ResetEffectStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)203 ArkUINativeModuleValue SymbolGlyphBridge::ResetEffectStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
204 {
205 EcmaVM* vm = runtimeCallInfo->GetVM();
206 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
207 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
208 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
209 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
210 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetEffectStrategy(nativeNode);
211 return panda::JSValueRef::Undefined(vm);
212 }
213
SetSymbolEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)214 ArkUINativeModuleValue SymbolGlyphBridge::SetSymbolEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
215 {
216 EcmaVM* vm = runtimeCallInfo->GetVM();
217 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
218 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
219 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
220 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
221 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
222
223 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
224 if (info.Length() < NUM_1 || !info[NUM_1]->IsObject()) {
225 return panda::JSValueRef::Undefined(vm);
226 }
227 auto symbolEffectObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
228 NG::SymbolEffectOptions symbolEffectOptions;
229 Framework::JSSymbol::parseSymbolEffect(symbolEffectObj, symbolEffectOptions);
230 if (info.Length() > NUM_2 && !info[NUM_2]->IsUndefined()) {
231 Framework::JSSymbol::parseSymbolSwitch(info[NUM_2], symbolEffectOptions);
232 }
233 SymbolModelNG::SetSymbolEffectOptions(frameNode, symbolEffectOptions);
234 return panda::JSValueRef::Undefined(vm);
235 }
236
ResetSymbolEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue SymbolGlyphBridge::ResetSymbolEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
238 {
239 EcmaVM* vm = runtimeCallInfo->GetVM();
240 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
241 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
242 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
243 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
244 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
245 NG::SymbolEffectOptions symbolEffectOptions;
246 SymbolModelNG::SetSymbolEffectOptions(frameNode, symbolEffectOptions);
247 return panda::JSValueRef::Undefined(vm);
248 }
249
SetSymbolGlyphInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)250 ArkUINativeModuleValue SymbolGlyphBridge::SetSymbolGlyphInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
251 {
252 EcmaVM* vm = runtimeCallInfo->GetVM();
253 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
254 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
255 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
256 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
257 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
258 uint32_t symbolId = 0;
259 ArkTSUtils::ParseJsSymbolId(vm, valueArg, symbolId);
260 if (symbolId > SYSTEM_SYMBOL_BOUNDARY) {
261 std::string symbolFontFamilyName;
262 ArkTSUtils::ParseJsSymbolFontFamilyName(vm, valueArg, symbolFontFamilyName);
263 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setCustomSymbolGlyphInitialize(nativeNode, symbolId,
264 symbolFontFamilyName.c_str());
265 } else {
266 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setSymbolGlyphInitialize(nativeNode, symbolId);
267 }
268 return panda::JSValueRef::Undefined(vm);
269 }
270
ResetSymbolGlyphInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)271 ArkUINativeModuleValue SymbolGlyphBridge::ResetSymbolGlyphInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
272 {
273 EcmaVM* vm = runtimeCallInfo->GetVM();
274 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
275 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
276 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
277 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetSymbolGlyphInitialize(nativeNode);
279 return panda::JSValueRef::Undefined(vm);
280 }
281
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)282 ArkUINativeModuleValue SymbolGlyphBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
283 {
284 EcmaVM* vm = runtimeCallInfo->GetVM();
285 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
286 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
287 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
288 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
289 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
290 double minFontScale = 0.0;
291 RefPtr<ResourceObject> resourceObject;
292 if (ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale, resourceObject)) {
293 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setMinFontScale(nativeNode,
294 static_cast<float>(minFontScale), AceType::RawPtr(resourceObject));
295 }
296 return panda::JSValueRef::Undefined(vm);
297 }
298
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)299 ArkUINativeModuleValue SymbolGlyphBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
300 {
301 EcmaVM* vm = runtimeCallInfo->GetVM();
302 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
303 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
304 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
305 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
306 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetMinFontScale(nativeNode);
307 return panda::JSValueRef::Undefined(vm);
308 }
309
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)310 ArkUINativeModuleValue SymbolGlyphBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
311 {
312 EcmaVM* vm = runtimeCallInfo->GetVM();
313 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
314 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
315 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
316 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
317 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
318 double maxFontScale = 0.0;
319 RefPtr<ResourceObject> resourceObject;
320 if (ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale, resourceObject)) {
321 GetArkUINodeModifiers()->getSymbolGlyphModifier()->setMaxFontScale(nativeNode,
322 static_cast<float>(maxFontScale), AceType::RawPtr(resourceObject));
323 }
324 return panda::JSValueRef::Undefined(vm);
325 }
326
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)327 ArkUINativeModuleValue SymbolGlyphBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
328 {
329 EcmaVM* vm = runtimeCallInfo->GetVM();
330 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
331 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
332 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
333 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
334 GetArkUINodeModifiers()->getSymbolGlyphModifier()->resetMaxFontScale(nativeNode);
335 return panda::JSValueRef::Undefined(vm);
336 }
337
SetSymbolShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)338 ArkUINativeModuleValue SymbolGlyphBridge::SetSymbolShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
339 {
340 EcmaVM* vm = runtimeCallInfo->GetVM();
341 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
342 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
343 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
344 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
345 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
346 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
347 if (info.Length() < NUM_2 || !info[1]->IsObject()) {
348 SymbolModelNG::ResetShaderStyle(frameNode);
349 return panda::JSValueRef::Undefined(vm);
350 }
351 auto symbolShadowObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
352 SymbolShadow symbolShadow;
353 Framework::JSSymbol::ParseSymbolShadow(symbolShadowObj, symbolShadow);
354 SymbolModelNG::SetSymbolShadow(frameNode, symbolShadow);
355 return panda::JSValueRef::Undefined(vm);
356 }
357
ResetSymbolShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)358 ArkUINativeModuleValue SymbolGlyphBridge::ResetSymbolShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
359 {
360 EcmaVM* vm = runtimeCallInfo->GetVM();
361 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
362 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
363 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
364 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
365 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
366 SymbolShadow symbolShadow;
367 SymbolModelNG::SetSymbolShadow(frameNode, symbolShadow);
368 return panda::JSValueRef::Undefined(vm);
369 }
370
SetShaderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)371 ArkUINativeModuleValue SymbolGlyphBridge::SetShaderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
372 {
373 EcmaVM* vm = runtimeCallInfo->GetVM();
374 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
375 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
376 if (info.Length() < NUM_2 || !info[1]->IsObject()) {
377 return panda::JSValueRef::Undefined(vm);
378 }
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 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
383
384 std::vector<SymbolGradient> gradients;
385 if (!info[1]->IsArray()) {
386 auto jsGradientObj = Framework::JSRef<Framework::JSObject>::Cast(info[1]);
387 SymbolGradient gradient;
388 gradient.gradientType = GradientDefinedStatus::GRADIENT_TYPE;
389 Framework::JSSymbol::ParseShaderStyle(jsGradientObj, gradient);
390 gradients.emplace_back(std::move(gradient));
391 SymbolModelNG::SetShaderStyle(frameNode, gradients);
392 return panda::JSValueRef::Undefined(vm);
393 }
394 auto jsArray = Framework::JSRef<Framework::JSArray>::Cast(info[1]);
395 gradients.reserve(jsArray->Length());
396 for (size_t i = 0; i < jsArray->Length(); ++i) {
397 auto jsGradientObj = Framework::JSRef<Framework::JSObject>::Cast(jsArray->GetValueAt(i));
398 SymbolGradient gradient;
399 Framework::JSSymbol::ParseShaderStyle(jsGradientObj, gradient);
400 gradients.emplace_back(std::move(gradient));
401 }
402 SymbolModelNG::SetShaderStyle(frameNode, gradients);
403 return panda::JSValueRef::Undefined(vm);
404 }
405
ResetShaderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)406 ArkUINativeModuleValue SymbolGlyphBridge::ResetShaderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
407 {
408 EcmaVM* vm = runtimeCallInfo->GetVM();
409 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
410 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
411 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
412 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
413 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
414 SymbolModelNG::ResetShaderStyle(frameNode);
415 return panda::JSValueRef::Undefined(vm);
416 }
417 } // namespace OHOS::Ace::NG
418