Skip to content

Commit

Permalink
Make LayerRepaintRects internal to RenderLayer
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=264530
rdar://118203951

Reviewed by Chris Dumez.

There are two call sites that make use of RenderLayer's cached repaint rects, but
they both use only the clippedOverflowRect, not the outlineBoundsRect, so we can
hide RepaintRects inside of RenderLayer, and only expose the cachedClippedOverflowRect()
to those two clients.

* Source/WebCore/rendering/LegacyLineLayout.cpp:
(WebCore::LegacyLineLayout::layoutRunsAndFloats):
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::cachedClippedOverflowRect const):
(WebCore::RenderLayer::setRepaintRects):
(WebCore::RenderLayer::shouldRepaintAfterLayout const):
* Source/WebCore/rendering/RenderLayer.h:
(WebCore::RenderLayer::repaintRects const):
* Source/WebCore/rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::styleDidChange):
(WebCore::RenderLayerModelObject::cachedLayerClippedOverflowRect const):
(WebCore::RenderLayerModelObject::layerRepaintRects const): Deleted.
* Source/WebCore/rendering/RenderLayerModelObject.h:
* Source/WebCore/rendering/RenderLayerScrollableArea.cpp:
(WebCore::RenderLayerScrollableArea::scrollTo):

Canonical link: https://commits.webkit.org/270550@main
  • Loading branch information
smfr committed Nov 10, 2023
1 parent 24772eb commit d24752c
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 24 deletions.
4 changes: 2 additions & 2 deletions Source/WebCore/rendering/LegacyLineLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1333,12 +1333,12 @@ void LegacyLineLayout::layoutRunsAndFloats(LineLayoutState& layoutState, bool ha
// determineStartPosition first will break fast/repaint/line-flow-with-floats-9.html.
if (layoutState.isFullLayout() && hasInlineChild && !m_flow.selfNeedsLayout()) {
m_flow.setNeedsLayout(MarkOnlyThis); // Mark as needing a full layout to force us to repaint.
if (!layoutContext().needsFullRepaint() && m_flow.layerRepaintRects()) {
if (!layoutContext().needsFullRepaint() && m_flow.cachedLayerClippedOverflowRect()) {
// Because we waited until we were already inside layout to discover
// that the block really needed a full layout, we missed our chance to repaint the layer
// before layout started. Luckily the layer has cached the repaint rect for its original
// position and size, and so we can use that to make a repaint happen now.
m_flow.repaintUsingContainer(m_flow.containerForRepaint().renderer.get(), m_flow.layerRepaintRects()->clippedOverflowRect);
m_flow.repaintUsingContainer(m_flow.containerForRepaint().renderer.get(), *m_flow.cachedLayerClippedOverflowRect());
}
}

Expand Down
12 changes: 10 additions & 2 deletions Source/WebCore/rendering/RenderLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,14 @@ void RenderLayer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus()
}
}

std::optional<LayoutRect> RenderLayer::cachedClippedOverflowRect() const
{
if (!m_repaintRectsValid)
return std::nullopt;

return m_repaintRects.clippedOverflowRect;
}

void RenderLayer::computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* geometryMap)
{
ASSERT(!m_visibleContentStatusDirty);
Expand All @@ -1189,7 +1197,7 @@ void RenderLayer::computeRepaintRectsIncludingDescendants()
layer->computeRepaintRectsIncludingDescendants();
}

void RenderLayer::setRepaintRects(const LayerRepaintRects& rects)
void RenderLayer::setRepaintRects(const RepaintRects& rects)
{
m_repaintRects = rects;
m_repaintRectsValid = true;
Expand Down Expand Up @@ -2026,7 +2034,7 @@ RenderLayer* RenderLayer::enclosingTransformedAncestor() const
return curr;
}

inline bool RenderLayer::shouldRepaintAfterLayout() const
bool RenderLayer::shouldRepaintAfterLayout() const
{
#if ENABLE(LAYER_BASED_SVG_ENGINE)
// The SVG containers themselves never trigger repaints, only their contents are allowed to.
Expand Down
26 changes: 17 additions & 9 deletions Source/WebCore/rendering/RenderLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,7 @@ class RenderLayer : public CanMakeWeakPtr<RenderLayer>, public CanMakeCheckedPtr

RenderLayer* paintOrderParent() const;

std::optional<LayerRepaintRects> repaintRects() const
{
if (m_repaintRectsValid)
return m_repaintRects;

return { };
}
std::optional<LayoutRect> cachedClippedOverflowRect() const;

void dirtyNormalFlowList();
void dirtyZOrderLists();
Expand Down Expand Up @@ -969,10 +963,24 @@ class RenderLayer : public CanMakeWeakPtr<RenderLayer>, public CanMakeCheckedPtr
void setAncestorChainHasSelfPaintingLayerDescendant();
void dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();

struct RepaintRects {
LayoutRect clippedOverflowRect;
LayoutRect outlineBoundsRect;
};


std::optional<RepaintRects> repaintRects() const
{
if (m_repaintRectsValid)
return m_repaintRects;

return { };
}

void computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* = nullptr);
void computeRepaintRectsIncludingDescendants();

