| Index: src/core/SkPictureStateTree.cpp
|
| diff --git a/src/core/SkPictureStateTree.cpp b/src/core/SkPictureStateTree.cpp
|
| deleted file mode 100644
|
| index 704a04ebee962e2fd90fcebc6a6e42d2a440fcc4..0000000000000000000000000000000000000000
|
| --- a/src/core/SkPictureStateTree.cpp
|
| +++ /dev/null
|
| @@ -1,218 +0,0 @@
|
| -
|
| -/*
|
| - * Copyright 2012 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "SkPictureStateTree.h"
|
| -#include "SkCanvas.h"
|
| -
|
| -SkPictureStateTree::SkPictureStateTree()
|
| - : fAlloc(2048)
|
| - , fLastRestoredNode(NULL)
|
| - , fStateStack(sizeof(Draw), 16) {
|
| - fRootMatrix.reset();
|
| - fRoot.fParent = NULL;
|
| - fRoot.fMatrix = &fRootMatrix;
|
| - fRoot.fFlags = Node::kSave_Flag;
|
| - fRoot.fOffset = 0;
|
| - fRoot.fLevel = 0;
|
| - fCurrentState.fNode = &fRoot;
|
| - fCurrentState.fMatrix = &fRootMatrix;
|
| - *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
|
| -}
|
| -
|
| -SkPictureStateTree::~SkPictureStateTree() {
|
| -}
|
| -
|
| -SkPictureStateTree::Draw* SkPictureStateTree::appendDraw(size_t offset) {
|
| - Draw* draw = static_cast<Draw*>(fAlloc.allocThrow(sizeof(Draw)));
|
| - *draw = fCurrentState;
|
| - draw->fOffset = SkToU32(offset);
|
| - return draw;
|
| -}
|
| -
|
| -void SkPictureStateTree::appendSave() {
|
| - *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
|
| - fCurrentState.fNode->fFlags |= Node::kSave_Flag;
|
| -}
|
| -
|
| -void SkPictureStateTree::appendSaveLayer(size_t offset) {
|
| - *static_cast<Draw*>(fStateStack.push_back()) = fCurrentState;
|
| - this->appendNode(offset);
|
| - fCurrentState.fNode->fFlags |= Node::kSaveLayer_Flag;
|
| -}
|
| -
|
| -void SkPictureStateTree::saveCollapsed() {
|
| - SkASSERT(fLastRestoredNode);
|
| - SkASSERT(SkToBool(fLastRestoredNode->fFlags & \
|
| - (Node::kSaveLayer_Flag | Node::kSave_Flag)));
|
| - SkASSERT(fLastRestoredNode->fParent == fCurrentState.fNode);
|
| - // The structure of the tree is not modified here. We just turn off
|
| - // the save or saveLayer flag to prevent the iterator from making state
|
| - // changing calls on the playback canvas when traversing a save or
|
| - // saveLayerNode node.
|
| - fLastRestoredNode->fFlags = 0;
|
| -}
|
| -
|
| -void SkPictureStateTree::appendRestore() {
|
| - fLastRestoredNode = fCurrentState.fNode;
|
| - fCurrentState = *static_cast<Draw*>(fStateStack.back());
|
| - fStateStack.pop_back();
|
| -}
|
| -
|
| -void SkPictureStateTree::appendTransform(const SkMatrix& trans) {
|
| - SkMatrix* m = static_cast<SkMatrix*>(fAlloc.allocThrow(sizeof(SkMatrix)));
|
| - *m = trans;
|
| - fCurrentState.fMatrix = m;
|
| -}
|
| -
|
| -void SkPictureStateTree::appendClip(size_t offset) {
|
| - this->appendNode(offset);
|
| -}
|
| -
|
| -void SkPictureStateTree::initIterator(SkPictureStateTree::Iterator* iter,
|
| - const SkTDArray<void*>& draws,
|
| - SkCanvas* canvas) {
|
| - iter->init(draws, canvas, &fRoot);
|
| -}
|
| -
|
| -void SkPictureStateTree::appendNode(size_t offset) {
|
| - Node* n = static_cast<Node*>(fAlloc.allocThrow(sizeof(Node)));
|
| - n->fOffset = SkToU32(offset);
|
| - n->fFlags = 0;
|
| - n->fParent = fCurrentState.fNode;
|
| - n->fLevel = fCurrentState.fNode->fLevel + 1;
|
| - n->fMatrix = fCurrentState.fMatrix;
|
| - fCurrentState.fNode = n;
|
| -}
|
| -
|
| -void SkPictureStateTree::Iterator::init(const SkTDArray<void*>& draws, SkCanvas* canvas, Node* root) {
|
| - SkASSERT(!fValid);
|
| - fDraws = &draws;
|
| - fCanvas = canvas;
|
| - fCurrentNode = root;
|
| - fPlaybackMatrix = canvas->getTotalMatrix();
|
| - fCurrentMatrix = NULL;
|
| - fPlaybackIndex = 0;
|
| - fSave = false;
|
| - fValid = true;
|
| -}
|
| -
|
| -void SkPictureStateTree::Iterator::setCurrentMatrix(const SkMatrix* matrix) {
|
| - SkASSERT(matrix);
|
| -
|
| - if (matrix == fCurrentMatrix) {
|
| - return;
|
| - }
|
| -
|
| - // The matrix is in recording space, but we also inherit
|
| - // a playback matrix from out target canvas.
|
| - SkMatrix m = *matrix;
|
| - m.postConcat(fPlaybackMatrix);
|
| - fCanvas->setMatrix(m);
|
| - fCurrentMatrix = matrix;
|
| -}
|
| -
|
| -uint32_t SkPictureStateTree::Iterator::finish() {
|
| - if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
|
| - fCanvas->restore();
|
| - }
|
| -
|
| - for (fCurrentNode = fCurrentNode->fParent; fCurrentNode;
|
| - fCurrentNode = fCurrentNode->fParent) {
|
| - // Note: we call restore() twice when both flags are set.
|
| - if (fCurrentNode->fFlags & Node::kSave_Flag) {
|
| - fCanvas->restore();
|
| - }
|
| - if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) {
|
| - fCanvas->restore();
|
| - }
|
| - }
|
| -
|
| - fCanvas->setMatrix(fPlaybackMatrix);
|
| - fCurrentMatrix = NULL;
|
| - return kDrawComplete;
|
| -}
|
| -
|
| -uint32_t SkPictureStateTree::Iterator::nextDraw() {
|
| - SkASSERT(this->isValid());
|
| - if (fPlaybackIndex >= fDraws->count()) {
|
| - return this->finish();
|
| - }
|
| -
|
| - Draw* draw = static_cast<Draw*>((*fDraws)[fPlaybackIndex]);
|
| - Node* targetNode = draw->fNode;
|
| -
|
| - if (fSave) {
|
| - fCanvas->save();
|
| - fSave = false;
|
| - }
|
| -
|
| - if (fCurrentNode != targetNode) {
|
| - // If we're not at the target and we don't have a list of nodes to get there, we need to
|
| - // figure out the path from our current node, to the target
|
| - if (fNodes.count() == 0) {
|
| - // Trace back up to a common ancestor, restoring to get our current state to match that
|
| - // of the ancestor, and saving a list of nodes whose state we need to apply to get to
|
| - // the target (we can restore up to the ancestor immediately, but we'll need to return
|
| - // an offset for each node on the way down to the target, to apply the desired clips and
|
| - // saveLayers, so it may take several draw() calls before the next draw actually occurs)
|
| - Node* tmp = fCurrentNode;
|
| - Node* ancestor = targetNode;
|
| - while (tmp != ancestor) {
|
| - uint16_t currentLevel = tmp->fLevel;
|
| - uint16_t targetLevel = ancestor->fLevel;
|
| - if (currentLevel >= targetLevel) {
|
| - if (tmp != fCurrentNode && tmp->fFlags & Node::kSave_Flag) {
|
| - fCanvas->restore();
|
| - // restore() may change the matrix, so we need to reapply.
|
| - fCurrentMatrix = NULL;
|
| - }
|
| - if (tmp->fFlags & Node::kSaveLayer_Flag) {
|
| - fCanvas->restore();
|
| - // restore() may change the matrix, so we need to reapply.
|
| - fCurrentMatrix = NULL;
|
| - }
|
| - tmp = tmp->fParent;
|
| - }
|
| - if (currentLevel <= targetLevel) {
|
| - fNodes.push(ancestor);
|
| - ancestor = ancestor->fParent;
|
| - }
|
| - }
|
| -
|
| - if (ancestor->fFlags & Node::kSave_Flag) {
|
| - if (fCurrentNode != ancestor) {
|
| - fCanvas->restore();
|
| - // restore() may change the matrix, so we need to reapply.
|
| - fCurrentMatrix = NULL;
|
| - }
|
| - if (targetNode != ancestor) {
|
| - fCanvas->save();
|
| - }
|
| - }
|
| - fCurrentNode = ancestor;
|
| - }
|
| -
|
| - // If we're not at the target node yet, we'll need to return an offset to make the caller
|
| - // apply the next clip or saveLayer.
|
| - if (fCurrentNode != targetNode) {
|
| - uint32_t offset = fNodes.top()->fOffset;
|
| - fCurrentNode = fNodes.top();
|
| - fSave = fCurrentNode != targetNode && fCurrentNode->fFlags & Node::kSave_Flag;
|
| - fNodes.pop();
|
| - this->setCurrentMatrix(fCurrentNode->fMatrix);
|
| - return offset;
|
| - }
|
| - }
|
| -
|
| - // If we got this far, the clip/saveLayer state is all set, so we can proceed to set the matrix
|
| - // for the draw, and return its offset.
|
| - this->setCurrentMatrix(draw->fMatrix);
|
| -
|
| - ++fPlaybackIndex;
|
| - return draw->fOffset;
|
| -}
|
|
|