diff options
author | Robert Phillips <robertphillips@google.com> | 2018-04-20 10:27:27 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-04-20 15:13:55 +0000 |
commit | 3d0e8507face451a4b17698beb6ad0ea51b9ef1d (patch) | |
tree | 876f06c75dbcdd21fd61d37bc62b614170025ed1 /src/core/SkCanvas.cpp | |
parent | 1eece783181701bf07431180eca13c689fd13aee (diff) |
Prevent matrix stack from being corrupted if a rotated image filter is clipped out
Bug: skia:7765
Change-Id: Id76b63cebc25dcdff02d4ba3f6d6bba6f2b6b842
Reviewed-on: https://skia-review.googlesource.com/122782
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/core/SkCanvas.cpp')
-rw-r--r-- | src/core/SkCanvas.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 635f453bf7..7398f2819d 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -984,6 +984,7 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra SkLazyPaint lazyP; SkImageFilter* imageFilter = paint ? paint->getImageFilter() : nullptr; SkMatrix stashedMatrix = fMCRec->fMatrix; + MCRec* modifiedRec = nullptr; SkMatrix remainder; SkSize scale; /* @@ -1006,6 +1007,7 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra stashedMatrix.decomposeScale(&scale, &remainder)) { // We will restore the matrix (which we are overwriting here) in restore via fStashedMatrix + modifiedRec = fMCRec; this->internalSetMatrix(SkMatrix::MakeScale(scale.width(), scale.height())); SkPaint* p = lazyP.set(*paint); p->setImageFilter(SkImageFilter::MakeMatrixFilter(remainder, @@ -1021,6 +1023,11 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra SkIRect ir; if (!this->clipRectBounds(bounds, saveLayerFlags, &ir, imageFilter)) { + if (modifiedRec) { + // In this case there will be no layer in which to stash the matrix so we need to + // revert the prior MCRec to its earlier state. + modifiedRec->fMatrix = stashedMatrix; + } return; } |