void setRepaintRects(const LayerRepaintRects&);
void setRepaintRects(const RepaintRects&);
void clearRepaintRects();

LayoutRect clipRectRelativeToAncestor(RenderLayer* ancestor, LayoutSize offsetFromAncestor, const LayoutRect& constrainingRect) const;
Expand Down Expand Up @@ -1310,7 +1318,7 @@ class RenderLayer : public CanMakeWeakPtr<RenderLayer>, public CanMakeCheckedPtr
std::unique_ptr<Vector<RenderLayer*>> m_normalFlowList;

// Only valid if m_repaintRectsValid is set (std::optional<> not used to avoid padding).
LayerRepaintRects m_repaintRects;
RepaintRects m_repaintRects;

// Our current relative or absolute position offset.
LayoutSize m_offsetForPosition;
Expand Down
8 changes: 4 additions & 4 deletions Source/WebCore/rendering/RenderLayerModelObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderSt
setHasReflection(false);

// Repaint the about to be destroyed self-painting layer when style change also triggers repaint.
if (layer()->isSelfPaintingLayer() && layer()->repaintStatus() == RepaintStatus::NeedsFullRepaint && layer()->repaintRects())
repaintUsingContainer(containerForRepaint().renderer.get(), layer()->repaintRects()->clippedOverflowRect);
if (layer()->isSelfPaintingLayer() && layer()->repaintStatus() == RepaintStatus::NeedsFullRepaint && layer()->cachedClippedOverflowRect())
repaintUsingContainer(containerForRepaint().renderer.get(), *(layer()->cachedClippedOverflowRect()));

layer()->removeOnlyThisLayer(RenderLayer::LayerChangeTiming::StyleChange); // calls destroyLayer() which clears m_layer
if (s_wasFloating && isFloating())
Expand Down Expand Up @@ -238,9 +238,9 @@ bool RenderLayerModelObject::shouldPlaceVerticalScrollbarOnLeft() const
#endif
}

std::optional<LayerRepaintRects> RenderLayerModelObject::layerRepaintRects() const
std::optional<LayoutRect> RenderLayerModelObject::cachedLayerClippedOverflowRect() const
{
return hasLayer() ? layer()->repaintRects() : std::nullopt;
return hasLayer() ? layer()->cachedClippedOverflowRect() : std::nullopt;
}

bool RenderLayerModelObject::startAnimation(double timeOffset, const Animation& animation, const KeyframeList& keyframes)
Expand Down
7 changes: 1 addition & 6 deletions Source/WebCore/rendering/RenderLayerModelObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,6 @@ class KeyframeList;
class RenderLayer;
class SVGGraphicsElement;

struct LayerRepaintRects {
LayoutRect clippedOverflowRect;
LayoutRect outlineBoundsRect;
};

class RenderLayerModelObject : public RenderElement {
WTF_MAKE_ISO_ALLOCATED(RenderLayerModelObject);
public:
Expand Down Expand Up @@ -65,7 +60,7 @@ class RenderLayerModelObject : public RenderElement {

bool shouldPlaceVerticalScrollbarOnLeft() const;

std::optional<LayerRepaintRects> layerRepaintRects() const;
std::optional<LayoutRect> cachedLayerClippedOverflowRect() const;

bool startAnimation(double timeOffset, const Animation&, const KeyframeList&) override;
void animationPaused(double timeOffset, const String& name) override;
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderLayerScrollableArea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ void RenderLayerScrollableArea::scrollTo(const ScrollPosition& position)
// The caret rect needs to be invalidated after scrolling
frame.selection().setCaretRectNeedsUpdate();

LayoutRect rectForRepaint = layer().repaintRects() ? layer().repaintRects()->clippedOverflowRect : renderer.clippedOverflowRectForRepaint(repaintContainer.get());
auto rectForRepaint = valueOrCompute(layer().cachedClippedOverflowRect(), [&] { return renderer.clippedOverflowRectForRepaint(repaintContainer.get()); });

FloatQuad quadForFakeMouseMoveEvent = FloatQuad(rectForRepaint);
if (repaintContainer)
Expand Down

0 comments on commit d24752c

Please sign in to comment.