diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-09-21 23:21:42 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-09-21 23:21:42 +0000 |
| commit | fada28cf98a472231cf2a2a2b623da2c693dec65 (patch) | |
| tree | 574faba7417e89e6ccad3c2f0d1018d3b504fea8 | |
| parent | d638549cbba51d42b0ae875dcb4c70d5371ec91c (diff) | |
| parent | 1843ac7cc9e58e93abcd9d555ae65a941315d45f (diff) | |
Merge "Fix alpha fading in System UI"
| -rw-r--r-- | libs/hwui/pipeline/skia/RenderNodeDrawable.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index 4ee47afe87fd..47dee9d4e9d8 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -19,6 +19,7 @@ #include "SkiaDisplayList.h" #include "SkiaPipeline.h" #include "utils/TraceUtils.h" +#include <SkPaintFilterCanvas.h> namespace android { namespace uirenderer { @@ -151,6 +152,27 @@ static bool layerNeedsPaint(const LayerProperties& properties, return false; } +class AlphaFilterCanvas : public SkPaintFilterCanvas { +public: + AlphaFilterCanvas(SkCanvas* canvas, float alpha) : SkPaintFilterCanvas(canvas), mAlpha(alpha) {} +protected: + bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type t) const override { + SkTLazy<SkPaint> defaultPaint; + if (!*paint) { + paint->init(*defaultPaint.init()); + } + paint->writable()->setAlpha((uint8_t)(*paint)->getAlpha()*mAlpha); + return true; + } + void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override { + // We unroll the drawable using "this" canvas, so that draw calls contained inside will + // get their alpha applied. THe default SkPaintFilterCanvas::onDrawDrawable does not unroll. + drawable->draw(this, matrix); + } +private: + float mAlpha; +}; + void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { RenderNode* renderNode = mRenderNode.get(); float alphaMultiplier = 1.0f; @@ -211,7 +233,14 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { canvas->restore(); } } else { - displayList->draw(canvas); + if (alphaMultiplier < 1.0f) { + // Non-layer draw for a view with getHasOverlappingRendering=false, will apply + // the alpha to the paint of each nested draw. + AlphaFilterCanvas alphaCanvas(canvas, alphaMultiplier); + displayList->draw(&alphaCanvas); + } else { + displayList->draw(canvas); + } } } } |
