pass sampling to drawImage

Bug: skia:7650
Change-Id: I0fa4c5f3fb350705f78ee91f4bdfb4edd83d0ed9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/361360
Reviewed-by: Mike Reed <[email protected]>
Commit-Queue: Mike Reed <[email protected]>
diff --git a/docs/examples/50_percent_gray.cpp b/docs/examples/50_percent_gray.cpp
index 60794dc..1aa0bcb 100644
--- a/docs/examples/50_percent_gray.cpp
+++ b/docs/examples/50_percent_gray.cpp
@@ -8,7 +8,8 @@
     surf->getCanvas()->drawRect({0, 0, 1, 1}, SkPaint());
     surf->getCanvas()->drawRect({1, 1, 2, 2}, SkPaint());
     return surf->makeImageSnapshot()->makeShader(SkTileMode::kRepeat,
-                                                 SkTileMode::kRepeat);
+                                                 SkTileMode::kRepeat
+                                                 SkSamplingOptions(SkFilterMode::kLinear));
 }
 
 void draw(SkCanvas* canvas) {
@@ -25,7 +26,6 @@
 
     // Scaled BW Dither
     canvas->translate(105, 0);
-    p.setFilterQuality(kLow_SkFilterQuality);
     canvas->save();
     canvas->scale(0.5, 0.5);
     canvas->drawRect({0, 0, 200, 200}, p);
diff --git a/docs/examples/50_percent_srgb.cpp b/docs/examples/50_percent_srgb.cpp
index 61746dd..d26491d 100644
--- a/docs/examples/50_percent_srgb.cpp
+++ b/docs/examples/50_percent_srgb.cpp
@@ -8,7 +8,8 @@
     surf->getCanvas()->drawRect({0, 0, 1, 1}, SkPaint());
     surf->getCanvas()->drawRect({1, 1, 2, 2}, SkPaint());
     return surf->makeImageSnapshot()->makeShader(SkTileMode::kRepeat,
-                                                 SkTileMode::kRepeat);
+                                                 SkTileMode::kRepeat,
+                                                 SkSamplingOptions(SkFilterMode::kLinear));
 }
 
 void draw(SkCanvas* canvas) {
@@ -17,7 +18,6 @@
     const SkRect r = { 0, 0, 100, 100 };
     SkPaint p;
     p.setShader(make());
-    p.setFilterQuality(kLow_SkFilterQuality);
     // this is a dither
     canvas->drawRect({0, 0, 50, 50}, p);
 
diff --git a/docs/examples/Bitmap_extractAlpha.cpp b/docs/examples/Bitmap_extractAlpha.cpp
index 4afda81..cfa14f5 100644
--- a/docs/examples/Bitmap_extractAlpha.cpp
+++ b/docs/examples/Bitmap_extractAlpha.cpp
@@ -17,7 +17,7 @@
     offscreen.flush();
     bitmap.extractAlpha(&alpha);
     paint.setColor(SK_ColorRED);
-    canvas->drawImage(bitmap.asImage(), 0, 0, &paint);
-    canvas->drawImage(alpha.asImage(), 100, 0, &paint);
+    canvas->drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
+    canvas->drawImage(alpha.asImage(), 100, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Bitmap_extractAlpha_2.cpp b/docs/examples/Bitmap_extractAlpha_2.cpp
index 4ec366f..06aa408 100644
--- a/docs/examples/Bitmap_extractAlpha_2.cpp
+++ b/docs/examples/Bitmap_extractAlpha_2.cpp
@@ -23,7 +23,7 @@
     SkIPoint offset;
     bitmap.extractAlpha(&alpha, &paint, &offset);
     paint.setColor(SK_ColorRED);
-    canvas->drawImage(bitmap.asImage(), 0, -offset.fY, &paint);
-    canvas->drawImage(alpha.asImage(), 100 + offset.fX, 0, &paint);
+    canvas->drawImage(bitmap.asImage(), 0, -offset.fY, SkSamplingOptions(), &paint);
+    canvas->drawImage(alpha.asImage(), 100 + offset.fX, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Bitmap_extractAlpha_3.cpp b/docs/examples/Bitmap_extractAlpha_3.cpp
index e5fcdf4..461abc8 100644
--- a/docs/examples/Bitmap_extractAlpha_3.cpp
+++ b/docs/examples/Bitmap_extractAlpha_3.cpp
@@ -19,7 +19,7 @@
     SkIPoint offset;
     bitmap.extractAlpha(&alpha, &paint, nullptr, &offset);
     paint.setColor(SK_ColorRED);
-    canvas->drawImage(bitmap.asImage(), 0, -offset.fY, &paint);
-    canvas->drawImage(alpha.asImage(), 100 + offset.fX, 0, &paint);
+    canvas->drawImage(bitmap.asImage(), 0, -offset.fY, SkSamplingOptions(), &paint);
+    canvas->drawImage(alpha.asImage(), 100 + offset.fX, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Canvas_drawImage.cpp b/docs/examples/Canvas_drawImage.cpp
index fbebf34..0d07687 100644
--- a/docs/examples/Canvas_drawImage.cpp
+++ b/docs/examples/Canvas_drawImage.cpp
@@ -8,8 +8,8 @@
    SkImage* imagePtr = image.get();
    canvas->drawImage(imagePtr, 0, 0);
    SkPaint paint;
-   canvas->drawImage(imagePtr, 80, 0, &paint);
+   canvas->drawImage(imagePtr, 80, 0, SkSamplingOptions(), &paint);
    paint.setAlpha(0x80);
-   canvas->drawImage(imagePtr, 160, 0, &paint);
+   canvas->drawImage(imagePtr, 160, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Canvas_drawImageRect.cpp b/docs/examples/Canvas_drawImageRect.cpp
index fc01726..e6c90e5 100644
--- a/docs/examples/Canvas_drawImageRect.cpp
+++ b/docs/examples/Canvas_drawImageRect.cpp
@@ -13,14 +13,14 @@
     redBorder.installPixels(SkImageInfo::MakeN32Premul(4, 4),
             (void*) pixels, sizeof(pixels[0]));
     sk_sp<SkImage> image = redBorder.asImage();
-    SkPaint lowPaint;
+    SkSamplingOptions sampling;
     for (auto constraint : {
             SkCanvas::kFast_SrcRectConstraint,
             SkCanvas::kStrict_SrcRectConstraint,
             SkCanvas::kFast_SrcRectConstraint } ) {
         canvas->drawImageRect(image.get(), SkRect::MakeLTRB(1, 1, 3, 3),
-                SkRect::MakeLTRB(16, 16, 48, 48), &lowPaint, constraint);
-        lowPaint.setFilterQuality(kLow_SkFilterQuality);
+                SkRect::MakeLTRB(16, 16, 48, 48), sampling, nullptr, constraint);
+        sampling = SkSamplingOptions(SkFilterMode::kLinear);
         canvas->translate(80, 0);
     }
 }
diff --git a/docs/examples/Canvas_drawImageRect_2.cpp b/docs/examples/Canvas_drawImageRect_2.cpp
index 743f8bd..de6845c 100644
--- a/docs/examples/Canvas_drawImageRect_2.cpp
+++ b/docs/examples/Canvas_drawImageRect_2.cpp
@@ -6,8 +6,9 @@
 void draw(SkCanvas* canvas) {
     // sk_sp<SkImage> image;
     for (auto i : { 1, 2, 4, 8 } ) {
-        canvas->drawImageRect(image.get(), SkIRect::MakeLTRB(0, 0, 100, 100),
-                SkRect::MakeXYWH(i * 20, i * 20, i * 20, i * 20), nullptr);
+        canvas->drawImageRect(image.get(), SkRect::MakeLTRB(0, 0, 100, 100),
+                SkRect::MakeXYWH(i * 20, i * 20, i * 20, i * 20), SkSamplingOptions(),
+                nullptr, SkCanvas::kStrict_SrcRectConstraint);
     }
 }
 }  // END FIDDLE
diff --git a/docs/examples/Canvas_drawImageRect_3.cpp b/docs/examples/Canvas_drawImageRect_3.cpp
index ad6f0d97..8c0363f 100644
--- a/docs/examples/Canvas_drawImageRect_3.cpp
+++ b/docs/examples/Canvas_drawImageRect_3.cpp
@@ -6,7 +6,7 @@
 void draw(SkCanvas* canvas) {
     // sk_sp<SkImage> image;
     for (auto i : { 20, 40, 80, 160 } ) {
-        canvas->drawImageRect(image.get(), SkRect::MakeXYWH(i, i, i, i), nullptr);
+        canvas->drawImageRect(image.get(), SkRect::MakeXYWH(i, i, i, i), SkSamplingOptions());
     }
 }
 }  // END FIDDLE
diff --git a/docs/examples/Canvas_drawImageRect_4.cpp b/docs/examples/Canvas_drawImageRect_4.cpp
index b80a270..6b1b5d4 100644
--- a/docs/examples/Canvas_drawImageRect_4.cpp
+++ b/docs/examples/Canvas_drawImageRect_4.cpp
@@ -14,7 +14,8 @@
     canvas->scale(4, 4);
     for (auto alpha : { 50, 100, 150, 255 } ) {
         paint.setAlpha(alpha);
-        canvas->drawImageRect(image, SkRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);
+        canvas->drawImageRect(image, SkRect::MakeWH(2, 2), SkRect::MakeWH(8, 8),
+                              SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint);
         canvas->translate(8, 0);
     }
 }
