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 }