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