165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita/*
265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita * Copyright 2015 Google Inc.
365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita *
465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita * Use of this source code is governed by a BSD-style license that can be
565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita * found in the LICENSE file.
665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita */
765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita#ifndef SkPaintFilterCanvas_DEFINED
965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita#define SkPaintFilterCanvas_DEFINED
1065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
1165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita#include "SkNWayCanvas.h"
12bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita#include "SkTLazy.h"
1365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
1465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita/** \class SkPaintFilterCanvas
1565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
16bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita    A utility proxy base class for implementing draw/paint filters.
1765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita*/
1865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalitaclass SK_API SkPaintFilterCanvas : public SkNWayCanvas {
1965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalitapublic:
20f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita    /**
21f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita     * The new SkPaintFilterCanvas is configured for forwarding to the
22f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita     * specified canvas.  Also copies the target canvas matrix and clip bounds.
23f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita     */
24f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita    SkPaintFilterCanvas(SkCanvas* canvas);
25f433bb2bebd441cc0b2b152e8fbf79eac43baf5dfmalita
2665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    enum Type {
2765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kPaint_Type,
2865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kPoint_Type,
29ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon        kArc_Type,
3065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kBitmap_Type,
3165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kRect_Type,
3265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kRRect_Type,
3365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kDRRect_Type,
3465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kOval_Type,
3565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kPath_Type,
3665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kPicture_Type,
3765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kText_Type,
3865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kTextBlob_Type,
3965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kVertices_Type,
4065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kPatch_Type,
4165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
4265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita        kTypeCount
4365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    };
4465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
4565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalitaprotected:
4665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    /**
4765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita     *  Called with the paint that will be used to draw the specified type.
4832cdc32522bf39a8236880f57ff4ee5b26bdd363fmalita     *  The implementation may modify the paint as they wish (using SkTCopyOnFirstWrite::writable).
49bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita     *
50bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita     *  The result bool is used to determine whether the draw op is to be
5132cdc32522bf39a8236880f57ff4ee5b26bdd363fmalita     *  executed (true) or skipped (false).
52bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita     *
53bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita     *  Note: The base implementation calls onFilter() for top-level/explicit paints only.
5465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita     *        To also filter encapsulated paints (e.g. SkPicture, SkTextBlob), clients may need to
5565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita     *        override the relevant methods (i.e. drawPicture, drawTextBlob).
5665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita     */
5761a237e319a63b7ed6d38c2f3cd9b597816c3a46fmalita    virtual bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type type) const = 0;
5865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
5965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPaint(const SkPaint&) override;
6065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
6165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawRect(const SkRect&, const SkPaint&) override;
6265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawRRect(const SkRRect&, const SkPaint&) override;
6365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
6465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawOval(const SkRect&, const SkPaint&) override;
65ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon    void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override;
6665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPath(const SkPath&, const SkPaint&) override;
6765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
6865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
69562fe4767cc73e08a4e039362bc0336aea66ecfbreed                          SrcRectConstraint) override;
70bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita    void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
71bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita                          const SkPaint*) override;
7265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
7365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
74562fe4767cc73e08a4e039362bc0336aea66ecfbreed                         const SkPaint*, SrcRectConstraint) override;
75bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita    void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
76bad23dc9ed2e00f2a066db01ab88e4c4adcecfc6fmalita                         const SkPaint*) override;
77fed9cfdc0216152d7fffe6d838ea7281466ffe74Mike Reed    void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
7865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
79faba3715b8ddfaa0ce4df79bc8006e9bc7694e5bMike Reed                             const SkPoint texCoords[4], SkBlendMode,
8065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                             const SkPaint& paint) override;
8165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
8265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
8365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
8465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                    const SkPaint&) override;
8565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
8665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                       const SkPaint&) override;
8765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
8865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                        SkScalar constY, const SkPaint&) override;
8965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
9065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                          const SkMatrix* matrix, const SkPaint&) override;
9145561a0b15fe045ba272c328684c3f7ae290785areed    void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
9245561a0b15fe045ba272c328684c3f7ae290785areed                           const SkRect* cull, const SkPaint& paint) override;
9365cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
9465cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita                        const SkPaint& paint) override;
9565cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
9665cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalitaprivate:
9765cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    class AutoPaintFilter;
9865cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
9965cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita    typedef SkNWayCanvas INHERITED;
10065cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita};
10165cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita
10265cdb57ae8fd23ccec5f7f4f86b34e4aa85c45aefmalita#endif
103