filter-quality is deprecated, pass sampling to drawImage

Bug: skia:7650
Change-Id: Ifd92705bd042db74a6c2527858239b0b8e5a4def
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/360981
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/bench/BulkRectBench.cpp b/bench/BulkRectBench.cpp
index 6bc38ea..0941c17 100644
--- a/bench/BulkRectBench.cpp
+++ b/bench/BulkRectBench.cpp
@@ -115,13 +115,13 @@
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setFilterQuality(kLow_SkFilterQuality);
 
         for (int i = 0; i < kRectCount; ++i) {
             int imageIndex = kImageMode == ImageMode::kShared ? 0 : i;
-            SkIRect srcRect = SkIRect::MakeWH(fImages[imageIndex]->width(),
-                                              fImages[imageIndex]->height());
-            canvas->drawImageRect(fImages[imageIndex].get(), srcRect, fRects[i], &paint,
+            SkRect srcRect = SkRect::MakeIWH(fImages[imageIndex]->width(),
+                                             fImages[imageIndex]->height());
+            canvas->drawImageRect(fImages[imageIndex].get(), srcRect, fRects[i],
+                                  SkSamplingOptions(SkFilterMode::kLinear), &paint,
                                   SkCanvas::kFast_SrcRectConstraint);
         }
     }
diff --git a/bench/DisplacementBench.cpp b/bench/DisplacementBench.cpp
index 3f1fed2..b86577c 100644
--- a/bench/DisplacementBench.cpp
+++ b/bench/DisplacementBench.cpp
@@ -71,7 +71,7 @@
     void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
         canvas->save();
         canvas->clipIRect(fImage->bounds().makeOffset(x, y));
-        canvas->drawImage(fImage, SkIntToScalar(x), SkIntToScalar(y), &paint);
+        canvas->drawImage(fImage, SkIntToScalar(x), SkIntToScalar(y), SkSamplingOptions(), &paint);
         canvas->restore();
     }
 
diff --git a/bench/ImageCacheBudgetBench.cpp b/bench/ImageCacheBudgetBench.cpp
index bedc7b3..a224cbf 100644
--- a/bench/ImageCacheBudgetBench.cpp
+++ b/bench/ImageCacheBudgetBench.cpp
@@ -36,7 +36,7 @@
     // optmizations
     SkPaint paint;
     paint.setAlpha(0x10);
