Index: include/core/SkDrawLooper.h |
diff --git a/include/core/SkDrawLooper.h b/include/core/SkDrawLooper.h |
index 4609c1dcf90ddb67a4708909ea209b5063fcfe18..65650d88e84c6d851bdf2ebb33fbf0655088b004 100644 |
--- a/include/core/SkDrawLooper.h |
+++ b/include/core/SkDrawLooper.h |
@@ -30,24 +30,49 @@ public: |
SK_DECLARE_INST_COUNT(SkDrawLooper) |
/** |
- * Called right before something is being drawn. This will be followed by |
- * calls to next() until next() returns false. |
+ * Holds state during a draw. Users call next() until it returns false. |
+ * |
+ * Subclasses of SkDrawLooper should create a subclass of this object to |
+ * hold state specific to their subclass. |
*/ |
- virtual void init(SkCanvas*) = 0; |
+ class SK_API Context : public SkNoncopyable { |
+ public: |
+ Context() {} |
+ virtual ~Context() {} |
+ |
+ /** |
+ * Called in a loop on objects returned by SkDrawLooper::createContext(). |
+ * Each time true is returned, the object is drawn (possibly with a modified |
+ * canvas and/or paint). When false is finally returned, drawing for the object |
+ * stops. |
+ * |
+ * On each call, the paint will be in its original state, but the |
+ * canvas will be as it was following the previous call to next() or |
+ * createContext(). |
+ * |
+ * The implementation must ensure that, when next() finally returns |
+ * false, the canvas has been restored to the state it was |
+ * initially, before createContext() was first called. |
+ */ |
+ virtual bool next(SkCanvas* canvas, SkPaint* paint) = 0; |
+ }; |
/** |
- * Called in a loop (after init()). Each time true is returned, the object |
- * is drawn (possibly with a modified canvas and/or paint). When false is |
- * finally returned, drawing for the object stops. |
- * |
- * On each call, the paint will be in its original state, but the canvas |
- * will be as it was following the previous call to next() or init(). |
- * |
- * The implementation must ensure that, when next() finally returns false, |
- * that the canvas has been restored to the state it was initially, before |
- * init() was first called. |
+ * Called right before something is being drawn. Returns a Context |
+ * whose next() method should be called until it returns false. |
+ * The caller has to ensure that the storage pointer provides enough |
+ * memory for the Context. The required size can be queried by calling |
+ * contextSize(). It is also the caller's responsibility to destroy the |
+ * object after use. |
*/ |
- virtual bool next(SkCanvas*, SkPaint* paint) = 0; |
+ virtual Context* createContext(SkCanvas*, void* storage) const = 0; |
+ |
+ /** |
+ * Returns the number of bytes needed to store subclasses of Context (belonging to the |
+ * corresponding SkDrawLooper subclass). |
+ */ |
+ virtual size_t contextSize() const = 0; |
+ |
/** |
* The fast bounds functions are used to enable the paint to be culled early |
@@ -59,9 +84,9 @@ public: |
* storage rect, where the storage rect is with the union of the src rect |
* and the looper's bounding rect. |
*/ |
- virtual bool canComputeFastBounds(const SkPaint& paint); |
+ virtual bool canComputeFastBounds(const SkPaint& paint) const; |
virtual void computeFastBounds(const SkPaint& paint, |
- const SkRect& src, SkRect* dst); |
+ const SkRect& src, SkRect* dst) const; |
SkDEVCODE(virtual void toString(SkString* str) const = 0;) |
SK_DEFINE_FLATTENABLE_TYPE(SkDrawLooper) |