Loading libs/hwui/HardwareBitmapUploader.cpp +2 −7 Original line number Diff line number Diff line Loading @@ -362,13 +362,8 @@ static SkBitmap makeHwCompatible(const FormatInfo& format, const SkBitmap& sourc return source; } else { SkBitmap bitmap; const SkImageInfo& info = source.info(); bitmap.allocPixels(info.makeColorType(kN32_SkColorType)); SkCanvas canvas(bitmap); canvas.drawColor(0); canvas.drawBitmap(source, 0.0f, 0.0f, nullptr); bitmap.allocPixels(source.info().makeColorType(kN32_SkColorType)); bitmap.writePixels(source.pixmap()); return bitmap; } } Loading libs/hwui/Layer.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -127,10 +127,11 @@ void Layer::draw(SkCanvas* canvas) { const SkMatrix& totalMatrix = canvas->getTotalMatrix(); SkRect imageRect = SkRect::MakeIWH(layerImage->width(), layerImage->height()); SkSamplingOptions sampling; if (getForceFilter() || shouldFilterRect(totalMatrix, imageRect, imageRect)) { paint.setFilterQuality(kLow_SkFilterQuality); sampling = SkSamplingOptions(SkFilterMode::kLinear); } canvas->drawImage(layerImage.get(), 0, 0, &paint); canvas->drawImage(layerImage.get(), 0, 0, sampling, &paint); // restore the original matrix if (nonIdentityMatrix) { canvas->restore(); Loading libs/hwui/RecordingCanvas.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -487,7 +487,9 @@ struct DrawVectorDrawable final : Op { tree->getPaintFor(&paint, tree->stagingProperties()); } void draw(SkCanvas* canvas, const SkMatrix&) const { mRoot->draw(canvas, mBounds, paint); } void draw(SkCanvas* canvas, const SkMatrix&) const { mRoot->draw(canvas, mBounds, paint); } sp<VectorDrawableRoot> mRoot; SkRect mBounds; Loading libs/hwui/SkiaCanvas.cpp +25 −11 Original line number Diff line number Diff line Loading @@ -565,7 +565,8 @@ void SkiaCanvas::drawVertices(const SkVertices* vertices, SkBlendMode mode, cons void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) { auto image = bitmap.makeImage(); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImage(image, left, top, &p); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImage(image, left, top, sampling, &p); }); } Loading @@ -574,7 +575,8 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* SkAutoCanvasRestore acr(mCanvas, true); mCanvas->concat(matrix); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImage(image, 0, 0, &p); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImage(image, 0, 0, sampling, &p); }); } Loading @@ -586,10 +588,17 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float s SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImageRect(image, srcRect, dstRect, &p, SkCanvas::kFast_SrcRectConstraint); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImageRect(image, srcRect, dstRect, sampling, &p, SkCanvas::kFast_SrcRectConstraint); }); } static SkFilterMode paintToFilter(const Paint* paint) { return paint && paint->isFilterBitmap() ? SkFilterMode::kLinear : SkFilterMode::kNearest; } void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, const float* vertices, const int* colors, const Paint* paint) { const int ptCount = (meshWidth + 1) * (meshHeight + 1); Loading Loading @@ -664,18 +673,25 @@ void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, } #endif auto image = bitmap.makeImage(); // cons-up a shader for the bitmap Paint pnt; if (paint) { pnt = *paint; } SkSamplingOptions sampling(pnt.isFilterBitmap() ? SkFilterMode::kLinear : SkFilterMode::kNearest, SkMipmapMode::kNone); pnt.setShader(bitmap.makeImage()->makeShader(sampling)); SkSamplingOptions sampling(paintToFilter(&pnt)); pnt.setShader(image->makeShader(sampling)); auto v = builder.detach(); apply_looper(&pnt, [&](const SkPaint& p) { mCanvas->drawVertices(v, SkBlendMode::kModulate, p); SkPaint copy(p); auto s = SkSamplingOptions(p.getFilterQuality()); if (s != sampling) { // apply_looper changed the quality? copy.setShader(image->makeShader(s)); } mCanvas->drawVertices(v, SkBlendMode::kModulate, copy); }); } Loading @@ -700,13 +716,11 @@ 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) { auto filter = SkSamplingOptions(p.getFilterQuality()).filter; mCanvas->drawImageLattice(image.get(), lattice, dst, filter, &p); }); } Loading libs/hwui/VectorDrawable.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -507,10 +507,12 @@ void Tree::draw(SkCanvas* canvas, const SkRect& bounds, const SkPaint& inPaint) sk_sp<SkImage> cachedBitmap = getBitmapUpdateIfDirty().makeImage(); // HWUI always draws VD with bilinear filtering. auto sampling = SkSamplingOptions(SkFilterMode::kLinear); int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth()); int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight()); canvas->drawImageRect(cachedBitmap, SkRect::MakeWH(scaledWidth, scaledHeight), bounds, &paint, SkCanvas::kFast_SrcRectConstraint); sampling, &paint, SkCanvas::kFast_SrcRectConstraint); } void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) { Loading Loading
libs/hwui/HardwareBitmapUploader.cpp +2 −7 Original line number Diff line number Diff line Loading @@ -362,13 +362,8 @@ static SkBitmap makeHwCompatible(const FormatInfo& format, const SkBitmap& sourc return source; } else { SkBitmap bitmap; const SkImageInfo& info = source.info(); bitmap.allocPixels(info.makeColorType(kN32_SkColorType)); SkCanvas canvas(bitmap); canvas.drawColor(0); canvas.drawBitmap(source, 0.0f, 0.0f, nullptr); bitmap.allocPixels(source.info().makeColorType(kN32_SkColorType)); bitmap.writePixels(source.pixmap()); return bitmap; } } Loading
libs/hwui/Layer.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -127,10 +127,11 @@ void Layer::draw(SkCanvas* canvas) { const SkMatrix& totalMatrix = canvas->getTotalMatrix(); SkRect imageRect = SkRect::MakeIWH(layerImage->width(), layerImage->height()); SkSamplingOptions sampling; if (getForceFilter() || shouldFilterRect(totalMatrix, imageRect, imageRect)) { paint.setFilterQuality(kLow_SkFilterQuality); sampling = SkSamplingOptions(SkFilterMode::kLinear); } canvas->drawImage(layerImage.get(), 0, 0, &paint); canvas->drawImage(layerImage.get(), 0, 0, sampling, &paint); // restore the original matrix if (nonIdentityMatrix) { canvas->restore(); Loading
libs/hwui/RecordingCanvas.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -487,7 +487,9 @@ struct DrawVectorDrawable final : Op { tree->getPaintFor(&paint, tree->stagingProperties()); } void draw(SkCanvas* canvas, const SkMatrix&) const { mRoot->draw(canvas, mBounds, paint); } void draw(SkCanvas* canvas, const SkMatrix&) const { mRoot->draw(canvas, mBounds, paint); } sp<VectorDrawableRoot> mRoot; SkRect mBounds; Loading
libs/hwui/SkiaCanvas.cpp +25 −11 Original line number Diff line number Diff line Loading @@ -565,7 +565,8 @@ void SkiaCanvas::drawVertices(const SkVertices* vertices, SkBlendMode mode, cons void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) { auto image = bitmap.makeImage(); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImage(image, left, top, &p); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImage(image, left, top, sampling, &p); }); } Loading @@ -574,7 +575,8 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* SkAutoCanvasRestore acr(mCanvas, true); mCanvas->concat(matrix); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImage(image, 0, 0, &p); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImage(image, 0, 0, sampling, &p); }); } Loading @@ -586,10 +588,17 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float s SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); apply_looper(paint, [&](const SkPaint& p) { mCanvas->drawImageRect(image, srcRect, dstRect, &p, SkCanvas::kFast_SrcRectConstraint); auto sampling = SkSamplingOptions(p.getFilterQuality()); mCanvas->drawImageRect(image, srcRect, dstRect, sampling, &p, SkCanvas::kFast_SrcRectConstraint); }); } static SkFilterMode paintToFilter(const Paint* paint) { return paint && paint->isFilterBitmap() ? SkFilterMode::kLinear : SkFilterMode::kNearest; } void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, const float* vertices, const int* colors, const Paint* paint) { const int ptCount = (meshWidth + 1) * (meshHeight + 1); Loading Loading @@ -664,18 +673,25 @@ void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, } #endif auto image = bitmap.makeImage(); // cons-up a shader for the bitmap Paint pnt; if (paint) { pnt = *paint; } SkSamplingOptions sampling(pnt.isFilterBitmap() ? SkFilterMode::kLinear : SkFilterMode::kNearest, SkMipmapMode::kNone); pnt.setShader(bitmap.makeImage()->makeShader(sampling)); SkSamplingOptions sampling(paintToFilter(&pnt)); pnt.setShader(image->makeShader(sampling)); auto v = builder.detach(); apply_looper(&pnt, [&](const SkPaint& p) { mCanvas->drawVertices(v, SkBlendMode::kModulate, p); SkPaint copy(p); auto s = SkSamplingOptions(p.getFilterQuality()); if (s != sampling) { // apply_looper changed the quality? copy.setShader(image->makeShader(s)); } mCanvas->drawVertices(v, SkBlendMode::kModulate, copy); }); } Loading @@ -700,13 +716,11 @@ 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) { auto filter = SkSamplingOptions(p.getFilterQuality()).filter; mCanvas->drawImageLattice(image.get(), lattice, dst, filter, &p); }); } Loading
libs/hwui/VectorDrawable.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -507,10 +507,12 @@ void Tree::draw(SkCanvas* canvas, const SkRect& bounds, const SkPaint& inPaint) sk_sp<SkImage> cachedBitmap = getBitmapUpdateIfDirty().makeImage(); // HWUI always draws VD with bilinear filtering. auto sampling = SkSamplingOptions(SkFilterMode::kLinear); int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth()); int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight()); canvas->drawImageRect(cachedBitmap, SkRect::MakeWH(scaledWidth, scaledHeight), bounds, &paint, SkCanvas::kFast_SrcRectConstraint); sampling, &paint, SkCanvas::kFast_SrcRectConstraint); } void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) { Loading