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();
+                }
             }
         }
     }