blob: 2f0a62d8b5eb8c824a8c91927fa52a6ecd7b5f5a [file] [log] [blame]
reedc5369422014-11-11 04:56:05 -08001/*
2 * Copyright 2014 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
reed3cb38402015-02-06 08:36:15 -08008#ifndef SkDrawable_DEFINED
9#define SkDrawable_DEFINED
reedc5369422014-11-11 04:56:05 -080010
11#include "SkRefCnt.h"
12
13class SkCanvas;
reed1bdfd3f2014-11-24 14:41:51 -080014class SkPicture;
reedc5369422014-11-11 04:56:05 -080015struct SkRect;
16
17/**
reed79c77a42014-11-11 07:54:10 -080018 * Base-class for objects that draw into SkCanvas.
19 *
20 * The object has a generation ID, which is guaranteed to be unique across all drawables. To
21 * allow for clients of the drawable that may want to cache the results, the drawable must
22 * change its generation ID whenever its internal state changes such that it will draw differently.
reedc5369422014-11-11 04:56:05 -080023 */
reed3cb38402015-02-06 08:36:15 -080024class SkDrawable : public SkRefCnt {
reedc5369422014-11-11 04:56:05 -080025public:
reed3cb38402015-02-06 08:36:15 -080026 SkDrawable();
reedc5369422014-11-11 04:56:05 -080027
28 /**
29 * Draws into the specified content. The drawing sequence will be balanced upon return
30 * (i.e. the saveLevel() on the canvas will match what it was when draw() was called,
31 * and the current matrix and clip settings will not be changed.
32 */
reeda8db7282015-07-07 10:22:31 -070033 void draw(SkCanvas*, const SkMatrix* = NULL);
34 void draw(SkCanvas*, SkScalar x, SkScalar y);
reedc5369422014-11-11 04:56:05 -080035
reed1bdfd3f2014-11-24 14:41:51 -080036 SkPicture* newPictureSnapshot();
reed6be2aa92014-11-18 11:08:05 -080037
reedc5369422014-11-11 04:56:05 -080038 /**
39 * Return a unique value for this instance. If two calls to this return the same value,
40 * it is presumed that calling the draw() method will render the same thing as well.
41 *
42 * Subclasses that change their state should call notifyDrawingChanged() to ensure that
43 * a new value will be returned the next time it is called.
44 */
45 uint32_t getGenerationID();
46
47 /**
reed6be2aa92014-11-18 11:08:05 -080048 * Return the (conservative) bounds of what the drawable will draw. If the drawable can
49 * change what it draws (e.g. animation or in response to some external change), then this
50 * must return a bounds that is always valid for all possible states.
reedc5369422014-11-11 04:56:05 -080051 */
reed6be2aa92014-11-18 11:08:05 -080052 SkRect getBounds();
reedc5369422014-11-11 04:56:05 -080053
reed79c77a42014-11-11 07:54:10 -080054 /**
55 * Calling this invalidates the previous generation ID, and causes a new one to be computed
56 * the next time getGenerationID() is called. Typically this is called by the object itself,
57 * in response to its internal state changing.
58 */
reedc5369422014-11-11 04:56:05 -080059 void notifyDrawingChanged();
60
61protected:
reed6be2aa92014-11-18 11:08:05 -080062 virtual SkRect onGetBounds() = 0;
reedc5369422014-11-11 04:56:05 -080063 virtual void onDraw(SkCanvas*) = 0;
reed3cb38402015-02-06 08:36:15 -080064
65 /**
66 * Default implementation calls onDraw() with a canvas that records into a picture. Subclasses
67 * may override if they have a more efficient way to return a picture for the current state
68 * of their drawable. Note: this picture must draw the same as what would be drawn from
69 * onDraw().
70 */
reed1bdfd3f2014-11-24 14:41:51 -080071 virtual SkPicture* onNewPictureSnapshot();
reedc5369422014-11-11 04:56:05 -080072
73private:
74 int32_t fGenerationID;
75};
76
77#endif