Index: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
index 83cf5e45e90c8d5f3da455493a94a93311c6a8d0..29560ad32793a176ffcc736f27223a5f24415299 100644 |
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp |
@@ -499,12 +499,28 @@ void PaintArtifactCompositor::LayerizeGroup( |
// due to copying the chunk list. Subtotal: O((qd + p)d) = O(qd^2 + pd) |
// Assuming p > d, the total complexity would be O(pqd + qd^2 + pd) = O(pqd) |
while (chunk_it != paint_artifact.PaintChunks().end()) { |
- // Look at the effect node of the next chunk. There are 3 possible cases: |
+ // Look at the effect node of the next chunk. If the chunk has |
+ // effectively-invisible opacity we skip it. Otherwise, there are 3 possible |
+ // cases: |
// A. The next chunk belongs to the current group but no subgroup. |
// B. The next chunk does not belong to the current group. |
// C. The next chunk belongs to some subgroup of the current group. |
const EffectPaintPropertyNode* chunk_effect = |
chunk_it->properties.property_tree_state.Effect(); |
+ |
+ // Skip paint chunks that are effectively invisible due to opacity as long |
+ // as we don't have another explicit reason to give them a layer. The lower |
+ // bound of visibility is considered to be 0.0004f < 1/2048. With 10-bit |
+ // color channels (only available on the newest Macs as of 2016; otherwise |
+ // it's 8-bit), we see that an alpha of 1/2048 or less leads to a color |
+ // output of less than 0.5 in all channels, hence not visible. |
+ static const float kMinimumVisibleOpacity = 0.0004f; |
+ if (chunk_effect->Opacity() < kMinimumVisibleOpacity && |
+ !chunk_effect->HasDirectCompositingReasons()) { |
+ chunk_it++; |
+ continue; |
+ } |
+ |
if (chunk_effect == ¤t_group) { |
// Case A: The next chunk belongs to the current group but no subgroup. |
bool is_foreign = |