| 1 | /* |
| 2 | * Copyright 2015 Google Inc. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
| 6 | */ |
| 7 | |
| 8 | #ifndef SkPaintFilterCanvas_DEFINED |
| 9 | #define SkPaintFilterCanvas_DEFINED |
| 10 | |
| 11 | #include "include/core/SkCanvasVirtualEnforcer.h" |
| 12 | #include "include/utils/SkNWayCanvas.h" |
| 13 | |
| 14 | class SkAndroidFrameworkUtils; |
| 15 | |
| 16 | /** \class SkPaintFilterCanvas |
| 17 | |
| 18 | A utility proxy base class for implementing draw/paint filters. |
| 19 | */ |
| 20 | class SK_API SkPaintFilterCanvas : public SkCanvasVirtualEnforcer<SkNWayCanvas> { |
| 21 | public: |
| 22 | /** |
| 23 | * The new SkPaintFilterCanvas is configured for forwarding to the |
| 24 | * specified canvas. Also copies the target canvas matrix and clip bounds. |
| 25 | */ |
| 26 | SkPaintFilterCanvas(SkCanvas* canvas); |
| 27 | |
| 28 | enum Type { |
| 29 | kPicture_Type, |
| 30 | }; |
| 31 | |
| 32 | // Forwarded to the wrapped canvas. |
| 33 | SkISize getBaseLayerSize() const override { return proxy()->getBaseLayerSize(); } |
| 34 | GrContext* getGrContext() override { return proxy()->getGrContext(); } |
| 35 | GrRenderTargetContext* internal_private_accessTopLayerRenderTargetContext() override { |
| 36 | return proxy()->internal_private_accessTopLayerRenderTargetContext(); |
| 37 | } |
| 38 | |
| 39 | protected: |
| 40 | /** |
| 41 | * Called with the paint that will be used to draw the specified type. |
| 42 | * The implementation may modify the paint as they wish. |
| 43 | * |
| 44 | * The result bool is used to determine whether the draw op is to be |
| 45 | * executed (true) or skipped (false). |
| 46 | * |
| 47 | * Note: The base implementation calls onFilter() for top-level/explicit paints only. |
| 48 | * To also filter encapsulated paints (e.g. SkPicture, SkTextBlob), clients may need to |
| 49 | * override the relevant methods (i.e. drawPicture, drawTextBlob). |
| 50 | */ |
| 51 | virtual bool onFilter(SkPaint& paint) const = 0; |
| 52 | |
| 53 | void onDrawPaint(const SkPaint&) override; |
| 54 | void onDrawBehind(const SkPaint&) override; |
| 55 | void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; |
| 56 | void onDrawRect(const SkRect&, const SkPaint&) override; |
| 57 | void onDrawRRect(const SkRRect&, const SkPaint&) override; |
| 58 | void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; |
| 59 | void onDrawRegion(const SkRegion&, const SkPaint&) override; |
| 60 | void onDrawOval(const SkRect&, const SkPaint&) override; |
| 61 | void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override; |
| 62 | void onDrawPath(const SkPath&, const SkPaint&) override; |
| 63 | void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; |
| 64 | void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, |
| 65 | const SkPaint*, SrcRectConstraint) override; |
| 66 | void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, |
| 67 | const SkPaint*) override; |
| 68 | void onDrawImageLattice(const SkImage*, const Lattice&, const SkRect&, |
| 69 | const SkPaint*) override; |
| 70 | void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override; |
| 71 | void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], |
| 72 | const SkPoint texCoords[4], SkBlendMode, |
| 73 | const SkPaint& paint) override; |
| 74 | void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; |
| 75 | void onDrawDrawable(SkDrawable*, const SkMatrix*) override; |
| 76 | |
| 77 | void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
| 78 | const SkPaint& paint) override; |
| 79 | void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], |
| 80 | int, SkBlendMode, const SkRect*, const SkPaint*) override; |
| 81 | void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value) override; |
| 82 | void onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) override; |
| 83 | |
| 84 | void onDrawEdgeAAQuad(const SkRect&, const SkPoint[4], QuadAAFlags, const SkColor4f&, |
| 85 | SkBlendMode) override; |
| 86 | void onDrawEdgeAAImageSet(const ImageSetEntry[], int count, const SkPoint[], const SkMatrix[], |
| 87 | const SkPaint*, SrcRectConstraint) override; |
| 88 | |
| 89 | // Forwarded to the wrapped canvas. |
| 90 | sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override; |
| 91 | bool onPeekPixels(SkPixmap* pixmap) override; |
| 92 | bool onAccessTopLayerPixels(SkPixmap* pixmap) override; |
| 93 | SkImageInfo onImageInfo() const override; |
| 94 | bool onGetProps(SkSurfaceProps* props) const override; |
| 95 | |
| 96 | private: |
| 97 | class AutoPaintFilter; |
| 98 | |
| 99 | SkCanvas* proxy() const { SkASSERT(fList.count() == 1); return fList[0]; } |
| 100 | |
| 101 | SkPaintFilterCanvas* internal_private_asPaintFilterCanvas() const override { |
| 102 | return const_cast<SkPaintFilterCanvas*>(this); |
| 103 | } |
| 104 | |
| 105 | friend class SkAndroidFrameworkUtils; |
| 106 | }; |
| 107 | |
| 108 | #endif |
| 109 | |