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

Unified Diff: third_party/WebKit/Source/core/paint/PaintLayer.cpp

Issue 2604973002: Move computation of 3D descendants to the descendant-dependent flags walk. (Closed)
Patch Set: none Created 4 years 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/core/paint/PaintLayer.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index 7a098e407c3170d03fdbc948ebb001ca222ec3f6..a5519b3b360f2e99a1ec61ff0320d81ea48088cc 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -138,7 +138,6 @@ PaintLayer::PaintLayer(LayoutBoxModelObject* layoutObject)
#if DCHECK_IS_ON()
m_needsPositionUpdate(true),
#endif
- m_is3DTransformedDescendantDirty(true),
m_has3DTransformedDescendant(false),
m_containsDirtyOverlayScrollbars(false),
m_needsAncestorDependentCompositingInputsUpdate(true),
@@ -415,7 +414,7 @@ void PaintLayer::updateTransform(const ComputedStyle* oldStyle,
updateTransformationMatrix();
if (had3DTransform != has3DTransform())
- dirty3DTransformedDescendantStatus();
+ markAncestorChainForDescendantDependentFlagsUpdate();
if (FrameView* frameView = layoutObject()->document().view())
frameView->setNeedsUpdateWidgetGeometries();
@@ -740,49 +739,32 @@ void PaintLayer::updateDescendantDependentFlags() {
// this LayoutObject during the invalidateTreeIfNeeded walk.
m_layoutObject->setMayNeedPaintInvalidation();
}
-}
-
-void PaintLayer::dirty3DTransformedDescendantStatus() {
- PaintLayerStackingNode* stackingNode =
- m_stackingNode->ancestorStackingContextNode();
- if (!stackingNode)
- return;
-
- stackingNode->layer()->m_is3DTransformedDescendantDirty = true;
- // This propagates up through preserve-3d hierarchies to the enclosing
- // flattening layer. Note that preserves3D() creates stacking context, so we
- // can just run up the stacking containers.
- while (stackingNode && stackingNode->layer()->preserves3D()) {
- stackingNode->layer()->m_is3DTransformedDescendantDirty = true;
- stackingNode = stackingNode->ancestorStackingContextNode();
- }
+ update3DTransformedDescendantStatus();
}
-// Return true if this layer or any preserve-3d descendants have 3d.
-bool PaintLayer::update3DTransformedDescendantStatus() {
- if (m_is3DTransformedDescendantDirty) {
- m_has3DTransformedDescendant = false;
-
- m_stackingNode->updateZOrderLists();
+void PaintLayer::update3DTransformedDescendantStatus() {
+ m_has3DTransformedDescendant = false;
- // Transformed or preserve-3d descendants can only be in the z-order lists,
- // not in the normal flow list, so we only need to check those.
- PaintLayerStackingNodeIterator iterator(
- *m_stackingNode.get(), PositiveZOrderChildren | NegativeZOrderChildren);
- while (PaintLayerStackingNode* node = iterator.next())
- m_has3DTransformedDescendant |=
- node->layer()->update3DTransformedDescendantStatus();
+ m_stackingNode->updateZOrderLists();
- m_is3DTransformedDescendantDirty = false;
+ // Transformed or preserve-3d descendants can only be in the z-order lists,
+ // not in the normal flow list, so we only need to check those.
+ PaintLayerStackingNodeIterator iterator(
+ *m_stackingNode.get(), PositiveZOrderChildren | NegativeZOrderChildren);
+ while (PaintLayerStackingNode* node = iterator.next()) {
+ const PaintLayer& childLayer = *node->layer();
+ bool childHas3D = false;
+ // If the child lives in a 3d hierarchy, then the layer at the root of
+ // that hierarchy needs the m_has3DTransformedDescendant set.
+ if (childLayer.preserves3D() && (childLayer.has3DTransform() ||
+ childLayer.has3DTransformedDescendant()))
+ childHas3D = true;
+ else if (childLayer.has3DTransform())
+ childHas3D = true;
+
+ m_has3DTransformedDescendant = m_has3DTransformedDescendant || childHas3D;
Xianzhu 2016/12/28 18:08:11 We should break the loop when m_has3DTransformedDe
chrishtr 2016/12/28 18:49:46 Fixed.
}
-
- // If we live in a 3d hierarchy, then the layer at the root of that hierarchy
- // needs the m_has3DTransformedDescendant set.
- if (preserves3D())
- return has3DTransform() || m_has3DTransformedDescendant;
-
- return has3DTransform();
}
void PaintLayer::updateLayerPosition() {

Powered by Google App Engine
This is Rietveld 408576698