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, returns an iterator that produces the correct sequence
54 * of offsets into the command buffer to carry out those calls with correct matrix/clip state.
55 * This handles saves/restores, and does all necessary matrix setup.
57 Iterator getIterator(const SkTDArray<void*>& draws, SkCanvas* canvas);
60 void appendSaveLayer(size_t offset);
62 void appendTransform(const SkMatrix& trans);
63 void appendClip(size_t offset);
66 * Call this immediately after an appendRestore call that is associated
67 * a save or saveLayer that was removed from the command stream
68 * due to a command pattern optimization in SkPicture.
77 /** Returns the next offset into the picture stream, or kDrawComplete if complete. */
79 static const uint32_t kDrawComplete = SK_MaxU32;
80 Iterator() : fPlaybackMatrix(), fValid(false) { }
81 bool isValid() const { return fValid; }
83 Iterator(const SkTDArray<void*>& draws, SkCanvas* canvas, Node* root);
84 // The draws this iterator is associated with
85 const SkTDArray<void*>* fDraws;
87 // canvas this is playing into (so we can insert saves/restores as necessary)
93 // List of nodes whose state we need to apply to reach TargetNode
94 SkTDArray<Node*> fNodes;
96 // The matrix of the canvas we're playing back into
97 const SkMatrix fPlaybackMatrix;
99 // Cache of current matrix, so we can avoid redundantly setting it
100 SkMatrix* fCurrentMatrix;
102 // current position in the array of draws
104 // Whether or not we need to do a save next iteration
107 // Whether or not this is a valid iterator (the default public constructor sets this false)
110 friend class SkPictureStateTree;
115 void appendNode(size_t offset);
118 // Needed by saveCollapsed() because nodes do not currently store
119 // references to their children. If they did, we could just retrieve the
121 Node* fLastRestoredNode;
123 // The currently active state
125 // A stack of states for tracking save/restores
128 // Represents a notable piece of state that requires an offset into the command buffer,
129 // corresponding to a clip/saveLayer/etc call, to apply.
138 kSaveLayer_Flag = 0x2
143 SkMatrix fRootMatrix;
145 typedef SkRefCnt INHERITED;