| Index: Source/core/layout/LayoutObject.h
|
| diff --git a/Source/core/layout/LayoutObject.h b/Source/core/layout/LayoutObject.h
|
| index 06e8d0270fba1af8f836169364b4e2f30ebf0d3b..43b9cb0b6ce68abaebc19d0a050859c774b364af 100644
|
| --- a/Source/core/layout/LayoutObject.h
|
| +++ b/Source/core/layout/LayoutObject.h
|
| @@ -115,6 +115,15 @@ typedef WTF::HashMap<const DeprecatedPaintLayer*, Vector<LayoutRect>> LayerHitTe
|
| const int showTreeCharacterOffset = 39;
|
| #endif
|
|
|
| +class NonLayoutObjectDisplayItemClientWrapper : public DisplayItemClientWrapper {
|
| +public:
|
| + template <typename T>
|
| + NonLayoutObjectDisplayItemClientWrapper(const T& client)
|
| + : DisplayItemClientWrapper(client) { }
|
| +
|
| + NonLayoutObjectDisplayItemClientWrapper(const LayoutObject&) = delete;
|
| +};
|
| +
|
| // Base class for all layout tree objects.
|
| class CORE_EXPORT LayoutObject : public ImageResourceClient {
|
| friend class LayoutBlock;
|
| @@ -856,8 +865,8 @@ public:
|
| void invalidatePaintUsingContainer(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect&, PaintInvalidationReason) const;
|
|
|
| // Invalidate the paint of a specific subrectangle within a given object. The rect |r| is in the object's coordinate space.
|
| - void invalidatePaintRectangle(const LayoutRect&) const;
|
| - void invalidatePaintRectangleNotInvalidatingDisplayItemClients(const LayoutRect& r) const { invalidatePaintRectangleInternal(r); }
|
| + void invalidatePaintRectangle(const LayoutRect&);
|
| + void invalidatePaintRectangleNotInvalidatingDisplayItemClients(const LayoutRect& r) { invalidatePaintRectangleInternal(r); }
|
|
|
| // Walk the tree after layout issuing paint invalidations for layoutObjects that have changed or moved, updating bounds that have changed, and clearing paint invalidation state.
|
| virtual void invalidateTreeIfNeeded(PaintInvalidationState&);
|
| @@ -1043,15 +1052,25 @@ public:
|
|
|
| DisplayItemClient displayItemClient() const { return toDisplayItemClient(this); }
|
|
|
| - void invalidateDisplayItemClient(const DisplayItemClientWrapper&) const;
|
| - void invalidateDisplayItemClientForNonCompositingDescendants() const { invalidateDisplayItemClientForNonCompositingDescendantsOf(*this); }
|
| + void invalidateDisplayItemClient(const NonLayoutObjectDisplayItemClientWrapper&);
|
| + void invalidateDisplayItemClient(LayoutObject&);
|
| + void invalidateDisplayItemClientForNonCompositingDescendants() { invalidateDisplayItemClientForNonCompositingDescendantsOf(*this); }
|
| // A normal object should use invalidateDisplayItemClientForNonCompositingDescendants()
|
| // to invalidate its descendants which are painted on the same backing. However, for
|
| // an object (e.g. LayoutScrollbarPart, custom scroll corner, custom resizer) which is
|
| // not hooked up in the layout tree and not able to find its paint backing, it should
|
| // let its owning layout object call the following function.
|
| // FIXME: should we hook up scrollbar parts in the layout tree? crbug.com/484263.
|
| - void invalidateDisplayItemClientForNonCompositingDescendantsOf(const LayoutObject&) const;
|
| + void invalidateDisplayItemClientForNonCompositingDescendantsOf(LayoutObject&);
|
| +
|
| + // Slimming paint v2 tracks whether a LayoutObject is invalid instead of using invalidation rects.
|
| + // For more information, see: https://docs.google.com/a/chromium.org/document/d/1FTqk3MwUAS1qLJsnA9zgfDbeqAQBdLYC4GJ9jpN-xdA
|
| + bool selfNeedsRepaint() const { return m_bitfields.selfNeedsRepaint(); }
|
| + void setNeedsRepaint();
|
| + bool childNeedsRepaint() const { return m_bitfields.childNeedsRepaint(); }
|
| + bool shouldCheckForRepaint() const { return selfNeedsRepaint() || childNeedsRepaint(); }
|
| +
|
| + void clearRepaintFlagsRecursively();
|
|
|
| protected:
|
| enum LayoutObjectType {
|
| @@ -1179,7 +1198,9 @@ protected:
|
| // owned by this object, including the object itself, LayoutText/LayoutInline line boxes, etc.,
|
| // not including children which will be invalidated normally during invalidateTreeIfNeeded() and
|
| // parts which are invalidated separately (e.g. scrollbars).
|
| - virtual void invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer) const;
|
| + virtual void invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer);
|
| +
|
| + virtual void clearRepaintFlagsOfSubtrees();
|
|
|
| void setIsSlowRepaintObject(bool);
|
|
|
| @@ -1210,6 +1231,9 @@ private:
|
|
|
| inline void markContainerChainForPaintInvalidation();
|
|
|
| + void markContainerChainForChildNeedsRepaint();
|
| + void setChildNeedsRepaint();
|
| +
|
| inline void invalidateSelectionIfNeeded(const LayoutBoxModelObject&, PaintInvalidationReason);
|
|
|
| inline void invalidateContainerPreferredLogicalWidths();
|
| @@ -1240,7 +1264,9 @@ private:
|
|
|
| static bool isAllowedToModifyLayoutTreeStructure(Document&);
|
|
|
| - const LayoutBoxModelObject* invalidatePaintRectangleInternal(const LayoutRect&) const;
|
| + const LayoutBoxModelObject* invalidatePaintRectangleInternal(const LayoutRect&);
|
| +
|
| + void invalidateDisplayItemClientInternal(const DisplayItemClientWrapper&);
|
|
|
| RefPtr<ComputedStyle> m_style;
|
|
|
| @@ -1311,6 +1337,8 @@ private:
|
| , m_alwaysCreateLineBoxesForLayoutInline(false)
|
| , m_lastBoxDecorationBackgroundObscured(false)
|
| , m_isSlowRepaintObject(false)
|
| + , m_selfNeedsRepaint(false)
|
| + , m_childNeedsRepaint(false)
|
| , m_positionedState(IsStaticallyPositioned)
|
| , m_selectionState(SelectionNone)
|
| , m_boxDecorationBackgroundState(NoBoxDecorationBackground)
|
| @@ -1318,7 +1346,7 @@ private:
|
| {
|
| }
|
|
|
| - // 32 bits have been used in the first word, and 16 in the second.
|
| + // 32 bits have been used in the first word, and 18 in the second.
|
| ADD_BOOLEAN_BITFIELD(selfNeedsLayout, SelfNeedsLayout);
|
| ADD_BOOLEAN_BITFIELD(shouldInvalidateOverflowForPaint, ShouldInvalidateOverflowForPaint); // TODO(wangxianzhu): Remove for slimming paint v2.
|
| ADD_BOOLEAN_BITFIELD(childShouldCheckForPaintInvalidation, ChildShouldCheckForPaintInvalidation);
|
| @@ -1370,6 +1398,12 @@ private:
|
|
|
| ADD_BOOLEAN_BITFIELD(isSlowRepaintObject, IsSlowRepaintObject);
|
|
|
| + // For slimming-paint v2.
|
| + // TODO(wangxianzhu): Combine repaint flags with paint invalidation flags when we remove
|
| + // old paint invalidation code.
|
| + ADD_BOOLEAN_BITFIELD(selfNeedsRepaint, SelfNeedsRepaint);
|
| + ADD_BOOLEAN_BITFIELD(childNeedsRepaint, ChildNeedsRepaint);
|
| +
|
| private:
|
| unsigned m_positionedState : 2; // PositionedState
|
| unsigned m_selectionState : 3; // SelectionState
|
|
|