Reland "Add support for SkCanvas::kStrict_SrcRectConstraint to GrTextureOp."

This is a reland of a0047bcff704a9121a6d82a6f97d6124463a2e54

Original change's description:
> Add support for SkCanvas::kStrict_SrcRectConstraint to GrTextureOp.
> 
> Change-Id: I8faa2838b3110b8080ac48bbe223240e3fb22998
> Reviewed-on: https://skia-review.googlesource.com/129762
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Brian Salomon <bsalomon@google.com>

Change-Id: Icbad064ae2779f4e140a55e520c0034cd1d17477
Reviewed-on: https://skia-review.googlesource.com/130305
Reviewed-by: Stephen White <senorblanco@chromium.org>
diff --git a/gm/perspimages.cpp b/gm/perspimages.cpp
index a4242cf..b4ad5eb 100644
--- a/gm/perspimages.cpp
+++ b/gm/perspimages.cpp
@@ -28,7 +28,7 @@
 protected:
     SkString onShortName() override { return SkString("persp_images"); }
 
-    SkISize onISize() override { return SkISize::Make(1150, 880); }
+    SkISize onISize() override { return SkISize::Make(1150, 1280); }
 
     void onOnceBeforeDraw() override {
         fImages.push_back(make_image1());
@@ -60,7 +60,13 @@
         }
         canvas->translate(-bounds.fLeft + 10.f, -bounds.fTop + 10.f);
         canvas->save();
-        for (auto subrect : {false, true}) {
+        enum class DrawType {
+            kDrawImage,
+            kDrawImageRectStrict,
+            kDrawImageRectFast,
+        };
+        for (auto type :
+             {DrawType::kDrawImage, DrawType::kDrawImageRectStrict, DrawType::kDrawImageRectFast}) {
             for (const auto& m : matrices) {
                 for (auto aa : {false, true}) {
                     paint.setAntiAlias(aa);
@@ -70,14 +76,22 @@
                             paint.setFilterQuality(filter);
                             canvas->save();
                             canvas->concat(m);
-                            if (subrect) {
-                                SkRect src = {img->width() / 4.f, img->height() / 4.f,
-                                              3.f * img->width() / 4.f, 3.f * img->height() / 4};
-                                SkRect dst = {0, 0,
-                                              3.f / 4.f * img->width(), 3.f / 4.f * img->height()};
-                                canvas->drawImageRect(img, src, dst, &paint);
-                            } else {
-                                canvas->drawImage(img, 0, 0, &paint);
+                            SkRect src = {img->width() / 4.f, img->height() / 4.f,
+                                          3.f * img->width() / 4.f, 3.f * img->height() / 4};
+                            SkRect dst = {0, 0,
+                                          3.f / 4.f * img->width(), 3.f / 4.f * img->height()};
+                            switch (type) {
+                                case DrawType::kDrawImage:
+                                    canvas->drawImage(img, 0, 0, &paint);
+                                    break;
+                                case DrawType::kDrawImageRectStrict:
+                                    canvas->drawImageRect(img, src, dst, &paint,
+                                                          SkCanvas::kStrict_SrcRectConstraint);
+                                    break;
+                                case DrawType::kDrawImageRectFast:
+                                    canvas->drawImageRect(img, src, dst, &paint,
+                                                          SkCanvas::kFast_SrcRectConstraint);
+                                    break;
                             }
                             canvas->restore();
                             ++n;