diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-07 21:31:09 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-07 21:31:09 +0000 |
commit | beb1af2f34b5c538fc08d849b132355160b4c93f (patch) | |
tree | f54c63e2f844993197f3faf2b7c55ab468d90001 /src/core/SkPictureStateTree.cpp | |
parent | c71da1f6ed3a5e1a3eb2dd860b8129e1b423f9f4 (diff) |
First pass at pre-rendering saveLayers for GPU
https://codereview.chromium.org/261663003/
git-svn-id: http://skia.googlecode.com/svn/trunk@14632 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkPictureStateTree.cpp')
-rw-r--r-- | src/core/SkPictureStateTree.cpp | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/src/core/SkPictureStateTree.cpp b/src/core/SkPictureStateTree.cpp index f6d54ffedc..39a1a47e14 100644 --- a/src/core/SkPictureStateTree.cpp +++ b/src/core/SkPictureStateTree.cpp @@ -114,27 +114,60 @@ void SkPictureStateTree::Iterator::setCurrentMatrix(const SkMatrix* matrix) { fCurrentMatrix = matrix; } -uint32_t SkPictureStateTree::Iterator::nextDraw() { +uint32_t SkPictureStateTree::Iterator::peekDraw() { + SkASSERT(this->isValid()); + if (fPlaybackIndex >= fDraws->count()) { + return kDrawComplete; + } + + Draw* draw = static_cast<Draw*>((*fDraws)[fPlaybackIndex]); + return draw->fOffset; +} + +uint32_t SkPictureStateTree::Iterator::skipDraw() { SkASSERT(this->isValid()); if (fPlaybackIndex >= fDraws->count()) { + return this->finish(); + } + + Draw* draw = static_cast<Draw*>((*fDraws)[fPlaybackIndex]); + + if (fSave) { + fCanvas->save(); + fSave = false; + } + + fNodes.rewind(); + + ++fPlaybackIndex; + return draw->fOffset; +} + +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(); } + } - 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; +} - 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]); |