diff --git a/docs/examples/Canvas_drawImageRect_5.cpp b/docs/examples/Canvas_drawImageRect_5.cpp
index 22111e1..646d66f 100644
--- a/docs/examples/Canvas_drawImageRect_5.cpp
+++ b/docs/examples/Canvas_drawImageRect_5.cpp
@@ -14,7 +14,8 @@
     canvas->scale(4, 4);
     for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
         paint.setColorFilter(SkColorFilters::Blend(color, SkBlendMode::kPlus));
-        canvas->drawImageRect(image, SkIRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);
+        canvas->drawImageRect(image, SkRect::MakeWH(2, 2), SkRect::MakeWH(8, 8),
+                              SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint);
         canvas->translate(8, 0);
     }
 }
diff --git a/docs/examples/Canvas_drawImageRect_6.cpp b/docs/examples/Canvas_drawImageRect_6.cpp
index 8940fa2..5b4ff80 100644
--- a/docs/examples/Canvas_drawImageRect_6.cpp
+++ b/docs/examples/Canvas_drawImageRect_6.cpp
@@ -14,7 +14,7 @@
     canvas->scale(4, 4);
     for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
         paint.setColorFilter(SkColorFilters::Blend(color, SkBlendMode::kPlus));
-        canvas->drawImageRect(image, SkRect::MakeWH(8, 8), &paint);
+        canvas->drawImageRect(image, SkRect::MakeWH(8, 8), SkSamplingOptions(), &paint);
         canvas->translate(8, 0);
     }
 }