-    canvas->drawImage(img, 0, 0, &paint);
+    canvas->drawImage(img, 0, 0, SkSamplingOptions(), &paint);
 }
 
 void set_cache_budget(SkCanvas* canvas, int approxImagesInBudget) {
diff --git a/gm/emboss.cpp b/gm/emboss.cpp
index 32b9cf6..af414db 100644
--- a/gm/emboss.cpp
+++ b/gm/emboss.cpp
@@ -49,19 +49,19 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         auto img = make_bm();
-        canvas->drawImage(img, 10, 10, &paint);
+        canvas->drawImage(img, 10, 10);
         canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         paint.setMaskFilter(SkEmbossMaskFilter::Make(
             SkBlurMask::ConvertRadiusToSigma(3),
             { { SK_Scalar1, SK_Scalar1, SK_Scalar1 }, 0, 128, 16*2 }));
-        canvas->drawImage(img, 10, 10, &paint);
+        canvas->drawImage(img, 10, 10, SkSamplingOptions(), &paint);
         canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         // this combination of emboss+colorfilter used to crash -- so we exercise it to
         // confirm that we have a fix.
         paint.setColorFilter(SkColorFilters::Blend(0xFFFF0000, SkBlendMode::kSrcATop));
-        canvas->drawImage(img, 10, 10, &paint);
+        canvas->drawImage(img, 10, 10, SkSamplingOptions(), &paint);
         canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         paint.setAntiAlias(true);
diff --git a/gm/rectangletexture.cpp b/gm/rectangletexture.cpp
index 04fc98a..f21bc8f 100644
--- a/gm/rectangletexture.cpp
+++ b/gm/rectangletexture.cpp
@@ -153,11 +153,11 @@
 
         static constexpr SkScalar kPad = 5.f;
 
-        constexpr SkFilterQuality kQualities[] = {
-                kNone_SkFilterQuality,
-                kLow_SkFilterQuality,
-                kMedium_SkFilterQuality,
-                kHigh_SkFilterQuality,
+        const SkSamplingOptions kSamplings[] = {
+            SkSamplingOptions(SkFilterMode::kNearest),
+            SkSamplingOptions(SkFilterMode::kLinear),
+            SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear),
+            SkSamplingOptions({1.0f/3, 1.0f/3}),
         };
 
         constexpr SkScalar kScales[] = {1.0f, 1.2f, 0.75f};
@@ -170,16 +170,14 @@
             for (auto s : kScales) {
                 canvas->save();
                 canvas->scale(s, s);
-                for (auto q : kQualities) {
+                for (auto s : kSamplings) {
                     // drawImage
-                    SkPaint plainPaint;
-                    plainPaint.setFilterQuality(q);
-                    canvas->drawImage(img, 0, 0, &plainPaint);
+                    canvas->drawImage(img, 0, 0, s);
                     canvas->translate(w + kPad, 0);
 
                     // clamp/clamp shader
                     SkPaint clampPaint;
-                    clampPaint.setShader(fGradImgs[i]->makeShader(SkSamplingOptions(q)));
+                    clampPaint.setShader(fGradImgs[i]->makeShader(s));
                     canvas->drawRect(SkRect::MakeWH(1.5f*w, 1.5f*h), clampPaint);
                     canvas->translate(1.5f*w + kPad, 0);
 
@@ -187,14 +185,14 @@
                     SkPaint repeatPaint;
                     repeatPaint.setShader(fGradImgs[i]->makeShader(SkTileMode::kRepeat,
                                                                    SkTileMode::kMirror,
-                                                                   SkSamplingOptions(q)));
+                                                                   s));
                     canvas->drawRect(SkRect::MakeWH(1.5f*w, 1.5f*h), repeatPaint);
                     canvas->translate(1.5f*w + kPad, 0);
 
                     // drawImageRect with kStrict
                     auto srcRect = SkRect::MakeXYWH(.25f*w, .25f*h, .50f*w, .50f*h);
                     auto dstRect = SkRect::MakeXYWH(      0,     0, .50f*w, .50f*h);
-                    canvas->drawImageRect(fGradImgs[i], srcRect, dstRect, &plainPaint,
+                    canvas->drawImageRect(fGradImgs[i], srcRect, dstRect, s, nullptr,
                                           SkCanvas::kStrict_SrcRectConstraint);
                     canvas->translate(.5f*w + kPad, 0);
                 }
diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp
index b538fe7..4efc6af 100644
--- a/tests/CachedDecodingPixelRefTest.cpp
+++ b/tests/CachedDecodingPixelRefTest.cpp
@@ -114,7 +114,7 @@
             SkCanvas canvas(bitmap);
             const SkColor kDefaultColor = 0xffabcdef;
             canvas.clear(kDefaultColor);
-            canvas.drawImage(image, 0, 0, nullptr);
+            canvas.drawImage(image, 0, 0);
             if (TestImageGenerator::kSucceedGetPixels_TestType == test) {
                 REPORTER_ASSERT(
                     r, TestImageGenerator::Color() == bitmap.getColor(0, 0));
diff --git a/tests/DrawBitmapRectTest.cpp b/tests/DrawBitmapRectTest.cpp
index afe8615..de882ef 100644
--- a/tests/DrawBitmapRectTest.cpp
+++ b/tests/DrawBitmapRectTest.cpp
@@ -248,10 +248,11 @@
 
     SkCanvas canvas(dst);
 
-    SkIRect srcR = { gWidth, 0, gWidth + 16, 16 };
-    SkRect  dstR = { 0, 0, SkIntToScalar(16), SkIntToScalar(16) };
+    SkRect srcR = { gWidth, 0, gWidth + 16, 16 };
+    SkRect dstR = { 0, 0, 16, 16 };
 
-    canvas.drawImageRect(src.asImage(), srcR, dstR, nullptr);
+    canvas.drawImageRect(src.asImage(), srcR, dstR, SkSamplingOptions(), nullptr,
+                         SkCanvas::kStrict_SrcRectConstraint);
 
     // ensure that we draw nothing if srcR does not intersect the bitmap
     REPORTER_ASSERT(reporter, check_for_all_zeros(dst));
diff --git a/tests/GrMipMappedTest.cpp b/tests/GrMipMappedTest.cpp
index 0095b1f..d6c5fab 100644
--- a/tests/GrMipMappedTest.cpp
+++ b/tests/GrMipMappedTest.cpp
@@ -337,16 +337,14 @@
     // Make sure we scale so we don't optimize out the use of mips.
     surface->getCanvas()->scale(0.5f, 0.5f);
 
-    SkPaint paint;
     // This should upload the image to a non mipped GrTextureProxy.
-    surface->getCanvas()->drawImage(bmpImage, 0, 0, &paint);
+    surface->getCanvas()->drawImage(bmpImage, 0, 0);
     surface->flushAndSubmit();
 
     // Now set the filter quality to high so we use mip maps. We should find the non mipped texture
     // in the cache for the SkImage. Since the texture is 1x1 we should just use that texture
     // instead of trying to do a copy to a mipped texture.
-    paint.setFilterQuality(kHigh_SkFilterQuality);
-    surface->getCanvas()->drawImage(bmpImage, 0, 0, &paint);
+    surface->getCanvas()->drawImage(bmpImage, 0, 0, SkSamplingOptions({1.0f/3, 1.0f/3}));
     surface->flushAndSubmit();
 }
 
diff --git a/tests/GrOpListFlushTest.cpp b/tests/GrOpListFlushTest.cpp
index 73a2cdf..370a2bd 100644
--- a/tests/GrOpListFlushTest.cpp
+++ b/tests/GrOpListFlushTest.cpp
@@ -47,7 +47,7 @@
     canvas1->clear(SK_ColorRED);
     canvas2->clear(SK_ColorRED);
 
-    SkIRect srcRect = SkIRect::MakeWH(1, 1);
+    SkRect srcRect = SkRect::MakeWH(1, 1);
     SkRect dstRect = SkRect::MakeWH(1, 1);
     SkPaint paint;
     paint.setColor(SK_ColorGREEN);
@@ -58,12 +58,14 @@
         srcRect.fRight = srcRect.fLeft + 1;
 
         sk_sp<SkImage> image = surface1->makeImageSnapshot();
-        canvas2->drawImageRect(image.get(), srcRect, dstRect, nullptr);
+        canvas2->drawImageRect(image.get(), srcRect, dstRect, SkSamplingOptions(), nullptr,
+                               SkCanvas::kStrict_SrcRectConstraint);
         if (i != 999) {
             dstRect.fLeft = i+1;
             dstRect.fRight = dstRect.fLeft + 1;
             image = surface2->makeImageSnapshot();
-            canvas1->drawImageRect(image.get(), srcRect, dstRect, nullptr);
+            canvas1->drawImageRect(image.get(), srcRect, dstRect, SkSamplingOptions(), nullptr,
+                                   SkCanvas::kStrict_SrcRectConstraint);
         }
     }
     context->flushAndSubmit();
diff --git a/tests/GrTextureMipMapInvalidationTest.cpp b/tests/GrTextureMipMapInvalidationTest.cpp
index e8fb2f2..c751074 100644
--- a/tests/GrTextureMipMapInvalidationTest.cpp
+++ b/tests/GrTextureMipMapInvalidationTest.cpp
@@ -49,10 +49,10 @@
         // Painting with downscale and medium filter quality should result in mipmap creation
         // Flush the context rather than the canvas as flushing the canvas triggers MIP level
         // generation.
-        SkPaint paint;
-        paint.setFilterQuality(kMedium_SkFilterQuality);
+        SkSamplingOptions sampling(SkFilterMode::kLinear, SkMipmapMode::kLinear);
+
         surf2->getCanvas()->scale(0.2f, 0.2f);
-        surf2->getCanvas()->drawImage(surf1->makeImageSnapshot(), 0, 0, &paint);
+        surf2->getCanvas()->drawImage(surf1->makeImageSnapshot(), 0, 0, sampling);
         context->flushAndSubmit();
         REPORTER_ASSERT(reporter, isMipped(surf1.get()) == allocateMips);
         REPORTER_ASSERT(reporter, !allocateMips || !mipsAreDirty(surf1.get()));
@@ -100,9 +100,10 @@
             SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr);
     surf = SkSurface::MakeRenderTarget(dContext, SkBudgeted::kYes, singlePixelInfo, 1,
                                        kTopLeft_GrSurfaceOrigin, nullptr);
