diff options
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp | 25 | ||||
| -rw-r--r-- | 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 25c76eb4db3e..62d78e73ccc0 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<SkColorFilter> 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 0e5dbdbab078..93807a5476e6 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<SkColorFilter> 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 |