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() {
494b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    SkASSERT(NULL != 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
76a9279f0749f7641d946517be44a1b74fa64ebbc2skia.committer@gmail.comSkPictureStateTree::Iterator SkPictureStateTree::getIterator(const SkTDArray<void*>& draws,
779fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                                                             SkCanvas* canvas) {
78773f8e24214991332eaf903e72c13dca7d78d40dcommit-bot@chromium.org    return Iterator(draws, canvas, &fRoot);
799fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
809fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
816fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.comvoid SkPictureStateTree::appendNode(size_t offset) {
829fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    Node* n = static_cast<Node*>(fAlloc.allocThrow(sizeof(Node)));
836fcd28ba1de83b72f4c8343ccec27d26c127de32reed@google.com    n->fOffset = SkToU32(offset);
849fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fFlags = 0;
859fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fParent = fCurrentState.fNode;
869fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fLevel = fCurrentState.fNode->fLevel + 1;
879fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    n->fMatrix = fCurrentState.fMatrix;
889fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    fCurrentState.fNode = n;
899fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
909fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
919fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.comSkPictureStateTree::Iterator::Iterator(const SkTDArray<void*>& draws, SkCanvas* canvas, Node* root)
928515e79a7699922e0f95f93e8cc11d4c88657c58rileya@google.com    : fDraws(&draws)
939fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    , fCanvas(canvas)
949fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    , fCurrentNode(root)
95178a267a6cb1405805caf23fe074d68b509f76d3robertphillips@google.com    , fPlaybackMatrix(canvas->getTotalMatrix())
969fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    , fCurrentMatrix(NULL)
979fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    , fPlaybackIndex(0)
988515e79a7699922e0f95f93e8cc11d4c88657c58rileya@google.com    , fSave(false)
998515e79a7699922e0f95f93e8cc11d4c88657c58rileya@google.com    , fValid(true) {
1009fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
1019fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
102a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.orgvoid SkPictureStateTree::Iterator::setCurrentMatrix(const SkMatrix* matrix) {
103a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    SkASSERT(NULL != matrix);
104a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
105a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    if (matrix == fCurrentMatrix) {
106a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org        return;
107a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    }
108a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
109a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    // The matrix is in recording space, but we also inherit
110a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    // a playback matrix from out target canvas.
111a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    SkMatrix m = *matrix;
112a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    m.postConcat(fPlaybackMatrix);
113a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    fCanvas->setMatrix(m);
114a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    fCurrentMatrix = matrix;
115a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org}
116a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
117beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.comuint32_t SkPictureStateTree::Iterator::finish() {
118beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
119beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        fCanvas->restore();
120beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    }
121beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com
122beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    for (fCurrentNode = fCurrentNode->fParent; fCurrentNode;
123beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com            fCurrentNode = fCurrentNode->fParent) {
124beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        // Note: we call restore() twice when both flags are set.
125beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        if (fCurrentNode->fFlags & Node::kSave_Flag) {
126beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com            fCanvas->restore();
127beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        }
128db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com        if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
129db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com            fCanvas->restore();
1302b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org        }
131beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    }
132a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
133beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    fCanvas->setMatrix(fPlaybackMatrix);
134beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    fCurrentMatrix = NULL;
135beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    return kDrawComplete;
136beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com}
137a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org
138beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.comuint32_t SkPictureStateTree::Iterator::nextDraw() {
139beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    SkASSERT(this->isValid());
140beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com    if (fPlaybackIndex >= fDraws->count()) {
141beb1af2f34b5c538fc08d849b132355160b4c93frobertphillips@google.com        return this->finish();
1429fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
1439fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1448515e79a7699922e0f95f93e8cc11d4c88657c58rileya@google.com    Draw* draw = static_cast<Draw*>((*fDraws)[fPlaybackIndex]);
1459fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    Node* targetNode = draw->fNode;
1469fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1479fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    if (fSave) {
148a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org        fCanvas->save();
1499fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        fSave = false;
1509fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
1519fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1529fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    if (fCurrentNode != targetNode) {
1539fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // If we're not at the target and we don't have a list of nodes to get there, we need to
1549fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // figure out the path from our current node, to the target
1559fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        if (fNodes.count() == 0) {
1569fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // Trace back up to a common ancestor, restoring to get our current state to match that
1579fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // of the ancestor, and saving a list of nodes whose state we need to apply to get to
1589fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // the target (we can restore up to the ancestor immediately, but we'll need to return
1599fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // an offset for each node on the way down to the target, to apply the desired clips and
1609fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            // saveLayers, so it may take several draw() calls before the next draw actually occurs)
1619fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            Node* tmp = fCurrentNode;
1629fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            Node* ancestor = targetNode;
1639fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            while (tmp != ancestor) {
1649fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                uint16_t currentLevel = tmp->fLevel;
1659fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                uint16_t targetLevel = ancestor->fLevel;
1669fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                if (currentLevel >= targetLevel) {
167db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    if (tmp != fCurrentNode && tmp->fFlags & Node::kSave_Flag) {
168db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                        fCanvas->restore();
169a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        // restore() may change the matrix, so we need to reapply.
170a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        fCurrentMatrix = NULL;
1712b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                    }
172db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    if (tmp->fFlags & Node::kSaveLayer_Flag) {
173db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                        fCanvas->restore();
174a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        // restore() may change the matrix, so we need to reapply.
175a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                        fCurrentMatrix = NULL;
1762b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                    }
1779fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    tmp = tmp->fParent;
1789fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                }
1799fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                if (currentLevel <= targetLevel) {
1809fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    fNodes.push(ancestor);
1819fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                    ancestor = ancestor->fParent;
1829fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com                }
1839fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            }
1849fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1859fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            if (ancestor->fFlags & Node::kSave_Flag) {
186db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                if (fCurrentNode != ancestor) {
187db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                    fCanvas->restore();
188a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    // restore() may change the matrix, so we need to reapply.
189a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    fCurrentMatrix = NULL;
1902b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                }
191db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com                if (targetNode != ancestor) {
192a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org                    fCanvas->save();
1932b290cec9825da11d8e09074727cfaac5eca6453commit-bot@chromium.org                }
1949fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            }
1959fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fCurrentNode = ancestor;
1969fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        }
1979fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
1989fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // If we're not at the target node yet, we'll need to return an offset to make the caller
1999fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        // apply the next clip or saveLayer.
2009fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        if (fCurrentNode != targetNode) {
2019fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            uint32_t offset = fNodes.top()->fOffset;
2029fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fCurrentNode = fNodes.top();
2039fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fSave = fCurrentNode != targetNode && fCurrentNode->fFlags & Node::kSave_Flag;
2049fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            fNodes.pop();
205a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org            this->setCurrentMatrix(fCurrentNode->fMatrix);
2069fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com            return offset;
2079fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com        }
2089fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    }
2099fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
2109fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    // If we got this far, the clip/saveLayer state is all set, so we can proceed to set the matrix
2119fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    // for the draw, and return its offset.
212a31eacb22e12a4223740e53ff5a11bd08340106ecommit-bot@chromium.org    this->setCurrentMatrix(draw->fMatrix);
2139fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com
2149fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    ++fPlaybackIndex;
2159fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com    return draw->fOffset;
2169fd7f8d2906365637dc25f98ffdede87d631ef71rileya@google.com}
217