Pass sampling to drawImage

Bug: skia:7650
Change-Id: Ia0e02023ab65267e0be17ee1509c8562fe55d75a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/362180
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/modules/canvaskit/CHANGELOG.md b/modules/canvaskit/CHANGELOG.md
index 3ade6f5..9d45ec8 100644
--- a/modules/canvaskit/CHANGELOG.md
+++ b/modules/canvaskit/CHANGELOG.md
@@ -18,6 +18,12 @@
  - 4x4 matrices are "downsampled" properly if necessary to 3x3 matrices by removing the third
    column and the third row.
 
+## [0.23.0] - 2021-1-29
+
+### Deprecated
+ - `Canvas.drawImageRect`, `Canvas.drawImage`, `Canvas.drawAtlas`,
+   These rely on the Paint's FilterQuality, which is going away. Pass sampling options explicitly.
+
 ## [0.22.0] - 2020-12-17
 
 ### Added
diff --git a/modules/canvaskit/canvaskit_bindings.cpp b/modules/canvaskit/canvaskit_bindings.cpp
index cb56aa6..8b4878d 100644
--- a/modules/canvaskit/canvaskit_bindings.cpp
+++ b/modules/canvaskit/canvaskit_bindings.cpp
@@ -874,6 +874,7 @@
             self.drawArc(*oval, startAngle, sweepAngle, useCenter, paint);
         }))
         // _drawAtlas takes an array of SkColor. There is no SkColor4f override.
+        // TODO: take sampling as an explicit parameter from the caller
         .function("_drawAtlas", optional_override([](SkCanvas& self,
                 const sk_sp<SkImage>& atlas, uintptr_t /* SkRSXform* */ xptr,
                 uintptr_t /* SkRect* */ rptr, uintptr_t /* SkColor* */ cptr, int count,
@@ -884,7 +885,6 @@
             if (cptr) {
                 colors = reinterpret_cast<const SkColor*>(cptr);
             }
-            // TODO: take sampling as an explicit parameter from the caller
             SkSamplingOptions sampling(SkFilterMode::kLinear);
             self.drawAtlas(atlas.get(), dstXforms, srcRects, colors, count, mode, sampling,
                            nullptr, paint);
@@ -906,7 +906,13 @@
                                                      uintptr_t /* float* */ innerPtr, const SkPaint& paint) {
             self.drawDRRect(ptrToSkRRect(outerPtr), ptrToSkRRect(innerPtr), paint);
         }))
-        .function("drawImage", select_overload<void (const sk_sp<SkImage>&, SkScalar, SkScalar, const SkPaint*)>(&SkCanvas::drawImage), allow_raw_pointers())
+        // TODO: deprecate this version, and require sampling
+        .function("drawImage", optional_override([](SkCanvas& self, const sk_sp<SkImage>& image,
+                                                    SkScalar x, SkScalar y, const SkPaint* paint) {
+            SkSamplingOptions sampling(paint ? paint->getFilterQuality()
+                                             : kNone_SkFilterQuality);
+            self.drawImage(image.get(), x, y, sampling, paint);
+        }), allow_raw_pointers())
         .function("drawImageCubic",  optional_override([](SkCanvas& self, const sk_sp<SkImage>& img,
                                                           SkScalar left, SkScalar top,
                                                           float B, float C, // See SkSamplingOptions.h for docs.
@@ -922,7 +928,9 @@
         .function("drawImageAtCurrentFrame", optional_override([](SkCanvas& self, sk_sp<SkAnimatedImage> aImg,
                                                                   SkScalar left, SkScalar top, const SkPaint* paint)->void {
             auto img = aImg->getCurrentFrame();
-            self.drawImage(img, left, top, paint);
+            SkSamplingOptions sampling(paint ? paint->getFilterQuality()
+                                             : kNone_SkFilterQuality);
+            self.drawImage(img, left, top, sampling, paint);
         }), allow_raw_pointers())
 
         .function("_drawImageNine", optional_override([](SkCanvas& self, const sk_sp<SkImage>& image,
@@ -933,12 +941,15 @@
 
             self.drawImageNine(image.get(), *center, *dst, filter, paint);
         }), allow_raw_pointers())
+        // TODO: deprecate this version, and require sampling
         .function("_drawImageRect", optional_override([](SkCanvas& self, const sk_sp<SkImage>& image,
                                                          uintptr_t /* float* */ srcPtr, uintptr_t /* float* */ dstPtr,
                                                          const SkPaint* paint, bool fastSample)->void {
             const SkRect* src = reinterpret_cast<const SkRect*>(srcPtr);
             const SkRect* dst = reinterpret_cast<const SkRect*>(dstPtr);
-            self.drawImageRect(image, *src, *dst, paint,
+            SkSamplingOptions sampling(paint ? paint->getFilterQuality()
+                                             : kNone_SkFilterQuality);
+            self.drawImageRect(image, *src, *dst, sampling, paint,
                                fastSample ? SkCanvas::kFast_SrcRectConstraint:
                                             SkCanvas::kStrict_SrcRectConstraint);
         }), allow_raw_pointers())
diff --git a/tests/GifTest.cpp b/tests/GifTest.cpp
index 7ae65a5..329b9df 100644
--- a/tests/GifTest.cpp
+++ b/tests/GifTest.cpp
@@ -456,7 +456,7 @@
     bm.eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas canvas(bm);
-    canvas.drawImage(image, 0, 0, nullptr);
+    canvas.drawImage(image, 0, 0);
 
     for (int i = 0; i < image->width();  ++i)
     for (int j = 0; j < image->height(); ++j) {
diff --git a/tests/VkDrawableTest.cpp b/tests/VkDrawableTest.cpp
index 662b322..154c089 100644
--- a/tests/VkDrawableTest.cpp
+++ b/tests/VkDrawableTest.cpp
@@ -158,8 +158,9 @@
         surf->getCanvas()->clear(SK_ColorRED);
 
         SkRect dstRect = SkRect::MakeXYWH(3*td->fWidth/4, 0, td->fWidth/4, td->fHeight);
-        SkIRect srcRect = SkIRect::MakeWH(td->fWidth/4, td->fHeight);
-        canvas->drawImageRect(surf->makeImageSnapshot(), srcRect, dstRect, &paint);
+        SkRect srcRect = SkRect::MakeIWH(td->fWidth/4, td->fHeight);
+        canvas->drawImageRect(surf->makeImageSnapshot(), srcRect, dstRect, SkSamplingOptions(),
+                              &paint, SkCanvas::kStrict_SrcRectConstraint);
 
         td->fDrawContext->flush();
     }