diff options
Diffstat (limited to 'src/core/SkPictureStateTree.cpp')
-rw-r--r-- | src/core/SkPictureStateTree.cpp | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/src/core/SkPictureStateTree.cpp b/src/core/SkPictureStateTree.cpp index 20a826aa92..891d04ca21 100644 --- a/src/core/SkPictureStateTree.cpp +++ b/src/core/SkPictureStateTree.cpp @@ -99,39 +99,24 @@ SkPictureStateTree::Iterator::Iterator(const SkTDArray<void*>& draws, SkCanvas* , fValid(true) { } -void SkPictureStateTree::Iterator::setCurrentMatrix(const SkMatrix* matrix) { - SkASSERT(NULL != 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::nextDraw() { +uint32_t SkPictureStateTree::Iterator::draw() { SkASSERT(this->isValid()); if (fPlaybackIndex >= fDraws->count()) { + // restore back to where we started + fCanvas->setMatrix(fPlaybackMatrix); if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) { fCanvas->restore(); } - - for (fCurrentNode = fCurrentNode->fParent; fCurrentNode; - fCurrentNode = fCurrentNode->fParent) { - if (fCurrentNode->fFlags & (Node::kSave_Flag | Node::kSaveLayer_Flag)) { + fCurrentNode = fCurrentNode->fParent; + while (NULL != fCurrentNode) { + if (fCurrentNode->fFlags & Node::kSave_Flag) { + fCanvas->restore(); + } + if (fCurrentNode->fFlags & Node::kSaveLayer_Flag) { fCanvas->restore(); } + fCurrentNode = fCurrentNode->fParent; } - - // restore back to where we started - fCanvas->setMatrix(fPlaybackMatrix); - fCurrentMatrix = NULL; - return kDrawComplete; } @@ -160,13 +145,9 @@ uint32_t SkPictureStateTree::Iterator::nextDraw() { 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; } @@ -174,19 +155,17 @@ uint32_t SkPictureStateTree::Iterator::nextDraw() { fNodes.push(ancestor); ancestor = ancestor->fParent; } - - SkASSERT(NULL != tmp); - SkASSERT(NULL != ancestor); } 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(); + // FIXME: the save below depends on soon-to-be-deprecated + // SaveFlags behavior: it relies on matrix changes persisting + // after restore. + fCanvas->save(SkCanvas::kClip_SaveFlag); } } fCurrentNode = ancestor; @@ -195,18 +174,29 @@ uint32_t SkPictureStateTree::Iterator::nextDraw() { // 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) { + if (fCurrentMatrix != fNodes.top()->fMatrix) { + fCurrentMatrix = fNodes.top()->fMatrix; + SkMatrix tmp = *fNodes.top()->fMatrix; + tmp.postConcat(fPlaybackMatrix); + fCanvas->setMatrix(tmp); + } 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); + + if (fCurrentMatrix != draw->fMatrix) { + SkMatrix tmp = *draw->fMatrix; + tmp.postConcat(fPlaybackMatrix); + fCanvas->setMatrix(tmp); + fCurrentMatrix = draw->fMatrix; + } ++fPlaybackIndex; return draw->fOffset; |