[go: up one dir, main page]

Don't draw layer in kDstIn blend mode in resourceless software draw mode

Resourceless software draw mode doesn't support non-kSrcOver blend mode
if source is not a render surface. We should not draw in the case
because the fallback to kSrcOver would result a black mask on the
destination.

(cherry picked from commit 8540de427cab80ac0bf07ef57bae612e1b87d69c)

Bug: 973697
Change-Id: Ieaa9e612fe09512e925337ec131ced7594d64627
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1661289
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: Philip Rogers <pdr@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#669512}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1662498
Reviewed-by: Ben Mason <benmason@chromium.org>
Cr-Commit-Position: refs/branch-heads/3770@{#1026}
Cr-Branched-From: a9eee1c7c727ef42a15d86e9fa7b77ff0e63840a-refs/heads/master@{#652427}
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 36a262b3..580dd90 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -183,6 +183,16 @@
     return false;
   }
 
+  // Resourceless mode does not support non-default blend mode. If we draw,
+  // the result will be just like kSrcOver which is not too bad for blend modes
+  // other than kDstIn. For kDstIn mode, we should ignore the source because
+  // otherwise we would draw a bad black mask over the destination.
+  if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) {
+    const auto* effect_node = GetEffectTree().Node(effect_tree_index());
+    if (effect_node && effect_node->blend_mode == SkBlendMode::kDstIn)
+      return false;
+  }
+
   current_draw_mode_ = draw_mode;
   return true;
 }