Chromium Code Reviews| 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()); |