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