From cebb647802c66ad2e6358a02e98d79986c784260 Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Fri, 2 Mar 2018 13:20:26 -0500 Subject: [PATCH] kClear blend mode is drawn as kDstOut kClear blend mode is drawn as kDstOut on hardware canvas for compatibility with Android O and older. On SDK released with Android P, the kClear blend mode is respected. Bug: 71602378 Test: Ran Flo app Change-Id: I6b0fa8b8bf5aa14aa5a351a914bf2ed0469ac660 (cherry picked from commit f9a461feafded09a0949f5acfd42187dc857a823) --- .../pipeline/skia/SkiaRecordingCanvas.cpp | 25 ------------ libs/hwui/pipeline/skia/SkiaRecordingCanvas.h | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index 25c76eb4db3e4..62d78e73ccc0f 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -148,31 +148,6 @@ void SkiaRecordingCanvas::drawVectorDrawable(VectorDrawableRoot* tree) { // Recording Canvas draw operations: Bitmaps // ---------------------------------------------------------------------------- -inline static const SkPaint* bitmapPaint(const SkPaint* origPaint, SkPaint* tmpPaint, - sk_sp colorSpaceFilter) { - if ((origPaint && origPaint->isAntiAlias()) || colorSpaceFilter) { - if (origPaint) { - *tmpPaint = *origPaint; - } - - if (colorSpaceFilter) { - if (tmpPaint->getColorFilter()) { - tmpPaint->setColorFilter( - SkColorFilter::MakeComposeFilter(tmpPaint->refColorFilter(), colorSpaceFilter)); - } else { - tmpPaint->setColorFilter(colorSpaceFilter); - } - LOG_ALWAYS_FATAL_IF(!tmpPaint->getColorFilter()); - } - - - // disabling AA on bitmap draws matches legacy HWUI behavior - tmpPaint->setAntiAlias(false); - return tmpPaint; - } else { - return origPaint; - } -} void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) { SkPaint tmpPaint; diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h index 0e5dbdbab0780..93807a5476e62 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h @@ -88,6 +88,45 @@ private: * @param height used to calculate recording bounds. */ void initDisplayList(uirenderer::RenderNode* renderNode, int width, int height); + + inline static const SkPaint* bitmapPaint(const SkPaint* origPaint, SkPaint* tmpPaint, + sk_sp colorSpaceFilter) { + bool fixBlending = false; + bool fixAA = false; + if (origPaint) { + // kClear blend mode is drawn as kDstOut on HW for compatibility with Android O and + // older. + fixBlending = sApiLevel <= 27 && origPaint->getBlendMode() == SkBlendMode::kClear; + fixAA = origPaint->isAntiAlias(); + } + + if (fixBlending || fixAA || colorSpaceFilter) { + if (origPaint) { + *tmpPaint = *origPaint; + } + + if (fixBlending) { + tmpPaint->setBlendMode(SkBlendMode::kDstOut); + } + + if (colorSpaceFilter) { + if (tmpPaint->getColorFilter()) { + tmpPaint->setColorFilter(SkColorFilter::MakeComposeFilter( + tmpPaint->refColorFilter(), colorSpaceFilter)); + } else { + tmpPaint->setColorFilter(colorSpaceFilter); + } + LOG_ALWAYS_FATAL_IF(!tmpPaint->getColorFilter()); + } + + // disabling AA on bitmap draws matches legacy HWUI behavior + tmpPaint->setAntiAlias(false); + return tmpPaint; + } else { + return origPaint; + } + } + }; }; // namespace skiapipeline