3 * Copyright 2012 Google Inc.
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
9 #ifndef SkPictureStateTree_DEFINED
10 #define SkPictureStateTree_DEFINED
12 #include "SkTDArray.h"
13 #include "SkChunkAlloc.h"
21 * Provides an interface that, given a sequence of draws into an SkPicture with corresponding
22 * offsets, allows for playback of an arbitrary subset of the draws (note that Z-order is only
23 * guaranteed if the draws are explicitly sorted).
25 class SkPictureStateTree : public SkRefCnt {
29 SK_DECLARE_INST_COUNT(SkPictureStateTree)
32 * A draw call, stores offset into command buffer, a pointer to the matrix, and a pointer to
33 * the node in the tree that corresponds to its clip/layer state
39 bool operator<(const Draw& other) const { return fOffset < other.fOffset; }
45 ~SkPictureStateTree();
48 * Creates and returns a struct representing a draw at the given offset.
50 Draw* appendDraw(size_t offset);
53 * Given a list of draws, and a canvas, initialize an iterator that produces the correct
54 * sequence of offsets into the command buffer to carry out those calls with correct
55 * matrix/clip state. This handles saves/restores, and does all necessary matrix setup.
57 void initIterator(SkPictureStateTree::Iterator* iter,
58 const SkTDArray<void*>& draws,
62 void appendSaveLayer(size_t offset);
64 void appendTransform(const SkMatrix& trans);
65 void appendClip(size_t offset);
68 * Call this immediately after an appendRestore call that is associated
69 * a save or saveLayer that was removed from the command stream
70 * due to a command pattern optimization in SkPicture.
79 /** Returns the next op offset needed to create the drawing state
80 required by the queued up draw operation or the offset of the queued
81 up draw operation itself. In the latter case, the next draw operation
82 will move into the queued up slot.
83 It retuns kDrawComplete when done.
84 TODO: this might be better named nextOp
87 static const uint32_t kDrawComplete = SK_MaxU32;
88 Iterator() : fValid(false) { }
89 bool isValid() const { return fValid; }
92 void init(const SkTDArray<void*>& draws, SkCanvas* canvas, Node* root);
94 void setCurrentMatrix(const SkMatrix*);
96 // The draws this iterator is associated with
97 const SkTDArray<void*>* fDraws;
99 // canvas this is playing into (so we can insert saves/restores as necessary)
102 // current state node
105 // List of nodes whose state we need to apply to reach TargetNode
106 SkTDArray<Node*> fNodes;
108 // The matrix of the canvas we're playing back into
109 SkMatrix fPlaybackMatrix;
111 // Cache of current matrix, so we can avoid redundantly setting it
112 const SkMatrix* fCurrentMatrix;
114 // current position in the array of draws
116 // Whether or not we need to do a save next iteration
119 // Whether or not this is a valid iterator (the default public constructor sets this false)
124 friend class SkPictureStateTree;
129 void appendNode(size_t offset);
132 // Needed by saveCollapsed() because nodes do not currently store
133 // references to their children. If they did, we could just retrieve the
135 Node* fLastRestoredNode;
137 // The currently active state
139 // A stack of states for tracking save/restores
142 // Represents a notable piece of state that requires an offset into the command buffer,
143 // corresponding to a clip/saveLayer/etc call, to apply.
152 kSaveLayer_Flag = 0x2
157 SkMatrix fRootMatrix;
159 typedef SkRefCnt INHERITED;