• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "c/drawing_canvas.h"
17 
18 #include "draw/canvas.h"
19 
20 using namespace OHOS;
21 using namespace Rosen;
22 using namespace Drawing;
23 
CastToCanvas(OH_Drawing_Canvas * cCanvas)24 static Canvas* CastToCanvas(OH_Drawing_Canvas* cCanvas)
25 {
26     return reinterpret_cast<Canvas*>(cCanvas);
27 }
28 
CastToPath(const OH_Drawing_Path & cPath)29 static const Path& CastToPath(const OH_Drawing_Path& cPath)
30 {
31     return reinterpret_cast<const Path&>(cPath);
32 }
33 
CastToBrush(const OH_Drawing_Brush & cBrush)34 static const Brush& CastToBrush(const OH_Drawing_Brush& cBrush)
35 {
36     return reinterpret_cast<const Brush&>(cBrush);
37 }
38 
CastToPen(const OH_Drawing_Pen & cPen)39 static const Pen& CastToPen(const OH_Drawing_Pen& cPen)
40 {
41     return reinterpret_cast<const Pen&>(cPen);
42 }
43 
CastToBitmap(const OH_Drawing_Bitmap & cBitmap)44 static const Bitmap& CastToBitmap(const OH_Drawing_Bitmap& cBitmap)
45 {
46     return reinterpret_cast<const Bitmap&>(cBitmap);
47 }
48 
CastToRect(const OH_Drawing_Rect & cRect)49 static const Rect& CastToRect(const OH_Drawing_Rect& cRect)
50 {
51     return reinterpret_cast<const Rect&>(cRect);
52 }
53 
CastToPoint(const OH_Drawing_Point & cPoint)54 static const Point& CastToPoint(const OH_Drawing_Point& cPoint)
55 {
56     return reinterpret_cast<const Point&>(cPoint);
57 }
58 
CastToRoundRect(const OH_Drawing_RoundRect & cRoundRect)59 static const RoundRect& CastToRoundRect(const OH_Drawing_RoundRect& cRoundRect)
60 {
61     return reinterpret_cast<const RoundRect&>(cRoundRect);
62 }
63 
CastToTextBlob(const OH_Drawing_TextBlob * cTextBlob)64 static const TextBlob* CastToTextBlob(const OH_Drawing_TextBlob* cTextBlob)
65 {
66     return reinterpret_cast<const TextBlob*>(cTextBlob);
67 }
68 
CastToMatrix(const OH_Drawing_Matrix & cMatrix)69 static const Matrix& CastToMatrix(const OH_Drawing_Matrix& cMatrix)
70 {
71     return reinterpret_cast<const Matrix&>(cMatrix);
72 }
73 
CastToImage(const OH_Drawing_Image & cImage)74 static const Image& CastToImage(const OH_Drawing_Image& cImage)
75 {
76     return reinterpret_cast<const Image&>(cImage);
77 }
78 
CastToSamplingOptions(const OH_Drawing_SamplingOptions & cSamplingOptions)79 static const SamplingOptions& CastToSamplingOptions(const OH_Drawing_SamplingOptions& cSamplingOptions)
80 {
81     return reinterpret_cast<const SamplingOptions&>(cSamplingOptions);
82 }
83 
OH_Drawing_CanvasCreate()84 OH_Drawing_Canvas* OH_Drawing_CanvasCreate()
85 {
86     return (OH_Drawing_Canvas*)new Canvas;
87 }
88 
OH_Drawing_CanvasDestroy(OH_Drawing_Canvas * cCanvas)89 void OH_Drawing_CanvasDestroy(OH_Drawing_Canvas* cCanvas)
90 {
91     delete CastToCanvas(cCanvas);
92 }
93 
OH_Drawing_CanvasBind(OH_Drawing_Canvas * cCanvas,OH_Drawing_Bitmap * cBitmap)94 void OH_Drawing_CanvasBind(OH_Drawing_Canvas* cCanvas, OH_Drawing_Bitmap* cBitmap)
95 {
96     if (cBitmap == nullptr) {
97         return;
98     }
99     Canvas* canvas = CastToCanvas(cCanvas);
100     if (canvas == nullptr) {
101         return;
102     }
103     canvas->Bind(CastToBitmap(*cBitmap));
104 }
105 
OH_Drawing_CanvasAttachPen(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Pen * cPen)106 void OH_Drawing_CanvasAttachPen(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Pen* cPen)
107 {
108     if (cPen == nullptr) {
109         return;
110     }
111     Canvas* canvas = CastToCanvas(cCanvas);
112     if (canvas == nullptr) {
113         return;
114     }
115     canvas->AttachPen(CastToPen(*cPen));
116 }
117 
OH_Drawing_CanvasDetachPen(OH_Drawing_Canvas * cCanvas)118 void OH_Drawing_CanvasDetachPen(OH_Drawing_Canvas* cCanvas)
119 {
120     Canvas* canvas = CastToCanvas(cCanvas);
121     if (canvas == nullptr) {
122         return;
123     }
124     canvas->DetachPen();
125 }
126 
OH_Drawing_CanvasAttachBrush(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Brush * cBrush)127 void OH_Drawing_CanvasAttachBrush(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Brush* cBrush)
128 {
129     if (cBrush == nullptr) {
130         return;
131     }
132     Canvas* canvas = CastToCanvas(cCanvas);
133     if (canvas == nullptr) {
134         return;
135     }
136     canvas->AttachBrush(CastToBrush(*cBrush));
137 }
138 
OH_Drawing_CanvasDetachBrush(OH_Drawing_Canvas * cCanvas)139 void OH_Drawing_CanvasDetachBrush(OH_Drawing_Canvas* cCanvas)
140 {
141     Canvas* canvas = CastToCanvas(cCanvas);
142     if (canvas == nullptr) {
143         return;
144     }
145     canvas->DetachBrush();
146 }
147 
OH_Drawing_CanvasSave(OH_Drawing_Canvas * cCanvas)148 void OH_Drawing_CanvasSave(OH_Drawing_Canvas* cCanvas)
149 {
150     Canvas* canvas = CastToCanvas(cCanvas);
151     if (canvas == nullptr) {
152         return;
153     }
154     canvas->Save();
155 }
156 
OH_Drawing_CanvasSaveLayer(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,const OH_Drawing_Brush * cBrush)157 void OH_Drawing_CanvasSaveLayer(OH_Drawing_Canvas* cCanvas,
158     const OH_Drawing_Rect* cRect, const OH_Drawing_Brush* cBrush)
159 {
160     Canvas* canvas = CastToCanvas(cCanvas);
161     if (canvas == nullptr) {
162         return;
163     }
164 
165     std::unique_ptr<Rect> bounds = nullptr;
166     std::unique_ptr<Brush> brush = nullptr;
167     if (cRect != nullptr) {
168         bounds = std::make_unique<Rect>();
169         *bounds = CastToRect(*cRect);
170     }
171     if (cBrush != nullptr) {
172         brush = std::make_unique<Brush>();
173         *brush = CastToBrush(*cBrush);
174     }
175 
176     SaveLayerOps slr = SaveLayerOps(bounds.get(), brush.get());
177     canvas->SaveLayer(slr);
178 }
179 
OH_Drawing_CanvasRestore(OH_Drawing_Canvas * cCanvas)180 void OH_Drawing_CanvasRestore(OH_Drawing_Canvas* cCanvas)
181 {
182     Canvas* canvas = CastToCanvas(cCanvas);
183     if (canvas == nullptr) {
184         return;
185     }
186     canvas->Restore();
187 }
188 
OH_Drawing_CanvasGetSaveCount(OH_Drawing_Canvas * cCanvas)189 uint32_t OH_Drawing_CanvasGetSaveCount(OH_Drawing_Canvas* cCanvas)
190 {
191     Canvas* canvas = CastToCanvas(cCanvas);
192     if (canvas == nullptr) {
193         return 0;
194     }
195     return canvas->GetSaveCount();
196 }
197 
OH_Drawing_CanvasRestoreToCount(OH_Drawing_Canvas * cCanvas,uint32_t saveCount)198 void OH_Drawing_CanvasRestoreToCount(OH_Drawing_Canvas* cCanvas, uint32_t saveCount)
199 {
200     Canvas* canvas = CastToCanvas(cCanvas);
201     if (canvas == nullptr) {
202         return;
203     }
204     canvas->RestoreToCount(saveCount);
205 }
206 
OH_Drawing_CanvasDrawLine(OH_Drawing_Canvas * cCanvas,float x1,float y1,float x2,float y2)207 void OH_Drawing_CanvasDrawLine(OH_Drawing_Canvas* cCanvas, float x1, float y1, float x2, float y2)
208 {
209     Canvas* canvas = CastToCanvas(cCanvas);
210     if (canvas == nullptr) {
211         return;
212     }
213     Point startPt(x1, y1);
214     Point endPt(x2, y2);
215     canvas->DrawLine(startPt, endPt);
216 }
217 
OH_Drawing_CanvasDrawPath(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Path * cPath)218 void OH_Drawing_CanvasDrawPath(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Path* cPath)
219 {
220     if (cPath == nullptr) {
221         return;
222     }
223     Canvas* canvas = CastToCanvas(cCanvas);
224     if (canvas == nullptr) {
225         return;
226     }
227     canvas->DrawPath(CastToPath(*cPath));
228 }
229 
OH_Drawing_CanvasDrawBitmap(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Bitmap * cBitmap,float left,float top)230 void OH_Drawing_CanvasDrawBitmap(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Bitmap* cBitmap, float left, float top)
231 {
232     if (cBitmap == nullptr) {
233         return;
234     }
235     Canvas* canvas = CastToCanvas(cCanvas);
236     if (canvas == nullptr) {
237         return;
238     }
239     canvas->DrawBitmap(CastToBitmap(*cBitmap), left, top);
240 }
241 
OH_Drawing_CanvasDrawRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect)242 void OH_Drawing_CanvasDrawRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect)
243 {
244     if (cRect == nullptr) {
245         return;
246     }
247     Canvas* canvas = CastToCanvas(cCanvas);
248     if (canvas == nullptr) {
249         return;
250     }
251     canvas->DrawRect(CastToRect(*cRect));
252 }
253 
OH_Drawing_CanvasDrawCircle(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Point * cPoint,float radius)254 void OH_Drawing_CanvasDrawCircle(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Point* cPoint, float radius)
255 {
256     if (cPoint == nullptr) {
257         return;
258     }
259     Canvas* canvas = CastToCanvas(cCanvas);
260     if (canvas == nullptr) {
261         return;
262     }
263     canvas->DrawCircle(CastToPoint(*cPoint), radius);
264 }
265 
OH_Drawing_CanvasDrawOval(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect)266 void OH_Drawing_CanvasDrawOval(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect)
267 {
268     if (cRect == nullptr) {
269         return;
270     }
271     Canvas* canvas = CastToCanvas(cCanvas);
272     if (canvas == nullptr) {
273         return;
274     }
275     canvas->DrawOval(CastToRect(*cRect));
276 }
277 
OH_Drawing_CanvasDrawArc(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,float startAngle,float sweepAngle)278 void OH_Drawing_CanvasDrawArc(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect,
279     float startAngle, float sweepAngle)
280 {
281     if (cRect == nullptr) {
282         return;
283     }
284     Canvas* canvas = CastToCanvas(cCanvas);
285     if (canvas == nullptr) {
286         return;
287     }
288     canvas->DrawArc(CastToRect(*cRect), startAngle, sweepAngle);
289 }
290 
OH_Drawing_CanvasDrawRoundRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_RoundRect * cRoundRect)291 void OH_Drawing_CanvasDrawRoundRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_RoundRect* cRoundRect)
292 {
293     if (cRoundRect == nullptr) {
294         return;
295     }
296     Canvas* canvas = CastToCanvas(cCanvas);
297     if (canvas == nullptr) {
298         return;
299     }
300     canvas->DrawRoundRect(CastToRoundRect(*cRoundRect));
301 }
302 
OH_Drawing_CanvasDrawTextBlob(OH_Drawing_Canvas * cCanvas,const OH_Drawing_TextBlob * cTextBlob,float x,float y)303 void OH_Drawing_CanvasDrawTextBlob(OH_Drawing_Canvas* cCanvas, const OH_Drawing_TextBlob* cTextBlob, float x, float y)
304 {
305     if (cTextBlob == nullptr) {
306         return;
307     }
308     Canvas* canvas = CastToCanvas(cCanvas);
309     if (canvas == nullptr) {
310         return;
311     }
312     canvas->DrawTextBlob(CastToTextBlob(cTextBlob), x, y);
313 }
314 
CClipOpCastToClipOp(OH_Drawing_CanvasClipOp cClipOp)315 static ClipOp CClipOpCastToClipOp(OH_Drawing_CanvasClipOp cClipOp)
316 {
317     ClipOp clipOp = ClipOp::INTERSECT;
318     switch (cClipOp) {
319         case DIFFERENCE:
320             clipOp = ClipOp::DIFFERENCE;
321             break;
322         case INTERSECT:
323             clipOp = ClipOp::INTERSECT;
324             break;
325         default:
326             break;
327     }
328     return clipOp;
329 }
330 
OH_Drawing_CanvasClipRect(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Rect * cRect,OH_Drawing_CanvasClipOp cClipOp,bool doAntiAlias)331 void OH_Drawing_CanvasClipRect(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Rect* cRect,
332     OH_Drawing_CanvasClipOp cClipOp, bool doAntiAlias)
333 {
334     if (cRect == nullptr) {
335         return;
336     }
337     Canvas* canvas = CastToCanvas(cCanvas);
338     if (canvas == nullptr) {
339         return;
340     }
341     canvas->ClipRect(CastToRect(*cRect), CClipOpCastToClipOp(cClipOp), doAntiAlias);
342 }
343 
OH_Drawing_CanvasClipPath(OH_Drawing_Canvas * cCanvas,const OH_Drawing_Path * cPath,OH_Drawing_CanvasClipOp cClipOp,bool doAntiAlias)344 void OH_Drawing_CanvasClipPath(OH_Drawing_Canvas* cCanvas, const OH_Drawing_Path* cPath,
345     OH_Drawing_CanvasClipOp cClipOp, bool doAntiAlias)
346 {
347     if (cPath == nullptr) {
348         return;
349     }
350     Canvas* canvas = CastToCanvas(cCanvas);
351     if (canvas == nullptr) {
352         return;
353     }
354     canvas->ClipPath(CastToPath(*cPath), CClipOpCastToClipOp(cClipOp), doAntiAlias);
355 }
356 
OH_Drawing_CanvasRotate(OH_Drawing_Canvas * cCanvas,float degrees,float px,float py)357 void OH_Drawing_CanvasRotate(OH_Drawing_Canvas* cCanvas, float degrees, float px, float py)
358 {
359     Canvas* canvas = CastToCanvas(cCanvas);
360     if (canvas == nullptr) {
361         return;
362     }
363     canvas->Rotate(degrees, px, py);
364 }
365 
OH_Drawing_CanvasTranslate(OH_Drawing_Canvas * cCanvas,float dx,float dy)366 void OH_Drawing_CanvasTranslate(OH_Drawing_Canvas* cCanvas, float dx, float dy)
367 {
368     Canvas* canvas = CastToCanvas(cCanvas);
369     if (canvas == nullptr) {
370         return;
371     }
372     canvas->Translate(dx, dy);
373 }
374 
OH_Drawing_CanvasScale(OH_Drawing_Canvas * cCanvas,float sx,float sy)375 void OH_Drawing_CanvasScale(OH_Drawing_Canvas* cCanvas, float sx, float sy)
376 {
377     Canvas* canvas = CastToCanvas(cCanvas);
378     if (canvas == nullptr) {
379         return;
380     }
381     canvas->Scale(sx, sy);
382 }
383 
OH_Drawing_CanvasClear(OH_Drawing_Canvas * cCanvas,uint32_t color)384 void OH_Drawing_CanvasClear(OH_Drawing_Canvas* cCanvas, uint32_t color)
385 {
386     Canvas* canvas = CastToCanvas(cCanvas);
387     if (canvas == nullptr) {
388         return;
389     }
390     canvas->Clear(color);
391 }
392 
OH_Drawing_CanvasGetWidth(OH_Drawing_Canvas * cCanvas)393 int32_t OH_Drawing_CanvasGetWidth(OH_Drawing_Canvas* cCanvas)
394 {
395     Canvas* canvas = CastToCanvas(cCanvas);
396     if (canvas == nullptr) {
397         return 0;
398     }
399     return canvas->GetWidth();
400 }
401 
OH_Drawing_CanvasGetHeight(OH_Drawing_Canvas * cCanvas)402 int32_t OH_Drawing_CanvasGetHeight(OH_Drawing_Canvas* cCanvas)
403 {
404     Canvas* canvas = CastToCanvas(cCanvas);
405     if (canvas == nullptr) {
406         return 0;
407     }
408     return canvas->GetHeight();
409 }
410 
OH_Drawing_CanvasGetLocalClipBounds(OH_Drawing_Canvas * cCanvas)411 OH_Drawing_Rect* OH_Drawing_CanvasGetLocalClipBounds(OH_Drawing_Canvas* cCanvas)
412 {
413     Canvas* canvas = CastToCanvas(cCanvas);
414     if (canvas == nullptr) {
415         return nullptr;
416     }
417     OHOS::Rosen::Drawing::Rect rect = canvas->GetLocalClipBounds();
418     OH_Drawing_Rect* cRect = (OH_Drawing_Rect*)new Rect(rect);
419     return cRect;
420 }
421 
OH_Drawing_CanvasGetLocalToDevice(OH_Drawing_Canvas * cCanvas)422 OH_Drawing_Matrix* OH_Drawing_CanvasGetLocalToDevice(OH_Drawing_Canvas* cCanvas)
423 {
424     Canvas* canvas = CastToCanvas(cCanvas);
425     if (canvas == nullptr) {
426         return nullptr;
427     }
428     OHOS::Rosen::Drawing::Matrix matrix = canvas->GetTotalMatrix();
429     OH_Drawing_Matrix* cMatrix = (OH_Drawing_Matrix*)new Matrix(matrix);
430     return cMatrix;
431 }
432 
OH_Drawing_CanvasConcatMatrix(OH_Drawing_Canvas * cCanvas,OH_Drawing_Matrix * cMatrix)433 void OH_Drawing_CanvasConcatMatrix(OH_Drawing_Canvas* cCanvas, OH_Drawing_Matrix* cMatrix)
434 {
435     Canvas* canvas = CastToCanvas(cCanvas);
436     if (canvas == nullptr) {
437         return;
438     }
439     canvas->ConcatMatrix(*reinterpret_cast<OHOS::Rosen::Drawing::Matrix*>(cMatrix));
440 }
441 
CClipOpCastToClipOp(OH_Drawing_CanvasShadowFlags cFlag)442 static ShadowFlags CClipOpCastToClipOp(OH_Drawing_CanvasShadowFlags cFlag)
443 {
444     ShadowFlags shadowFlags = ShadowFlags::NONE;
445     switch (cFlag) {
446         case OH_Drawing_CanvasShadowFlags::SHADOW_FLAGS_NONE:
447             shadowFlags = ShadowFlags::NONE;
448             break;
449         case OH_Drawing_CanvasShadowFlags::SHADOW_FLAGS_TRANSPARENT_OCCLUDER:
450             shadowFlags = ShadowFlags::TRANSPARENT_OCCLUDER;
451             break;
452         case OH_Drawing_CanvasShadowFlags::SHADOW_FLAGS_GEOMETRIC_ONLY:
453             shadowFlags = ShadowFlags::GEOMETRIC_ONLY;
454             break;
455         case OH_Drawing_CanvasShadowFlags::SHADOW_FLAGS_ALL:
456             shadowFlags = ShadowFlags::ALL;
457             break;
458         default:
459             break;
460     }
461     return shadowFlags;
462 }
463 
OH_Drawing_CanvasDrawShadow(OH_Drawing_Canvas * cCanvas,OH_Drawing_Path * cPath,OH_Drawing_Point3 * planeParams,OH_Drawing_Point3 * devLightPos,float lightRadius,uint32_t ambientColor,uint32_t spotColor,OH_Drawing_CanvasShadowFlags flag)464 void OH_Drawing_CanvasDrawShadow(OH_Drawing_Canvas* cCanvas, OH_Drawing_Path* cPath, OH_Drawing_Point3* planeParams,
465     OH_Drawing_Point3* devLightPos, float lightRadius, uint32_t ambientColor, uint32_t spotColor,
466     OH_Drawing_CanvasShadowFlags flag)
467 {
468     Canvas* canvas = CastToCanvas(cCanvas);
469     if (canvas == nullptr) {
470         return;
471     }
472     canvas->DrawShadow(*reinterpret_cast<Path*>(cPath), *reinterpret_cast<Point3*>(planeParams),
473         *reinterpret_cast<Point3*>(devLightPos), lightRadius, Color(ambientColor), Color(spotColor),
474         CClipOpCastToClipOp(flag));
475 }
OH_Drawing_CanvasSetMatrix(OH_Drawing_Canvas * cCanvas,OH_Drawing_Matrix * matrix)476 void OH_Drawing_CanvasSetMatrix(OH_Drawing_Canvas* cCanvas, OH_Drawing_Matrix* matrix)
477 {
478     Canvas* canvas = CastToCanvas(cCanvas);
479     if (canvas == nullptr || matrix == nullptr) {
480         return;
481     }
482     canvas->SetMatrix(CastToMatrix(*matrix));
483 }
484 
OH_Drawing_CanvasDrawImageRect(OH_Drawing_Canvas * cCanvas,OH_Drawing_Image * cImage,OH_Drawing_Rect * dst,OH_Drawing_SamplingOptions * cSampingOptions)485 void OH_Drawing_CanvasDrawImageRect(OH_Drawing_Canvas* cCanvas, OH_Drawing_Image* cImage, OH_Drawing_Rect* dst,
486     OH_Drawing_SamplingOptions* cSampingOptions)
487 {
488     Canvas* canvas = CastToCanvas(cCanvas);
489     if (canvas == nullptr || cImage == nullptr || dst == nullptr || cSampingOptions == nullptr) {
490         return;
491     }
492     canvas->DrawImageRect(CastToImage(*cImage), CastToRect(*dst), CastToSamplingOptions(*cSampingOptions));
493 }
494 
OH_Drawing_CanvasReadPixels(OH_Drawing_Canvas * cCanvas,OH_Drawing_Image_Info * cImageInfo,void * dstPixels,uint32_t dstRowBytes,int32_t srcX,int32_t srcY)495 bool OH_Drawing_CanvasReadPixels(OH_Drawing_Canvas* cCanvas, OH_Drawing_Image_Info* cImageInfo,
496     void* dstPixels, uint32_t dstRowBytes, int32_t srcX, int32_t srcY)
497 {
498     Canvas* canvas = CastToCanvas(cCanvas);
499     if (canvas == nullptr || cImageInfo == nullptr || dstPixels == nullptr) {
500         return false;
501     }
502     ImageInfo imageInfo(cImageInfo->width, cImageInfo->height,
503         static_cast<ColorType>(cImageInfo->colorType), static_cast<AlphaType>(cImageInfo->alphaType));
504     return canvas->ReadPixels(imageInfo, dstPixels, dstRowBytes, srcX, srcY);
505 }
506 
OH_Drawing_CanvasReadPixelsToBitmap(OH_Drawing_Canvas * cCanvas,OH_Drawing_Bitmap * cBitmap,int32_t srcX,int32_t srcY)507 bool OH_Drawing_CanvasReadPixelsToBitmap(OH_Drawing_Canvas* cCanvas, OH_Drawing_Bitmap* cBitmap, int32_t srcX, int32_t srcY)
508 {
509     Canvas* canvas = CastToCanvas(cCanvas);
510     if (canvas == nullptr || cBitmap == nullptr) {
511         return false;
512     }
513     return canvas->ReadPixels(CastToBitmap(*cBitmap), srcX, srcY);
514 }