(Mostly) respect FilterQuality in draw[stretchy]
Bug: b/77917978
For
drawImageLattice
drawBitmapLattice
drawImageNine
drawBitmapNine
, respect the SkFilterQuality on the SkPaint. Previously the GPU used
the lowest quality to avoid a bleeding effect, leading to ugly nine-
patches on Android.
For all backends, cap the filter quality at kLow_SkFilterQuality.
Update SkCanvas' documentation to specify this.
Change-Id: Id28c7753834975f039170f14bc51be4f2bd44d41
Reviewed-on: https://skia-review.googlesource.com/121891
Reviewed-by: Cary Clark <caryclark@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Auto-Submit: Leon Scroggins <scroggo@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 7398f28..fa2c08a 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1725,6 +1725,29 @@
constraint);
}
+namespace {
+class NoneOrLowQualityFilterPaint : SkNoncopyable {
+public:
+ NoneOrLowQualityFilterPaint(const SkPaint* origPaint) {
+ if (origPaint && origPaint->getFilterQuality() > kLow_SkFilterQuality) {
+ fLazyPaint.set(*origPaint);
+ fLazyPaint.get()->setFilterQuality(kLow_SkFilterQuality);
+ fPaint = fLazyPaint.get();
+ } else {
+ fPaint = origPaint;
+ }
+ }
+
+ const SkPaint* get() const {
+ return fPaint;
+ }
+
+private:
+ const SkPaint* fPaint;
+ SkLazyPaint fLazyPaint;
+};
+} // namespace
+
void SkCanvas::drawImageNine(const SkImage* image, const SkIRect& center, const SkRect& dst,
const SkPaint* paint) {
TRACE_EVENT0("skia", TRACE_FUNC);
@@ -1733,7 +1756,8 @@
return;
}
if (SkLatticeIter::Valid(image->width(), image->height(), center)) {
- this->onDrawImageNine(image, center, dst, paint);
+ NoneOrLowQualityFilterPaint lowPaint(paint);
+ this->onDrawImageNine(image, center, dst, lowPaint.get());
} else {
this->drawImageRect(image, dst, paint);
}
@@ -1755,7 +1779,8 @@
}
if (SkLatticeIter::Valid(image->width(), image->height(), latticePlusBounds)) {
- this->onDrawImageLattice(image, latticePlusBounds, dst, paint);
+ NoneOrLowQualityFilterPaint lowPaint(paint);
+ this->onDrawImageLattice(image, latticePlusBounds, dst, lowPaint.get());
} else {
this->drawImageRect(image, dst, paint);
}
@@ -1796,7 +1821,8 @@
return;
}
if (SkLatticeIter::Valid(bitmap.width(), bitmap.height(), center)) {
- this->onDrawBitmapNine(bitmap, center, dst, paint);
+ NoneOrLowQualityFilterPaint lowPaint(paint);
+ this->onDrawBitmapNine(bitmap, center, dst, lowPaint.get());
} else {
this->drawBitmapRect(bitmap, dst, paint);
}
@@ -1817,7 +1843,8 @@
}
if (SkLatticeIter::Valid(bitmap.width(), bitmap.height(), latticePlusBounds)) {
- this->onDrawBitmapLattice(bitmap, latticePlusBounds, dst, paint);
+ NoneOrLowQualityFilterPaint lowPaint(paint);
+ this->onDrawBitmapLattice(bitmap, latticePlusBounds, dst, lowPaint.get());
} else {
this->drawBitmapRect(bitmap, dst, paint);
}