-    SkPaint paint;
-    paint.setFilterQuality(kMedium_SkFilterQuality);
-    surf->getCanvas()->drawImageRect(img, SkRect::MakeWH(1, 1), &paint);
+
+    surf->getCanvas()->drawImageRect(img, SkRect::MakeWH(1, 1),
+                                     SkSamplingOptions(SkFilterMode::kLinear,
+                                                       SkMipmapMode::kLinear));
     uint32_t pixel;
     surf->readPixels(singlePixelInfo, &pixel, sizeof(uint32_t), 0, 0);
     REPORTER_ASSERT(reporter, pixel == SkPreMultiplyColor(SK_ColorDKGRAY));
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index bceec80..cf70c79 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -1357,7 +1357,6 @@
 DEF_TEST(Image_nonfinite_dst, reporter) {
     auto surf = SkSurface::MakeRasterN32Premul(10, 10);
     auto img = any_image_will_do();
-    SkPaint paint;
 
     for (SkScalar bad : { SK_ScalarInfinity, SK_ScalarNaN}) {
         for (int bits = 1; bits <= 15; ++bits) {
@@ -1367,7 +1366,7 @@
             if (bits & 4) dst.fRight = bad;
             if (bits & 8) dst.fBottom = bad;
 
-            surf->getCanvas()->drawImageRect(img, dst, &paint);
+            surf->getCanvas()->drawImageRect(img, dst, SkSamplingOptions());
 
             // we should draw nothing
             ToolUtils::PixelIter iter(surf.get());
diff --git a/tests/MipMapTest.cpp b/tests/MipMapTest.cpp
index 299ebe0..b08075b 100644
--- a/tests/MipMapTest.cpp
+++ b/tests/MipMapTest.cpp
@@ -220,7 +220,8 @@
     for (int i = 0; i < count; ++i) {
         SkPixmap pm = builder->level(i);
         auto surf = SkSurface::MakeRasterDirect(pm);
-        surf->getCanvas()->drawImageRect(img, SkRect::MakeIWH(pm.width(), pm.height()), nullptr);
+        surf->getCanvas()->drawImageRect(img, SkRect::MakeIWH(pm.width(), pm.height()),
+                                         SkSamplingOptions());
     }
 }
 
diff --git a/tests/MultiPictureDocumentTest.cpp b/tests/MultiPictureDocumentTest.cpp
index 26b0b6d..27dc745 100644
--- a/tests/MultiPictureDocumentTest.cpp
+++ b/tests/MultiPictureDocumentTest.cpp
@@ -53,11 +53,11 @@
     paint.setColor(SK_ColorGREEN);
     canvas->drawPath(path, paint);
 
-    canvas->drawImage(image, 128-seed, 128, &paint);
+    canvas->drawImage(image, 128-seed, 128, SkSamplingOptions(), &paint);
 
     if (seed % 2 == 0) {
         SkRect rect2 = SkRect::MakeXYWH(0, 0, 40, 60);
-        canvas->drawImageRect(image, rect2, &paint);
+        canvas->drawImageRect(image, rect2, SkSamplingOptions(), &paint);
     }
 
     SkPaint paint2;
diff --git a/tests/PDFJpegEmbedTest.cpp b/tests/PDFJpegEmbedTest.cpp
index 87577ac..53b1015 100644
--- a/tests/PDFJpegEmbedTest.cpp
+++ b/tests/PDFJpegEmbedTest.cpp
@@ -61,9 +61,9 @@
     canvas->clear(SK_ColorLTGRAY);
 
     sk_sp<SkImage> im1(SkImage::MakeFromEncoded(mandrillData));
-    canvas->drawImage(im1.get(), 65.0, 0.0, nullptr);
+    canvas->drawImage(im1.get(), 65.0, 0.0);
     sk_sp<SkImage> im2(SkImage::MakeFromEncoded(cmykData));
-    canvas->drawImage(im2.get(), 0.0, 512.0, nullptr);
+    canvas->drawImage(im2.get(), 0.0, 512.0);
 
     document->endPage();
     document->close();
diff --git a/tests/PromiseImageTest.cpp b/tests/PromiseImageTest.cpp
index c472b35..3d8057f 100644
--- a/tests/PromiseImageTest.cpp
+++ b/tests/PromiseImageTest.cpp
@@ -392,7 +392,7 @@
     canvas->drawImage(refImg, 0, 0);
     SkPaint paint;
     paint.setColorFilter(SkColorFilters::LinearToSRGBGamma());
-    canvas->drawImage(refImg, 0, 0, &paint);
+    canvas->drawImage(refImg, 0, 0, SkSamplingOptions(), &paint);
     auto shader = refImg->makeShader(SkSamplingOptions());
     REPORTER_ASSERT(reporter, shader);
     paint.setShader(std::move(shader));
diff --git a/tests/RepeatedClippedBlurTest.cpp b/tests/RepeatedClippedBlurTest.cpp
index 81bfc33..9d305c0 100644
--- a/tests/RepeatedClippedBlurTest.cpp
+++ b/tests/RepeatedClippedBlurTest.cpp
@@ -69,7 +69,7 @@
                                                          nullptr);
         SkCanvas* c = s->getCanvas();
 
-        c->drawImageRect(bigImg, SkRect::MakeWH(1024, 600), nullptr);
+        c->drawImageRect(bigImg, SkRect::MakeWH(1024, 600), SkSamplingOptions());
 
         smImg = s->makeImageSnapshot();
     }
