• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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