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>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 635f453..7398f28 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -984,6 +984,7 @@
SkLazyPaint lazyP;
SkImageFilter* imageFilter = paint ? paint->getImageFilter() : nullptr;
SkMatrix stashedMatrix = fMCRec->fMatrix;
+ MCRec* modifiedRec = nullptr;
SkMatrix remainder;
SkSize scale;
/*
@@ -1006,6 +1007,7 @@
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 @@
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;
}