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();
}