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