• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-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/canvas_rendering_context_2d_modifier.h"
16 
17 #include "core/components_ng/pattern/canvas/canvas_model_ng.h"
18 
19 namespace OHOS::Ace::NG {
20 
SetCanvasBeginPath(ArkUINodeHandle node)21 void SetCanvasBeginPath(ArkUINodeHandle node)
22 {
23     auto* frameNode = reinterpret_cast<FrameNode*>(node);
24     CHECK_NULL_VOID(frameNode);
25     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
26     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
27     CHECK_NULL_VOID(canvasPattern);
28     canvasPattern->BeginPath();
29 }
30 
SetCanvasClosePath(ArkUINodeHandle node)31 void SetCanvasClosePath(ArkUINodeHandle node)
32 {
33     auto* frameNode = reinterpret_cast<FrameNode*>(node);
34     CHECK_NULL_VOID(frameNode);
35     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
36     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
37     CHECK_NULL_VOID(canvasPattern);
38     canvasPattern->ClosePath();
39 }
40 
SetCanvasFill(ArkUINodeHandle node,const char * value)41 void SetCanvasFill(ArkUINodeHandle node, const char* value)
42 {
43     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasFill: value: %{public}s", value);
44     auto* frameNode = reinterpret_cast<FrameNode*>(node);
45     CHECK_NULL_VOID(frameNode);
46     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
47     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
48     CHECK_NULL_VOID(canvasPattern);
49     std::string ruleStr(value);
50     CanvasFillRule fillRule = CanvasFillRule::NONZERO;
51     if (ruleStr == "nonezero") {
52         fillRule = CanvasFillRule::NONZERO;
53     } else if (ruleStr == "evenodd") {
54         fillRule = CanvasFillRule::EVENODD;
55     }
56     canvasPattern->UpdateFillRuleForPath(fillRule);
57     canvasPattern->Fill();
58 }
59 
SetCanvasMoveTo(ArkUINodeHandle node,float x,float y)60 void SetCanvasMoveTo(ArkUINodeHandle node, float x, float y)
61 {
62     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasMoveTo: x: %{public}f, y: %{public}f", x, y);
63     auto* frameNode = reinterpret_cast<FrameNode*>(node);
64     CHECK_NULL_VOID(frameNode);
65     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
66     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
67     CHECK_NULL_VOID(canvasPattern);
68     canvasPattern->MoveTo(x, y);
69 }
70 
SetCanvasArc(ArkUINodeHandle node,ArkUICanvasArcOptions * options)71 void SetCanvasArc(ArkUINodeHandle node, ArkUICanvasArcOptions* options)
72 {
73     CHECK_NULL_VOID(options);
74     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasArc: x: %{public}f, y: %{public}f, \
75         radius: %{public}f, startAngle: %{public}f, endAngle: %{public}f",
76         options->x, options->y, options->radius, options->startAngle, options->endAngle);
77     auto* frameNode = reinterpret_cast<FrameNode*>(node);
78     CHECK_NULL_VOID(frameNode);
79     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
80     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
81     CHECK_NULL_VOID(canvasPattern);
82     ArcParam param;
83     param.x = Dimension(options->x, DimensionUnit::VP).ConvertToPx();
84     param.y = Dimension(options->y, DimensionUnit::VP).ConvertToPx();
85     param.radius = Dimension(options->radius, DimensionUnit::VP).ConvertToPx();
86     param.startAngle = options->startAngle;
87     param.endAngle = options->endAngle;
88     param.anticlockwise = static_cast<bool>(options->counterclockwise);
89     canvasPattern->Arc(param);
90 }
91 
SetCanvasLineTo(ArkUINodeHandle node,float x,float y)92 void SetCanvasLineTo(ArkUINodeHandle node, float x, float y)
93 {
94     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasLineTo: x: %{public}f, y: %{public}f", x, y);
95     auto* frameNode = reinterpret_cast<FrameNode*>(node);
96     CHECK_NULL_VOID(frameNode);
97     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
98     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
99     CHECK_NULL_VOID(canvasPattern);
100     canvasPattern->LineTo(Dimension(x, DimensionUnit::VP).ConvertToPx(), Dimension(y, DimensionUnit::VP).ConvertToPx());
101 }
102 
SetCanvasStrokeStyle(ArkUINodeHandle node,int color)103 void SetCanvasStrokeStyle(ArkUINodeHandle node, int color)
104 {
105     TAG_LOGD(
106         AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasStrokStyle: color: %{public}d", color);
107     auto* frameNode = reinterpret_cast<FrameNode*>(node);
108     CHECK_NULL_VOID(frameNode);
109     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
110     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
111     CHECK_NULL_VOID(canvasPattern);
112     canvasPattern->UpdateStrokeColor(Color(color));
113 }
114 
GetCanvasStrokeStyle(ArkUINodeHandle node)115 ArkUI_Int32 GetCanvasStrokeStyle(ArkUINodeHandle node)
116 {
117     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala GetCanvasStrokeStyle STUB");
118     return 0xff000000;
119 }
120 
SetCanvasLineWidth(ArkUINodeHandle node,float width)121 void SetCanvasLineWidth(ArkUINodeHandle node, float width)
122 {
123     TAG_LOGD(
124         AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasStrokStyle: width: %{public}f", width);
125     auto* frameNode = reinterpret_cast<FrameNode*>(node);
126     CHECK_NULL_VOID(frameNode);
127     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
128     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
129     CHECK_NULL_VOID(canvasPattern);
130     canvasPattern->UpdateLineWidth(Dimension(width, DimensionUnit::VP).ConvertToPx());
131 }
132 
GetCanvasLineWidth(ArkUINodeHandle node)133 ArkUI_Float32 GetCanvasLineWidth(ArkUINodeHandle node)
134 {
135     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala GetCanvasLineWidth STUB");
136     return 0xff000000;
137 }
138 
SetCanvasStroke(ArkUINodeHandle node)139 void SetCanvasStroke(ArkUINodeHandle node)
140 {
141     auto* frameNode = reinterpret_cast<FrameNode*>(node);
142     CHECK_NULL_VOID(frameNode);
143     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
144     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
145     CHECK_NULL_VOID(canvasPattern);
146     canvasPattern->Stroke();
147 }
148 
SetCanvasAntiAlias(ArkUINodeHandle node,ArkUI_Bool antialias)149 void SetCanvasAntiAlias(ArkUINodeHandle node, ArkUI_Bool antialias)
150 {
151     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasAntiAlias: antialias:%{public}d", antialias);
152     auto* frameNode = reinterpret_cast<FrameNode*>(node);
153     CHECK_NULL_VOID(frameNode);
154     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
155     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
156     CHECK_NULL_VOID(canvasPattern);
157     canvasPattern->SetAntiAlias(static_cast<bool>(antialias));
158 }
159 
SetCanvasFillColor(ArkUINodeHandle node,int color)160 void SetCanvasFillColor(ArkUINodeHandle node, int color)
161 {
162     TAG_LOGD(
163         AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasFillColor: color: %{public}d", color);
164     auto* frameNode = reinterpret_cast<FrameNode*>(node);
165     CHECK_NULL_VOID(frameNode);
166     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
167     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
168     CHECK_NULL_VOID(canvasPattern);
169     canvasPattern->UpdateFillColor(Color(color));
170 }
171 
GetCanvasFillColor(ArkUINodeHandle node)172 ArkUI_Int32 GetCanvasFillColor(ArkUINodeHandle node)
173 {
174     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala GetCanvasFillColor STUB");
175     return 0xff000000;
176 }
177 
SetCanvasGlobalAlpha(ArkUINodeHandle node,float alpha)178 void SetCanvasGlobalAlpha(ArkUINodeHandle node, float alpha)
179 {
180     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasGlobalAlpha");
181     auto* frameNode = reinterpret_cast<FrameNode*>(node);
182     CHECK_NULL_VOID(frameNode);
183     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
184     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
185     CHECK_NULL_VOID(canvasPattern);
186     canvasPattern->UpdateGlobalAlpha(alpha);
187 }
188 
GetCanvasGlobalAlpha(ArkUINodeHandle node)189 ArkUI_Float32 GetCanvasGlobalAlpha(ArkUINodeHandle node)
190 {
191     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala GetCanvasGlobalAlpha STUB");
192     return 0;
193 }
194 
SetCanvasFillRect(ArkUINodeHandle node,float x,float y,float w,float h)195 void SetCanvasFillRect(ArkUINodeHandle node, float x, float y, float w, float h)
196 {
197     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasFillRect: x: %{public}f, \
198         y: %{public}f, w: %{public}f, h: %{public}f",
199         x, y, w, h);
200     auto* frameNode = reinterpret_cast<FrameNode*>(node);
201     CHECK_NULL_VOID(frameNode);
202     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
203     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
204     CHECK_NULL_VOID(canvasPattern);
205     canvasPattern->FillRect(
206         { Dimension(x, DimensionUnit::VP).ConvertToPx(), Dimension(y, DimensionUnit::VP).ConvertToPx(),
207             Dimension(w, DimensionUnit::VP).ConvertToPx(), Dimension(h, DimensionUnit::VP).ConvertToPx() });
208 }
209 
SetCanvasFillText(ArkUINodeHandle node,const char * value,float x,float y,float maxWidth)210 void SetCanvasFillText(ArkUINodeHandle node, const char* value, float x, float y, float maxWidth)
211 {
212     TAG_LOGD(AceLogTag::ACE_CANVAS_COMPONENT, "Arkoala SetCanvasFillText: value:%{public}s, \
213         x: %{public}f, y: %{public}f, maxWith: %{public}f",
214         value, x, y, maxWidth);
215     auto* frameNode = reinterpret_cast<FrameNode*>(node);
216     CHECK_NULL_VOID(frameNode);
217     RefPtr<AceType> pattern = CanvasModelNG::GetCanvasPattern(frameNode);
218     auto canvasPattern = AceType::DynamicCast<NG::CanvasPattern>(pattern);
219     CHECK_NULL_VOID(canvasPattern);
220     std::string text(value);
221     canvasPattern->FillText(text, Dimension(x, DimensionUnit::VP).ConvertToPx(),
222         Dimension(y, DimensionUnit::VP).ConvertToPx(), Dimension(maxWidth, DimensionUnit::VP).ConvertToPx());
223 }
224 
225 namespace NodeModifier {
GetCanvasRenderingContext2DModifier()226 const ArkUICanvasRenderingContext2DModifier* GetCanvasRenderingContext2DModifier()
227 {
228     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
229     static const ArkUICanvasRenderingContext2DModifier modifier = {
230         .getCanvasRenderingContext2D = nullptr,
231         .setCanvasBeginPath = SetCanvasBeginPath,
232         .setCanvasClosePath = SetCanvasClosePath,
233         .setCanvasFill = SetCanvasFill,
234         .setCanvasMoveTo = SetCanvasMoveTo,
235         .setCanvasArc = SetCanvasArc,
236         .setCanvasLineTo = SetCanvasLineTo,
237         .setCanvasStrokeStyle = SetCanvasStrokeStyle,
238         .getCanvasStrokeStyle = GetCanvasStrokeStyle,
239         .setCanvasLineWidth = SetCanvasLineWidth,
240         .getCanvasLineWidth = GetCanvasLineWidth,
241         .setCanvasStroke = SetCanvasStroke,
242         .setCanvasAntiAlias = SetCanvasAntiAlias,
243         .setCanvasFillColor = SetCanvasFillColor,
244         .getCanvasFillColor = GetCanvasFillColor,
245         .setCanvasGlobalAlpha = SetCanvasGlobalAlpha,
246         .getCanvasGlobalAlpha = GetCanvasGlobalAlpha,
247         .setCanvasFillRect = SetCanvasFillRect,
248         .setCanvasFillText = SetCanvasFillText,
249     };
250     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
251     return &modifier;
252 }
253 
GetCJUICanvasRenderingContext2DModifier()254 const CJUICanvasRenderingContext2DModifier* GetCJUICanvasRenderingContext2DModifier()
255 {
256     CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
257     static const CJUICanvasRenderingContext2DModifier modifier = {
258         .getCanvasRenderingContext2D = nullptr,
259         .setCanvasBeginPath = SetCanvasBeginPath,
260         .setCanvasClosePath = SetCanvasClosePath,
261         .setCanvasFill = SetCanvasFill,
262         .setCanvasMoveTo = SetCanvasMoveTo,
263         .setCanvasArc = SetCanvasArc,
264         .setCanvasLineTo = SetCanvasLineTo,
265         .setCanvasStrokeStyle = SetCanvasStrokeStyle,
266         .getCanvasStrokeStyle = GetCanvasStrokeStyle,
267         .setCanvasLineWidth = SetCanvasLineWidth,
268         .getCanvasLineWidth = GetCanvasLineWidth,
269         .setCanvasStroke = SetCanvasStroke,
270         .setCanvasAntiAlias = SetCanvasAntiAlias,
271         .setCanvasFillColor = SetCanvasFillColor,
272         .getCanvasFillColor = GetCanvasFillColor,
273         .setCanvasGlobalAlpha = SetCanvasGlobalAlpha,
274         .getCanvasGlobalAlpha = GetCanvasGlobalAlpha,
275         .setCanvasFillRect = SetCanvasFillRect,
276         .setCanvasFillText = SetCanvasFillText,
277     };
278     CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
279     return &modifier;
280 }
281 } // namespace NodeModifier
282 } // namespace OHOS::Ace::NG
283