19fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
29fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com/*
39fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com * Copyright 2012 Google Inc.
49fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com *
59fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com * Use of this source code is governed by a BSD-style license that can be
69fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com * found in the LICENSE file.
79fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com */
89fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
99fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com#include "SkPictureStateTree.h"
109fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com#include "SkCanvas.h"
119fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
129fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comSkPictureStateTree::SkPictureStateTree()
139fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    : fAlloc(2048)
144b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    , fLastRestoredNode(NULL)
159fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    , fStateStack(sizeof(Draw), 16) {
16773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRootMatrix.reset();
17773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRoot.fParent = NULL;
18773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRoot.fMatrix = &fRootMatrix;
19773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRoot.fFlags = Node::kSave_Flag;
20773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRoot.fOffset = 0;
21773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fRoot.fLevel = 0;
22773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fCurrentState.fNode = &fRoot;
23773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    fCurrentState.fMatrix = &fRootMatrix;
249fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
259fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
269fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
279fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comSkPictureStateTree::~SkPictureStateTree() {
289fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
299fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
306fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.comSkPictureStateTree::Draw* SkPictureStateTree::appendDraw(size_t offset) {
319fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    Draw* draw = static_cast<Draw*>(fAlloc.allocThrow(sizeof(Draw)));
329fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    *draw = fCurrentState;
336fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.com    draw->fOffset = SkToU32(offset);
349fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    return draw;
359fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
369fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
379fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comvoid SkPictureStateTree::appendSave() {
389fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
399fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState.fNode->fFlags |= Node::kSave_Flag;
409fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
419fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
426fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.comvoid SkPictureStateTree::appendSaveLayer(size_t offset) {
439fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
449fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    this->appendNode(offset);
459fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState.fNode->fFlags |= Node::kSaveLayer_Flag;
469fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
479fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
484b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.orgvoid SkPictureStateTree::saveCollapsed() {
4949f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(fLastRestoredNode);
504b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    SkASSERT(SkToBool(fLastRestoredNode->fFlags & \
514b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org        (Node::kSaveLayer_Flag | Node::kSave_Flag)));
524b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    SkASSERT(fLastRestoredNode->fParent == fCurrentState.fNode);
534b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    // The structure of the tree is not modified here. We just turn off
544b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    // the save or saveLayer flag to prevent the iterator from making state
554b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    // changing calls on the playback canvas when traversing a save or
564b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    // saveLayerNode node.
574b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    fLastRestoredNode->fFlags = 0;
584b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org}
594b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org
609fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comvoid SkPictureStateTree::appendRestore() {
614b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    fLastRestoredNode = fCurrentState.fNode;
629fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState = *static_cast<Draw*>(fStateStack.back());
639fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fStateStack.pop_back();
649fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
659fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
669fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comvoid SkPictureStateTree::appendTransform(const SkMatrix& trans) {
679fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    SkMatrix* m = static_cast<SkMatrix*>(fAlloc.allocThrow(sizeof(SkMatrix)));
689fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    *m = trans;
699fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState.fMatrix = m;
709fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
719fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
726fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.comvoid SkPictureStateTree::appendClip(size_t offset) {
739fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    this->appendNode(offset);
749fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
759fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
76ec66e6264de5110802c3d9927380d913242c9d5frobertphillipsvoid SkPictureStateTree::initIterator(SkPictureStateTree::Iterator* iter,
77ec66e6264de5110802c3d9927380d913242c9d5frobertphillips                                      const SkTDArray<void*>& draws,
78ec66e6264de5110802c3d9927380d913242c9d5frobertphillips                                      SkCanvas* canvas) {
79ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    iter->init(draws, canvas, &fRoot);
809fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
819fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
826fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.comvoid SkPictureStateTree::appendNode(size_t offset) {
839fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    Node* n = static_cast<Node*>(fAlloc.allocThrow(sizeof(Node)));
846fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.com    n->fOffset = SkToU32(offset);
859fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fFlags = 0;
869fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fParent = fCurrentState.fNode;
879fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fLevel = fCurrentState.fNode->fLevel + 1;
889fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fMatrix = fCurrentState.fMatrix;
899fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState.fNode = n;
909fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
919fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
92ec66e6264de5110802c3d9927380d913242c9d5frobertphillipsvoid SkPictureStateTree::Iterator::init(const SkTDArray<void*>& draws, SkCanvas* canvas, Node* root) {
93ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    SkASSERT(!fValid);
94ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fDraws = &draws;
95ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fCanvas = canvas;
96ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fCurrentNode = root;
97ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fPlaybackMatrix = canvas->getTotalMatrix();
98ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fCurrentMatrix = NULL;
99ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fPlaybackIndex = 0;
100ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fSave = false;
101ec66e6264de5110802c3d9927380d913242c9d5frobertphillips    fValid = true;
1029fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
1039fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
104a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.orgvoid SkPictureStateTree::Iterator::setCurrentMatrix(const SkMatrix* matrix) {
10549f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(matrix);
106a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
107a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    if (matrix == fCurrentMatrix) {
108a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org        return;
109a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    }
110a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
111a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    // The matrix is in recording space, but we also inherit
112a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    // a playback matrix from out target canvas.
113a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    SkMatrix m = *matrix;
114a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    m.postConcat(fPlaybackMatrix);
115a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    fCanvas->setMatrix(m);
116a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    fCurrentMatrix = matrix;
117a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org}
118a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
119beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.comuint32_t SkPictureStateTree::Iterator::finish() {
120beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
121beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        fCanvas->restore();
122beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    }
123beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com
124beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    for (fCurrentNode = fCurrentNode->fParent; fCurrentNode;
125beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com            fCurrentNode = fCurrentNode->fParent) {
126beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        // Note: we call restore() twice when both flags are set.
127beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        if (fCurrentNode->fFlags & Node::kSave_Flag) {
128beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com            fCanvas->restore();
129beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        }
130db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com        if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
131db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com            fCanvas->restore();
1322b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org        }
133beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    }
134a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
135beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    fCanvas->setMatrix(fPlaybackMatrix);
136beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    fCurrentMatrix = NULL;
137beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    return kDrawComplete;
138beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com}
139a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
140beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.comuint32_t SkPictureStateTree::Iterator::nextDraw() {
141beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    SkASSERT(this->isValid());
142beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    if (fPlaybackIndex >= fDraws->count()) {
143beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        return this->finish();
1449fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
1459fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1468515e79a7699922e0f95f93e8cc11d4c88657c58rileya@google.com    Draw* draw = static_cast<Draw*>((*fDraws)[fPlaybackIndex]);
1479fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    Node* targetNode = draw->fNode;
1489fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1499fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    if (fSave) {
150a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org        fCanvas->save();
1519fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        fSave = false;
1529fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
1539fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1549fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    if (fCurrentNode != targetNode) {
1559fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // If we're not at the target and we don't have a list of nodes to get there, we need to
1569fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // figure out the path from our current node, to the target
1579fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        if (fNodes.count() == 0) {
1589fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // Trace back up to a common ancestor, restoring to get our current state to match that
1599fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // of the ancestor, and saving a list of nodes whose state we need to apply to get to
1609fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // the target (we can restore up to the ancestor immediately, but we'll need to return
1619fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // an offset for each node on the way down to the target, to apply the desired clips and
1629fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // saveLayers, so it may take several draw() calls before the next draw actually occurs)
1639fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            Node* tmp = fCurrentNode;
1649fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            Node* ancestor = targetNode;
1659fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            while (tmp != ancestor) {
1669fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                uint16_t currentLevel = tmp->fLevel;
1679fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                uint16_t targetLevel = ancestor->fLevel;
1689fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                if (currentLevel >= targetLevel) {
169db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    if (tmp != fCurrentNode && tmp->fFlags & Node::kSave_Flag) {
170db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                        fCanvas->restore();
171a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        // restore() may change the matrix, so we need to reapply.
172a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        fCurrentMatrix = NULL;
1732b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                    }
174db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    if (tmp->fFlags & Node::kSaveLayer_Flag) {
175db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                        fCanvas->restore();
176a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        // restore() may change the matrix, so we need to reapply.
177a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        fCurrentMatrix = NULL;
1782b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                    }
1799fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    tmp = tmp->fParent;
1809fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                }
1819fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                if (currentLevel <= targetLevel) {
1829fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    fNodes.push(ancestor);
1839fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    ancestor = ancestor->fParent;
1849fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                }
1859fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            }
1869fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1879fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            if (ancestor->fFlags & Node::kSave_Flag) {
188db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                if (fCurrentNode != ancestor) {
189db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    fCanvas->restore();
190a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    // restore() may change the matrix, so we need to reapply.
191a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    fCurrentMatrix = NULL;
1922b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                }
193db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                if (targetNode != ancestor) {
194a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    fCanvas->save();
1952b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                }
1969fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            }
1979fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fCurrentNode = ancestor;
1989fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        }
1999fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
2009fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // If we're not at the target node yet, we'll need to return an offset to make the caller
2019fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // apply the next clip or saveLayer.
2029fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        if (fCurrentNode != targetNode) {
2039fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            uint32_t offset = fNodes.top()->fOffset;
2049fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fCurrentNode = fNodes.top();
2059fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fSave = fCurrentNode != targetNode && fCurrentNode->fFlags & Node::kSave_Flag;
2069fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fNodes.pop();
207a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org            this->setCurrentMatrix(fCurrentNode->fMatrix);
2089fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            return offset;
2099fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        }
2109fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
2119fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
2129fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    // If we got this far, the clip/saveLayer state is all set, so we can proceed to set the matrix
2139fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    // for the draw, and return its offset.
214a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    this->setCurrentMatrix(draw->fMatrix);
2159fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
2169fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    ++fPlaybackIndex;
2179fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    return draw->fOffset;
2189fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
219