diff --git a/docs/examples/Canvas_drawImage_2.cpp b/docs/examples/Canvas_drawImage_2.cpp
index 0b0a48f..c5a5939 100644
--- a/docs/examples/Canvas_drawImage_2.cpp
+++ b/docs/examples/Canvas_drawImage_2.cpp
@@ -7,8 +7,8 @@
    // sk_sp<SkImage> image;
    canvas->drawImage(image, 0, 0);
    SkPaint paint;
-   canvas->drawImage(image, 80, 0, &paint);
+   canvas->drawImage(image, 80, 0, SkSamplingOptions(), &paint);
    paint.setAlpha(0x80);
-   canvas->drawImage(image, 160, 0, &paint);
+   canvas->drawImage(image, 160, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Canvas_saveLayer_3.cpp b/docs/examples/Canvas_saveLayer_3.cpp
index 3a6d427..3c0f27d 100644
--- a/docs/examples/Canvas_saveLayer_3.cpp
+++ b/docs/examples/Canvas_saveLayer_3.cpp
@@ -5,7 +5,7 @@
 REG_FIDDLE(Canvas_saveLayer_3, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
     // sk_sp<SkImage> image = GetResourceAsImage("images/mandrill_256.png");
-    canvas->drawImage(image, 0, 0, nullptr);
+    canvas->drawImage(image, 0, 0);
     SkCanvas::SaveLayerRec rec;
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kPlus);
diff --git a/docs/examples/Dither_b.cpp b/docs/examples/Dither_b.cpp
index 075ca64..695ba5c 100644
--- a/docs/examples/Dither_b.cpp
+++ b/docs/examples/Dither_b.cpp
@@ -20,8 +20,9 @@
     canvas->scale(12, 12);
     canvas->drawImage(img, 0, 0);
     paint.setBlendMode(SkBlendMode::kPlus);
-    canvas->drawImage(img, 0, 11, &paint);
-    canvas->drawImage(img, 0, 11, &paint);
-    canvas->drawImage(img, 0, 11, &paint);
+    SkSamplingOptions sampling;
+    canvas->drawImage(img, 0, 11, sampling, &paint);
+    canvas->drawImage(img, 0, 11, sampling, &paint);
+    canvas->drawImage(img, 0, 11, sampling, &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Filter_Quality_Methods.cpp b/docs/examples/Filter_Quality_Methods.cpp
deleted file mode 100644
index 7c772b2..0000000
--- a/docs/examples/Filter_Quality_Methods.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=69369cff2f5b145a6f616092513266a0
-REG_FIDDLE(Filter_Quality_Methods, 256, 256, false, 3) {
-void draw(SkCanvas* canvas) {
-    SkPaint paint;
-    canvas->scale(.2f, .2f);
-    for (SkFilterQuality q : { kNone_SkFilterQuality, kLow_SkFilterQuality,
-                               kMedium_SkFilterQuality, kHigh_SkFilterQuality } ) {
-        paint.setFilterQuality(q);
-        canvas->drawImage(image.get(), 0, 0, &paint);
-        canvas->translate(550, 0);
-        if (kLow_SkFilterQuality == q) canvas->translate(-1100, 550);
-    }
-}
-}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_MakeA8.cpp b/docs/examples/ImageInfo_MakeA8.cpp
index 40f773f..70900d4 100644
--- a/docs/examples/ImageInfo_MakeA8.cpp
+++ b/docs/examples/ImageInfo_MakeA8.cpp
@@ -19,7 +19,7 @@
     canvas->scale(4, 4);
     for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {
         paint.setColor(color);
-        canvas->drawImage(bitmap.asImage(), 0, 0, &paint);
+        canvas->drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
         canvas->translate(12, 0);
     }
 }
diff --git a/docs/examples/Image_scalePixels.cpp b/docs/examples/Image_scalePixels.cpp
index ab38ecd..48a7eb3 100644
--- a/docs/examples/Image_scalePixels.cpp
+++ b/docs/examples/Image_scalePixels.cpp
@@ -12,10 +12,15 @@
     SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
                     &srcPixels.front(), rowBytes);
     canvas->scale(4, 4);
