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
16 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_canvas_ffi.h"
17
18 #include <cinttypes>
19
20 #include "cj_lambda.h"
21 #include "ffi_remote_data.h"
22 #include "pixel_map_impl.h"
23
24 #include "bridge/cj_frontend/cppview/canvas_path.h"
25 #include "bridge/cj_frontend/cppview/canvas_renderer.h"
26 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
27 #include "core/common/container.h"
28 #include "core/components_ng/pattern/canvas/canvas_model.h"
29
30 using namespace OHOS;
31 using namespace OHOS::Ace;
32 using namespace OHOS::FFI;
33 using namespace OHOS::Ace::Framework;
34
35 namespace {
36 enum class CanvasImageType { COORDINATES_ONLY = 0, COORDINATES_AND_SIZE, COORDINATES_AND_SIZE_WITH_SOURCE };
37 const std::vector<LineCapStyle> LINE_CAP_STYLE_LIST = { LineCapStyle::BUTT, LineCapStyle::ROUND, LineCapStyle::SQUARE };
38 const std::vector<LineJoinStyle> LINE_JOIN_STYLE_LIST = { LineJoinStyle::MITER, LineJoinStyle::ROUND,
39 LineJoinStyle::BEVEL };
40 const std::vector<FontStyle> FONT_STYLE_LIST = { FontStyle::NORMAL, FontStyle::ITALIC };
41 const std::vector<TextAlign> TEXT_ALIGN_LIST = { TextAlign::LEFT, TextAlign::RIGHT, TextAlign::CENTER,
42 TextAlign::JUSTIFY, TextAlign::START, TextAlign::END };
43 const std::vector<TextBaseline> TEXT_BASELINE_LIST = { TextBaseline::ALPHABETIC, TextBaseline::IDEOGRAPHIC,
44 TextBaseline::TOP, TextBaseline::BOTTOM, TextBaseline::MIDDLE, TextBaseline::HANGING };
45 const std::vector<CompositeOperation> COMPOSITE_OPERATION_LIST = { CompositeOperation::SOURCE_OVER,
46 CompositeOperation::SOURCE_ATOP, CompositeOperation::SOURCE_IN, CompositeOperation::SOURCE_OUT,
47 CompositeOperation::DESTINATION_OVER, CompositeOperation::DESTINATION_ATOP, CompositeOperation::DESTINATION_IN,
48 CompositeOperation::DESTINATION_OUT, CompositeOperation::LIGHTER, CompositeOperation::COPY,
49 CompositeOperation::XOR };
50 const std::vector<CanvasImageType> CANVAS_IMAGE_TYPE_LIST = { CanvasImageType::COORDINATES_ONLY,
51 CanvasImageType::COORDINATES_AND_SIZE, CanvasImageType::COORDINATES_AND_SIZE_WITH_SOURCE };
52
GetRectParam(double x,double y,double width,double height)53 Rect GetRectParam(double x, double y, double width, double height)
54 {
55 x = PipelineBase::Vp2PxWithCurrentDensity(x);
56 y = PipelineBase::Vp2PxWithCurrentDensity(y);
57 width = PipelineBase::Vp2PxWithCurrentDensity(width);
58 height = PipelineBase::Vp2PxWithCurrentDensity(height);
59 Rect rect = Rect(x, y, width, height);
60 return rect;
61 }
62
GetBezierCurveParam(double cp1x,double cp1y,double cp2x,double cp2y,double x,double y)63 BezierCurveParam GetBezierCurveParam(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y)
64 {
65 BezierCurveParam param;
66 param.cp1x = PipelineBase::Vp2PxWithCurrentDensity(cp1x);
67 param.cp1y = PipelineBase::Vp2PxWithCurrentDensity(cp1y);
68 param.cp2x = PipelineBase::Vp2PxWithCurrentDensity(cp2x);
69 param.cp2y = PipelineBase::Vp2PxWithCurrentDensity(cp2y);
70 param.x = PipelineBase::Vp2PxWithCurrentDensity(x);
71 param.y = PipelineBase::Vp2PxWithCurrentDensity(y);
72 return param;
73 }
74
GetQuadraticCurveParam(double cpx,double cpy,double x,double y)75 QuadraticCurveParam GetQuadraticCurveParam(double cpx, double cpy, double x, double y)
76 {
77 QuadraticCurveParam param;
78 param.cpx = PipelineBase::Vp2PxWithCurrentDensity(cpx);
79 param.cpy = PipelineBase::Vp2PxWithCurrentDensity(cpy);
80 param.x = PipelineBase::Vp2PxWithCurrentDensity(x);
81 param.y = PipelineBase::Vp2PxWithCurrentDensity(y);
82 return param;
83 }
84
GetArcParam(double x,double y,double radius,double startAngle,double endAngle,bool anticlockwise)85 ArcParam GetArcParam(double x, double y, double radius, double startAngle, double endAngle, bool anticlockwise)
86 {
87 ArcParam param;
88 param.x = PipelineBase::Vp2PxWithCurrentDensity(x);
89 param.y = PipelineBase::Vp2PxWithCurrentDensity(y);
90 param.radius = PipelineBase::Vp2PxWithCurrentDensity(radius);
91 param.startAngle = startAngle;
92 param.endAngle = endAngle;
93 param.anticlockwise = anticlockwise;
94 return param;
95 }
96
GetArcToParam(double x1,double y1,double x2,double y2,double radius)97 ArcToParam GetArcToParam(double x1, double y1, double x2, double y2, double radius)
98 {
99 ArcToParam param;
100 param.x1 = PipelineBase::Vp2PxWithCurrentDensity(x1);
101 param.y1 = PipelineBase::Vp2PxWithCurrentDensity(y1);
102 param.x2 = PipelineBase::Vp2PxWithCurrentDensity(x2);
103 param.y2 = PipelineBase::Vp2PxWithCurrentDensity(y2);
104 param.radius = PipelineBase::Vp2PxWithCurrentDensity(radius);
105 return param;
106 }
107
GetEllipseParam(double x,double y,double radiusX,double radiusY,double rotation,double startAngle,double endAngle,bool anticlockwise)108 EllipseParam GetEllipseParam(double x, double y, double radiusX, double radiusY, double rotation, double startAngle,
109 double endAngle, bool anticlockwise)
110 {
111 EllipseParam param;
112 param.x = PipelineBase::Vp2PxWithCurrentDensity(x);
113 param.y = PipelineBase::Vp2PxWithCurrentDensity(y);
114 param.radiusX = PipelineBase::Vp2PxWithCurrentDensity(radiusX);
115 param.radiusY = PipelineBase::Vp2PxWithCurrentDensity(radiusY);
116 param.rotation = rotation;
117 param.startAngle = startAngle;
118 param.endAngle = endAngle;
119 param.anticlockwise = anticlockwise;
120 return param;
121 }
122
GetTransformParam(double scaleX,double scaleY,double skewX,double skewY,double translateX,double translateY)123 TransformParam GetTransformParam(
124 double scaleX, double scaleY, double skewX, double skewY, double translateX, double translateY)
125 {
126 TransformParam param;
127 param.scaleX = scaleX;
128 param.scaleY = scaleY;
129 param.skewX = skewX;
130 param.skewY = skewY;
131 param.translateX = PipelineBase::Vp2PxWithCurrentDensity(translateX);
132 param.translateY = PipelineBase::Vp2PxWithCurrentDensity(translateY);
133 return param;
134 }
135 } // namespace
136
137 extern "C" {
FfiOHOSAceFrameworkCanvasCreate(int64_t contextId)138 void FfiOHOSAceFrameworkCanvasCreate(int64_t contextId)
139 {
140 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
141 if (context == nullptr) {
142 return;
143 }
144
145 auto pattern = CanvasModel::GetInstance()->Create();
146 context->SetCanvasPattern(pattern);
147 context->SetAntiAlias();
148 }
149
FfiOHOSAceFrameworkCanvasOnReady(void (* callback)())150 void FfiOHOSAceFrameworkCanvasOnReady(void (*callback)())
151 {
152 auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
153 auto readyEvent = [lambda = CJLambda::Create(callback), node = targetNode] {
154 PipelineContext::SetCallBackNode(node);
155 lambda();
156 };
157 CanvasModel::GetInstance()->SetOnReady(std::move(readyEvent));
158 }
159
FfiOHOSAceFrameworkRenderingContextCtor(bool antialias)160 int64_t FfiOHOSAceFrameworkRenderingContextCtor(bool antialias)
161 {
162 auto context = FFIData::Create<NativeCanvasRenderer>(antialias);
163 if (context == nullptr) {
164 return FFI_ERROR_CODE;
165 }
166 return context->GetID();
167 }
168
FfiOHOSAceFrameworkRenderingContextSetFillStyle(int64_t contextId,uint32_t colorValue)169 void FfiOHOSAceFrameworkRenderingContextSetFillStyle(int64_t contextId, uint32_t colorValue)
170 {
171 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
172 if (context != nullptr) {
173 context->SetFillStyle(Color(colorValue));
174 } else {
175 LOGE("canvas fillStyle error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
176 }
177 }
178
FfiOHOSAceFrameworkRenderingContextSetFillStyleByGradient(int64_t contextId,int64_t gradientId)179 void FfiOHOSAceFrameworkRenderingContextSetFillStyleByGradient(int64_t contextId, int64_t gradientId)
180 {
181 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
182 if (context == nullptr) {
183 return;
184 }
185 auto nativeCanvasGradient = FFIData::GetData<NativeCanvasGradient>(gradientId);
186 if (nativeCanvasGradient == nullptr) {
187 return;
188 }
189 context->SetFillStyle(nativeCanvasGradient);
190 }
191
FfiOHOSAceFrameworkRenderingContextSetLineWidth(int64_t contextId,double lineWidth)192 void FfiOHOSAceFrameworkRenderingContextSetLineWidth(int64_t contextId, double lineWidth)
193 {
194 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
195 if (context != nullptr) {
196 lineWidth = PipelineBase::Vp2PxWithCurrentDensity(lineWidth);
197 context->SetLineWidth(lineWidth);
198 } else {
199 LOGE("canvas lineWidth error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
200 }
201 }
202
FfiOHOSAceFrameworkRenderingContextSetStrokeStyle(int64_t contextId,uint32_t color)203 void FfiOHOSAceFrameworkRenderingContextSetStrokeStyle(int64_t contextId, uint32_t color)
204 {
205 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
206 if (context != nullptr) {
207 context->SetStrokeStyle(Color(color));
208 } else {
209 LOGE("canvas strokeStyle error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
210 }
211 }
212
FfiOHOSAceFrameworkRenderingContextSetStrokeStyleByGradient(int64_t contextId,int64_t gradientId)213 void FfiOHOSAceFrameworkRenderingContextSetStrokeStyleByGradient(int64_t contextId, int64_t gradientId)
214 {
215 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
216 if (context == nullptr) {
217 return;
218 }
219 auto nativeCanvasGradient = FFIData::GetData<NativeCanvasGradient>(gradientId);
220 if (nativeCanvasGradient == nullptr) {
221 return;
222 }
223 context->SetStrokeStyle(nativeCanvasGradient);
224 }
225
FfiOHOSAceFrameworkRenderingContextSetLineCap(int64_t contextId,int32_t lineCap)226 void FfiOHOSAceFrameworkRenderingContextSetLineCap(int64_t contextId, int32_t lineCap)
227 {
228 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(lineCap, LINE_CAP_STYLE_LIST.size())) {
229 return;
230 }
231 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
232 if (context != nullptr) {
233 context->SetLineCap(LINE_CAP_STYLE_LIST[lineCap]);
234 } else {
235 LOGE("canvas lineCap error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
236 }
237 }
238
FfiOHOSAceFrameworkRenderingContextSetLineJoin(int64_t contextId,int32_t lineJoin)239 void FfiOHOSAceFrameworkRenderingContextSetLineJoin(int64_t contextId, int32_t lineJoin)
240 {
241 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(lineJoin, LINE_JOIN_STYLE_LIST.size())) {
242 return;
243 }
244 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
245 if (context != nullptr) {
246 context->SetLineJoin(LINE_JOIN_STYLE_LIST[lineJoin]);
247 } else {
248 LOGE("canvas lineJoin error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
249 }
250 }
251
FfiOHOSAceFrameworkRenderingContextSetMiterLimit(int64_t contextId,double limit)252 void FfiOHOSAceFrameworkRenderingContextSetMiterLimit(int64_t contextId, double limit)
253 {
254 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
255 if (context != nullptr) {
256 limit = PipelineBase::Vp2PxWithCurrentDensity(limit);
257 context->SetMiterLimit(limit);
258 } else {
259 LOGE("canvas miterLimit error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
260 }
261 }
262
FfiOHOSAceFrameworkRenderingContextSetFont(int64_t contextId,int32_t style,const char * weight,double size,int32_t sizeUnit,const char * family)263 void FfiOHOSAceFrameworkRenderingContextSetFont(
264 int64_t contextId, int32_t style, const char* weight, double size, int32_t sizeUnit, const char* family)
265 {
266 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(style, FONT_STYLE_LIST.size())) {
267 return;
268 }
269 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
270 if (context != nullptr) {
271 context->SetFont(FONT_STYLE_LIST[style], weight, Dimension(size, static_cast<DimensionUnit>(sizeUnit)), family);
272 } else {
273 LOGE("canvas font error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
274 }
275 }
276
FfiOHOSAceFrameworkRenderingContextSetTextAlign(int64_t contextId,int32_t align)277 void FfiOHOSAceFrameworkRenderingContextSetTextAlign(int64_t contextId, int32_t align)
278 {
279 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(align, TEXT_ALIGN_LIST.size())) {
280 return;
281 }
282 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
283 if (context != nullptr) {
284 context->SetTextAlign(TEXT_ALIGN_LIST[align]);
285 } else {
286 LOGE("canvas textAlign error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
287 }
288 }
289
FfiOHOSAceFrameworkRenderingContextSetTextBaseline(int64_t contextId,int32_t baseline)290 void FfiOHOSAceFrameworkRenderingContextSetTextBaseline(int64_t contextId, int32_t baseline)
291 {
292 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(baseline, TEXT_BASELINE_LIST.size())) {
293 return;
294 }
295 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
296 if (context != nullptr) {
297 context->SetTextBaseline(TEXT_BASELINE_LIST[baseline]);
298 } else {
299 LOGE("canvas textBaseline error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
300 }
301 }
302
FfiOHOSAceFrameworkRenderingContextSetGlobalAlpha(int64_t contextId,double alpha)303 void FfiOHOSAceFrameworkRenderingContextSetGlobalAlpha(int64_t contextId, double alpha)
304 {
305 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
306 if (context != nullptr) {
307 context->SetGlobalAlpha(alpha);
308 } else {
309 LOGE("canvas globalAlpha error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
310 }
311 }
312
FfiOHOSAceFrameworkRenderingContextSetLineDash(int64_t contextId,VectorDoublePtr lineDashArr)313 void FfiOHOSAceFrameworkRenderingContextSetLineDash(int64_t contextId, VectorDoublePtr lineDashArr)
314 {
315 auto actualVec = reinterpret_cast<std::vector<double>*>(lineDashArr);
316 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
317 if (context != nullptr) {
318 context->SetLineDash(*actualVec);
319 } else {
320 LOGE("canvas lineDash error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
321 }
322 }
323
FfiOHOSAceFrameworkRenderingContextSetLineDashOffset(int64_t contextId,double lineDashOffset)324 void FfiOHOSAceFrameworkRenderingContextSetLineDashOffset(int64_t contextId, double lineDashOffset)
325 {
326 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
327 if (context != nullptr) {
328 lineDashOffset = PipelineBase::Vp2PxWithCurrentDensity(lineDashOffset);
329 context->SetLineDashOffset(lineDashOffset);
330 } else {
331 LOGE("canvas lineDashOffset error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
332 }
333 }
334
FfiOHOSAceFrameworkRenderingContextSetGlobalCompositeOperation(int64_t contextId,int32_t type)335 void FfiOHOSAceFrameworkRenderingContextSetGlobalCompositeOperation(int64_t contextId, int32_t type)
336 {
337 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(type, COMPOSITE_OPERATION_LIST.size())) {
338 return;
339 }
340 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
341 if (context != nullptr) {
342 context->SetGlobalCompositeOperation(COMPOSITE_OPERATION_LIST[type]);
343 } else {
344 LOGE("canvas globalCompositeOperation error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64,
345 contextId);
346 }
347 }
348
FfiOHOSAceFrameworkRenderingContextSetShadowBlur(int64_t contextId,double blur)349 void FfiOHOSAceFrameworkRenderingContextSetShadowBlur(int64_t contextId, double blur)
350 {
351 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
352 if (context != nullptr) {
353 context->SetShadowBlur(blur);
354 } else {
355 LOGE("canvas shadowBlur error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
356 }
357 }
358
FfiOHOSAceFrameworkRenderingContextSetShadowColor(int64_t contextId,uint32_t color)359 void FfiOHOSAceFrameworkRenderingContextSetShadowColor(int64_t contextId, uint32_t color)
360 {
361 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
362 if (context != nullptr) {
363 context->SetShadowColor(Color(color));
364 } else {
365 LOGE("canvas shadowColor error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
366 }
367 }
368
FfiOHOSAceFrameworkRenderingContextSetShadowOffsetX(int64_t contextId,double offsetX)369 void FfiOHOSAceFrameworkRenderingContextSetShadowOffsetX(int64_t contextId, double offsetX)
370 {
371 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
372 if (context != nullptr) {
373 offsetX = PipelineBase::Vp2PxWithCurrentDensity(offsetX);
374 context->SetShadowOffsetX(offsetX);
375 } else {
376 LOGE("canvas shadowOffsetX error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
377 }
378 }
379
FfiOHOSAceFrameworkRenderingContextSetShadowOffsetY(int64_t contextId,double offsetY)380 void FfiOHOSAceFrameworkRenderingContextSetShadowOffsetY(int64_t contextId, double offsetY)
381 {
382 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
383 if (context != nullptr) {
384 offsetY = PipelineBase::Vp2PxWithCurrentDensity(offsetY);
385 context->SetShadowOffsetY(offsetY);
386 } else {
387 LOGE("canvas shadowOffsetY error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
388 }
389 }
390
FfiOHOSAceFrameworkRenderingContextSetImageSmoothingEnabled(int64_t contextId,bool enabled)391 void FfiOHOSAceFrameworkRenderingContextSetImageSmoothingEnabled(int64_t contextId, bool enabled)
392 {
393 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
394 if (context != nullptr) {
395 context->SetImageSmoothingEnabled(enabled);
396 } else {
397 LOGE("canvas imageSmoothingEnabled error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
398 }
399 }
400
FfiOHOSAceFrameworkRenderingContextSetImageSmoothingQuality(int64_t contextId,const char * quality)401 void FfiOHOSAceFrameworkRenderingContextSetImageSmoothingQuality(int64_t contextId, const char* quality)
402 {
403 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
404 if (context != nullptr) {
405 context->SetImageSmoothingQuality(quality);
406 } else {
407 LOGE("canvas imageSmoothingQuality error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
408 }
409 }
410
FfiOHOSAceFrameworkRenderingContextFillRect(int64_t contextId,double x,double y,double width,double height)411 void FfiOHOSAceFrameworkRenderingContextFillRect(int64_t contextId, double x, double y, double width, double height)
412 {
413 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
414 if (context != nullptr) {
415 auto rect = GetRectParam(x, y, width, height);
416 context->FillRect(rect);
417 } else {
418 LOGE("canvas fillRect error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
419 }
420 }
421
FfiOHOSAceFrameworkRenderingContextStrokeRect(int64_t contextId,double x,double y,double width,double height)422 void FfiOHOSAceFrameworkRenderingContextStrokeRect(int64_t contextId, double x, double y, double width, double height)
423 {
424 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
425 if (context != nullptr) {
426 auto rect = GetRectParam(x, y, width, height);
427 context->StrokeRect(rect);
428 } else {
429 LOGE("canvas strokeRect error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
430 }
431 }
432
FfiOHOSAceFrameworkRenderingContextClearRect(int64_t contextId,double x,double y,double width,double height)433 void FfiOHOSAceFrameworkRenderingContextClearRect(int64_t contextId, double x, double y, double width, double height)
434 {
435 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
436 if (context != nullptr) {
437 auto rect = GetRectParam(x, y, width, height);
438 context->ClearRect(rect);
439 } else {
440 LOGE("canvas clearRect error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
441 }
442 }
443
FfiOHOSAceFrameworkRenderingContextFillText(int64_t contextId,double x,double y,const char * text)444 void FfiOHOSAceFrameworkRenderingContextFillText(int64_t contextId, double x, double y, const char* text)
445 {
446 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
447 if (context != nullptr) {
448 x = PipelineBase::Vp2PxWithCurrentDensity(x);
449 y = PipelineBase::Vp2PxWithCurrentDensity(y);
450 context->FillText(x, y, text);
451 } else {
452 LOGE("canvas fillText error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
453 }
454 }
455
FfiOHOSAceFrameworkRenderingContextStrokeText(int64_t contextId,double x,double y,const char * text)456 void FfiOHOSAceFrameworkRenderingContextStrokeText(int64_t contextId, double x, double y, const char* text)
457 {
458 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
459 if (context != nullptr) {
460 x = PipelineBase::Vp2PxWithCurrentDensity(x);
461 y = PipelineBase::Vp2PxWithCurrentDensity(y);
462 context->StrokeText(x, y, text);
463 } else {
464 LOGE("canvas strokeText error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
465 }
466 }
467
FfiOHOSAceFrameworkRenderingContextMeasureText(int64_t contextId,const char * text)468 CTextMetrics FfiOHOSAceFrameworkRenderingContextMeasureText(int64_t contextId, const char* text)
469 {
470 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
471 CTextMetrics textMetrics;
472 if (context != nullptr) {
473 auto metrics = context->MeasureText(text);
474 textMetrics.height = metrics.height;
475 textMetrics.width = metrics.width;
476 } else {
477 LOGE("canvas measureText error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
478 }
479 return textMetrics;
480 }
481
FfiOHOSAceFrameworkRenderingContextStroke(int64_t contextId)482 void FfiOHOSAceFrameworkRenderingContextStroke(int64_t contextId)
483 {
484 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
485 if (context != nullptr) {
486 context->Stroke();
487 } else {
488 LOGE("canvas stroke error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
489 }
490 }
491
FfiOHOSAceFrameworkRenderingContextStrokeWithPath(int64_t contextId,int64_t pathId)492 void FfiOHOSAceFrameworkRenderingContextStrokeWithPath(int64_t contextId, int64_t pathId)
493 {
494 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
495 if (context == nullptr) {
496 return;
497 }
498 auto path2d = FFIData::GetData<NativeCanvasPath>(pathId);
499 if (path2d == nullptr) {
500 return;
501 }
502 context->Stroke(path2d);
503 }
504
FfiOHOSAceFrameworkRenderingContextBeginPath(int64_t contextId)505 void FfiOHOSAceFrameworkRenderingContextBeginPath(int64_t contextId)
506 {
507 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
508 if (context != nullptr) {
509 context->BeginPath();
510 } else {
511 LOGE("canvas beginPath error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
512 }
513 }
514
FfiOHOSAceFrameworkRenderingContextMoveTo(int64_t contextId,double x,double y)515 void FfiOHOSAceFrameworkRenderingContextMoveTo(int64_t contextId, double x, double y)
516 {
517 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
518 if (context != nullptr) {
519 x = PipelineBase::Vp2PxWithCurrentDensity(x);
520 y = PipelineBase::Vp2PxWithCurrentDensity(y);
521 context->MoveTo(x, y);
522 } else {
523 LOGE("canvas moveTo error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
524 }
525 }
526
FfiOHOSAceFrameworkRenderingContextLineTo(int64_t contextId,double x,double y)527 void FfiOHOSAceFrameworkRenderingContextLineTo(int64_t contextId, double x, double y)
528 {
529 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
530 if (context != nullptr) {
531 x = PipelineBase::Vp2PxWithCurrentDensity(x);
532 y = PipelineBase::Vp2PxWithCurrentDensity(y);
533 context->LineTo(x, y);
534 } else {
535 LOGE("canvas lineTo error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
536 }
537 }
538
FfiOHOSAceFrameworkRenderingContextClosePath(int64_t contextId)539 void FfiOHOSAceFrameworkRenderingContextClosePath(int64_t contextId)
540 {
541 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
542 if (context != nullptr) {
543 context->ClosePath();
544 } else {
545 LOGE("canvas closePath error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
546 }
547 }
548
FfiOHOSAceFrameworkRenderingContextBezierCurveTo(int64_t contextId,double cp1x,double cp1y,double cp2x,double cp2y,double x,double y)549 void FfiOHOSAceFrameworkRenderingContextBezierCurveTo(
550 int64_t contextId, double cp1x, double cp1y, double cp2x, double cp2y, double x, double y)
551 {
552 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
553 if (context != nullptr) {
554 auto bezierCurveParam = GetBezierCurveParam(cp1x, cp1y, cp2x, cp2y, x, y);
555 context->BezierCurveTo(bezierCurveParam);
556 } else {
557 LOGE("canvas bezierCurveTo error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
558 }
559 }
560
FfiOHOSAceFrameworkRenderingContextQuadraticCurveTo(int64_t contextId,double cpx,double cpy,double x,double y)561 void FfiOHOSAceFrameworkRenderingContextQuadraticCurveTo(int64_t contextId, double cpx, double cpy, double x, double y)
562 {
563 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
564 if (context != nullptr) {
565 auto quadraticCurveParam = GetQuadraticCurveParam(cpx, cpy, x, y);
566 context->QuadraticCurveTo(quadraticCurveParam);
567 } else {
568 LOGE("canvas quadraticCurveTo error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
569 }
570 }
571
FfiOHOSAceFrameworkRenderingContextArc(int64_t contextId,double x,double y,double radius,double startAngle,double endAngle,bool anticlockwise)572 void FfiOHOSAceFrameworkRenderingContextArc(
573 int64_t contextId, double x, double y, double radius, double startAngle, double endAngle, bool anticlockwise)
574 {
575 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
576 if (context != nullptr) {
577 auto arcParam = GetArcParam(x, y, radius, startAngle, endAngle, anticlockwise);
578 context->Arc(arcParam);
579 } else {
580 LOGE("canvas arc error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
581 }
582 }
583
FfiOHOSAceFrameworkRenderingContextArcTo(int64_t contextId,double x1,double y1,double x2,double y2,double radius)584 void FfiOHOSAceFrameworkRenderingContextArcTo(
585 int64_t contextId, double x1, double y1, double x2, double y2, double radius)
586 {
587 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
588 if (context != nullptr) {
589 auto arcToParam = GetArcToParam(x1, y1, x2, y2, radius);
590 context->ArcTo(arcToParam);
591 } else {
592 LOGE("canvas arcTo error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
593 }
594 }
595
FfiOHOSAceFrameworkRenderingContextEllipse(int64_t contextId,double x,double y,double radiusX,double radiusY,double rotation,double startAngle,double endAngle,bool anticlockwise)596 void FfiOHOSAceFrameworkRenderingContextEllipse(int64_t contextId, double x, double y, double radiusX, double radiusY,
597 double rotation, double startAngle, double endAngle, bool anticlockwise)
598 {
599 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
600 if (context != nullptr) {
601 auto arcParam = GetEllipseParam(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
602 context->Ellipse(arcParam);
603 } else {
604 LOGE("canvas ellipse error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
605 }
606 }
607
FfiOHOSAceFrameworkRenderingContextRect(int64_t contextId,double x,double y,double width,double height)608 void FfiOHOSAceFrameworkRenderingContextRect(int64_t contextId, double x, double y, double width, double height)
609 {
610 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
611 if (context != nullptr) {
612 auto rect = GetRectParam(x, y, width, height);
613 context->NormalRect(rect);
614 } else {
615 LOGE("canvas normalRect error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
616 }
617 }
618
FfiOHOSAceFrameworkRenderingContextFill(int64_t contextId)619 void FfiOHOSAceFrameworkRenderingContextFill(int64_t contextId)
620 {
621 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
622 if (context != nullptr) {
623 context->Fill();
624 } else {
625 LOGE("canvas fill error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
626 }
627 }
628
FfiOHOSAceFrameworkRenderingContextClip(int64_t contextId)629 void FfiOHOSAceFrameworkRenderingContextClip(int64_t contextId)
630 {
631 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
632 if (context != nullptr) {
633 context->Clip();
634 } else {
635 LOGE("canvas clip error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
636 }
637 }
638
FfiOHOSAceFrameworkRenderingContextRotate(int64_t contextId,double angle)639 void FfiOHOSAceFrameworkRenderingContextRotate(int64_t contextId, double angle)
640 {
641 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
642 if (context != nullptr) {
643 context->Rotate(angle);
644 } else {
645 LOGE("canvas rotate error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
646 }
647 }
648
FfiOHOSAceFrameworkRenderingContextScale(int64_t contextId,double x,double y)649 void FfiOHOSAceFrameworkRenderingContextScale(int64_t contextId, double x, double y)
650 {
651 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
652 if (context != nullptr) {
653 context->Scale(x, y);
654 } else {
655 LOGE("canvas scale error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
656 }
657 }
658
FfiOHOSAceFrameworkRenderingContextTransform(int64_t contextId,double scaleX,double scaleY,double skewX,double skewY,double translateX,double translateY)659 void FfiOHOSAceFrameworkRenderingContextTransform(
660 int64_t contextId, double scaleX, double scaleY, double skewX, double skewY, double translateX, double translateY)
661 {
662 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
663 if (context != nullptr) {
664 auto transformParam = GetTransformParam(scaleX, scaleY, skewX, skewY, translateX, translateY);
665 context->Transform(transformParam);
666 } else {
667 LOGE("canvas transform error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
668 }
669 }
670
FfiOHOSAceFrameworkRenderingContextSetTransform(int64_t contextId,double scaleX,double scaleY,double skewX,double skewY,double translateX,double translateY)671 void FfiOHOSAceFrameworkRenderingContextSetTransform(
672 int64_t contextId, double scaleX, double scaleY, double skewX, double skewY, double translateX, double translateY)
673 {
674 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
675 if (context != nullptr) {
676 auto transformParam = GetTransformParam(scaleX, scaleY, skewX, skewY, translateX, translateY);
677 context->SetTransform(transformParam);
678 } else {
679 LOGE("canvas setTransform error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
680 }
681 }
682
FfiOHOSAceFrameworkRenderingContextTranslate(int64_t contextId,double x,double y)683 void FfiOHOSAceFrameworkRenderingContextTranslate(int64_t contextId, double x, double y)
684 {
685 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
686 if (context != nullptr) {
687 x = PipelineBase::Vp2PxWithCurrentDensity(x);
688 y = PipelineBase::Vp2PxWithCurrentDensity(y);
689 context->Translate(x, y);
690 } else {
691 LOGE("canvas translate error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
692 }
693 }
694
FfiOHOSAceFrameworkRenderingContextRestore(int64_t contextId)695 void FfiOHOSAceFrameworkRenderingContextRestore(int64_t contextId)
696 {
697 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
698 if (context != nullptr) {
699 context->Restore();
700 } else {
701 LOGE("canvas restore error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
702 }
703 }
704
FfiOHOSAceFrameworkRenderingContextSave(int64_t contextId)705 void FfiOHOSAceFrameworkRenderingContextSave(int64_t contextId)
706 {
707 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
708 if (context != nullptr) {
709 context->Save();
710 } else {
711 LOGE("canvas save error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
712 }
713 }
714
FfiOHOSAceFrameworkRenderingContextCreateLinearGradient(int64_t contextId,double x0,double y0,double x1,double y1)715 int64_t FfiOHOSAceFrameworkRenderingContextCreateLinearGradient(
716 int64_t contextId, double x0, double y0, double x1, double y1)
717 {
718 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
719 if (context != nullptr) {
720 x0 = PipelineBase::Vp2PxWithCurrentDensity(x0);
721 y0 = PipelineBase::Vp2PxWithCurrentDensity(y0);
722 x1 = PipelineBase::Vp2PxWithCurrentDensity(x1);
723 y1 = PipelineBase::Vp2PxWithCurrentDensity(y1);
724 return context->CreateLinearGradient(x0, y0, x1, y1);
725 } else {
726 LOGE("canvas createLinearGradient error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
727 return 0;
728 }
729 }
730
FfiOHOSAceFrameworkRenderingContextCreateRadialGradient(int64_t contextId,double x0,double y0,double r0,double x1,double y1,double r1)731 int64_t FfiOHOSAceFrameworkRenderingContextCreateRadialGradient(
732 int64_t contextId, double x0, double y0, double r0, double x1, double y1, double r1)
733 {
734 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
735 if (context != nullptr) {
736 x0 = PipelineBase::Vp2PxWithCurrentDensity(x0);
737 y0 = PipelineBase::Vp2PxWithCurrentDensity(y0);
738 r0 = PipelineBase::Vp2PxWithCurrentDensity(r0);
739 x1 = PipelineBase::Vp2PxWithCurrentDensity(x1);
740 y1 = PipelineBase::Vp2PxWithCurrentDensity(y1);
741 r1 = PipelineBase::Vp2PxWithCurrentDensity(r1);
742 return context->CreateRadialGradient(x0, y0, r0, x1, y1, r1);
743 } else {
744 LOGE("canvas createRadialGradient error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
745 return 0;
746 }
747 }
748
FfiOHOSAceFrameworkRenderingContextDrawImage(int64_t contextId,const char * src,NativeImageInfo imageInfo)749 void FfiOHOSAceFrameworkRenderingContextDrawImage(int64_t contextId, const char* src, NativeImageInfo imageInfo)
750 {
751 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(imageInfo.flag, CANVAS_IMAGE_TYPE_LIST.size())) {
752 return;
753 }
754 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
755 if (context == nullptr) {
756 return;
757 }
758 CanvasImage image { .flag = imageInfo.flag,
759 .sx = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sx),
760 .sy = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sy),
761 .sWidth = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sWidth),
762 .sHeight = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sHeight),
763 .dx = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dx),
764 .dy = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dy),
765 .dWidth = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dWidth),
766 .dHeight = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dHeight),
767 .src = src };
768 context->DrawImage(image);
769 }
770
FfiOHOSAceFrameworkRenderingContextDrawImageWithPixelMap(int64_t contextId,int64_t pixelMapId,NativeImageInfo imageInfo)771 void FfiOHOSAceFrameworkRenderingContextDrawImageWithPixelMap(
772 int64_t contextId, int64_t pixelMapId, NativeImageInfo imageInfo)
773 {
774 if (!OHOS::Ace::Framework::Utils::CheckParamsValid(imageInfo.flag, CANVAS_IMAGE_TYPE_LIST.size())) {
775 LOGE("canvas imageInfo type error, invalid value for ImageInfoType");
776 return;
777 }
778 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
779 if (context == nullptr) {
780 LOGE("canvas drawImage error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
781 return;
782 }
783 auto instance = FFIData::GetData<OHOS::Media::PixelMapImpl>(pixelMapId);
784 if (instance == nullptr) {
785 LOGE("canvas drawImage error, Cannot get PixelMapProxy by id: %{public}" PRId64, pixelMapId);
786 return;
787 }
788 auto pixMap = instance->GetRealPixelMap();
789 if (pixMap == nullptr) {
790 LOGE("canvas drawImage error, Cannot get pixMap in PixelMapProxy");
791 return;
792 }
793 auto pixMapOhos = PixelMap::CreatePixelMap(&pixMap);
794 if (pixMapOhos == nullptr) {
795 LOGE("canvas drawImage error, Cannot create PixelMapOhos by pixMap");
796 return;
797 }
798 CanvasImage image { .flag = imageInfo.flag,
799 .sx = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sx),
800 .sy = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sy),
801 .sWidth = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sWidth),
802 .sHeight = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.sHeight),
803 .dx = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dx),
804 .dy = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dy),
805 .dWidth = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dWidth),
806 .dHeight = PipelineBase::Vp2PxWithCurrentDensity(imageInfo.dHeight) };
807 context->DrawImage(pixMapOhos, image);
808 }
809
FfiOHOSAceFrameworkRenderingContextGetPixelMap(int64_t contextId,double left,double top,double width,double height)810 int64_t FfiOHOSAceFrameworkRenderingContextGetPixelMap(
811 int64_t contextId, double left, double top, double width, double height)
812 {
813 auto context = FFIData::GetData<NativeCanvasRenderer>(contextId);
814 if (context == nullptr) {
815 LOGE("canvas drawImage error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
816 return 0;
817 }
818
819 left = PipelineBase::Vp2PxWithCurrentDensity(left);
820 top = PipelineBase::Vp2PxWithCurrentDensity(top);
821 width = PipelineBase::Vp2PxWithCurrentDensity(width);
822 height = PipelineBase::Vp2PxWithCurrentDensity(height);
823 return context->GetPixelMap(left, top, width, height);
824 }
825
FfiOHOSAceFrameworkCanvasGradientAddColorStop(int64_t contextId,double offset,uint32_t color)826 void FfiOHOSAceFrameworkCanvasGradientAddColorStop(int64_t contextId, double offset, uint32_t color)
827 {
828 auto context = FFIData::GetData<NativeCanvasGradient>(contextId);
829 if (context != nullptr) {
830 context->AddColorStop(offset, Color(color));
831 } else {
832 LOGE("canvasGradient addColorStop error, Cannot get NativeCanvasRenderer by id: %{public}" PRId64, contextId);
833 }
834 }
835
836 // Canvas Path2d
FfiOHOSAceFrameworkCanvasPathCtor()837 int64_t FfiOHOSAceFrameworkCanvasPathCtor()
838 {
839 auto path2d = FFIData::Create<NativeCanvasPath>();
840 return path2d->GetID();
841 }
842
FfiOHOSAceFrameworkCanvasPathCtorWithPath(const char * path)843 int64_t FfiOHOSAceFrameworkCanvasPathCtorWithPath(const char* path)
844 {
845 auto path2d = FFIData::Create<NativeCanvasPath>(path);
846 return path2d->GetID();
847 }
848
FfiOHOSAceFrameworkCanvasPathAddPath(int64_t selfId,int64_t pathId)849 void FfiOHOSAceFrameworkCanvasPathAddPath(int64_t selfId, int64_t pathId)
850 {
851 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
852 if (path2d == nullptr) {
853 return;
854 }
855 auto addPath = FFIData::GetData<NativeCanvasPath>(pathId);
856 if (addPath == nullptr) {
857 return;
858 }
859 path2d->AddPath(addPath);
860 }
861
FfiOHOSAceFrameworkCanvasPathSetTransform(int64_t selfId,TransformParams params)862 void FfiOHOSAceFrameworkCanvasPathSetTransform(int64_t selfId, TransformParams params)
863 {
864 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
865 if (path2d != nullptr) {
866 double translateX = PipelineBase::Vp2PxWithCurrentDensity(params.translateX);
867 double translateY = PipelineBase::Vp2PxWithCurrentDensity(params.translateY);
868 path2d->SetTransform(params.scaleX, params.skewX, params.skewY, params.scaleY, translateX, translateY);
869 } else {
870 LOGE("canvas path2D setTransform error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
871 }
872 }
873
FfiOHOSAceFrameworkCanvasPathMoveTo(int64_t selfId,double x,double y)874 void FfiOHOSAceFrameworkCanvasPathMoveTo(int64_t selfId, double x, double y)
875 {
876 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
877 if (path2d != nullptr) {
878 x = PipelineBase::Vp2PxWithCurrentDensity(x);
879 y = PipelineBase::Vp2PxWithCurrentDensity(y);
880 path2d->MoveTo(x, y);
881 } else {
882 LOGE("canvas path2D moveTo error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
883 }
884 }
885
FfiOHOSAceFrameworkCanvasPathLineTo(int64_t selfId,double x,double y)886 void FfiOHOSAceFrameworkCanvasPathLineTo(int64_t selfId, double x, double y)
887 {
888 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
889 if (path2d != nullptr) {
890 x = PipelineBase::Vp2PxWithCurrentDensity(x);
891 y = PipelineBase::Vp2PxWithCurrentDensity(y);
892 path2d->LineTo(x, y);
893 } else {
894 LOGE("canvas path2D lineTo error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
895 }
896 }
897
FfiOHOSAceFrameworkCanvasPathArc(int64_t selfId,ArcParams params,bool anticlockwise)898 void FfiOHOSAceFrameworkCanvasPathArc(int64_t selfId, ArcParams params, bool anticlockwise)
899 {
900 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
901 if (path2d != nullptr) {
902 double x = PipelineBase::Vp2PxWithCurrentDensity(params.x);
903 double y = PipelineBase::Vp2PxWithCurrentDensity(params.y);
904 double radius = PipelineBase::Vp2PxWithCurrentDensity(params.radius);
905 path2d->Arc(x, y, radius, params.startAngle, params.endAngle, anticlockwise);
906 } else {
907 LOGE("canvas path2D arc error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
908 }
909 }
910
FfiOHOSAceFrameworkCanvasPathArcTo(int64_t selfId,ArcToParams params)911 void FfiOHOSAceFrameworkCanvasPathArcTo(int64_t selfId, ArcToParams params)
912 {
913 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
914 if (path2d != nullptr) {
915 double x1 = PipelineBase::Vp2PxWithCurrentDensity(params.x1);
916 double y1 = PipelineBase::Vp2PxWithCurrentDensity(params.y1);
917 double x2 = PipelineBase::Vp2PxWithCurrentDensity(params.x2);
918 double y2 = PipelineBase::Vp2PxWithCurrentDensity(params.y2);
919 double radius = PipelineBase::Vp2PxWithCurrentDensity(params.radius);
920 path2d->ArcTo(x1, y1, x2, y2, radius);
921 } else {
922 LOGE("canvas path2D arcTo error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
923 }
924 }
925
FfiOHOSAceFrameworkCanvasPathQuadraticCurveTo(int64_t selfId,QuadraticCurveToParams params)926 void FfiOHOSAceFrameworkCanvasPathQuadraticCurveTo(int64_t selfId, QuadraticCurveToParams params)
927 {
928 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
929 if (path2d != nullptr) {
930 double cpx = PipelineBase::Vp2PxWithCurrentDensity(params.cpx);
931 double cpy = PipelineBase::Vp2PxWithCurrentDensity(params.cpy);
932 double x = PipelineBase::Vp2PxWithCurrentDensity(params.x);
933 double y = PipelineBase::Vp2PxWithCurrentDensity(params.y);
934 path2d->QuadraticCurveTo(cpx, cpy, x, y);
935 } else {
936 LOGE("canvas path2D quadraticCurveTo error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
937 }
938 }
939
FfiOHOSAceFrameworkCanvasPathBezierCurveTo(int64_t selfId,BezierCurveToParams params)940 void FfiOHOSAceFrameworkCanvasPathBezierCurveTo(int64_t selfId, BezierCurveToParams params)
941 {
942 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
943 if (path2d != nullptr) {
944 double cp1x = PipelineBase::Vp2PxWithCurrentDensity(params.cp1x);
945 double cp1y = PipelineBase::Vp2PxWithCurrentDensity(params.cp1y);
946 double cp2x = PipelineBase::Vp2PxWithCurrentDensity(params.cp2x);
947 double cp2y = PipelineBase::Vp2PxWithCurrentDensity(params.cp2y);
948 double x = PipelineBase::Vp2PxWithCurrentDensity(params.x);
949 double y = PipelineBase::Vp2PxWithCurrentDensity(params.y);
950 path2d->BezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
951 } else {
952 LOGE("canvas path2D bezierCurveTo error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
953 }
954 }
955
FfiOHOSAceFrameworkCanvasPathEllipse(int64_t selfId,EllipseParams params,bool anticlockwise)956 void FfiOHOSAceFrameworkCanvasPathEllipse(int64_t selfId, EllipseParams params, bool anticlockwise)
957 {
958 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
959 if (path2d != nullptr) {
960 double x = PipelineBase::Vp2PxWithCurrentDensity(params.x);
961 double y = PipelineBase::Vp2PxWithCurrentDensity(params.y);
962 double radiusX = PipelineBase::Vp2PxWithCurrentDensity(params.radiusX);
963 double radiusY = PipelineBase::Vp2PxWithCurrentDensity(params.radiusY);
964 path2d->Ellipse(x, y, radiusX, radiusY, params.rotation, params.startAngle, params.endAngle, anticlockwise);
965 } else {
966 LOGE("canvas path2D ellipse error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
967 }
968 }
969
FfiOHOSAceFrameworkCanvasPathRect(int64_t selfId,RectParams params)970 void FfiOHOSAceFrameworkCanvasPathRect(int64_t selfId, RectParams params)
971 {
972 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
973 if (path2d != nullptr) {
974 double x = PipelineBase::Vp2PxWithCurrentDensity(params.x);
975 double y = PipelineBase::Vp2PxWithCurrentDensity(params.y);
976 double width = PipelineBase::Vp2PxWithCurrentDensity(params.width);
977 double height = PipelineBase::Vp2PxWithCurrentDensity(params.height);
978 path2d->Rect(x, y, width, height);
979 } else {
980 LOGE("canvas path2D rect error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
981 }
982 }
983
FfiOHOSAceFrameworkCanvasPathClosePath(int64_t selfId)984 void FfiOHOSAceFrameworkCanvasPathClosePath(int64_t selfId)
985 {
986 auto path2d = FFIData::GetData<NativeCanvasPath>(selfId);
987 if (path2d != nullptr) {
988 path2d->ClosePath();
989 } else {
990 LOGE("canvas path2D closePath error, Cannot get NativeCanvasPath by id: %{public}" PRId64, selfId);
991 }
992 }
993 }
994