Index: Source/core/layout/LayoutObject.cpp |
diff --git a/Source/core/layout/LayoutObject.cpp b/Source/core/layout/LayoutObject.cpp |
index 0892709745635288d2a7b1efe0030c0615333d8e..8b278ff0d07ea5e3b0942f2289aa478ffa85b9b7 100644 |
--- a/Source/core/layout/LayoutObject.cpp |
+++ b/Source/core/layout/LayoutObject.cpp |
@@ -1164,7 +1164,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; |
@@ -1178,12 +1192,65 @@ 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()); |
pdr.
2015/08/20 22:45:05
Can we assert that we're in the appropriate docume
Xianzhu
2015/08/21 00:31:38
Done. The condition will change in next steps for
|
+ if (!selfNeedsRepaint()) { |
+ m_bitfields.setSelfNeedsRepaint(true); |
+ markContainerChainForRepaint(); |
+ } |
+} |
+ |
+void LayoutObject::setChildNeedsRepaint() |
+{ |
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ if (!childNeedsRepaint()) { |
+ m_bitfields.setChildNeedsRepaint(true); |
+ markContainerChainForRepaint(); |
+ } |
+} |
+ |
+void LayoutObject::markContainerChainForRepaint() |
pdr.
2015/08/20 22:45:05
markContainerChainForChildNeedsRepaint?
Xianzhu
2015/08/21 00:31:38
Done.
|
+{ |
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ for (LayoutObject* container = this->containerCrossingFrameBoundaries(); container && !container->childNeedsRepaint(); container = container->containerCrossingFrameBoundaries()) |
+ container->m_bitfields.setChildNeedsRepaint(true); |
trchen
2015/08/21 00:37:29
I think we need to special case fixed-pos elements
Xianzhu
2015/08/21 04:54:51
container() is actually equivalent to paintingAnce
Xianzhu
2015/08/21 05:52:45
Scratch the above. Perhaps I misunderstood paintin
|
+} |
+ |
+bool LayoutObject::clearRepaintFlagsRecursively() |
+{ |
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ m_bitfields.setSelfNeedsRepaint(false); |
+ |
+ if (!m_bitfields.childNeedsRepaint()) |
+ return true; |
+ |
+ if (clearRepaintFlagsOfSubtrees()) { |
+ m_bitfields.setChildNeedsRepaint(false); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool LayoutObject::clearRepaintFlagsOfSubtrees() |
+{ |
+ ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); |
+ bool result = true; |
+ for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibling()) { |
+ if (!child->isOutOfFlowPositioned()) |
+ result &= child->clearRepaintFlagsRecursively(); |
+ } |
+ return result; |
+} |
+ |
LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObject* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const |
{ |
if (!paintInvalidationContainer) |
@@ -1191,7 +1258,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()); |
@@ -1209,7 +1276,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()) |
@@ -3286,7 +3353,7 @@ void traverseNonCompositingDescendants(LayoutObject& object, const LayoutObjectT |
} // unnamed namespace |
-void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(const LayoutObject& object) const |
+void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(LayoutObject& object) |
{ |
ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); |