-    SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
-                     kMedium_SkFilterQuality, kHigh_SkFilterQuality };
-    for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
-        image->scalePixels(pixmap, SkSamplingOptions(qualities[index]));
+
+    const SkSamplingOptions samplings[] = {
+        SkSamplingOptions(),
+        SkSamplingOptions(SkFilterMode::kLinear),
+        SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear),
+        SkSamplingOptions({1.0f/3, 1.0f/3}),
+    };
+    for (unsigned index = 0; index < SK_ARRAY_COUNT(samplings); ++index) {
+        image->scalePixels(pixmap, samplings[index]);
         sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
         canvas->drawImage(filtered, 16 * index, 0);
     }
diff --git a/docs/examples/PaintDump.cpp b/docs/examples/PaintDump.cpp
index f66fbed..740c19e 100644
--- a/docs/examples/PaintDump.cpp
+++ b/docs/examples/PaintDump.cpp
@@ -27,16 +27,6 @@
     }
 }
 
-static const char* str(SkFilterQuality v) {
-    switch (v) {
-        case kNone_SkFilterQuality:   return "kNone_SkFilterQuality";
-        case kLow_SkFilterQuality:    return "kLow_SkFilterQuality";
-        case kMedium_SkFilterQuality: return "kMedium_SkFilterQuality";
-        case kHigh_SkFilterQuality:   return "kHigh_SkFilterQuality";
-        default: return "?";
-    }
-}
-
 static const char* str(bool v) { return v ? "true" : "false"; }
 
 SkString PaintStringDump(const SkPaint& p) {
@@ -67,9 +57,6 @@
     if (d.getStyle() != p.getStyle()) {
         s.appendf("p.setStyle(%s);\n", str(p.getStyle()));
     }
-    if (d.getFilterQuality() != p.getFilterQuality()) {
-        s.appendf("p.setFilterQuality(%s);\n", str(p.getFilterQuality()));
-    }
     if (d.getBlendMode() != p.getBlendMode()) {
         s.appendf("p.setBlendMode(SkBlendMode::k%s);\n", SkBlendMode_Name(p.getBlendMode()));
     }
diff --git a/docs/examples/Paint_getFilterQuality.cpp b/docs/examples/Paint_getFilterQuality.cpp
deleted file mode 100644
index dba72a0..0000000
--- a/docs/examples/Paint_getFilterQuality.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=d4ca1f23809b6835c4ba46ea98a86900
-REG_FIDDLE(Paint_getFilterQuality, 256, 256, true, 0) {
-void draw(SkCanvas* canvas) {
-    SkPaint paint;
-    SkDebugf("kNone_SkFilterQuality %c= paint.getFilterQuality()\n",
-            kNone_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');
-}
-}  // END FIDDLE
diff --git a/docs/examples/Paint_setFilterQuality.cpp b/docs/examples/Paint_setFilterQuality.cpp
deleted file mode 100644
index 3abeb6f..0000000
--- a/docs/examples/Paint_setFilterQuality.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=e4288fabf24ee60b645e8bb6ea0afadf
-REG_FIDDLE(Paint_setFilterQuality, 256, 256, true, 0) {
-void draw(SkCanvas* canvas) {
-    SkPaint paint;
-    paint.setFilterQuality(kHigh_SkFilterQuality);
-    SkDebugf("kHigh_SkFilterQuality %c= paint.getFilterQuality()\n",
-            kHigh_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');
-}
-}  // END FIDDLE
diff --git a/docs/examples/Paint_setStyle.cpp b/docs/examples/Paint_setStyle.cpp
index 64ffab3..a4ddccb 100644
--- a/docs/examples/Paint_setStyle.cpp
+++ b/docs/examples/Paint_setStyle.cpp
@@ -25,7 +25,7 @@
         canvas->drawLine(10, 10, 60, 60, paint);
         canvas->drawRect({80, 10, 130, 60}, paint);
         canvas->drawRegion(region, paint);
-        canvas->drawImage(bitmap.asImage(), 200, 10, &paint);
+        canvas->drawImage(bitmap.asImage(), 200, 10, SkSamplingOptions(), &paint);
         canvas->translate(0, 80);
     }
 }
diff --git a/docs/examples/alpha_bitmap_color_filter_mask_filter.cpp b/docs/examples/alpha_bitmap_color_filter_mask_filter.cpp
index 45ccd76..bc3aeca 100644
--- a/docs/examples/alpha_bitmap_color_filter_mask_filter.cpp
+++ b/docs/examples/alpha_bitmap_color_filter_mask_filter.cpp
@@ -26,20 +26,21 @@
 
 void draw(SkCanvas* canvas) {
     auto image = make_alpha_image(96, 96).asImage();
+    SkSamplingOptions sampling;
     SkPaint paint;
 
     paint.setColorFilter(make_color_filter());
     paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 10.0f, false));
