Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(417)

Unified Diff: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp

Issue 2833883003: Skip paint chunks with effectively invisible opacity. (Closed)
Patch Set: Sync to head. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 4f4e0b6ebdf40e13698a02cdfb634c2af9d1f15a..0aaecc29f3c0fddf654d9d7279d43c442aa709e0 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
@@ -474,11 +474,49 @@ bool PaintArtifactCompositor::CanDecompositeEffect(
return true;
}
+static bool EffectGroupContainsChunk(
+ const EffectPaintPropertyNode& group_effect,
+ const PaintChunk& chunk) {
+ const EffectPaintPropertyNode* effect =
+ chunk.properties.property_tree_state.Effect();
+ return effect == &group_effect ||
+ StrictChildOfAlongPath(&group_effect, effect);
+}
+
+static bool SkipGroupIfEffectivelyInvisible(
+ const PaintArtifact& paint_artifact,
+ const EffectPaintPropertyNode& current_group,
+ Vector<PaintChunk>::const_iterator& chunk_it) {
+ // 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 (current_group.Opacity() >= kMinimumVisibleOpacity ||
+ current_group.HasDirectCompositingReasons()) {
+ return false;
+ }
+
+ // Fast-forward to just past the end of the chunk sequence within this
+ // effect group.
+ DCHECK(EffectGroupContainsChunk(current_group, *chunk_it));
+ while (++chunk_it != paint_artifact.PaintChunks().end()) {
+ if (!EffectGroupContainsChunk(current_group, *chunk_it))
+ break;
+ }
+ return true;
+}
+
void PaintArtifactCompositor::LayerizeGroup(
const PaintArtifact& paint_artifact,
Vector<PendingLayer>& pending_layers,
const EffectPaintPropertyNode& current_group,
Vector<PaintChunk>::const_iterator& chunk_it) {
+ // Skip paint chunks that are effectively invisible due to opacity and don't
+ // have a direct compositing reason.
+ if (SkipGroupIfEffectivelyInvisible(paint_artifact, current_group, chunk_it))
+ return;
+
size_t first_layer_in_current_group = pending_layers.size();
// The worst case time complexity of the algorithm is O(pqd), where
// p = the number of paint chunks.

Powered by Google App Engine
This is Rietveld 408576698