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 "core/interfaces/native/node/common_shape_modifier.h"
16
17 #include "core/components/common/layout/constants.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components_ng/pattern/shape/shape_abstract_model_ng.h"
21 #include "core/components_ng/pattern/shape/shape_model_ng.h"
22 #include "core/pipeline/base/element_register.h"
23 #include "core/components/common/properties/color.h"
24
25 namespace OHOS::Ace::NG {
26 constexpr double DEFAULT_MITER_LIMIT = 4.0f;
27 constexpr double DEFAULT_FILL_OPACITY = 1.0f;
28 constexpr double DEFAULT_STROKE_OPACITY = 1.0f;
29 constexpr double DEFAULT_STROKE_WIDTH = 1.0f;
30
31 constexpr int DEFAULT_STROKE_DASH_OFFSET = 0;
32 constexpr int DEFAULT_STROKE_LINE_CAPS = 0;
33 constexpr int DEFAULT_STROKE_LINE_JOIN = 0;
34
SetStrokeMiterLimit(ArkUINodeHandle node,ArkUI_Float32 miterLimit)35 void SetStrokeMiterLimit(ArkUINodeHandle node, ArkUI_Float32 miterLimit)
36 {
37 auto* frameNode = reinterpret_cast<FrameNode*>(node);
38 CHECK_NULL_VOID(frameNode);
39 ShapeModelNG::SetStrokeMiterLimit(frameNode, miterLimit);
40 }
41
ResetStrokeMiterLimit(ArkUINodeHandle node)42 void ResetStrokeMiterLimit(ArkUINodeHandle node)
43 {
44 auto* frameNode = reinterpret_cast<FrameNode*>(node);
45 CHECK_NULL_VOID(frameNode);
46 ShapeModelNG::SetStrokeMiterLimit(frameNode, DEFAULT_MITER_LIMIT);
47 }
48
SetFillOpacity(ArkUINodeHandle node,ArkUI_Float32 fillOpacity)49 void SetFillOpacity(ArkUINodeHandle node, ArkUI_Float32 fillOpacity)
50 {
51 auto* frameNode = reinterpret_cast<FrameNode*>(node);
52 CHECK_NULL_VOID(frameNode);
53 ShapeModelNG::SetFillOpacity(frameNode, fillOpacity);
54 }
55
ResetFillOpacity(ArkUINodeHandle node)56 void ResetFillOpacity(ArkUINodeHandle node)
57 {
58 auto* frameNode = reinterpret_cast<FrameNode*>(node);
59 CHECK_NULL_VOID(frameNode);
60 ShapeModelNG::SetFillOpacity(frameNode, DEFAULT_FILL_OPACITY);
61 }
62
SetStrokeOpacity(ArkUINodeHandle node,ArkUI_Float32 strokeOpacity)63 void SetStrokeOpacity(ArkUINodeHandle node, ArkUI_Float32 strokeOpacity)
64 {
65 auto* frameNode = reinterpret_cast<FrameNode*>(node);
66 CHECK_NULL_VOID(frameNode);
67 ShapeModelNG::SetStrokeOpacity(frameNode, strokeOpacity);
68 }
69
ResetStrokeOpacity(ArkUINodeHandle node)70 void ResetStrokeOpacity(ArkUINodeHandle node)
71 {
72 auto* frameNode = reinterpret_cast<FrameNode*>(node);
73 CHECK_NULL_VOID(frameNode);
74 ShapeModelNG::SetStrokeOpacity(frameNode, DEFAULT_STROKE_OPACITY);
75 }
76
SetStrokeWidth(ArkUINodeHandle node,ArkUI_Float32 value,int unit)77 void SetStrokeWidth(ArkUINodeHandle node, ArkUI_Float32 value, int unit)
78 {
79 auto* frameNode = reinterpret_cast<FrameNode*>(node);
80 CHECK_NULL_VOID(frameNode);
81 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
82 ShapeModelNG::SetStrokeWidth(frameNode, Dimension(value, unitEnum));
83 }
84
ResetStrokeWidth(ArkUINodeHandle node)85 void ResetStrokeWidth(ArkUINodeHandle node)
86 {
87 auto* frameNode = reinterpret_cast<FrameNode*>(node);
88 CHECK_NULL_VOID(frameNode);
89 ShapeModelNG::SetStrokeWidth(frameNode, Dimension(DEFAULT_STROKE_WIDTH, DimensionUnit::VP));
90 }
91
SetAntiAlias(ArkUINodeHandle node,ArkUI_Bool antiAlias)92 void SetAntiAlias(ArkUINodeHandle node, ArkUI_Bool antiAlias)
93 {
94 auto* frameNode = reinterpret_cast<FrameNode*>(node);
95 CHECK_NULL_VOID(frameNode);
96 ShapeModelNG::SetAntiAlias(frameNode, antiAlias);
97 }
98
ResetAntiAlias(ArkUINodeHandle node)99 void ResetAntiAlias(ArkUINodeHandle node)
100 {
101 auto* frameNode = reinterpret_cast<FrameNode*>(node);
102 CHECK_NULL_VOID(frameNode);
103 ShapeModelNG::SetAntiAlias(frameNode, true);
104 }
105
SetStroke(ArkUINodeHandle node,uint32_t stroke)106 void SetStroke(ArkUINodeHandle node, uint32_t stroke)
107 {
108 auto* frameNode = reinterpret_cast<FrameNode*>(node);
109 CHECK_NULL_VOID(frameNode);
110 ShapeModelNG::SetStroke(frameNode, Color(stroke));
111 }
112
ResetStroke(ArkUINodeHandle node)113 void ResetStroke(ArkUINodeHandle node)
114 {
115 auto* frameNode = reinterpret_cast<FrameNode*>(node);
116 CHECK_NULL_VOID(frameNode);
117 ShapeModelNG::SetStroke(frameNode, Color::TRANSPARENT);
118 }
119
SetFill(ArkUINodeHandle node,uint32_t fill)120 void SetFill(ArkUINodeHandle node, uint32_t fill)
121 {
122 auto* frameNode = reinterpret_cast<FrameNode*>(node);
123 CHECK_NULL_VOID(frameNode);
124 ShapeModelNG::SetFill(frameNode, Color(fill));
125 }
126
ResetFill(ArkUINodeHandle node)127 void ResetFill(ArkUINodeHandle node)
128 {
129 auto* frameNode = reinterpret_cast<FrameNode*>(node);
130 CHECK_NULL_VOID(frameNode);
131 ShapeModelNG::SetFill(frameNode, Color::BLACK);
132 }
133
SetStrokeDashOffset(ArkUINodeHandle node,ArkUI_Float32 value,int unit)134 void SetStrokeDashOffset(ArkUINodeHandle node, ArkUI_Float32 value, int unit)
135 {
136 auto* frameNode = reinterpret_cast<FrameNode*>(node);
137 CHECK_NULL_VOID(frameNode);
138 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
139 ShapeModelNG::SetStrokeDashOffset(frameNode, Dimension(value, unitEnum));
140 }
141
ResetStrokeDashOffset(ArkUINodeHandle node)142 void ResetStrokeDashOffset(ArkUINodeHandle node)
143 {
144 auto* frameNode = reinterpret_cast<FrameNode*>(node);
145 CHECK_NULL_VOID(frameNode);
146 ShapeModelNG::SetStrokeDashOffset(frameNode, Dimension(DEFAULT_STROKE_DASH_OFFSET));
147 }
148
SetStrokeLineCap(ArkUINodeHandle node,int strokeLineCap)149 void SetStrokeLineCap(ArkUINodeHandle node, int strokeLineCap)
150 {
151 auto* frameNode = reinterpret_cast<FrameNode*>(node);
152 CHECK_NULL_VOID(frameNode);
153 ShapeModelNG::SetStrokeLineCap(frameNode, strokeLineCap);
154 }
155
ResetStrokeLineCap(ArkUINodeHandle node)156 void ResetStrokeLineCap(ArkUINodeHandle node)
157 {
158 auto* frameNode = reinterpret_cast<FrameNode*>(node);
159 CHECK_NULL_VOID(frameNode);
160 ShapeModelNG::SetStrokeLineCap(frameNode, DEFAULT_STROKE_LINE_CAPS);
161 }
162
SetStrokeLineJoin(ArkUINodeHandle node,int lineJoinStyle)163 void SetStrokeLineJoin(ArkUINodeHandle node, int lineJoinStyle)
164 {
165 auto* frameNode = reinterpret_cast<FrameNode*>(node);
166 CHECK_NULL_VOID(frameNode);
167 ShapeModelNG::SetStrokeLineJoin(frameNode, lineJoinStyle);
168 }
169
ResetStrokeLineJoin(ArkUINodeHandle node)170 void ResetStrokeLineJoin(ArkUINodeHandle node)
171 {
172 auto* frameNode = reinterpret_cast<FrameNode*>(node);
173 CHECK_NULL_VOID(frameNode);
174 ShapeModelNG::SetStrokeLineJoin(frameNode, DEFAULT_STROKE_LINE_JOIN);
175 }
176
SetStrokeDashArray(ArkUINodeHandle node,const ArkUI_Float32 * dashArrayArray,int32_t * dimUnits,int32_t size)177 void SetStrokeDashArray(ArkUINodeHandle node, const ArkUI_Float32* dashArrayArray, int32_t* dimUnits, int32_t size)
178 {
179 auto* frameNode = reinterpret_cast<FrameNode*>(node);
180 CHECK_NULL_VOID(frameNode);
181 std::vector<Dimension> dashArray;
182 for (int32_t i = 0; i < size; i++) {
183 dashArray.emplace_back(CalcDimension(dashArrayArray[i], (DimensionUnit)dimUnits[i]));
184 }
185 ShapeModelNG::SetStrokeDashArray(frameNode, dashArray);
186 }
187
ResetStrokeDashArray(ArkUINodeHandle node)188 void ResetStrokeDashArray(ArkUINodeHandle node)
189 {
190 auto* frameNode = reinterpret_cast<FrameNode*>(node);
191 CHECK_NULL_VOID(frameNode);
192 std::vector<Dimension> dashArray;
193 ShapeModelNG::SetStrokeDashArray(frameNode, dashArray);
194 }
195
SetShapeWidth(ArkUINodeHandle node,ArkUI_Float32 value,int32_t unit)196 void SetShapeWidth(ArkUINodeHandle node, ArkUI_Float32 value, int32_t unit)
197 {
198 auto* frameNode = reinterpret_cast<FrameNode*>(node);
199 CHECK_NULL_VOID(frameNode);
200 DimensionUnit unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
201 Dimension width = Dimension(value, unitEnum);
202 ShapeAbstractModelNG::SetWidth(frameNode, width);
203 }
204
ResetShapeWidth(ArkUINodeHandle node)205 void ResetShapeWidth(ArkUINodeHandle node)
206 {
207 auto* frameNode = reinterpret_cast<FrameNode*>(node);
208 CHECK_NULL_VOID(frameNode);
209 ShapeAbstractModelNG::ResetWidth(frameNode);
210 }
211
SetShapeHeight(ArkUINodeHandle node,ArkUI_Float32 value,int32_t unit)212 void SetShapeHeight(ArkUINodeHandle node, ArkUI_Float32 value, int32_t unit)
213 {
214 auto* frameNode = reinterpret_cast<FrameNode*>(node);
215 CHECK_NULL_VOID(frameNode);
216 DimensionUnit unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
217 Dimension height = Dimension(value, unitEnum);
218 ShapeAbstractModelNG::SetHeight(frameNode, height);
219 }
220
ResetShapeHeight(ArkUINodeHandle node)221 void ResetShapeHeight(ArkUINodeHandle node)
222 {
223 auto* frameNode = reinterpret_cast<FrameNode*>(node);
224 CHECK_NULL_VOID(frameNode);
225 ShapeAbstractModelNG::ResetHeight(frameNode);
226 }
227
SetShapeForegroundColor(ArkUINodeHandle node,ArkUI_Bool isColor,uint32_t color)228 void SetShapeForegroundColor(ArkUINodeHandle node, ArkUI_Bool isColor, uint32_t color)
229 {
230 auto* frameNode = reinterpret_cast<FrameNode*>(node);
231 CHECK_NULL_VOID(frameNode);
232 if (isColor) {
233 ShapeModelNG::SetFill(frameNode, Color(color));
234 ViewAbstract::SetForegroundColor(frameNode, Color(color));
235 } else {
236 ShapeModelNG::SetFill(frameNode, Color::FOREGROUND);
237 auto strategy = static_cast<ForegroundColorStrategy>(color);
238 ViewAbstract::SetForegroundColorStrategy(frameNode, strategy);
239 }
240 }
241
ResetShapeForegroundColor(ArkUINodeHandle node)242 void ResetShapeForegroundColor(ArkUINodeHandle node)
243 {
244 auto* frameNode = reinterpret_cast<FrameNode*>(node);
245 CHECK_NULL_VOID(frameNode);
246 }
247
248 namespace NodeModifier {
GetCommonShapeModifier()249 const ArkUICommonShapeModifier* GetCommonShapeModifier()
250 {
251 static const ArkUICommonShapeModifier modifier = { SetStrokeDashArray, ResetStrokeDashArray, SetStrokeMiterLimit,
252 ResetStrokeMiterLimit, SetFillOpacity, ResetFillOpacity, SetStrokeOpacity, ResetStrokeOpacity, SetStrokeWidth,
253 ResetStrokeWidth, SetAntiAlias, ResetAntiAlias, SetStroke, ResetStroke, SetFill, ResetFill, SetStrokeDashOffset,
254 ResetStrokeDashOffset, SetStrokeLineCap, ResetStrokeLineCap, SetStrokeLineJoin, ResetStrokeLineJoin,
255 SetShapeWidth, ResetShapeWidth, SetShapeHeight, ResetShapeHeight, SetShapeForegroundColor,
256 ResetShapeForegroundColor };
257 return &modifier;
258 }
259
GetCJUICommonShapeModifier()260 const CJUICommonShapeModifier* GetCJUICommonShapeModifier()
261 {
262 static const CJUICommonShapeModifier modifier = { SetStrokeDashArray, ResetStrokeDashArray, SetStrokeMiterLimit,
263 ResetStrokeMiterLimit, SetFillOpacity, ResetFillOpacity, SetStrokeOpacity, ResetStrokeOpacity, SetStrokeWidth,
264 ResetStrokeWidth, SetAntiAlias, ResetAntiAlias, SetStroke, ResetStroke, SetFill, ResetFill, SetStrokeDashOffset,
265 ResetStrokeDashOffset, SetStrokeLineCap, ResetStrokeLineCap, SetStrokeLineJoin, ResetStrokeLineJoin,
266 SetShapeWidth, ResetShapeWidth, SetShapeHeight, ResetShapeHeight, SetShapeForegroundColor,
267 ResetShapeForegroundColor };
268 return &modifier;
269 }
270 }
271 } // namespace OHOS::Ace::NG