-    canvas->drawImage(image.get(), 16, 16, &paint);
+    canvas->drawImage(image.get(), 16, 16, sampling, &paint);
 
     paint.setColorFilter(nullptr);
     paint.setShader(SkShaders::Color(SK_ColorCYAN));
-    canvas->drawImage(image.get(), 144, 16, &paint);
+    canvas->drawImage(image.get(), 144, 16, sampling, &paint);
 
     paint.setColorFilter(make_color_filter());
-    canvas->drawImage(image.get(), 16, 144, &paint);
+    canvas->drawImage(image.get(), 16, 144, sampling, &paint);
 
     paint.setMaskFilter(nullptr);
-    canvas->drawImage(image.get(), 144, 144, &paint);
+    canvas->drawImage(image.get(), 144, 144, sampling, &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/alphaimage_shader_colorfilter.cpp b/docs/examples/alphaimage_shader_colorfilter.cpp
index 8a5af29..16a899a 100644
--- a/docs/examples/alphaimage_shader_colorfilter.cpp
+++ b/docs/examples/alphaimage_shader_colorfilter.cpp
@@ -26,6 +26,6 @@
     p.setColorFilter(color_filter());
     auto i = alpha_image();
     canvas->scale(2, 2);
-    canvas->drawImage(i.get(), 32, 32, &p);
+    canvas->drawImage(i.get(), 32, 32, SkSamplingOptions(), &p);
 }
 }  // END FIDDLE
