1 /*
2  * Copyright (c) 2021-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 "drawing_canvas.h"
17 
18 #include "src/utils/SkUTF.h"
19 
20 #include "drawing_canvas_utils.h"
21 #include "drawing_helper.h"
22 #include "image_pixel_map_mdk.h"
23 #include "native_pixel_map.h"
24 #include "native_pixel_map_manager.h"
25 #include "pixelmap_native_impl.h"
26 #include "recording/recording_canvas.h"
27 #include "utils/log.h"
28 
29 using namespace OHOS;
30 using namespace Rosen;
31 using namespace Drawing;
32 
CastToCanvas(OH_Drawing_Canvas * cCanvas)33 static Canvas* CastToCanvas(OH_Drawing_Canvas* cCanvas)
34 {
35     return reinterpret_cast<Canvas*>(cCanvas);
36 }
37 
CastToPath(const OH_Drawing_Path & cPath)38 static const Path& CastToPath(const OH_Drawing_Path& cPath)
39 {
40     return reinterpret_cast<const Path&>(cPath);
41 }
42 
CastToBrush(const OH_Drawing_Brush & cBrush)43 static const Brush& CastToBrush(const OH_Drawing_Brush& cBrush)
44 {
45     return reinterpret_cast<const Brush&>(cBrush);
46 }
47 
CastToPen(const OH_Drawing_Pen & cPen)48 static const Pen& CastToPen(const OH_Drawing_Pen& cPen)
49 {
50     return reinterpret_cast<const Pen&>(cPen);
51 }
52 
CastToRegion(const OH_Drawing_Region & cRegion)53 static const OHOS::Rosen::Drawing::Region& CastToRegion(const OH_Drawing_Region& cRegion)
54 {
55     return reinterpret_cast<const OHOS::Rosen::Drawing::Region&>(cRegion);
56 }
57 
CastToBitmap(const OH_Drawing_Bitmap & cBitmap)58 static const Bitmap& CastToBitmap(const OH_Drawing_Bitmap& cBitmap)
59 {
60     return reinterpret_cast<const Bitmap&>(cBitmap);
61 }
62 
CastToRect(const OH_Drawing_Rect & cRect)63 static const Drawing::Rect& CastToRect(const OH_Drawing_Rect& cRect)
64 {
65     return reinterpret_cast<const Drawing::Rect&>(cRect);
66 }
67 
CastToPoint(const OH_Drawing_Point & cPoint)68 static const Point& CastToPoint(const OH_Drawing_Point& cPoint)
69 {
70     return reinterpret_cast<const Point&>(cPoint);
71 }
72 
CastToPoint(const OH_Drawing_Point2D & cPoint)73 static const Point& CastToPoint(const OH_Drawing_Point2D& cPoint)
74 {
75     return reinterpret_cast<const Point&>(cPoint);
76 }
77 
CastToPoint3(OH_Drawing_Point3D & cPoint3)78 static const Point3& CastToPoint3(OH_Drawing_Point3D& cPoint3)
79 {
80     return reinterpret_cast<const Point3&>(cPoint3);
81 }
82 
CastToRoundRect(const OH_Drawing_RoundRect & cRoundRect)83 static const RoundRect& CastToRoundRect(const OH_Drawing_RoundRect& cRoundRect)
84 {
85     return reinterpret_cast<const RoundRect&>(cRoundRect);
86 }
87 
CastToTextBlob(const OH_Drawing_TextBlob * cTextBlob)88 static const TextBlob* CastToTextBlob(const OH_Drawing_TextBlob* cTextBlob)
89 {
90     return reinterpret_cast<const TextBlob*>(cTextBlob);
91 }
92 
CastToMatrix(const OH_Drawing_Matrix & cMatrix)93 static const Matrix& CastToMatrix(const OH_Drawing_Matrix& cMatrix)
94 {
95     return reinterpret_cast<const Matrix&>(cMatrix);
96 }
97 
CastToImage(const OH_Drawing_Image & cImage)98 static const Image& CastToImage(const OH_Drawing_Image& cImage)
99 {
100     return reinterpret_cast<const Image&>(cImage);
101 }
102 
CastToSamplingOptions(const OH_Drawing_SamplingOptions & cSamplingOptions)103 static const SamplingOptions& CastToSamplingOptions(const OH_Drawing_SamplingOptions& cSamplingOptions)
104 {
105     return reinterpret_cast<const SamplingOptions&>(cSamplingOptions);
106 }
107 
CastToFont(const OH_Drawing_Font & cFont)108 static const Font& CastToFont(const OH_Drawing_Font& cFont)
109 {
110     return reinterpret_cast<const Font&>(cFont);
111 }
112 
OH_Drawing_CanvasCreate()113 OH_Drawing_Canvas* OH_Drawing_CanvasCreate()
114 {
115     return (OH_Drawing_Canvas*)new Canvas;
116 }
117 
OH_Drawing_CanvasDestroy(OH_Drawing_Canvas * cCanvas)118 void OH_Drawing_CanvasDestroy(OH_Drawing_Canvas* cCanvas)
119 {
120     if (!cCanvas) {
121         return;
122     }
123     delete CastToCanvas(cCanvas);
124 }
125 
OH_Drawing_CanvasBind(OH_Drawing_Canvas * cCanvas,OH_Drawing_Bitmap * cBitmap)126 void OH_Drawing_CanvasBind(OH_Drawing_Canvas* cCanvas, OH_Drawing_Bitmap* cBitmap)
127 {
128     if (cBitmap == nullptr) {
129         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
130         return;
131     }
132     Canvas* canvas = CastToCanvas(cCanvas);
133     if (canvas == nullptr) {
134         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
135         return;
136     }
137     canvas->Bind(CastToBitmap(*cBitmap));
138 }
139 
OH_Drawing_CanvasAttachPen(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Pen * cPen)140 void OH_Drawing_CanvasAttachPen(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Pen* cPen)
141 {
142     if (cPen == nullptr) {
143         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
144         return;
145     }
146     Canvas* canvas = CastToCanvas(cCanvas);
147     if (canvas == nullptr) {
148         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
149         return;
150     }
151     canvas->AttachPen(CastToPen(*cPen));
152 }
153 
OH_Drawing_CanvasDetachPen(OH_Drawing_Canvas * cCanvas)154 void OH_Drawing_CanvasDetachPen(OH_Drawing_Canvas* cCanvas)
155 {
156     Canvas* canvas = CastToCanvas(cCanvas);
157     if (canvas == nullptr) {
158         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
159         return;
160     }
161     canvas->DetachPen();
162 }
163 
OH_Drawing_CanvasAttachBrush(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Brush * cBrush)164 void OH_Drawing_CanvasAttachBrush(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Brush* cBrush)
165 {
166     if (cBrush == nullptr) {
167         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
168         return;
169     }
170     Canvas* canvas = CastToCanvas(cCanvas);
171     if (canvas == nullptr) {
172         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
173         return;
174     }
175     canvas->AttachBrush(CastToBrush(*cBrush));
176 }
177 
OH_Drawing_CanvasDetachBrush(OH_Drawing_Canvas * cCanvas)178 void OH_Drawing_CanvasDetachBrush(OH_Drawing_Canvas* cCanvas)
179 {
180     Canvas* canvas = CastToCanvas(cCanvas);
181     if (canvas == nullptr) {
182         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
183         return;
184     }
185     canvas->DetachBrush();
186 }
187 
OH_Drawing_CanvasSave(OH_Drawing_Canvas * cCanvas)188 void OH_Drawing_CanvasSave(OH_Drawing_Canvas* cCanvas)
189 {
190     Canvas* canvas = CastToCanvas(cCanvas);
191     if (canvas == nullptr) {
192         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
193         return;
194     }
195     canvas->Save();
196 }
197 
OH_Drawing_CanvasSaveLayer(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,const OH_Drawing_Brush * cBrush)198 void OH_Drawing_CanvasSaveLayer(OH_Drawing_Canvas* cCanvas,
199     const OH_Drawing_Rect* cRect, const OH_Drawing_Brush* cBrush)
200 {
201     Canvas* canvas = CastToCanvas(cCanvas);
202     if (canvas == nullptr) {
203         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
204         return;
205     }
206 
207     SaveLayerOps slr = SaveLayerOps(reinterpret_cast<const Drawing::Rect*>(cRect),
208         reinterpret_cast<const Drawing::Brush*>(cBrush));
209     canvas->SaveLayer(slr);
210 }
211 
OH_Drawing_CanvasRestore(OH_Drawing_Canvas * cCanvas)212 void OH_Drawing_CanvasRestore(OH_Drawing_Canvas* cCanvas)
213 {
214     Canvas* canvas = CastToCanvas(cCanvas);
215     if (canvas == nullptr) {
216         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
217         return;
218     }
219     canvas->Restore();
220 }
221 
OH_Drawing_CanvasGetSaveCount(OH_Drawing_Canvas * cCanvas)222 uint32_t OH_Drawing_CanvasGetSaveCount(OH_Drawing_Canvas* cCanvas)
223 {
224     Canvas* canvas = CastToCanvas(cCanvas);
225     if (canvas == nullptr) {
226         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
227         return 0;
228     }
229     return canvas->GetSaveCount();
230 }
231 
OH_Drawing_CanvasRestoreToCount(OH_Drawing_Canvas * cCanvas,uint32_t saveCount)232 void OH_Drawing_CanvasRestoreToCount(OH_Drawing_Canvas* cCanvas, uint32_t saveCount)
233 {
234     Canvas* canvas = CastToCanvas(cCanvas);
235     if (canvas == nullptr) {
236         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
237         return;
238     }
239     canvas->RestoreToCount(saveCount);
240 }
241 
OH_Drawing_CanvasDrawLine(OH_Drawing_Canvas * cCanvas,float x1,float y1,float x2,float y2)242 void OH_Drawing_CanvasDrawLine(OH_Drawing_Canvas* cCanvas, float x1, float y1, float x2, float y2)
243 {
244     Canvas* canvas = CastToCanvas(cCanvas);
245     if (canvas == nullptr) {
246         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
247         return;
248     }
249     Point startPt(x1, y1);
250     Point endPt(x2, y2);
251     canvas->DrawLine(startPt, endPt);
252 }
253 
OH_Drawing_CanvasDrawPath(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Path * cPath)254 void OH_Drawing_CanvasDrawPath(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Path* cPath)
255 {
256     if (cPath == nullptr) {
257         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
258         return;
259     }
260     Canvas* canvas = CastToCanvas(cCanvas);
261     if (canvas == nullptr) {
262         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
263         return;
264     }
265     canvas->DrawPath(CastToPath(*cPath));
266 }
267 
OH_Drawing_CanvasDrawPoints(OH_Drawing_Canvas * cCanvas,OH_Drawing_PointMode mode,uint32_t count,const OH_Drawing_Point2D * pts)268 void OH_Drawing_CanvasDrawPoints(OH_Drawing_Canvas* cCanvas, OH_Drawing_PointMode mode,
269     uint32_t count, const OH_Drawing_Point2D* pts)
270 {
271     if (pts == nullptr || count == 0) {
272         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
273         return;
274     }
275     Canvas* canvas = CastToCanvas(cCanvas);
276     if (canvas == nullptr) {
277         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
278         return;
279     }
280 
281     if (mode < POINT_MODE_POINTS || mode > POINT_MODE_POLYGON) {
282         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
283         return;
284     }
285     const Point* points = reinterpret_cast<const Point*>(pts);
286     canvas->DrawPoints(static_cast<PointMode>(mode), count, points);
287 }
288 
OH_Drawing_CanvasDrawVertices(OH_Drawing_Canvas * cCanvas,OH_Drawing_VertexMode vertexMode,int32_t vertexCount,const OH_Drawing_Point2D * positions,const OH_Drawing_Point2D * texs,const uint32_t * colors,int32_t indexCount,const uint16_t * indices,OH_Drawing_BlendMode mode)289 void OH_Drawing_CanvasDrawVertices(OH_Drawing_Canvas* cCanvas, OH_Drawing_VertexMode vertexMode,
290     int32_t vertexCount, const OH_Drawing_Point2D* positions, const OH_Drawing_Point2D* texs,
291     const uint32_t* colors, int32_t indexCount, const uint16_t* indices, OH_Drawing_BlendMode mode)
292 {
293     // 3 means the minimum number of vertices required for a triangle
294     if (positions == nullptr || vertexCount < 3 || (indexCount < 3 && indexCount != 0)) {
295         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
296         return;
297     }
298 
299     Canvas* canvas = CastToCanvas(cCanvas);
300     if (canvas == nullptr) {
301         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
302         return;
303     }
304 
305     if (vertexMode < VERTEX_MODE_TRIANGLES || vertexMode > VERTEX_MODE_TRIANGLE_FAN) {
306         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
307         return;
308     }
309 
310     if (mode < BLEND_MODE_CLEAR || mode > BLEND_MODE_LUMINOSITY) {
311         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
312         return;
313     }
314 
315     Point* positionsPoint = new(std::nothrow) Point[vertexCount];
316     if (positionsPoint == nullptr) {
317         LOGE("OH_Drawing_CanvasDrawVertices: new position point failed.");
318         return;
319     }
320     for (int32_t i = 0; i < vertexCount; ++i) {
321         positionsPoint[i] = CastToPoint(positions[i]);
322     }
323 
324     Point* texsPoint = nullptr;
325     if (texs != nullptr) {
326         texsPoint = new(std::nothrow) Point[vertexCount];
327         if (texsPoint == nullptr) {
328             delete [] positionsPoint;
329             LOGE("OH_Drawing_CanvasDrawVertices: new texs point failed.");
330             return;
331         }
332         for (int32_t i = 0; i < vertexCount; i++) {
333             texsPoint[i] = CastToPoint(texs[i]);
334         }
335     }
336 
337     Vertices* vertices = new Vertices();
338     bool result = vertices->MakeCopy(static_cast<VertexMode>(vertexMode), vertexCount, positionsPoint,
339         texsPoint, colors, indices ? indexCount : 0, indices);
340     if (result) {
341         canvas->DrawVertices(*vertices, static_cast<BlendMode>(mode));
342     }
343     delete vertices;
344     delete [] positionsPoint;
345     delete [] texsPoint;
346 }
347 
OH_Drawing_CanvasDrawBackground(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Brush * cBrush)348 void OH_Drawing_CanvasDrawBackground(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Brush* cBrush)
349 {
350     if (cBrush == nullptr) {
351         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
352         return;
353     }
354     Canvas* canvas = CastToCanvas(cCanvas);
355     if (canvas == nullptr) {
356         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
357         return;
358     }
359     canvas->DrawBackground(CastToBrush(*cBrush));
360 }
361 
OH_Drawing_CanvasDrawRegion(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Region * cRegion)362 void OH_Drawing_CanvasDrawRegion(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Region* cRegion)
363 {
364     if (cRegion == nullptr) {
365         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
366         return;
367     }
368     Canvas* canvas = CastToCanvas(cCanvas);
369     if (canvas == nullptr) {
370         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
371         return;
372     }
373     canvas->DrawRegion(CastToRegion(*cRegion));
374 }
375 
OH_Drawing_CanvasDrawBitmap(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Bitmap * cBitmap,float left,float top)376 void OH_Drawing_CanvasDrawBitmap(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Bitmap* cBitmap, float left, float top)
377 {
378     if (cBitmap == nullptr) {
379         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
380         return;
381     }
382     Canvas* canvas = CastToCanvas(cCanvas);
383     if (canvas == nullptr) {
384         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
385         return;
386     }
387     canvas->DrawBitmap(CastToBitmap(*cBitmap), left, top);
388 }
389 
OH_Drawing_CanvasDrawPixelMapRect(OH_Drawing_Canvas * cCanvas,OH_Drawing_PixelMap * pixelMap,const OH_Drawing_Rect * src,const OH_Drawing_Rect * dst,const OH_Drawing_SamplingOptions * cSampingOptions)390 void OH_Drawing_CanvasDrawPixelMapRect(OH_Drawing_Canvas* cCanvas, OH_Drawing_PixelMap* pixelMap,
391     const OH_Drawing_Rect* src, const OH_Drawing_Rect* dst, const OH_Drawing_SamplingOptions* cSampingOptions)
392 {
393 #ifdef OHOS_PLATFORM
394     std::shared_ptr<Media::PixelMap> p = nullptr;
395     switch (NativePixelMapManager::GetInstance().GetNativePixelMapType(pixelMap)) {
396         case NativePixelMapType::OBJECT_FROM_C:
397             if (pixelMap) {
398                 p = reinterpret_cast<OH_PixelmapNative*>(pixelMap)->GetInnerPixelmap();
399             }
400             break;
401         case NativePixelMapType::OBJECT_FROM_JS:
402             p = Media::PixelMapNative_GetPixelMap(reinterpret_cast<NativePixelMap_*>(pixelMap));
403             break;
404         default:
405             break;
406     }
407     DrawingCanvasUtils::DrawPixelMapRect(CastToCanvas(cCanvas), p,
408         reinterpret_cast<const Drawing::Rect*>(src), reinterpret_cast<const Drawing::Rect*>(dst),
409         reinterpret_cast<const Drawing::SamplingOptions*>(cSampingOptions));
410 #endif
411 }
412 
OH_Drawing_CanvasDrawBitmapRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Bitmap * cBitmap,const OH_Drawing_Rect * src,const OH_Drawing_Rect * dst,const OH_Drawing_SamplingOptions * cSampling)413 void OH_Drawing_CanvasDrawBitmapRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Bitmap* cBitmap,
414     const OH_Drawing_Rect* src, const OH_Drawing_Rect* dst, const OH_Drawing_SamplingOptions* cSampling)
415 {
416     Canvas* canvas = CastToCanvas(cCanvas);
417     if (canvas == nullptr || cBitmap == nullptr || dst == nullptr) {
418         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
419         return;
420     }
421     const Bitmap& bitmap = CastToBitmap(*cBitmap);
422     auto image = bitmap.MakeImage();
423     if (image == nullptr) {
424         return;
425     }
426     if (src == nullptr) {
427         canvas->DrawImageRect(*image, CastToRect(*dst),
428             cSampling ? CastToSamplingOptions(*cSampling) : Drawing::SamplingOptions());
429     } else {
430         canvas->DrawImageRect(*image, CastToRect(*src),
431             CastToRect(*dst), cSampling ? CastToSamplingOptions(*cSampling) : Drawing::SamplingOptions());
432     }
433 }
434 
OH_Drawing_CanvasDrawRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect)435 void OH_Drawing_CanvasDrawRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect)
436 {
437     if (cRect == nullptr) {
438         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
439         return;
440     }
441     Canvas* canvas = CastToCanvas(cCanvas);
442     if (canvas == nullptr) {
443         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
444         return;
445     }
446     canvas->DrawRect(CastToRect(*cRect));
447 }
448 
OH_Drawing_CanvasDrawCircle(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Point * cPoint,float radius)449 void OH_Drawing_CanvasDrawCircle(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Point* cPoint, float radius)
450 {
451     if (cPoint == nullptr) {
452         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
453         return;
454     }
455     if (radius <= 0) {
456         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
457         return;
458     }
459     Canvas* canvas = CastToCanvas(cCanvas);
460     if (canvas == nullptr) {
461         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
462         return;
463     }
464     canvas->DrawCircle(CastToPoint(*cPoint), radius);
465 }
466 
OH_Drawing_CanvasDrawOval(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect)467 void OH_Drawing_CanvasDrawOval(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect)
468 {
469     if (cRect == nullptr) {
470         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
471         return;
472     }
473     Canvas* canvas = CastToCanvas(cCanvas);
474     if (canvas == nullptr) {
475         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
476         return;
477     }
478     canvas->DrawOval(CastToRect(*cRect));
479 }
480 
OH_Drawing_CanvasDrawArc(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,float startAngle,float sweepAngle)481 void OH_Drawing_CanvasDrawArc(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect,
482     float startAngle, float sweepAngle)
483 {
484     if (cRect == nullptr) {
485         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
486         return;
487     }
488     Canvas* canvas = CastToCanvas(cCanvas);
489     if (canvas == nullptr) {
490         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
491         return;
492     }
493     canvas->DrawArc(CastToRect(*cRect), startAngle, sweepAngle);
494 }
495 
OH_Drawing_CanvasDrawRoundRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_RoundRect * cRoundRect)496 void OH_Drawing_CanvasDrawRoundRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_RoundRect* cRoundRect)
497 {
498     if (cRoundRect == nullptr) {
499         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
500         return;
501     }
502     Canvas* canvas = CastToCanvas(cCanvas);
503     if (canvas == nullptr) {
504         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
505         return;
506     }
507     canvas->DrawRoundRect(CastToRoundRect(*cRoundRect));
508 }
509 
OH_Drawing_CanvasDrawSingleCharacter(OH_Drawing_Canvas * cCanvas,const char * str,const OH_Drawing_Font * cFont,float x,float y)510 OH_Drawing_ErrorCode OH_Drawing_CanvasDrawSingleCharacter(OH_Drawing_Canvas* cCanvas, const char* str,
511     const OH_Drawing_Font* cFont, float x, float y)
512 {
513     if (str == nullptr || cFont == nullptr) {
514         return OH_DRAWING_ERROR_INVALID_PARAMETER;
515     }
516     Canvas* canvas = CastToCanvas(cCanvas);
517     if (canvas == nullptr) {
518         return OH_DRAWING_ERROR_INVALID_PARAMETER;
519     }
520     size_t len = strlen(str);
521     if (len == 0) {
522         return OH_DRAWING_ERROR_INVALID_PARAMETER;
523     }
524     const char* currentStr = str;
525     int32_t unicode = SkUTF::NextUTF8(&currentStr, currentStr + len);
526     canvas->DrawSingleCharacter(unicode, CastToFont(*cFont), x, y);
527     return OH_DRAWING_SUCCESS;
528 }
529 
OH_Drawing_CanvasDrawTextBlob(OH_Drawing_Canvas * cCanvas,const OH_Drawing_TextBlob * cTextBlob,float x,float y)530 void OH_Drawing_CanvasDrawTextBlob(OH_Drawing_Canvas* cCanvas, const OH_Drawing_TextBlob* cTextBlob, float x, float y)
531 {
532     if (cTextBlob == nullptr) {
533         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
534         return;
535     }
536     Canvas* canvas = CastToCanvas(cCanvas);
537     if (canvas == nullptr) {
538         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
539         return;
540     }
541     canvas->DrawTextBlob(CastToTextBlob(cTextBlob), x, y);
542 }
543 
OH_Drawing_CanvasClipRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,OH_Drawing_CanvasClipOp cClipOp,bool doAntiAlias)544 void OH_Drawing_CanvasClipRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect,
545     OH_Drawing_CanvasClipOp cClipOp, bool doAntiAlias)
546 {
547     if (cRect == nullptr) {
548         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
549         return;
550     }
551     Canvas* canvas = CastToCanvas(cCanvas);
552     if (canvas == nullptr) {
553         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
554         return;
555     }
556 
557     if (cClipOp < DIFFERENCE || cClipOp > INTERSECT) {
558         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
559         return;
560     }
561     canvas->ClipRect(CastToRect(*cRect), static_cast<ClipOp>(cClipOp), doAntiAlias);
562 }
563 
OH_Drawing_CanvasClipRoundRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_RoundRect * cRoundRect,OH_Drawing_CanvasClipOp cClipOp,bool doAntiAlias)564 void OH_Drawing_CanvasClipRoundRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_RoundRect* cRoundRect,
565     OH_Drawing_CanvasClipOp cClipOp, bool doAntiAlias)
566 {
567     if (cRoundRect == nullptr) {
568         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
569         return;
570     }
571     Canvas* canvas = CastToCanvas(cCanvas);
572     if (canvas == nullptr) {
573         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
574         return;
575     }
576 
577     if (cClipOp < DIFFERENCE || cClipOp > INTERSECT) {
578         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
579         return;
580     }
581     canvas->ClipRoundRect(CastToRoundRect(*cRoundRect), static_cast<ClipOp>(cClipOp), doAntiAlias);
582 }
583 
OH_Drawing_CanvasClipPath(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Path * cPath,OH_Drawing_CanvasClipOp cClipOp,bool doAntiAlias)584 void OH_Drawing_CanvasClipPath(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Path* cPath,
585     OH_Drawing_CanvasClipOp cClipOp, bool doAntiAlias)
586 {
587     if (cPath == nullptr) {
588         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
589         return;
590     }
591     Canvas* canvas = CastToCanvas(cCanvas);
592     if (canvas == nullptr) {
593         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
594         return;
595     }
596 
597     if (cClipOp < DIFFERENCE || cClipOp > INTERSECT) {
598         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
599         return;
600     }
601     canvas->ClipPath(CastToPath(*cPath), static_cast<ClipOp>(cClipOp), doAntiAlias);
602 }
603 
OH_Drawing_CanvasRotate(OH_Drawing_Canvas * cCanvas,float degrees,float px,float py)604 void OH_Drawing_CanvasRotate(OH_Drawing_Canvas* cCanvas, float degrees, float px, float py)
605 {
606     Canvas* canvas = CastToCanvas(cCanvas);
607     if (canvas == nullptr) {
608         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
609         return;
610     }
611     canvas->Rotate(degrees, px, py);
612 }
613 
OH_Drawing_CanvasTranslate(OH_Drawing_Canvas * cCanvas,float dx,float dy)614 void OH_Drawing_CanvasTranslate(OH_Drawing_Canvas* cCanvas, float dx, float dy)
615 {
616     Canvas* canvas = CastToCanvas(cCanvas);
617     if (canvas == nullptr) {
618         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
619         return;
620     }
621     canvas->Translate(dx, dy);
622 }
623 
OH_Drawing_CanvasScale(OH_Drawing_Canvas * cCanvas,float sx,float sy)624 void OH_Drawing_CanvasScale(OH_Drawing_Canvas* cCanvas, float sx, float sy)
625 {
626     Canvas* canvas = CastToCanvas(cCanvas);
627     if (canvas == nullptr) {
628         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
629         return;
630     }
631     canvas->Scale(sx, sy);
632 }
633 
OH_Drawing_CanvasSkew(OH_Drawing_Canvas * cCanvas,float sx,float sy)634 void OH_Drawing_CanvasSkew(OH_Drawing_Canvas* cCanvas, float sx, float sy)
635 {
636     Canvas* canvas = CastToCanvas(cCanvas);
637     if (canvas == nullptr) {
638         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
639         return;
640     }
641     canvas->Shear(sx, sy);
642 }
643 
OH_Drawing_CanvasClear(OH_Drawing_Canvas * cCanvas,uint32_t color)644 void OH_Drawing_CanvasClear(OH_Drawing_Canvas* cCanvas, uint32_t color)
645 {
646     Canvas* canvas = CastToCanvas(cCanvas);
647     if (canvas == nullptr) {
648         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
649         return;
650     }
651     canvas->Clear(color);
652 }
653 
OH_Drawing_CanvasGetWidth(OH_Drawing_Canvas * cCanvas)654 int32_t OH_Drawing_CanvasGetWidth(OH_Drawing_Canvas* cCanvas)
655 {
656     Canvas* canvas = CastToCanvas(cCanvas);
657     if (canvas == nullptr) {
658         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
659         return 0;
660     }
661     return canvas->GetWidth();
662 }
663 
OH_Drawing_CanvasGetHeight(OH_Drawing_Canvas * cCanvas)664 int32_t OH_Drawing_CanvasGetHeight(OH_Drawing_Canvas* cCanvas)
665 {
666     Canvas* canvas = CastToCanvas(cCanvas);
667     if (canvas == nullptr) {
668         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
669         return 0;
670     }
671     return canvas->GetHeight();
672 }
673 
OH_Drawing_CanvasGetLocalClipBounds(OH_Drawing_Canvas * cCanvas,OH_Drawing_Rect * cRect)674 void OH_Drawing_CanvasGetLocalClipBounds(OH_Drawing_Canvas* cCanvas, OH_Drawing_Rect* cRect)
675 {
676     if (cRect == nullptr) {
677         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
678         return;
679     }
680     Canvas* canvas = CastToCanvas(cCanvas);
681     if (canvas == nullptr) {
682         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
683         return;
684     }
685     Drawing::Rect rect = canvas->GetLocalClipBounds();
686     Drawing::Rect* outRect = reinterpret_cast<Drawing::Rect*>(cRect);
687     *outRect = rect;
688 }
689 
OH_Drawing_CanvasGetTotalMatrix(OH_Drawing_Canvas * cCanvas,OH_Drawing_Matrix * cMatrix)690 void OH_Drawing_CanvasGetTotalMatrix(OH_Drawing_Canvas* cCanvas, OH_Drawing_Matrix* cMatrix)
691 {
692     Canvas* canvas = CastToCanvas(cCanvas);
693     if (canvas == nullptr || cMatrix == nullptr) {
694         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
695         return;
696     }
697     Matrix matrix = canvas->GetTotalMatrix();
698     Matrix* outMatrix = reinterpret_cast<Matrix*>(cMatrix);
699     *outMatrix = matrix;
700 }
701 
OH_Drawing_CanvasConcatMatrix(OH_Drawing_Canvas * cCanvas,OH_Drawing_Matrix * cMatrix)702 void OH_Drawing_CanvasConcatMatrix(OH_Drawing_Canvas* cCanvas, OH_Drawing_Matrix* cMatrix)
703 {
704     Canvas* canvas = CastToCanvas(cCanvas);
705     if (canvas == nullptr || cMatrix == nullptr) {
706         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
707         return;
708     }
709     canvas->ConcatMatrix(*reinterpret_cast<Matrix*>(cMatrix));
710 }
711 
OH_Drawing_CanvasDrawShadow(OH_Drawing_Canvas * cCanvas,OH_Drawing_Path * cPath,OH_Drawing_Point3D cPlaneParams,OH_Drawing_Point3D cDevLightPos,float lightRadius,uint32_t ambientColor,uint32_t spotColor,OH_Drawing_CanvasShadowFlags flag)712 void OH_Drawing_CanvasDrawShadow(OH_Drawing_Canvas* cCanvas, OH_Drawing_Path* cPath, OH_Drawing_Point3D cPlaneParams,
713     OH_Drawing_Point3D cDevLightPos, float lightRadius, uint32_t ambientColor, uint32_t spotColor,
714     OH_Drawing_CanvasShadowFlags flag)
715 {
716     Canvas* canvas = CastToCanvas(cCanvas);
717     if (canvas == nullptr || cPath == nullptr) {
718         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
719         return;
720     }
721     if (flag < SHADOW_FLAGS_NONE || flag > SHADOW_FLAGS_ALL) {
722         g_drawingErrorCode = OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
723         return;
724     }
725     canvas->DrawShadow(*reinterpret_cast<Path*>(cPath), CastToPoint3(cPlaneParams),
726         CastToPoint3(cDevLightPos), lightRadius, Color(ambientColor), Color(spotColor),
727         static_cast<ShadowFlags>(flag));
728 }
729 
OH_Drawing_CanvasSetMatrix(OH_Drawing_Canvas * cCanvas,OH_Drawing_Matrix * matrix)730 void OH_Drawing_CanvasSetMatrix(OH_Drawing_Canvas* cCanvas, OH_Drawing_Matrix* matrix)
731 {
732     Canvas* canvas = CastToCanvas(cCanvas);
733     if (canvas == nullptr || matrix == nullptr) {
734         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
735         return;
736     }
737     canvas->SetMatrix(CastToMatrix(*matrix));
738 }
739 
OH_Drawing_CanvasResetMatrix(OH_Drawing_Canvas * cCanvas)740 void OH_Drawing_CanvasResetMatrix(OH_Drawing_Canvas* cCanvas)
741 {
742     Canvas* canvas = CastToCanvas(cCanvas);
743     if (canvas == nullptr) {
744         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
745         return;
746     }
747     canvas->ResetMatrix();
748 }
749 
OH_Drawing_CanvasDrawImageRectWithSrc(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Image * cImage,const OH_Drawing_Rect * src,const OH_Drawing_Rect * dst,const OH_Drawing_SamplingOptions * cSampling,OH_Drawing_SrcRectConstraint constraint)750 void OH_Drawing_CanvasDrawImageRectWithSrc(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Image* cImage,
751     const OH_Drawing_Rect* src, const OH_Drawing_Rect* dst, const OH_Drawing_SamplingOptions* cSampling,
752     OH_Drawing_SrcRectConstraint constraint)
753 {
754     Canvas* canvas = CastToCanvas(cCanvas);
755     if (canvas == nullptr || cImage == nullptr || src == nullptr || dst == nullptr) {
756         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
757         return;
758     }
759     canvas->DrawImageRect(CastToImage(*cImage), CastToRect(*src), CastToRect(*dst), cSampling
760         ? CastToSamplingOptions(*cSampling) : Drawing::SamplingOptions(), static_cast<SrcRectConstraint>(constraint));
761 }
762 
OH_Drawing_CanvasDrawImageRect(OH_Drawing_Canvas * cCanvas,OH_Drawing_Image * cImage,OH_Drawing_Rect * dst,OH_Drawing_SamplingOptions * cSampling)763 void OH_Drawing_CanvasDrawImageRect(OH_Drawing_Canvas* cCanvas, OH_Drawing_Image* cImage, OH_Drawing_Rect* dst,
764     OH_Drawing_SamplingOptions* cSampling)
765 {
766     Canvas* canvas = CastToCanvas(cCanvas);
767     if (canvas == nullptr || cImage == nullptr || dst == nullptr) {
768         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
769         return;
770     }
771     canvas->DrawImageRect(CastToImage(*cImage), CastToRect(*dst),
772         cSampling ? CastToSamplingOptions(*cSampling) : Drawing::SamplingOptions());
773 }
774 
OH_Drawing_CanvasReadPixels(OH_Drawing_Canvas * cCanvas,OH_Drawing_Image_Info * cImageInfo,void * dstPixels,uint32_t dstRowBytes,int32_t srcX,int32_t srcY)775 bool OH_Drawing_CanvasReadPixels(OH_Drawing_Canvas* cCanvas, OH_Drawing_Image_Info* cImageInfo,
776     void* dstPixels, uint32_t dstRowBytes, int32_t srcX, int32_t srcY)
777 {
778     Canvas* canvas = CastToCanvas(cCanvas);
779     if (canvas == nullptr || cImageInfo == nullptr || dstPixels == nullptr) {
780         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
781         return false;
782     }
783     ImageInfo imageInfo(cImageInfo->width, cImageInfo->height,
784         static_cast<ColorType>(cImageInfo->colorType), static_cast<AlphaType>(cImageInfo->alphaType));
785     return canvas->ReadPixels(imageInfo, dstPixels, dstRowBytes, srcX, srcY);
786 }
787 
OH_Drawing_CanvasReadPixelsToBitmap(OH_Drawing_Canvas * cCanvas,OH_Drawing_Bitmap * cBitmap,int32_t srcX,int32_t srcY)788 bool OH_Drawing_CanvasReadPixelsToBitmap(OH_Drawing_Canvas* cCanvas, OH_Drawing_Bitmap* cBitmap,
789     int32_t srcX, int32_t srcY)
790 {
791     Canvas* canvas = CastToCanvas(cCanvas);
792     if (canvas == nullptr || cBitmap == nullptr) {
793         g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
794         return false;
795     }
796     return canvas->ReadPixels(CastToBitmap(*cBitmap), srcX, srcY);
797 }
798 
OH_Drawing_CanvasIsClipEmpty(OH_Drawing_Canvas * cCanvas,bool * isClipEmpty)799 OH_Drawing_ErrorCode OH_Drawing_CanvasIsClipEmpty(OH_Drawing_Canvas* cCanvas, bool* isClipEmpty)
800 {
801     if (isClipEmpty == nullptr) {
802         return OH_DRAWING_ERROR_INVALID_PARAMETER;
803     }
804     Canvas* canvas = CastToCanvas(cCanvas);
805     if (canvas == nullptr) {
806         return OH_DRAWING_ERROR_INVALID_PARAMETER;
807     }
808     *isClipEmpty = canvas->IsClipEmpty();
809     return OH_DRAWING_SUCCESS;
810 }
811 
OH_Drawing_CanvasGetImageInfo(OH_Drawing_Canvas * cCanvas,OH_Drawing_Image_Info * cImageInfo)812 OH_Drawing_ErrorCode OH_Drawing_CanvasGetImageInfo(OH_Drawing_Canvas* cCanvas, OH_Drawing_Image_Info* cImageInfo)
813 {
814     if (cCanvas == nullptr || cImageInfo == nullptr) {
815         return OH_DRAWING_ERROR_INVALID_PARAMETER;
816     }
817     ImageInfo imageInfo = CastToCanvas(cCanvas)->GetImageInfo();
818 
819     cImageInfo->width = imageInfo.GetWidth();
820     cImageInfo->height = imageInfo.GetHeight();
821     cImageInfo->colorType = static_cast<OH_Drawing_ColorFormat>(imageInfo.GetColorType());
822     cImageInfo->alphaType = static_cast<OH_Drawing_AlphaFormat>(imageInfo.GetAlphaType());
823     return OH_DRAWING_SUCCESS;
824 }
825 
OH_Drawing_CanvasClipRegion(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Region * cRegion,OH_Drawing_CanvasClipOp op)826 OH_Drawing_ErrorCode OH_Drawing_CanvasClipRegion(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Region* cRegion,
827     OH_Drawing_CanvasClipOp op)
828 {
829     if (cRegion == nullptr) {
830         return OH_DRAWING_ERROR_INVALID_PARAMETER;
831     }
832     Canvas* canvas = CastToCanvas(cCanvas);
833     if (canvas == nullptr) {
834         return OH_DRAWING_ERROR_INVALID_PARAMETER;
835     }
836 
837     if (op < DIFFERENCE || op > INTERSECT) {
838         return OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
839     }
840     canvas->ClipRegion(CastToRegion(*cRegion), static_cast<ClipOp>(op));
841     return OH_DRAWING_SUCCESS;
842 }
843 
OH_Drawing_CanvasDrawPoint(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Point2D * cPoint)844 OH_Drawing_ErrorCode OH_Drawing_CanvasDrawPoint(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Point2D* cPoint)
845 {
846     if (cPoint == nullptr) {
847         return OH_DRAWING_ERROR_INVALID_PARAMETER;
848     }
849     Canvas* canvas = CastToCanvas(cCanvas);
850     if (canvas == nullptr) {
851         return OH_DRAWING_ERROR_INVALID_PARAMETER;
852     }
853     canvas->DrawPoint(CastToPoint(*cPoint));
854     return OH_DRAWING_SUCCESS;
855 }
856 
OH_Drawing_CanvasDrawColor(OH_Drawing_Canvas * cCanvas,uint32_t color,OH_Drawing_BlendMode cBlendMode)857 OH_Drawing_ErrorCode OH_Drawing_CanvasDrawColor(OH_Drawing_Canvas* cCanvas, uint32_t color,
858     OH_Drawing_BlendMode cBlendMode)
859 {
860     Canvas* canvas = CastToCanvas(cCanvas);
861     if (canvas == nullptr) {
862         return OH_DRAWING_ERROR_INVALID_PARAMETER;
863     }
864 
865     if (cBlendMode < BLEND_MODE_CLEAR || cBlendMode > BLEND_MODE_LUMINOSITY) {
866         return OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE;
867     }
868 
869     canvas->DrawColor(color, static_cast<BlendMode>(cBlendMode));
870     return OH_DRAWING_SUCCESS;
871 }
872 
OH_Drawing_CanvasDrawRecordCmd(OH_Drawing_Canvas * cCanvas,OH_Drawing_RecordCmd * cRecordCmd)873 OH_Drawing_ErrorCode OH_Drawing_CanvasDrawRecordCmd(OH_Drawing_Canvas* cCanvas,
874     OH_Drawing_RecordCmd* cRecordCmd)
875 {
876     if (cCanvas == nullptr || cRecordCmd == nullptr) {
877         return OH_DRAWING_ERROR_INVALID_PARAMETER;
878     }
879     Canvas* canvas = CastToCanvas(cCanvas);
880     auto recordCmdHandle = Helper::CastTo<OH_Drawing_RecordCmd*, NativeHandle<RecordCmd>*>(cRecordCmd);
881     if (recordCmdHandle->value == nullptr) {
882         return OH_DRAWING_ERROR_INVALID_PARAMETER;
883     }
884     canvas->DrawRecordCmd(recordCmdHandle->value);
885     return OH_DRAWING_SUCCESS;
886 }