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(¤tStr, 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 }