diff --git a/docs/examples/blur4444.cpp b/docs/examples/blur4444.cpp
index 0d24c90..48b89f7 100644
--- a/docs/examples/blur4444.cpp
+++ b/docs/examples/blur4444.cpp
@@ -36,7 +36,6 @@
     SkPaint blrPaint;
     blrPaint.setAntiAlias(true);
     blrPaint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 12.047));
-    blrPaint.setFilterQuality(kLow_SkFilterQuality);
     blrPaint.setBlendMode(SkBlendMode::kSrc);
     blrPaint.setDither(dither);
 
diff --git a/docs/examples/blur_alpha_img.cpp b/docs/examples/blur_alpha_img.cpp
index d60de63..abf5ddf 100644
--- a/docs/examples/blur_alpha_img.cpp
+++ b/docs/examples/blur_alpha_img.cpp
@@ -31,6 +31,6 @@
     SkPaint paint;
     paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 2.0f, 0));
     paint.setColor(0xFF008000);
-    canvas->drawImage(a8img, 8, 8, &paint);
+    canvas->drawImage(a8img, 8, 8, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/color_filter_vs_colorFilterImageFilter_saveLayer.cpp b/docs/examples/color_filter_vs_colorFilterImageFilter_saveLayer.cpp
index bd5b2bf..1fbc0cd 100644
--- a/docs/examples/color_filter_vs_colorFilterImageFilter_saveLayer.cpp
+++ b/docs/examples/color_filter_vs_colorFilterImageFilter_saveLayer.cpp
@@ -13,12 +13,12 @@
 void draw(SkCanvas* canvas) {
     SkPaint paint;
     paint.setColorFilter(saturate());
-    canvas->drawImageRect(image, {0, 0, 128, 128}, &paint);
+    canvas->drawImageRect(image, {0, 0, 128, 128}, SkSamplingOptions(), &paint);
 
     SkPaint paint2;
     paint2.setImageFilter(SkImageFilters::ColorFilter(saturate(), nullptr));
     SkAutoCanvasRestore autoCanvasRestore(canvas, false);
     canvas->saveLayer(nullptr, &paint2);
-    canvas->drawImageRect(image, {128, 0, 256, 128}, nullptr);
+    canvas->drawImageRect(image, {128, 0, 256, 128}, SkSamplingOptions());
 }
 }  // END FIDDLE
diff --git a/docs/examples/example3ps.cpp b/docs/examples/example3ps.cpp
index 53503f0..02db0ea 100644
--- a/docs/examples/example3ps.cpp
+++ b/docs/examples/example3ps.cpp
@@ -63,47 +63,46 @@
             SkImageInfo::Make(3, 2, SkColorType::kGray_8_SkColorType, kOpaque_SkAlphaType);
     sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, 3);
 
-    SkPaint bp;
     canvas->save();
     m = setpsmatrix(1, 0, 0, 1, -1, -24, 2);
     //  m.setAll(1, 0, -1, 0, 1, -24, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 
     canvas->save();
     m = setpsmatrix(0, 1, 1, 0, -24, -5, 2);
     //  m.setAll(0, -1, 5, -1, 0, -22, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 
     canvas->save();
     m = setpsmatrix(0, 1, -1, 0, 27, -8, 2);
     //  m.setAll(0, -1, 8, 1, 0, -25, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 
     canvas->save();
     m = setpsmatrix(0, -1, -1, 0, -24, 13, 2);
     //  m.setAll(0, 1, 9, -1, 0, -22, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 
     canvas->save();
     m = setpsmatrix(-1, 0, 0, -1, 17, 26, 2);
     //  m.setAll(-1, 0, 15, 0, -1, -22, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 
     canvas->save();
     m = setpsmatrix(-1, 0, 0, 1, 21, -24, 2);
     //  m.setAll(-1, 0, 19, 0, 1, -24, 0, 0, 1);
     canvas->concat(m);
-    canvas->drawImage(image, 0, 0, &bp);
+    canvas->drawImage(image, 0, 0);
     canvas->restore();
 }
 }  // END FIDDLE
diff --git a/docs/examples/f16to8888busted.cpp b/docs/examples/f16to8888busted.cpp
index c58928f..506d3b0 100644
--- a/docs/examples/f16to8888busted.cpp
+++ b/docs/examples/f16to8888busted.cpp
@@ -14,6 +14,6 @@
 
     // Take a snapshot from surface and draw it on the canvas
     sk_sp<SkImage> img = offscreen->makeImageSnapshot();