@@ -99,7 +99,8 @@
 
         SkRect dstRect = SkRect::MakeXYWH(offset.fX, offset.fY,
                                           outSubset.width(), outSubset.height());
-        dstCanvas->drawImageRect(filteredImg, outSubset, dstRect, nullptr);
+        dstCanvas->drawImageRect(filteredImg, SkRect::Make(outSubset), dstRect, SkSamplingOptions(),
+                                 nullptr, SkCanvas::kStrict_SrcRectConstraint);
 
         // Flush here to mimic Chrome's SkiaHelper::ApplyImageFilter
         dContext->flushAndSubmit();
diff --git a/tests/SerialProcsTest.cpp b/tests/SerialProcsTest.cpp
index 0c0c520..a206694 100644
--- a/tests/SerialProcsTest.cpp
+++ b/tests/SerialProcsTest.cpp
@@ -55,7 +55,7 @@
     {
         SkPictureRecorder rec;
         SkCanvas* canvas = rec.beginRecording(128, 128);
-        canvas->drawImage(src_img, 0, 0, nullptr);
+        canvas->drawImage(src_img, 0, 0);
         pic = rec.finishRecordingAsPicture();
     }
 
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index fa516c1..49aa214 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -294,7 +294,7 @@
         SkPaint paint;
         paint.setImageFilter(deserializedFilter);
         canvas.clipRect(SkRect::MakeXYWH(0, 0, SkIntToScalar(24), SkIntToScalar(24)));
