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