-    canvas->drawImageRect(img, SkRect::MakeWH(100, 100), nullptr);
+    canvas->drawImageRect(img, SkRect::MakeWH(100, 100), SkSamplingOptions());
 }
 }  // END FIDDLE
diff --git a/docs/examples/purplestamp.cpp b/docs/examples/purplestamp.cpp
index 0fde706..d922508 100644
--- a/docs/examples/purplestamp.cpp
+++ b/docs/examples/purplestamp.cpp
@@ -40,14 +40,16 @@
 void draw(SkCanvas* canvas) {
     SkPaint paint;
     paint.setColorFilter(SkColorFilters::Blend(0xFF7F00FF, SkBlendMode::kSrcIn));
-    paint.setFilterQuality(kMedium_SkFilterQuality);
     paint.setAntiAlias(true);
+
+    SkSamplingOptions sampling(SkFilterMode::kLinear, SkMipmapMode::kLinear);
+
     canvas->rotate(30);
     canvas->translate(60, 0);
 
     int stampSize = 200;
     if (drawWithRasterImage) {
-        canvas->drawImage(stampImage(stampSize), 0, 0, &paint);
+        canvas->drawImage(stampImage(stampSize), 0, 0, sampling, &paint);
     } else {
         canvas->saveLayer(nullptr, &paint);
         drawStamp(canvas, stampSize);
diff --git a/docs/examples/shader_alphaimage.cpp b/docs/examples/shader_alphaimage.cpp
index ee83df2..7f21c97 100644
--- a/docs/examples/shader_alphaimage.cpp
+++ b/docs/examples/shader_alphaimage.cpp
@@ -19,7 +19,7 @@
     SkPaint p;
     p.setShader(linear_gradient());
     auto i = alpha_image();
-    canvas->drawImage(i.get(), 128, 0, &p);
+    canvas->drawImage(i.get(), 128, 0, SkSamplingOptions(), &p);
     canvas->drawRect({0, 128, 128, 256}, p);
 }
 }  // END FIDDLE
diff --git a/docs/examples/skbug_237_drawImageRect.cpp b/docs/examples/skbug_237_drawImageRect.cpp
index bcf1320..17492ef 100644
--- a/docs/examples/skbug_237_drawImageRect.cpp
+++ b/docs/examples/skbug_237_drawImageRect.cpp
@@ -6,7 +6,7 @@
     SkPaint paint;
     paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 20.0f, false));
     canvas->clear(0xFF88FF88);
-    canvas->drawImageRect(image, SkRect{16, 16, 48, 48}, {64, 64, 192, 192}, &paint,
-                          SkCanvas::kFast_SrcRectConstraint);
+    canvas->drawImageRect(image, SkRect{16, 16, 48, 48}, {64, 64, 192, 192}, SkSamplingOptions(),
+                          &paint, SkCanvas::kFast_SrcRectConstraint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/skbug_237_drawImage_with_blur.cpp b/docs/examples/skbug_237_drawImage_with_blur.cpp
index 9800b2f..74351fe 100644
--- a/docs/examples/skbug_237_drawImage_with_blur.cpp
+++ b/docs/examples/skbug_237_drawImage_with_blur.cpp
@@ -8,6 +8,6 @@
     canvas->clear(0xFF88FF88);
     canvas->scale(4, 4);
     auto subset = image->makeSubset({16, 16, 48, 48});
-    canvas->drawImage(subset, 16, 16, &paint);
+    canvas->drawImage(subset, 16, 16, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/skcanvas_paint.cpp b/docs/examples/skcanvas_paint.cpp
index 72e4bc2..4b10779 100644
--- a/docs/examples/skcanvas_paint.cpp
+++ b/docs/examples/skcanvas_paint.cpp
@@ -31,10 +31,10 @@
     paint.setColor(SK_ColorGREEN);
     canvas->drawPath(path, paint);
 
-    canvas->drawImage(image, 128, 128, &paint);
+    canvas->drawImage(image, 128, 128, SkSamplingOptions(), &paint);
 
     SkRect rect2 = SkRect::MakeXYWH(0, 0, 40, 60);
-    canvas->drawImageRect(image, rect2, &paint);
+    canvas->drawImageRect(image, rect2, SkSamplingOptions(), &paint);
 
     SkPaint paint2;
     auto text = SkTextBlob::MakeFromString("Hello, Skia!", SkFont(nullptr, 18));
diff --git a/docs/examples/skpaint_color_table_filter.cpp b/docs/examples/skpaint_color_table_filter.cpp
index 6df1d88..7917367 100644
--- a/docs/examples/skpaint_color_table_filter.cpp
+++ b/docs/examples/skpaint_color_table_filter.cpp
@@ -11,6 +11,6 @@
     }
     SkPaint paint;
     paint.setColorFilter(SkTableColorFilter::MakeARGB(nullptr, ct, ct, ct));
-    canvas->drawImage(image, 0, 0, &paint);
+    canvas->drawImage(image, 0, 0, SkSamplingOptions(), &paint);
 }
 }  // END FIDDLE
