Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Unified Diff: src/core/SkPictureStateTree.cpp

Issue 617953002: Strip old backend recording down to essentials (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: debug-only Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkPictureStateTree.h ('k') | tests/PictureStateTreeTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
-}
« no previous file with comments | « src/core/SkPictureStateTree.h ('k') | tests/PictureStateTreeTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698