Check SkRRect::transform result, don't assume S+T matrix is safe
Bug: chromium:1132739
Change-Id: I67b7ac535232925e98e44c0bb90964fded9f4d05
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/320068
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/GrClipStack.cpp b/src/gpu/GrClipStack.cpp
index 1d7c9a0..0072727 100644
--- a/src/gpu/GrClipStack.cpp
+++ b/src/gpu/GrClipStack.cpp
@@ -570,16 +570,19 @@
SkASSERT(fOuterBounds.contains(fInnerBounds) || fInnerBounds.isEmpty());
}
} else if (fShape.isRRect()) {
- // Can't transform in place
- SkRRect src = fShape.rrect();
- SkAssertResult(src.transform(fLocalToDevice, &fShape.rrect()));
- fLocalToDevice.setIdentity();
- fDeviceToLocal.setIdentity();
+ // Can't transform in place and must still check transform result since some very
+ // ill-formed scale+translate matrices can cause invalid rrect radii.
+ SkRRect src;
+ if (fShape.rrect().transform(fLocalToDevice, &src)) {
+ fShape.rrect() = src;
+ fLocalToDevice.setIdentity();
+ fDeviceToLocal.setIdentity();
- SkRect inner = SkRRectPriv::InnerBounds(fShape.rrect());
- fInnerBounds = GrClip::GetPixelIBounds(inner, fAA, BoundsType::kInterior);
- if (!fInnerBounds.intersect(deviceBounds)) {
- fInnerBounds = SkIRect::MakeEmpty();
+ SkRect inner = SkRRectPriv::InnerBounds(fShape.rrect());
+ fInnerBounds = GrClip::GetPixelIBounds(inner, fAA, BoundsType::kInterior);
+ if (!fInnerBounds.intersect(deviceBounds)) {
+ fInnerBounds = SkIRect::MakeEmpty();
+ }
}
}
}