diff --git a/docs/examples/skpaint_matrix_color_filter.cpp b/docs/examples/skpaint_matrix_color_filter.cpp
index 185c010..dc89d59 100644
--- a/docs/examples/skpaint_matrix_color_filter.cpp
+++ b/docs/examples/skpaint_matrix_color_filter.cpp
@@ -5,7 +5,7 @@
 void f(SkCanvas* c, SkScalar x, SkScalar y, SkScalar colorMatrix[20]) {
     SkPaint paint;
     paint.setColorFilter(SkColorFilters::Matrix(colorMatrix));
-    c->drawImage(image, x, y, &paint);
+    c->drawImage(image, x, y, SkSamplingOptions(), &paint);
 }
 void draw(SkCanvas* c) {
     c->scale(0.25, 0.25);
diff --git a/tools/fiddle/all_examples.cpp b/tools/fiddle/all_examples.cpp
index c67b84d..4170533 100644
--- a/tools/fiddle/all_examples.cpp
+++ b/tools/fiddle/all_examples.cpp
@@ -261,7 +261,6 @@
 #include "../../docs/examples/Dst_Over.cpp"
 #include "../../docs/examples/Exclusion.cpp"
 #include "../../docs/examples/Fake_Bold.cpp"
-#include "../../docs/examples/Filter_Quality_Methods.cpp"
 #include "../../docs/examples/Font_breakText.cpp"
 #include "../../docs/examples/GradientShader_MakeLinear.cpp"
 #include "../../docs/examples/HSVToColor.cpp"
@@ -528,7 +527,6 @@
 #include "../../docs/examples/Paint_getColorFilter.cpp"
 #include "../../docs/examples/Paint_getFillPath.cpp"
 #include "../../docs/examples/Paint_getFillPath_2.cpp"
-#include "../../docs/examples/Paint_getFilterQuality.cpp"
 #include "../../docs/examples/Paint_getFlags.cpp"
 #include "../../docs/examples/Paint_getFontMetrics.cpp"
 #include "../../docs/examples/Paint_getFontSpacing.cpp"
@@ -583,7 +581,6 @@
 #include "../../docs/examples/Paint_setDither.cpp"
 #include "../../docs/examples/Paint_setEmbeddedBitmapText.cpp"
 #include "../../docs/examples/Paint_setFakeBoldText.cpp"
-#include "../../docs/examples/Paint_setFilterQuality.cpp"
 #include "../../docs/examples/Paint_setFlags.cpp"
 #include "../../docs/examples/Paint_setHinting.cpp"
 #include "../../docs/examples/Paint_setImageFilter.cpp"
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 9e80623..c90236c 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -1513,13 +1513,14 @@
         SkCanvas* canvas = surface->getCanvas();
         SkPaint paint;
         paint.setBlendMode(SkBlendMode::kSrc);
+        SkSamplingOptions sampling;
         int prePerspectiveCount = canvas->save();
         if (kPerspective_Fake == fPerspectiveMode) {
-            paint.setFilterQuality(kHigh_SkFilterQuality);
+            sampling = SkSamplingOptions({1.0f/3, 1.0f/3});
             canvas->clear(SK_ColorWHITE);
             canvas->concat(this->computePerspectiveMatrix());
         }
-        canvas->drawImage(fLastImage, 0, 0, &paint);
+        canvas->drawImage(fLastImage, 0, 0, sampling, &paint);
         canvas->restoreToCount(prePerspectiveCount);
     }