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 "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_symbol_span_bridge.h"
16
17 #include "frameworks/base/geometry/calc_dimension.h"
18 #include "frameworks/base/geometry/dimension.h"
19 #include "frameworks/base/utils/string_utils.h"
20 #include "frameworks/base/utils/utils.h"
21 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
22 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_value_conversions.h"
23 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
24 #include "frameworks/bridge/declarative_frontend/jsview/js_shape_abstract.h"
25 #include "frameworks/bridge/declarative_frontend/jsview/js_symbol.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
27 #include "frameworks/core/components/common/properties/shadow.h"
28 #include "frameworks/core/components_ng/base/frame_node.h"
29 #include "frameworks/core/components_ng/pattern/symbol/symbol_model_ng.h"
30
31 namespace OHOS::Ace::NG {
32 namespace {
33 constexpr int NUM_0 = 0;
34 constexpr int NUM_1 = 1;
35 constexpr int NUM_2 = 2;
36 } // namespace
37
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)38 ArkUINativeModuleValue SymbolSpanBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
39 {
40 EcmaVM* vm = runtimeCallInfo->GetVM();
41 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
42 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
43 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
44
45 if (!secondArg->IsArray(vm)) {
46 return panda::JSValueRef::Undefined(vm);
47 }
48 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
49 auto array = Local<panda::ArrayRef>(secondArg);
50 auto length = array->Length(vm);
51
52 std::vector<ArkUI_Uint32> colorArray;
53 for (uint32_t index = 0; index < length; index++) {
54 Local<JSValueRef> value = panda::ArrayRef::GetValueAt(vm, array, index);
55 Color color;
56 if (ArkTSUtils::ParseJsColorAlpha(vm, value, color)) {
57 colorArray.emplace_back(color.GetValue());
58 } else {
59 colorArray.clear();
60 break;
61 }
62 }
63 if (static_cast<uint32_t>(length) == colorArray.size() && (static_cast<uint32_t>(length) & 1)) {
64 for (uint32_t i = 0; i < length; i++) {
65 colorArray.emplace_back(colorArray[i]);
66 }
67 }
68 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanFontColor(
69 nativeNode, colorArray.data(), colorArray.size());
70 return panda::JSValueRef::Undefined(vm);
71 }
72
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)73 ArkUINativeModuleValue SymbolSpanBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
74 {
75 EcmaVM* vm = runtimeCallInfo->GetVM();
76 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
77 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
78 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
79 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanFontColor(nativeNode);
80 return panda::JSValueRef::Undefined(vm);
81 }
82
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)83 ArkUINativeModuleValue SymbolSpanBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
84 {
85 EcmaVM* vm = runtimeCallInfo->GetVM();
86 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
87 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
88 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
89 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
90 CalcDimension fontSize;
91 if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
92 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanFontSize(nativeNode);
93 } else {
94 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanFontSize(
95 nativeNode, fontSize.Value(), static_cast<int>(fontSize.Unit()));
96 }
97 return panda::JSValueRef::Undefined(vm);
98 }
99
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue SymbolSpanBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102 EcmaVM* vm = runtimeCallInfo->GetVM();
103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
105 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
106 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanFontSize(nativeNode);
107 return panda::JSValueRef::Undefined(vm);
108 }
109
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)110 ArkUINativeModuleValue SymbolSpanBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
111 {
112 EcmaVM* vm = runtimeCallInfo->GetVM();
113 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
114 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
115 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
116 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
117 if (secondArg->IsString(vm)) {
118 std::string weight = secondArg->ToString(vm)->ToString(vm);
119 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanFontWeightStr(
120 nativeNode, weight.c_str());
121 } else {
122 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanFontWeight(nativeNode);
123 }
124 return panda::JSValueRef::Undefined(vm);
125 }
126
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)127 ArkUINativeModuleValue SymbolSpanBridge::ResetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
128 {
129 EcmaVM* vm = runtimeCallInfo->GetVM();
130 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
131 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
132 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
133 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanFontWeight(nativeNode);
134 return panda::JSValueRef::Undefined(vm);
135 }
136
SetRenderingStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue SymbolSpanBridge::SetRenderingStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139 EcmaVM* vm = runtimeCallInfo->GetVM();
140 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
142 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
143 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
144 if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
145 secondArg->Int32Value(vm) <= NUM_2) {
146 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanRenderingStrategy(
147 nativeNode, secondArg->Int32Value(vm));
148 } else {
149 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanRenderingStrategy(nativeNode);
150 }
151 return panda::JSValueRef::Undefined(vm);
152 }
153
ResetRenderingStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue SymbolSpanBridge::ResetRenderingStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156 EcmaVM* vm = runtimeCallInfo->GetVM();
157 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
159 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
160 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanRenderingStrategy(nativeNode);
161 return panda::JSValueRef::Undefined(vm);
162 }
163
SetEffectStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)164 ArkUINativeModuleValue SymbolSpanBridge::SetEffectStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
165 {
166 EcmaVM* vm = runtimeCallInfo->GetVM();
167 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
168 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
169 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
170 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
171 if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
172 secondArg->Int32Value(vm) <= NUM_2) {
173 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanEffectStrategy(
174 nativeNode, secondArg->Int32Value(vm));
175 } else {
176 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanEffectStrategy(nativeNode);
177 }
178 return panda::JSValueRef::Undefined(vm);
179 }
180
ResetEffectStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)181 ArkUINativeModuleValue SymbolSpanBridge::ResetEffectStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
182 {
183 EcmaVM* vm = runtimeCallInfo->GetVM();
184 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
185 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
186 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
187 GetArkUINodeModifiers()->getSymbolSpanModifier()->resetSymbolSpanEffectStrategy(nativeNode);
188 return panda::JSValueRef::Undefined(vm);
189 }
190
SetId(ArkUIRuntimeCallInfo * runtimeCallInfo)191 ArkUINativeModuleValue SymbolSpanBridge::SetId(ArkUIRuntimeCallInfo* runtimeCallInfo)
192 {
193 EcmaVM* vm = runtimeCallInfo->GetVM();
194 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
195 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
196 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
197 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
198 uint32_t content = 0;
199 if (ArkTSUtils::ParseJsSymbolId(vm, secondArg, content)) {
200 GetArkUINodeModifiers()->getSymbolSpanModifier()->setSymbolSpanId(nativeNode, content);
201 }
202 return panda::JSValueRef::Undefined(vm);
203 }
204
205 } // namespace OHOS::Ace::NG
206