1 /*
2 * Copyright (c) 2022-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 "platform/ohos/overdraw/rs_listened_canvas.h"
17
18 #include "platform/common/rs_log.h"
19 #include "platform/ohos/overdraw/rs_canvas_listener.h"
20
21 namespace OHOS {
22 namespace Rosen {
23 #ifndef USE_ROSEN_DRAWING
RSListenedCanvas(SkCanvas * canvas,float alpha)24 RSListenedCanvas::RSListenedCanvas(SkCanvas* canvas, float alpha)
25 : RSPaintFilterCanvas(canvas, alpha)
26 {
27 }
28
RSListenedCanvas(SkSurface * skSurface,float alpha)29 RSListenedCanvas::RSListenedCanvas(SkSurface* skSurface, float alpha)
30 : RSPaintFilterCanvas(skSurface, alpha)
31 {
32 }
33 #else
34 RSListenedCanvas::RSListenedCanvas(Drawing::Canvas& canvas, float alpha)
35 : RSPaintFilterCanvas(&canvas, alpha)
36 {
37 }
38
39 RSListenedCanvas::RSListenedCanvas(Drawing::Surface& surface, float alpha)
40 : RSPaintFilterCanvas(&surface, alpha)
41 {
42 }
43 #endif
44
SetListener(const std::shared_ptr<RSCanvasListener> & listener)45 void RSListenedCanvas::SetListener(const std::shared_ptr<RSCanvasListener> &listener)
46 {
47 listener_ = listener;
48 }
49
50 #ifndef USE_ROSEN_DRAWING
onDrawPaint(const SkPaint & paint)51 void RSListenedCanvas::onDrawPaint(const SkPaint& paint)
52 {
53 RSPaintFilterCanvas::onDrawPaint(paint);
54 if (listener_ != nullptr) {
55 listener_->onDrawPaint(paint);
56 }
57 }
58
onDrawRect(const SkRect & rect,const SkPaint & paint)59 void RSListenedCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint)
60 {
61 RSPaintFilterCanvas::onDrawRect(rect, paint);
62 if (listener_ != nullptr) {
63 listener_->onDrawRect(rect, paint);
64 }
65 }
66
onDrawRRect(const SkRRect & rrect,const SkPaint & paint)67 void RSListenedCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint)
68 {
69 RSPaintFilterCanvas::onDrawRRect(rrect, paint);
70 if (listener_ != nullptr) {
71 listener_->onDrawRRect(rrect, paint);
72 }
73 }
74
onDrawDRRect(const SkRRect & outer,const SkRRect & inner,const SkPaint & paint)75 void RSListenedCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
76 const SkPaint& paint)
77 {
78 RSPaintFilterCanvas::onDrawDRRect(outer, inner, paint);
79 if (listener_ != nullptr) {
80 listener_->onDrawDRRect(outer, inner, paint);
81 }
82 }
83
onDrawOval(const SkRect & rect,const SkPaint & paint)84 void RSListenedCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint)
85 {
86 RSPaintFilterCanvas::onDrawOval(rect, paint);
87 if (listener_ != nullptr) {
88 listener_->onDrawOval(rect, paint);
89 }
90 }
91
onDrawArc(const SkRect & rect,SkScalar startAngle,SkScalar sweepAngle,bool useCenter,const SkPaint & paint)92 void RSListenedCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
93 const SkPaint& paint)
94 {
95 RSPaintFilterCanvas::onDrawArc(rect, startAngle, sweepAngle, useCenter, paint);
96 if (listener_ != nullptr) {
97 listener_->onDrawArc(rect, startAngle, sweepAngle, useCenter, paint);
98 }
99 }
100
onDrawPath(const SkPath & path,const SkPaint & paint)101 void RSListenedCanvas::onDrawPath(const SkPath& path, const SkPaint& paint)
102 {
103 RSPaintFilterCanvas::onDrawPath(path, paint);
104 if (listener_ != nullptr) {
105 listener_->onDrawPath(path, paint);
106 }
107 }
108
onDrawRegion(const SkRegion & region,const SkPaint & paint)109 void RSListenedCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint)
110 {
111 RSPaintFilterCanvas::onDrawRegion(region, paint);
112 if (listener_ != nullptr) {
113 listener_->onDrawRegion(region, paint);
114 }
115 }
116
onDrawTextBlob(const SkTextBlob * blob,SkScalar x,SkScalar y,const SkPaint & paint)117 void RSListenedCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
118 const SkPaint& paint)
119 {
120 RSPaintFilterCanvas::onDrawTextBlob(blob, x, y, paint);
121 if (listener_ != nullptr) {
122 listener_->onDrawTextBlob(blob, x, y, paint);
123 }
124 }
125
onDrawPatch(const SkPoint cubics[12],const SkColor colors[4],const SkPoint texCoords[4],SkBlendMode mode,const SkPaint & paint)126 void RSListenedCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
127 const SkPoint texCoords[4], SkBlendMode mode,
128 const SkPaint& paint)
129 {
130 RSPaintFilterCanvas::onDrawPatch(cubics, colors, texCoords, mode, paint);
131 if (listener_ != nullptr) {
132 listener_->onDrawPatch(cubics, colors, texCoords, mode, paint);
133 }
134 }
135
onDrawPoints(SkCanvas::PointMode mode,size_t count,const SkPoint pts[],const SkPaint & paint)136 void RSListenedCanvas::onDrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
137 const SkPaint& paint)
138 {
139 RSPaintFilterCanvas::onDrawPoints(mode, count, pts, paint);
140 if (listener_ != nullptr) {
141 listener_->onDrawPoints(mode, count, pts, paint);
142 }
143 }
144
onDrawAnnotation(const SkRect & rect,const char key[],SkData * value)145 void RSListenedCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* value)
146 {
147 RSPaintFilterCanvas::onDrawAnnotation(rect, key, value);
148 if (listener_ != nullptr) {
149 listener_->onDrawAnnotation(rect, key, value);
150 }
151 }
152
onDrawShadowRec(const SkPath & path,const SkDrawShadowRec & rect)153 void RSListenedCanvas::onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rect)
154 {
155 RSPaintFilterCanvas::onDrawShadowRec(path, rect);
156 if (listener_ != nullptr) {
157 listener_->onDrawShadowRec(path, rect);
158 }
159 }
160
onDrawDrawable(SkDrawable * drawable,const SkMatrix * matrix)161 void RSListenedCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix)
162 {
163 RSPaintFilterCanvas::onDrawDrawable(drawable, matrix);
164 if (listener_ != nullptr) {
165 listener_->onDrawDrawable(drawable, matrix);
166 }
167 }
168
onDrawPicture(const SkPicture * picture,const SkMatrix * matrix,const SkPaint * paint)169 void RSListenedCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
170 const SkPaint* paint)
171 {
172 RSPaintFilterCanvas::onDrawPicture(picture, matrix, paint);
173 if (listener_ != nullptr) {
174 listener_->onDrawPicture(picture, matrix, paint);
175 }
176 }
177 #ifdef NEW_SKIA
onDrawImageRect2(const SkImage * image,const SkRect & src,const SkRect & dst,const SkSamplingOptions & samplingOptions,const SkPaint * paint,SrcRectConstraint constraint)178 void RSListenedCanvas::onDrawImageRect2(const SkImage* image, const SkRect& src, const SkRect& dst,
179 const SkSamplingOptions& samplingOptions, const SkPaint* paint, SrcRectConstraint constraint)
180 {
181 RSPaintFilterCanvas::onDrawImageRect2(image, src, dst, samplingOptions, paint, constraint);
182 if (listener_ != nullptr) {
183 listener_->onDrawRect(dst, {});
184 }
185 }
186 #else
onDrawImageRect(const SkImage * image,const SkRect * src,const SkRect & dst,const SkPaint * paint,SrcRectConstraint constraint)187 void RSListenedCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst,
188 const SkPaint* paint, SrcRectConstraint constraint)
189 {
190 RSPaintFilterCanvas::onDrawImageRect(image, src, dst, paint, constraint);
191 if (listener_ != nullptr) {
192 listener_->onDrawRect(dst, {});
193 }
194 }
195 #endif
196 #else
197 using namespace Drawing;
198
DrawPoint(const Point & point)199 void RSListenedCanvas::DrawPoint(const Point& point)
200 {
201 RSPaintFilterCanvas::DrawPoint(point);
202 if (listener_ != nullptr) {
203 listener_->DrawPoint(point);
204 }
205 }
206
DrawLine(const Point & startPt,const Point & endPt)207 void RSListenedCanvas::DrawLine(const Point& startPt, const Point& endPt)
208 {
209 RSPaintFilterCanvas::DrawLine(startPt, endPt);
210 if (listener_ != nullptr) {
211 listener_->DrawLine(startPt, endPt);
212 }
213 }
214
DrawRect(const Rect & rect)215 void RSListenedCanvas::DrawRect(const Rect& rect)
216 {
217 RSPaintFilterCanvas::DrawRect(rect);
218 if (listener_ != nullptr) {
219 listener_->DrawRect(rect);
220 }
221 }
222
DrawRoundRect(const RoundRect & roundRect)223 void RSListenedCanvas::DrawRoundRect(const RoundRect& roundRect)
224 {
225 RSPaintFilterCanvas::DrawRoundRect(roundRect);
226 if (listener_ != nullptr) {
227 listener_->DrawRoundRect(roundRect);
228 }
229 }
230
DrawNestedRoundRect(const RoundRect & outer,const RoundRect & inner)231 void RSListenedCanvas::DrawNestedRoundRect(const RoundRect& outer, const RoundRect& inner)
232 {
233 RSPaintFilterCanvas::DrawNestedRoundRect(outer, inner);
234 if (listener_ != nullptr) {
235 listener_->DrawNestedRoundRect(outer, inner);
236 }
237 }
238
DrawArc(const Rect & oval,scalar startAngle,scalar sweepAngle)239 void RSListenedCanvas::DrawArc(const Rect& oval, scalar startAngle, scalar sweepAngle)
240 {
241 RSPaintFilterCanvas::DrawArc(oval, startAngle, sweepAngle);
242 if (listener_ != nullptr) {
243 listener_->DrawArc(oval, startAngle, sweepAngle);
244 }
245 }
246
DrawPie(const Rect & oval,scalar startAngle,scalar sweepAngle)247 void RSListenedCanvas::DrawPie(const Rect& oval, scalar startAngle, scalar sweepAngle)
248 {
249 RSPaintFilterCanvas::DrawPie(oval, startAngle, sweepAngle);
250 if (listener_ != nullptr) {
251 listener_->DrawPie(oval, startAngle, sweepAngle);
252 }
253 }
254
DrawOval(const Rect & oval)255 void RSListenedCanvas::DrawOval(const Rect& oval)
256 {
257 RSPaintFilterCanvas::DrawOval(oval);
258 if (listener_ != nullptr) {
259 listener_->DrawOval(oval);
260 }
261 }
262
DrawCircle(const Point & centerPt,scalar radius)263 void RSListenedCanvas::DrawCircle(const Point& centerPt, scalar radius)
264 {
265 RSPaintFilterCanvas::DrawCircle(centerPt, radius);
266 if (listener_ != nullptr) {
267 listener_->DrawCircle(centerPt, radius);
268 }
269 }
270
DrawPath(const Path & path)271 void RSListenedCanvas::DrawPath(const Path& path)
272 {
273 RSPaintFilterCanvas::DrawPath(path);
274 if (listener_ != nullptr) {
275 listener_->DrawPath(path);
276 }
277 }
278
DrawBackground(const Brush & brush)279 void RSListenedCanvas::DrawBackground(const Brush& brush)
280 {
281 RSPaintFilterCanvas::DrawBackground(brush);
282 if (listener_ != nullptr) {
283 listener_->DrawBackground(brush);
284 }
285 }
286
DrawShadow(const Path & path,const Point3 & planeParams,const Point3 & devLightPos,scalar lightRadius,Color ambientColor,Color spotColor,ShadowFlags flag)287 void RSListenedCanvas::DrawShadow(const Path& path, const Point3& planeParams, const Point3& devLightPos,
288 scalar lightRadius, Color ambientColor, Color spotColor, ShadowFlags flag)
289 {
290 RSPaintFilterCanvas::DrawShadow(path, planeParams, devLightPos, lightRadius, ambientColor, spotColor, flag);
291 if (listener_ != nullptr) {
292 listener_->DrawShadow(path, planeParams, devLightPos, lightRadius, ambientColor, spotColor, flag);
293 }
294 }
295
DrawRegion(const Drawing::Region & region)296 void RSListenedCanvas::DrawRegion(const Drawing::Region& region)
297 {
298 RSPaintFilterCanvas::DrawRegion(region);
299 if (listener_ != nullptr) {
300 listener_->DrawRegion(region);
301 }
302 }
303
DrawTextBlob(const Drawing::TextBlob * blob,const Drawing::scalar x,const Drawing::scalar y)304 void RSListenedCanvas::DrawTextBlob(const Drawing::TextBlob* blob, const Drawing::scalar x, const Drawing::scalar y)
305 {
306 RSPaintFilterCanvas::DrawTextBlob(blob, x, y);
307 if (listener_ != nullptr) {
308 listener_->DrawTextBlob(blob, x, y);
309 }
310 }
311
DrawBitmap(const Bitmap & bitmap,const scalar px,const scalar py)312 void RSListenedCanvas::DrawBitmap(const Bitmap& bitmap, const scalar px, const scalar py)
313 {
314 RSPaintFilterCanvas::DrawBitmap(bitmap, px, py);
315 if (listener_ != nullptr) {
316 listener_->DrawBitmap(bitmap, px, py);
317 }
318 }
319
DrawBitmap(Media::PixelMap & pixelMap,const scalar px,const scalar py)320 void RSListenedCanvas::DrawBitmap(Media::PixelMap& pixelMap, const scalar px, const scalar py)
321 {
322 RSPaintFilterCanvas::DrawBitmap(pixelMap, px, py);
323 if (listener_ != nullptr) {
324 listener_->DrawBitmap(pixelMap, px, py);
325 }
326 }
327
DrawImage(const Image & image,const scalar px,const scalar py,const SamplingOptions & sampling)328 void RSListenedCanvas::DrawImage(const Image& image, const scalar px, const scalar py, const SamplingOptions& sampling)
329 {
330 RSPaintFilterCanvas::DrawImage(image, px, py, sampling);
331 if (listener_ != nullptr) {
332 listener_->DrawImage(image, px, py, sampling);
333 }
334 }
335
DrawImageRect(const Image & image,const Rect & src,const Rect & dst,const SamplingOptions & sampling,SrcRectConstraint constraint)336 void RSListenedCanvas::DrawImageRect(const Image& image, const Rect& src, const Rect& dst,
337 const SamplingOptions& sampling, SrcRectConstraint constraint)
338 {
339 RSPaintFilterCanvas::DrawImageRect(image, src, dst, sampling, constraint);
340 if (listener_ != nullptr) {
341 listener_->DrawImageRect(image, src, dst, sampling, constraint);
342 }
343 }
344
DrawImageRect(const Image & image,const Rect & dst,const SamplingOptions & sampling)345 void RSListenedCanvas::DrawImageRect(const Image& image, const Rect& dst, const SamplingOptions& sampling)
346 {
347 RSPaintFilterCanvas::DrawImageRect(image, dst, sampling);
348 if (listener_ != nullptr) {
349 listener_->DrawImageRect(image, dst, sampling);
350 }
351 }
352
DrawPicture(const Picture & picture)353 void RSListenedCanvas::DrawPicture(const Picture& picture)
354 {
355 RSPaintFilterCanvas::DrawPicture(picture);
356 if (listener_ != nullptr) {
357 listener_->DrawPicture(picture);
358 }
359 }
360
Clear(Drawing::ColorQuad color)361 void RSListenedCanvas::Clear(Drawing::ColorQuad color)
362 {
363 RSPaintFilterCanvas::Clear(color);
364 if (listener_ != nullptr) {
365 listener_->Clear(color);
366 }
367 }
368
AttachPen(const Drawing::Pen & pen)369 CoreCanvas& RSListenedCanvas::AttachPen(const Drawing::Pen& pen)
370 {
371 RSPaintFilterCanvas::AttachPen(pen);
372 if (listener_ != nullptr) {
373 listener_->AttachPen(pen);
374 }
375
376 return *this;
377 }
378
AttachBrush(const Drawing::Brush & brush)379 CoreCanvas& RSListenedCanvas::AttachBrush(const Drawing::Brush& brush)
380 {
381 RSPaintFilterCanvas::AttachBrush(brush);
382 if (listener_ != nullptr) {
383 listener_->AttachBrush(brush);
384 }
385
386 return *this;
387 }
388
DetachPen()389 CoreCanvas& RSListenedCanvas::DetachPen()
390 {
391 RSPaintFilterCanvas::DetachPen();
392 if (listener_ != nullptr) {
393 listener_->DetachPen();
394 }
395
396 return *this;
397 }
398
DetachBrush()399 CoreCanvas& RSListenedCanvas::DetachBrush()
400 {
401 RSPaintFilterCanvas::DetachBrush();
402 if (listener_ != nullptr) {
403 listener_->DetachBrush();
404 }
405
406 return *this;
407 }
408 #endif // USE_ROSEN_DRAWING
409 } // namespace Rosen
410 } // namespace OHOS
411