Adopt sampling parameter
Test: make
Change-Id: Ie5c1897cf9108db3795a5d65b8c095e0b0280520
diff --git a/libs/hwui/pipeline/skia/DumpOpsCanvas.h b/libs/hwui/pipeline/skia/DumpOpsCanvas.h
index d5b46d5..26ff8bf 100644
--- a/libs/hwui/pipeline/skia/DumpOpsCanvas.h
+++ b/libs/hwui/pipeline/skia/DumpOpsCanvas.h
@@ -86,17 +86,18 @@
mOutput << mIdent << "drawTextBlob" << std::endl;
}
- void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*) override {
+ void onDrawImage2(const SkImage*, SkScalar dx, SkScalar dy, const SkSamplingOptions&,
+ const SkPaint*) override {
mOutput << mIdent << "drawImage" << std::endl;
}
- void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
- SrcRectConstraint) override {
+ void onDrawImageRect2(const SkImage*, const SkRect&, const SkRect&, const SkSamplingOptions&,
+ const SkPaint*, SrcRectConstraint) override {
mOutput << mIdent << "drawImageRect" << std::endl;
}
- void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst,
- const SkPaint*) override {
+ void onDrawImageLattice2(const SkImage*, const Lattice& lattice, const SkRect& dst,
+ SkFilterMode, const SkPaint*) override {
mOutput << mIdent << "drawImageLattice" << std::endl;
}
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index e292cbd..a436278 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -185,18 +185,21 @@
}
template <typename Proc>
-void applyLooper(SkDrawLooper* looper, const SkPaint& paint, Proc proc) {
+void applyLooper(SkDrawLooper* looper, const SkPaint* paint, Proc proc) {
if (looper) {
SkSTArenaAlloc<256> alloc;
SkDrawLooper::Context* ctx = looper->makeContext(&alloc);
if (ctx) {
SkDrawLooper::Context::Info info;
for (;;) {
- SkPaint p = paint;
+ SkPaint p;
+ if (paint) {
+ p = *paint;
+ }
if (!ctx->next(&info, &p)) {
break;
}
- proc(info.fTranslate.fX, info.fTranslate.fY, p);
+ proc(info.fTranslate.fX, info.fTranslate.fY, &p);
}
}
} else {
@@ -204,11 +207,22 @@
}
}
+static SkFilterMode Paint_to_filter(const SkPaint* paint) {
+ return paint && paint->getFilterQuality() != kNone_SkFilterQuality ? SkFilterMode::kLinear
+ : SkFilterMode::kNearest;
+}
+
+static SkSamplingOptions Paint_to_sampling(const SkPaint* paint) {
+ // Android only has 1-bit for "filter", so we don't try to cons-up mipmaps or cubics
+ return SkSamplingOptions(Paint_to_filter(paint), SkMipmapMode::kNone);
+}
+
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) {
sk_sp<SkImage> image = bitmap.makeImage();
- applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) {
- mRecorder.drawImage(image, left + x, top + y, &p, bitmap.palette());
+ applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
+ const SkPaint* p) {
+ mRecorder.drawImage(image, left + x, top + y, Paint_to_sampling(p), p, bitmap.palette());
});
// if image->unique() is true, then mRecorder.drawImage failed for some reason. It also means
@@ -225,8 +239,9 @@
sk_sp<SkImage> image = bitmap.makeImage();
- applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) {
- mRecorder.drawImage(image, x, y, &p, bitmap.palette());
+ applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
+ const SkPaint* p) {
+ mRecorder.drawImage(image, x, y, Paint_to_sampling(p), p, bitmap.palette());
});
if (!bitmap.isImmutable() && image.get() && !image->unique()) {
@@ -242,9 +257,10 @@
sk_sp<SkImage> image = bitmap.makeImage();
- applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) {
- mRecorder.drawImageRect(image, srcRect, dstRect.makeOffset(x, y), &p,
- SkCanvas::kFast_SrcRectConstraint, bitmap.palette());
+ applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
+ const SkPaint* p) {
+ mRecorder.drawImageRect(image, srcRect, dstRect.makeOffset(x, y), Paint_to_sampling(p),
+ p, SkCanvas::kFast_SrcRectConstraint, bitmap.palette());
});
if (!bitmap.isImmutable() && image.get() && !image->unique() && !srcRect.isEmpty() &&
@@ -276,16 +292,12 @@
lattice.fBounds = nullptr;
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
-
- PaintCoW filteredPaint(paint);
- // HWUI always draws 9-patches with bilinear filtering, regardless of what is set in the Paint.
- if (!filteredPaint || filteredPaint->getFilterQuality() != kLow_SkFilterQuality) {
- filteredPaint.writeable().setFilterQuality(kLow_SkFilterQuality);
- }
sk_sp<SkImage> image = bitmap.makeImage();
- applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) {
- mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), &p, bitmap.palette());
+ applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
+ const SkPaint* p) {
+ mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), Paint_to_filter(p),
+ p, bitmap.palette());
});
if (!bitmap.isImmutable() && image.get() && !image->unique() && !dst.isEmpty()) {