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