summaryrefslogtreecommitdiff
path: root/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
diff options
context:
space:
mode:
authorStan Iliev <stani@google.com>2017-09-20 18:05:35 -0400
committerStan Iliev <stani@google.com>2017-09-21 17:14:10 -0400
commit1843ac7cc9e58e93abcd9d555ae65a941315d45f (patch)
tree34296d1cf4d57e98740aae8fb2ebbc1ce0f9f8b4 /libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
parent8c85e5ffe65f7ff2e30e405e61a9e64ef3b69b78 (diff)
Fix alpha fading in System UI
Fix alpha not being applied for Views that have non overlapping rendering (getHasOverlappingRendering is false). Test: Ran system UI Bug: 65857651 Change-Id: I31001de0f67bf95ab8425189a4b78427d062585d
Diffstat (limited to 'libs/hwui/pipeline/skia/RenderNodeDrawable.cpp')
-rw-r--r--libs/hwui/pipeline/skia/RenderNodeDrawable.cpp31
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);
+ }
}
}
}