• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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