aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/SkGpuDevice.cpp
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2018-04-20 14:53:00 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-04-23 14:27:30 +0000
commit57e1f020116e9023b9dfd92478d46749b7248d6e (patch)
tree598fe9ee5bd039dea95cb774da7790c0c1431394 /src/gpu/SkGpuDevice.cpp
parent5c2ed720ec807aa7a79e8f5ee5be107a877015a8 (diff)
(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>
Diffstat (limited to 'src/gpu/SkGpuDevice.cpp')
-rw-r--r--src/gpu/SkGpuDevice.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 3a48e8cbe6..138d41f26a 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1350,6 +1350,15 @@ void SkGpuDevice::drawImageRect(const SkImage* image, const SkRect* src, const S
}
}
+// When drawing nine-patches or n-patches, cap the filter quality at kBilerp.
+static GrSamplerState::Filter compute_lattice_filter_mode(const SkPaint& paint) {
+ if (paint.getFilterQuality() == kNone_SkFilterQuality) {
+ return GrSamplerState::Filter::kNearest;
+ }
+
+ return GrSamplerState::Filter::kBilerp;
+}
+
void SkGpuDevice::drawProducerNine(GrTextureProducer* producer,
const SkIRect& center, const SkRect& dst, const SkPaint& paint) {
GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawProducerNine", fContext.get());
@@ -1371,7 +1380,7 @@ void SkGpuDevice::drawProducerNine(GrTextureProducer* producer,
return;
}
- static const GrSamplerState::Filter kMode = GrSamplerState::Filter::kNearest;
+ const GrSamplerState::Filter kMode = compute_lattice_filter_mode(paint);
auto fp = producer->createFragmentProcessor(
SkMatrix::I(), SkRect::MakeIWH(producer->width(), producer->height()),
GrTextureProducer::kNo_FilterConstraint, true, &kMode,
@@ -1426,7 +1435,7 @@ void SkGpuDevice::drawProducerLattice(GrTextureProducer* producer,
const SkPaint& paint) {
GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawProducerLattice", fContext.get());
- static const GrSamplerState::Filter kMode = GrSamplerState::Filter::kNearest;
+ const GrSamplerState::Filter kMode = compute_lattice_filter_mode(paint);
std::unique_ptr<GrFragmentProcessor> fp(producer->createFragmentProcessor(
SkMatrix::I(), SkRect::MakeIWH(producer->width(), producer->height()),
GrTextureProducer::kNo_FilterConstraint, true, &kMode,