summaryrefslogtreecommitdiff
path: root/libs/hwui/RenderNode.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2018-09-27 17:39:45 -0700
committerJohn Reck <jreck@google.com>2018-10-02 11:19:55 -0700
commit3b4510cd774d1a9e48b4758e95b02e7b32853607 (patch)
treef3c1be240a0c4e2dff4b1bcdca675914e22d43ff /libs/hwui/RenderNode.cpp
parentab5c506b6aeb1ae192eb3555108c2072acf77e3f (diff)
Auto-dark NinePatches & launcher
Support palette for ninepatches (fixes popupwindow) Crude heuristic tweak to treat any RenderNode that fully contains other nodes as background nodes. Test: all apps is now readable, and so is chrome's menu Change-Id: I9926973c0be1dbf0088fa2d61e4ee2a414b19a97
Diffstat (limited to 'libs/hwui/RenderNode.cpp')
-rw-r--r--libs/hwui/RenderNode.cpp50
1 files changed, 35 insertions, 15 deletions
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index d9a7cc3a575f..d2a8f02cc6a7 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -282,25 +282,45 @@ void RenderNode::syncDisplayList(TreeObserver& observer, TreeInfo* info) {
mStagingDisplayList = nullptr;
if (mDisplayList) {
mDisplayList->syncContents();
+ handleForceDark(info);
+ }
+}
- if (CC_UNLIKELY(info && !info->disableForceDark)) {
- auto usage = usageHint();
- if (mDisplayList->hasText()) {
- usage = UsageHint::Foreground;
- }
- if (usage == UsageHint::Unknown) {
- if (mDisplayList->mChildNodes.size() > 1) {
- usage = UsageHint::Background;
- } else if (mDisplayList->mChildNodes.size() == 1 &&
- mDisplayList->mChildNodes.front().getRenderNode()->usageHint() !=
- UsageHint::Background) {
- usage = UsageHint::Background;
- }
+void RenderNode::handleForceDark(android::uirenderer::TreeInfo *info) {
+ if (CC_LIKELY(!info || info->disableForceDark)) {
+ return;
+ }
+ auto usage = usageHint();
+ const auto& children = mDisplayList->mChildNodes;
+ if (mDisplayList->hasText()) {
+ usage = UsageHint::Foreground;
+ }
+ if (usage == UsageHint::Unknown) {
+ if (children.size() > 1) {
+ usage = UsageHint::Background;
+ } else if (children.size() == 1 &&
+ children.front().getRenderNode()->usageHint() !=
+ UsageHint::Background) {
+ usage = UsageHint::Background;
+ }
+ }
+ if (children.size() > 1) {
+ // Crude overlap check
+ SkRect drawn = SkRect::MakeEmpty();
+ for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
+ const auto& child = iter->getRenderNode();
+ // We use stagingProperties here because we haven't yet sync'd the children
+ SkRect bounds = SkRect::MakeXYWH(child->stagingProperties().getX(), child->stagingProperties().getY(),
+ child->stagingProperties().getWidth(), child->stagingProperties().getHeight());
+ if (bounds.contains(drawn)) {
+ // This contains everything drawn after it, so make it a background
+ child->setUsageHint(UsageHint::Background);
}
- mDisplayList->mDisplayList.applyColorTransform(
- usage == UsageHint::Background ? ColorTransform::Dark : ColorTransform::Light);
+ drawn.join(bounds);
}
}
+ mDisplayList->mDisplayList.applyColorTransform(
+ usage == UsageHint::Background ? ColorTransform::Dark : ColorTransform::Light);
}
void RenderNode::pushStagingDisplayListChanges(TreeObserver& observer, TreeInfo& info) {