-        canvas.drawImage(bitmap.asImage(), 0, 0, &paint);
+        canvas.drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
     }
 }
 
diff --git a/tests/SkImageTest.cpp b/tests/SkImageTest.cpp
index bbbcdfd..e5cf168 100644
--- a/tests/SkImageTest.cpp
+++ b/tests/SkImageTest.cpp
@@ -34,7 +34,7 @@
     tgt.allocN32Pixels(gWidth, gHeight);
     SkCanvas canvas(tgt);
     canvas.clear(SK_ColorTRANSPARENT);
-    canvas.drawImage(image, 0, 0, nullptr);
+    canvas.drawImage(image, 0, 0);
 
     uint32_t pixel = 0;
     SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, kUnpremul_SkAlphaType);
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp
index 175abe1..eedf020 100644
--- a/tests/SkResourceCacheTest.cpp
+++ b/tests/SkResourceCacheTest.cpp
@@ -153,14 +153,11 @@
 
         sk_sp<SkImage> image(buildImage());
 
-        // always use high quality to ensure caching when scaled
-        SkPaint paint;
-        paint.setFilterQuality(kHigh_SkFilterQuality);
-
         // draw the image (with a transform, to tickle different code paths) to ensure
         // any associated resources get cached
         canvas->concat(transform);
-        canvas->drawImage(image, 0, 0, &paint);
+        // always use high quality to ensure caching when scaled
+        canvas->drawImage(image, 0, 0, SkSamplingOptions({1.0f/3, 1.0f/3}));
 
         const auto desc = SkBitmapCacheDesc::Make(image.get());
 
diff --git a/tests/TextureStripAtlasManagerTest.cpp b/tests/TextureStripAtlasManagerTest.cpp
index bfead52..e67f58d 100644
--- a/tests/TextureStripAtlasManagerTest.cpp
+++ b/tests/TextureStripAtlasManagerTest.cpp
@@ -66,7 +66,7 @@
     auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info));
     SkCanvas* canvas = surface->getCanvas();
 
-    canvas->drawImage(std::move(img), 0, 0, &p);
+    canvas->drawImage(std::move(img), 0, 0, SkSamplingOptions(), &p);
 
     context->abandonContext();
 }