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

Unified Diff: Source/core/layout/LayoutObject.cpp

Issue 1294233004: Subtree caching implementation in blink-core (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add a complex-subtree-update test Created 5 years, 4 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: Source/core/layout/LayoutObject.cpp
diff --git a/Source/core/layout/LayoutObject.cpp b/Source/core/layout/LayoutObject.cpp
index fb0062c7711f8310c7700117e88d6e360ffe14e5..0969c25548316aaaa0ab283065f1134249558b8c 100644
--- a/Source/core/layout/LayoutObject.cpp
+++ b/Source/core/layout/LayoutObject.cpp
@@ -1165,7 +1165,21 @@ void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& pai
}
}
-void LayoutObject::invalidateDisplayItemClient(const DisplayItemClientWrapper& displayItemClient) const
+void LayoutObject::invalidateDisplayItemClient(const NonLayoutObjectDisplayItemClientWrapper& displayItemClient)
+{
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ setChildNeedsRepaint();
+ invalidateDisplayItemClientInternal(displayItemClient);
+}
+
+void LayoutObject::invalidateDisplayItemClient(LayoutObject& object)
+{
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ object.setNeedsRepaint();
+ invalidateDisplayItemClientInternal(object);
+}
+
+void LayoutObject::invalidateDisplayItemClientInternal(const DisplayItemClientWrapper& displayItemClient)
{
if (!RuntimeEnabledFeatures::slimmingPaintEnabled())
return;
@@ -1179,12 +1193,70 @@ void LayoutObject::invalidateDisplayItemClient(const DisplayItemClientWrapper& d
}
}
-void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer) const
+void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer)
{
ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled());
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+ setNeedsRepaint();
paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this);
}
+void LayoutObject::setNeedsRepaint()
+{
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
+ ASSERT(document().lifecycle().state() <= DocumentLifecycle::InPaintInvalidation);
+
+ if (!selfNeedsRepaint()) {
+ m_bitfields.setSelfNeedsRepaint(true);
+ markContainerChainForChildNeedsRepaint();
+ }
+}
+
+void LayoutObject::setChildNeedsRepaint()
+{
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
+ ASSERT(document().lifecycle().state() <= DocumentLifecycle::InPaintInvalidation);
+
+ if (!childNeedsRepaint()) {
+ m_bitfields.setChildNeedsRepaint(true);
+ markContainerChainForChildNeedsRepaint();
+ }
+}
+
+void LayoutObject::markContainerChainForChildNeedsRepaint()
+{
+ // TODO(wangxianzhu): This should be "markPaintContainerChainForChildNeedsRepaint"
+ // (which returns the painting container instead of positioning container for fixed-pos)
+ // when we remove DeprecatedPaintLayer. Currently DeprecatedPaintLayer paints fixed-pos
+ // object which is not fully controlled by normal LayoutBlock subtree repaint flags.
trchen 2015/08/25 06:30:38 Sorry I just realized that fixed-pos element is no
Xianzhu 2015/08/25 15:55:03 This is not too hard, but it'll need non-constant
chrishtr 2015/08/25 20:49:52 I'm not sure all the complexity of encoding paint
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
+ for (LayoutObject* container = this->containerCrossingFrameBoundaries(); container && !container->childNeedsRepaint(); container = container->containerCrossingFrameBoundaries())
+ container->m_bitfields.setChildNeedsRepaint(true);
+}
+
+void LayoutObject::clearRepaintFlagsRecursively()
+{
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
+ ASSERT(document().lifecycle().state() == DocumentLifecycle::InPaintForSlimmingPaintV2);
+
+ m_bitfields.setSelfNeedsRepaint(false);
+
+ if (!m_bitfields.childNeedsRepaint())
+ return;
+
+ clearRepaintFlagsOfSubtrees();
+ m_bitfields.setChildNeedsRepaint(false);
+}
+
+void LayoutObject::clearRepaintFlagsOfSubtrees()
+{
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
+ for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibling()) {
+ if (!child->isOutOfFlowPositioned())
+ child->clearRepaintFlagsRecursively();
+ }
+}
+
LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const
{
if (!paintInvalidationContainer)
@@ -1192,7 +1264,7 @@ LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObje
return DeprecatedPaintLayer::computePaintInvalidationRect(this, paintInvalidationContainer->layer(), paintInvalidationState);
}
-const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& r) const
+const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& r)
{
RELEASE_ASSERT(isRooted());
@@ -1210,7 +1282,7 @@ const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const
return &paintInvalidationContainer;
}
-void LayoutObject::invalidatePaintRectangle(const LayoutRect& r) const
+void LayoutObject::invalidatePaintRectangle(const LayoutRect& r)
{
if (const LayoutBoxModelObject* paintInvalidationContainer = invalidatePaintRectangleInternal(r)) {
if (RuntimeEnabledFeatures::slimmingPaintEnabled())
@@ -3273,7 +3345,7 @@ void traverseNonCompositingDescendants(LayoutObject& object, const LayoutObjectT
} // unnamed namespace
-void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(const LayoutObject& object) const
+void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(LayoutObject& object)
{
ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled());

Powered by Google App Engine
This is Rietveld 408576698