⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 249222 in webkit


Ignore:
Timestamp:
Aug 28, 2019, 3:32:01 PM (7 years ago)
Author:
Simon Fraser
Message:

Devirtualize RenderBox::visualOverflowRect()
https://bugs.webkit.org/show_bug.cgi?id=201231

Reviewed by Zalan Bujtas.

The only override of RenderBox::visualOverflowRect() was in RenderView, for "paintsEntireContents" views, and as
far as I can tell this is not necessary. visualOverflowRect() is hot when called from RenderLayer::localBoundingBox() --
this shows in profiles when scrolling large patch reviews, so making it non-virtual is a performance enhancement.

RenderLayer::localBoundingBox() can also just call visualOverflowRect(), since that returns borderBoxRect()
when there is no overflow.

  • rendering/RenderBox.h:

(WebCore::RenderBox::visualOverflowRect const):

  • rendering/RenderLayer.cpp:

(WebCore::performOverlapTests): Minor optimization to avoid a call to boundingBox().
(WebCore::RenderLayer::calculateClipRects const):

  • rendering/RenderView.cpp:

(WebCore::RenderView::visualOverflowRect const): Deleted.

  • rendering/RenderView.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r249218 r249222  
     12019-08-28  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Devirtualize RenderBox::visualOverflowRect()
     4        https://bugs.webkit.org/show_bug.cgi?id=201231
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        The only override of RenderBox::visualOverflowRect() was in RenderView, for "paintsEntireContents" views, and as
     9        far as I can tell this is not necessary. visualOverflowRect() is hot when called from RenderLayer::localBoundingBox() --
     10        this shows in profiles when scrolling large patch reviews, so making it non-virtual is a performance enhancement.
     11       
     12        RenderLayer::localBoundingBox() can also just call visualOverflowRect(), since that returns borderBoxRect()
     13        when there is no overflow.
     14
     15        * rendering/RenderBox.h:
     16        (WebCore::RenderBox::visualOverflowRect const):
     17        * rendering/RenderLayer.cpp:
     18        (WebCore::performOverlapTests): Minor optimization to avoid a call to boundingBox().
     19        (WebCore::RenderLayer::calculateClipRects const):
     20        * rendering/RenderView.cpp:
     21        (WebCore::RenderView::visualOverflowRect const): Deleted.
     22        * rendering/RenderView.h:
     23
    1242019-08-28  Austin Eng  <enga@chromium.org>
    225
  • trunk/Source/WebCore/rendering/RenderBox.h

    r247256 r249222  
    192192    LayoutUnit logicalRightLayoutOverflow() const { return style().isHorizontalWritingMode() ? layoutOverflowRect().maxX() : layoutOverflowRect().maxY(); }
    193193   
    194     virtual LayoutRect visualOverflowRect() const { return m_overflow ? m_overflow->visualOverflowRect() : borderBoxRect(); }
     194    LayoutRect visualOverflowRect() const { return m_overflow ? m_overflow->visualOverflowRect() : borderBoxRect(); }
    195195    LayoutUnit logicalLeftVisualOverflow() const { return style().isHorizontalWritingMode() ? visualOverflowRect().x() : visualOverflowRect().y(); }
    196196    LayoutUnit logicalRightVisualOverflow() const { return style().isHorizontalWritingMode() ? visualOverflowRect().maxX() : visualOverflowRect().maxY(); }
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r249120 r249222  
    40954095static void performOverlapTests(OverlapTestRequestMap& overlapTestRequests, const RenderLayer* rootLayer, const RenderLayer* layer)
    40964096{
     4097    if (overlapTestRequests.isEmpty())
     4098        return;
     4099
    40974100    Vector<OverlapTestRequestClient*> overlappedRequestClients;
    40984101    LayoutRect boundingBox = layer->boundingBox(rootLayer, layer->offsetFromAncestor(rootLayer));
     
    59355938            result = box->maskClipRect(LayoutPoint());
    59365939            box->flipForWritingMode(result); // The mask clip rect is in physical coordinates, so we have to flip, since localBoundingBox is not.
    5937         } else {
    5938             LayoutRect bbox = box->borderBoxRect();
    5939             result = bbox;
    5940             LayoutRect overflowRect = box->visualOverflowRect();
    5941             if (bbox != overflowRect)
    5942                 result.unite(overflowRect);
    5943         }
     5940        } else
     5941            result = box->visualOverflowRect();
    59445942    }
    59455943    return result;
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r248846 r249222  
    515515}
    516516
    517 LayoutRect RenderView::visualOverflowRect() const
    518 {
    519     if (frameView().paintsEntireContents())
    520         return layoutOverflowRect();
    521 
    522     return RenderBlockFlow::visualOverflowRect();
    523 }
    524 
    525517Optional<LayoutRect> RenderView::computeVisibleRectInContainer(const LayoutRect& rect, const RenderLayerModelObject* container, VisibleRectContext context) const
    526518{
  • trunk/Source/WebCore/rendering/RenderView.h

    r245716 r249222  
    6969    FrameView& frameView() const { return m_frameView; }
    7070
    71     LayoutRect visualOverflowRect() const override;
    7271    Optional<LayoutRect> computeVisibleRectInContainer(const LayoutRect&, const RenderLayerModelObject* container, VisibleRectContext) const override;
    7372    void repaintRootContents();
Note: See TracChangeset for help on using the changeset viewer.