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 "core/interfaces/native/node/node_symbol_glyph_modifier.h"
16 
17 #include "bridge/common/utils/utils.h"
18 #include "core/components/common/layout/constants.h"
19 #include "core/components/common/properties/text_style.h"
20 #include "core/components/common/properties/text_style_parser.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/pipeline/base/element_register.h"
24 #include "frameworks/core/components/common/layout/constants.h"
25 #include "frameworks/core/components/common/properties/text_style.h"
26 #include "frameworks/core/components_ng/pattern/symbol/symbol_model_ng.h"
27 
28 namespace OHOS::Ace::NG {
29 namespace {
ConvertStrToFontWeight(ArkUI_CharPtr weight,FontWeight defaultFontWeight=FontWeight::NORMAL)30 FontWeight ConvertStrToFontWeight(ArkUI_CharPtr weight, FontWeight defaultFontWeight = FontWeight::NORMAL)
31 {
32     std::string weightStr(weight);
33     return StringUtils::StringToFontWeight(weightStr, defaultFontWeight);
34 }
35 
ConvertIntToFontWeight(ArkUI_Int32 weight)36 FontWeight ConvertIntToFontWeight(ArkUI_Int32 weight)
37 {
38     static const std::unordered_map<ArkUI_Int32, FontWeight> fontWeightMap = {
39         {100, FontWeight::W100},
40         {200, FontWeight::W200},
41         {300, FontWeight::W300},
42         {400, FontWeight::W400},
43         {500, FontWeight::W500},
44         {600, FontWeight::W600},
45         {700, FontWeight::W700},
46         {800, FontWeight::W800},
47         {900, FontWeight::W900},
48     };
49     auto weightFindIter = fontWeightMap.find(weight);
50     if (weightFindIter != fontWeightMap.end()) {
51         return weightFindIter->second;
52     }
53     return FontWeight::NORMAL;
54 }
55 
SetFontColor(ArkUINodeHandle node,ArkUI_Uint32 * color,int32_t size)56 void SetFontColor(ArkUINodeHandle node, ArkUI_Uint32* color, int32_t size)
57 {
58     auto* frameNode = reinterpret_cast<FrameNode*>(node);
59     CHECK_NULL_VOID(frameNode);
60     std::vector<Color> colorArray;
61     for (int32_t i = 0; i < size; i++) {
62         colorArray.emplace_back(Color(color[i]));
63     }
64     SymbolModelNG::SetFontColor(frameNode, colorArray);
65 }
66 
ResetFontColor(ArkUINodeHandle node)67 void ResetFontColor(ArkUINodeHandle node)
68 {
69     auto* frameNode = reinterpret_cast<FrameNode*>(node);
70     CHECK_NULL_VOID(frameNode);
71     auto theme = GetTheme<TextTheme>();
72     CHECK_NULL_VOID(theme);
73     Color fontColor = theme->GetTextStyle().GetTextColor();
74     std::vector<Color> colorArray = { fontColor };
75     SymbolModelNG::SetFontColor(frameNode, colorArray);
76 }
77 
SetFontSize(ArkUINodeHandle node,ArkUI_Float32 fontSize,ArkUI_Int32 unit)78 void SetFontSize(ArkUINodeHandle node, ArkUI_Float32 fontSize, ArkUI_Int32 unit)
79 {
80     auto* frameNode = reinterpret_cast<FrameNode*>(node);
81     CHECK_NULL_VOID(frameNode);
82     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
83 
84     if (fontSize < 0 || unitEnum < OHOS::Ace::DimensionUnit::PX || unitEnum > OHOS::Ace::DimensionUnit::CALC ||
85         unitEnum == OHOS::Ace::DimensionUnit::PERCENT) {
86         auto theme = GetTheme<TextTheme>();
87         CHECK_NULL_VOID(theme);
88         CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
89         SymbolModelNG::SetFontSize(frameNode, fontSize);
90     } else {
91         SymbolModelNG::SetFontSize(frameNode, Dimension(fontSize, static_cast<OHOS::Ace::DimensionUnit>(unit)));
92     }
93 }
94 
ResetFontSize(ArkUINodeHandle node)95 void ResetFontSize(ArkUINodeHandle node)
96 {
97     auto* frameNode = reinterpret_cast<FrameNode*>(node);
98     CHECK_NULL_VOID(frameNode);
99     auto theme = GetTheme<TextTheme>();
100     CHECK_NULL_VOID(theme);
101     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
102     SymbolModelNG::SetFontSize(frameNode, fontSize);
103 }
104 
SetFontWeightStr(ArkUINodeHandle node,ArkUI_CharPtr weight)105 void SetFontWeightStr(ArkUINodeHandle node, ArkUI_CharPtr weight)
106 {
107     auto* frameNode = reinterpret_cast<FrameNode*>(node);
108     CHECK_NULL_VOID(frameNode);
109     SymbolModelNG::SetFontWeight(frameNode, ConvertStrToFontWeight(weight));
110 }
111 
SetFontWeight(ArkUINodeHandle node,ArkUI_Int32 weight)112 void SetFontWeight(ArkUINodeHandle node, ArkUI_Int32 weight)
113 {
114     auto* frameNode = reinterpret_cast<FrameNode*>(node);
115     CHECK_NULL_VOID(frameNode);
116     SymbolModelNG::SetFontWeight(frameNode, ConvertIntToFontWeight(weight));
117 }
118 
ResetFontWeight(ArkUINodeHandle node)119 void ResetFontWeight(ArkUINodeHandle node)
120 {
121     auto* frameNode = reinterpret_cast<FrameNode*>(node);
122     CHECK_NULL_VOID(frameNode);
123     SymbolModelNG::SetFontWeight(frameNode, Ace::FontWeight::NORMAL);
124 }
125 
SetRenderingStrategy(ArkUINodeHandle node,ArkUI_Uint32 renderingStrategy)126 void SetRenderingStrategy(ArkUINodeHandle node, ArkUI_Uint32 renderingStrategy)
127 {
128     auto* frameNode = reinterpret_cast<FrameNode*>(node);
129     CHECK_NULL_VOID(frameNode);
130     SymbolModelNG::SetRenderingStrategy(frameNode, renderingStrategy);
131 }
132 
ResetRenderingStrategy(ArkUINodeHandle node)133 void ResetRenderingStrategy(ArkUINodeHandle node)
134 {
135     auto* frameNode = reinterpret_cast<FrameNode*>(node);
136     CHECK_NULL_VOID(frameNode);
137     SymbolModelNG::SetRenderingStrategy(frameNode, 0);
138 }
139 
SetEffectStrategy(ArkUINodeHandle node,ArkUI_Uint32 effectStrategy)140 void SetEffectStrategy(ArkUINodeHandle node, ArkUI_Uint32 effectStrategy)
141 {
142     auto* frameNode = reinterpret_cast<FrameNode*>(node);
143     CHECK_NULL_VOID(frameNode);
144     SymbolModelNG::SetSymbolEffect(frameNode, effectStrategy);
145 }
146 
ResetEffectStrategy(ArkUINodeHandle node)147 void ResetEffectStrategy(ArkUINodeHandle node)
148 {
149     auto* frameNode = reinterpret_cast<FrameNode*>(node);
150     CHECK_NULL_VOID(frameNode);
151     SymbolModelNG::SetSymbolEffect(frameNode, 0);
152 }
153 
SetSymbolGlyphInitialize(ArkUINodeHandle node,ArkUI_Uint32 symbolId)154 void SetSymbolGlyphInitialize(ArkUINodeHandle node, ArkUI_Uint32 symbolId)
155 {
156     auto* frameNode = reinterpret_cast<FrameNode*>(node);
157     CHECK_NULL_VOID(frameNode);
158     SymbolModelNG::SetSymbolGlyphInitialize(frameNode, symbolId);
159 }
160 
ResetSymbolGlyphInitialize(ArkUINodeHandle node)161 void ResetSymbolGlyphInitialize(ArkUINodeHandle node)
162 {
163     auto* frameNode = reinterpret_cast<FrameNode*>(node);
164     CHECK_NULL_VOID(frameNode);
165     SymbolModelNG::SetSymbolGlyphInitialize(frameNode, 0);
166 }
167 }
168 
169 namespace NodeModifier {
GetSymbolGlyphModifier()170 const ArkUISymbolGlyphModifier* GetSymbolGlyphModifier()
171 {
172     static const ArkUISymbolGlyphModifier modifier = {
173         SetFontColor,
174         ResetFontColor,
175         SetFontSize,
176         ResetFontSize,
177         SetFontWeightStr,
178         SetFontWeight,
179         ResetFontWeight,
180         SetRenderingStrategy,
181         ResetRenderingStrategy,
182         SetEffectStrategy,
183         ResetEffectStrategy,
184         SetSymbolGlyphInitialize,
185         ResetSymbolGlyphInitialize,
186     };
187 
188     return &modifier;
189 }
190 
GetCJUISymbolGlyphModifier()191 const CJUISymbolGlyphModifier* GetCJUISymbolGlyphModifier()
192 {
193     static const CJUISymbolGlyphModifier modifier = {
194         SetFontColor,
195         ResetFontColor,
196         SetFontSize,
197         ResetFontSize,
198         SetFontWeightStr,
199         SetFontWeight,
200         ResetFontWeight,
201         SetRenderingStrategy,
202         ResetRenderingStrategy,
203         SetEffectStrategy,
204         ResetEffectStrategy,
205         SetSymbolGlyphInitialize,
206         ResetSymbolGlyphInitialize,
207     };
208 
209     return &modifier;
210 }
211 } // namespace NodeModifier
212 } // namespace OHOS::Ace::NG