From bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6 Mon Sep 17 00:00:00 2001 From: fmalita Date: Mon, 11 Jan 2016 13:58:29 -0800 Subject: SkPaintFilterCanvas skip-draw support At the time SkPaintFilterCanvas was introduced as a SkDrawFilter replacement, no clients were relying on the draw veto logic. Now Chromium does. To facilitate migrating off SkDrawFilter, let's augment SkPaintFilterCanvas with skip-draw semantics. A side effect of the CL is that now we call the filter virtual even for null paints. BUG=skia:4782 R=reed@google.com,robertphillips@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1577933002 Review URL: https://codereview.chromium.org/1577933002 --- include/utils/SkPaintFilterCanvas.h | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'include') diff --git a/include/utils/SkPaintFilterCanvas.h b/include/utils/SkPaintFilterCanvas.h index 0ad7e251b6..505f965565 100644 --- a/include/utils/SkPaintFilterCanvas.h +++ b/include/utils/SkPaintFilterCanvas.h @@ -9,10 +9,11 @@ #define SkPaintFilterCanvas_DEFINED #include "SkNWayCanvas.h" +#include "SkTLazy.h" /** \class SkPaintFilterCanvas - A utility proxy base class for implementing paint filters. + A utility proxy base class for implementing draw/paint filters. */ class SK_API SkPaintFilterCanvas : public SkNWayCanvas { public: @@ -48,13 +49,28 @@ public: protected: /** * Called with the paint that will be used to draw the specified type. - * The implementation may modify the paint as they wish. * - * Note: The base implementation calls onFilterPaint() for top-level/explicit paints only. + * Upon return, if filteredPaint is initialized it will replace the original paint + * for the current draw. Note that that implementation is responsible for + * initializing *filteredPaint (e.g. via set(*paint)). + * + * The result bool is used to determine whether the draw op is to be + * executed (true) or skipped (false). When the draw is skipped, filteredPaint is + * ignored. + * + * Note: The base implementation calls onFilter() for top-level/explicit paints only. * To also filter encapsulated paints (e.g. SkPicture, SkTextBlob), clients may need to * override the relevant methods (i.e. drawPicture, drawTextBlob). */ - virtual void onFilterPaint(SkPaint* paint, Type type) const = 0; + virtual bool onFilter(const SkPaint* paint, Type type, SkTLazy* filteredPaint) const { + if (paint) { + this->onFilterPaint(filteredPaint->set(*paint), type); + } + return true; + } + + // DEPRECATED - do not use + virtual void onFilterPaint(SkPaint*, Type) const { } void onDrawPaint(const SkPaint&) override; void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; @@ -66,11 +82,13 @@ protected: void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, SrcRectConstraint) override; + void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, + const SkPaint*) override; void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, const SkPaint*, SrcRectConstraint) override; - void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, - const SkPaint*) override; + void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, + const SkPaint*) override; void onDrawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], SkXfermode* xmode, -- cgit v1.2.3