Avoid MIP mapping in strict_constraint_no_red_allowed

Change-Id: Ia5fa3b7c61fb26abb9bcd2f21e1b9f01e77eb08e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/290762
Commit-Queue: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index fcf7c55..4c297f3 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -253,12 +253,18 @@
                 this->drawCase4(canvas, kCol1X, kRow3Y, aa, kLow_SkFilterQuality);
                 this->drawCase5(canvas, kCol1X, kRow4Y, aa, kLow_SkFilterQuality);
 
-                // Then draw a column with high filtering
-                this->drawCase1(canvas, kCol2X, kRow0Y, aa, kHigh_SkFilterQuality);
-                this->drawCase2(canvas, kCol2X, kRow1Y, aa, kHigh_SkFilterQuality);
-                this->drawCase3(canvas, kCol2X, kRow2Y, aa, kHigh_SkFilterQuality);
-                this->drawCase4(canvas, kCol2X, kRow3Y, aa, kHigh_SkFilterQuality);
-                this->drawCase5(canvas, kCol2X, kRow4Y, aa, kHigh_SkFilterQuality);
+                // Then draw a column with high filtering. Skip it if in kStrict mode and MIP
+                // mapping will be used. On GPU we allow bleeding at non-base levels because
+                // building a new MIP chain for the subset is expensive.
+                SkScalar scales[2];
+                SkAssertResult(matrices[m].getMinMaxScales(scales));
+                if (fConstraint != SkCanvas::kStrict_SrcRectConstraint || scales[0] >= 1.f) {
+                    this->drawCase1(canvas, kCol2X, kRow0Y, aa, kHigh_SkFilterQuality);
+                    this->drawCase2(canvas, kCol2X, kRow1Y, aa, kHigh_SkFilterQuality);
+                    this->drawCase3(canvas, kCol2X, kRow2Y, aa, kHigh_SkFilterQuality);
+                    this->drawCase4(canvas, kCol2X, kRow3Y, aa, kHigh_SkFilterQuality);
+                    this->drawCase5(canvas, kCol2X, kRow4Y, aa, kHigh_SkFilterQuality);
+                }
 
                 SkPoint corners[] = { { 0, 0 },{ 0, kBottom },{ kWidth, kBottom },{ kWidth, 0 } };
                 matrices[m].mapPoints(corners, 4);