diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 1ebc48900349f..1a8d9eb1f74f2 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -700,11 +700,14 @@ void SkiaCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& chunk, floa NinePatchUtils::SetLatticeFlags(&lattice, flags.get(), numFlags, chunk, colors.get()); } + SkFilterMode filter = paint && paint->isFilterBitmap() ? SkFilterMode::kLinear + : SkFilterMode::kNearest; + lattice.fBounds = nullptr; SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); auto image = bitmap.makeImage(); apply_looper(paint, [&](const SkPaint& p) { - mCanvas->drawImageLattice(image.get(), lattice, dst, &p); + mCanvas->drawImageLattice(image.get(), lattice, dst, filter, &p); }); } diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h index fa0c45b5221c1..cceba59cc6394 100644 --- a/libs/hwui/canvas/CanvasOps.h +++ b/libs/hwui/canvas/CanvasOps.h @@ -408,21 +408,24 @@ struct CanvasOp { const sk_sp& bitmap, SkRect dst, SkCanvas::Lattice lattice, + SkFilterMode filter, SkPaint paint ): dst(dst), lattice(lattice), + filter(filter), bitmap(bitmap), image(bitmap->makeImage()), paint(std::move(paint)) {} SkRect dst; SkCanvas::Lattice lattice; + SkFilterMode filter; const sk_sp bitmap; const sk_sp image; SkPaint paint; void draw(SkCanvas* canvas) const { - canvas->drawImageLattice(image.get(), lattice, dst, &paint); + canvas->drawImageLattice(image.get(), lattice, dst, filter, &paint); } ASSERT_DRAWABLE() }; diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp index a09e7429b4bed..c9e8d808f9955 100644 --- a/libs/hwui/tests/unit/CanvasOpTests.cpp +++ b/libs/hwui/tests/unit/CanvasOpTests.cpp @@ -528,6 +528,7 @@ TEST(CanvasOp, simpleDrawImageLattice) { bitmap, SkRect::MakeWH(5, 1), lattice, + SkFilterMode::kNearest, SkPaint{} } );