Index: src/core/SkCanvasDrawable.h |
diff --git a/src/core/SkCanvasDrawable.h b/src/core/SkCanvasDrawable.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bc5b4fd351e6513d08bf341c6e464e67d967991b |
--- /dev/null |
+++ b/src/core/SkCanvasDrawable.h |
@@ -0,0 +1,69 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkCanvasDrawable_DEFINED |
+#define SkCanvasDrawable_DEFINED |
+ |
+#include "SkRefCnt.h" |
+ |
+class SkCanvas; |
+class SkPicture; |
+struct SkRect; |
+ |
+/** |
+ * Base-class for objects that draw into SkCanvas. |
+ * |
+ * The object has a generation ID, which is guaranteed to be unique across all drawables. To |
+ * allow for clients of the drawable that may want to cache the results, the drawable must |
+ * change its generation ID whenever its internal state changes such that it will draw differently. |
+ */ |
+class SkCanvasDrawable : public SkRefCnt { |
+public: |
+ SkCanvasDrawable(); |
+ |
+ /** |
+ * Draws into the specified content. The drawing sequence will be balanced upon return |
+ * (i.e. the saveLevel() on the canvas will match what it was when draw() was called, |
+ * and the current matrix and clip settings will not be changed. |
+ */ |
+ void draw(SkCanvas*); |
+ |
+ SkPicture* newPictureSnapshot(); |
+ |
+ /** |
+ * Return a unique value for this instance. If two calls to this return the same value, |
+ * it is presumed that calling the draw() method will render the same thing as well. |
+ * |
+ * Subclasses that change their state should call notifyDrawingChanged() to ensure that |
+ * a new value will be returned the next time it is called. |
+ */ |
+ uint32_t getGenerationID(); |
+ |
+ /** |
+ * Return the (conservative) bounds of what the drawable will draw. If the drawable can |
+ * change what it draws (e.g. animation or in response to some external change), then this |
+ * must return a bounds that is always valid for all possible states. |
+ */ |
+ SkRect getBounds(); |
+ |
+ /** |
+ * Calling this invalidates the previous generation ID, and causes a new one to be computed |
+ * the next time getGenerationID() is called. Typically this is called by the object itself, |
+ * in response to its internal state changing. |
+ */ |
+ void notifyDrawingChanged(); |
+ |
+protected: |
+ virtual SkRect onGetBounds() = 0; |
+ virtual void onDraw(SkCanvas*) = 0; |
+ virtual SkPicture* onNewPictureSnapshot(); |
+ |
+private: |
+ int32_t fGenerationID; |
+}; |
+ |
+#endif |