Changeset 56941 in webkit


Ignore:
Timestamp:
Apr 1, 2010 3:21:20 PM (14 years ago)
Author:
jamesr@google.com
Message:

2010-04-01 James Robinson <jamesr@chromium.org>

Reviewed by Simon Fraser.

Keeps a transient optimistic offset to the root in RenderLayer::updateLayerPositions
https://bugs.webkit.org/show_bug.cgi?id=33520

RenderLayer::updateLayerPositions() makes a recursive walk through all RenderLayers and updates the repaint rectangles on each.
These rectangles have to be calculated in the repaint container's coordinates using RenderObject::mapLocalToContainer to walk
up to the repaint container. This patch keeps track of the offset to the root and uses that offset instead of walking back up to
the root every time.

Tests: fast/layers/nested-layers-1.html

fast/layers/nested-layers-2.html
fast/layers/nested-layers-3.html
fast/layers/nested-layers-4.html

  • page/FrameView.cpp: (WebCore::FrameView::layout):
  • rendering/RenderBox.cpp: (WebCore::RenderBox::outlineBoundsForRepaint):
  • rendering/RenderBox.h:
  • rendering/RenderLayer.cpp: (WebCore::RenderLayer::updateLayerPositions):
  • rendering/RenderLayer.h:
  • rendering/RenderObject.h: (WebCore::RenderObject::outlineBoundsForRepaint):
  • rendering/RenderSVGModelObject.cpp: (WebCore::RenderSVGModelObject::outlineBoundsForRepaint):
  • rendering/RenderSVGModelObject.h:

2010-04-01 James Robinson <jamesr@chromium.org>

Reviewed by Simon Fraser.

Mapping from local to container coord space in updateLayerPositions is quadratic
https://bugs.webkit.org/show_bug.cgi?id=33520

These tests move layers around in various ways to test that the offset caching in
updateLayerPositions() is correct.

  • fast/layers/nested-layers-1-expected.txt: Added.
  • fast/layers/nested-layers-1.html: Added.
  • fast/layers/nested-layers-2-expected.txt: Added.
  • fast/layers/nested-layers-2.html: Added.
  • fast/layers/nested-layers-3-expected.txt: Added.
  • fast/layers/nested-layers-3.html: Added.
  • fast/layers/nested-layers-4-expected.txt: Added.
  • fast/layers/nested-layers-4.html: Added.
Location:
trunk
Files:
8 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r56934 r56941  
     12010-04-01  James Robinson  <jamesr@chromium.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Mapping from local to container coord space in updateLayerPositions is quadratic
     6        https://bugs.webkit.org/show_bug.cgi?id=33520
     7
     8        These tests move layers around in various ways to test that the offset caching in
     9        updateLayerPositions() is correct.
     10
     11        * fast/layers/nested-layers-1-expected.txt: Added.
     12        * fast/layers/nested-layers-1.html: Added.
     13        * fast/layers/nested-layers-2-expected.txt: Added.
     14        * fast/layers/nested-layers-2.html: Added.
     15        * fast/layers/nested-layers-3-expected.txt: Added.
     16        * fast/layers/nested-layers-3.html: Added.
     17        * fast/layers/nested-layers-4-expected.txt: Added.
     18        * fast/layers/nested-layers-4.html: Added.
     19
    1202010-04-01  Chris Marrin  <cmarrin@apple.com>
    221
  • trunk/WebCore/ChangeLog

    r56940 r56941  
     12010-04-01  James Robinson  <jamesr@chromium.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Keeps a transient optimistic offset to the root in RenderLayer::updateLayerPositions
     6        https://bugs.webkit.org/show_bug.cgi?id=33520
     7
     8        RenderLayer::updateLayerPositions() makes a recursive walk through all RenderLayers and updates the repaint rectangles on each.
     9        These rectangles have to be calculated in the repaint container's coordinates using RenderObject::mapLocalToContainer to walk
     10        up to the repaint container.  This patch keeps track of the offset to the root and uses that offset instead of walking back up to
     11        the root every time.
     12
     13        Tests: fast/layers/nested-layers-1.html
     14               fast/layers/nested-layers-2.html
     15               fast/layers/nested-layers-3.html
     16               fast/layers/nested-layers-4.html
     17
     18        * page/FrameView.cpp:
     19        (WebCore::FrameView::layout):
     20        * rendering/RenderBox.cpp:
     21        (WebCore::RenderBox::outlineBoundsForRepaint):
     22        * rendering/RenderBox.h:
     23        * rendering/RenderLayer.cpp:
     24        (WebCore::RenderLayer::updateLayerPositions):
     25        * rendering/RenderLayer.h:
     26        * rendering/RenderObject.h:
     27        (WebCore::RenderObject::outlineBoundsForRepaint):
     28        * rendering/RenderSVGModelObject.cpp:
     29        (WebCore::RenderSVGModelObject::outlineBoundsForRepaint):
     30        * rendering/RenderSVGModelObject.h:
     31
    1322010-04-01  Daniel Bates  <dbates@rim.com>
    233
  • trunk/WebCore/page/FrameView.cpp

    r56856 r56941  
    739739    // Now update the positions of all layers.
    740740    beginDeferredRepaints();
     741    IntPoint cachedOffset;
    741742    layer->updateLayerPositions((m_doFullRepaint ? RenderLayer::DoFullRepaint : 0)
    742743                                | RenderLayer::CheckForRepaint
    743744                                | RenderLayer::IsCompositingUpdateRoot
    744                                 | RenderLayer::UpdateCompositingLayers);
     745                                | RenderLayer::UpdateCompositingLayers,
     746                                subtree ? 0 : &cachedOffset);
    745747    endDeferredRepaints();
    746748
  • trunk/WebCore/rendering/RenderBox.cpp

    r55890 r56941  
    326326}
    327327
    328 IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const
     328IntRect RenderBox::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint* cachedOffsetToRepaintContainer) const
    329329{
    330330    IntRect box = borderBoundingBox();
    331331    adjustRectForOutlineAndShadow(box);
    332332
    333     FloatQuad containerRelativeQuad = localToContainerQuad(FloatRect(box), repaintContainer);
     333    FloatQuad containerRelativeQuad = FloatRect(box);
     334    if (cachedOffsetToRepaintContainer)
     335        containerRelativeQuad.move(cachedOffsetToRepaintContainer->x(), cachedOffsetToRepaintContainer->y());
     336    else
     337        containerRelativeQuad = localToContainerQuad(containerRelativeQuad, repaintContainer);
     338
    334339    box = containerRelativeQuad.enclosingBoundingBox();
    335340
  • trunk/WebCore/rendering/RenderBox.h

    r56831 r56941  
    7474
    7575    // Bounds of the outline box in absolute coords. Respects transforms
    76     virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/) const;
     76    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* cachedOffsetToRepaintContainer) const;
    7777    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
    7878
  • trunk/WebCore/rendering/RenderLayer.cpp

    r56825 r56941  
    246246}
    247247
    248 void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags)
     248void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint* cachedOffset)
    249249{
    250250    if (flags & DoFullRepaint) {
     
    260260    }
    261261   
     262
    262263    updateLayerPosition(); // For relpositioned layers or non-positioned layers,
    263264                           // we need to keep in sync, since we may have shifted relative
    264265                           // to our parent layer.
     266    IntPoint oldCachedOffset;
     267    if (cachedOffset) {
     268        // We can't cache our offset to the repaint container if the mapping is anything more complex than a simple translation
     269        bool disableOffsetCache = renderer()->isSVGRoot() || renderer()->hasColumns() || renderer()->hasTransform() || isComposited();
     270        if (disableOffsetCache)
     271            cachedOffset = 0; // If our cached offset is invalid make sure it's not passed to any of our children
     272        else {
     273            oldCachedOffset = *cachedOffset;
     274            // Frequently our parent layer's renderer will be the same as our renderer's containing block.  In that case,
     275            // we just update the cache using our offset to our parent (which is m_x / m_y).  Otherwise, regenerated cached
     276            // offsets to the root from the render tree.
     277            if (!m_parent || m_parent->renderer() == renderer()->containingBlock())
     278                cachedOffset->move(m_x, m_y); // Fast case
     279            else {
     280                int x = 0;
     281                int y = 0;
     282                convertToLayerCoords(root(), x, y);
     283                *cachedOffset = IntPoint(x, y);
     284            }
     285        }
     286    }
    265287
    266288    int x = 0;
    267289    int y = 0;
    268     convertToLayerCoords(root(), x, y);
     290    if (cachedOffset) {
     291        x += cachedOffset->x();
     292        y += cachedOffset->y();
     293#ifndef NDEBUG
     294        int nonCachedX = 0;
     295        int nonCachedY = 0;
     296        convertToLayerCoords(root(), nonCachedX, nonCachedY);
     297        ASSERT(x == nonCachedX);
     298        ASSERT(y == nonCachedY);
     299#endif
     300    } else
     301        convertToLayerCoords(root(), x, y);
    269302    positionOverflowControls(x, y);
    270303
     
    282315        RenderBoxModelObject* repaintContainer = renderer()->containerForRepaint();
    283316        IntRect newRect = renderer()->clippedOverflowRectForRepaint(repaintContainer);
    284         IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer);
     317        IntRect newOutlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, cachedOffset);
     318        ASSERT(newOutlineBox == renderer()->outlineBoundsForRepaint(repaintContainer, 0));
    285319        if (flags & CheckForRepaint) {
    286320            if (view && !view->printing()) {
     
    314348
    315349    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
    316         child->updateLayerPositions(flags);
     350        child->updateLayerPositions(flags, cachedOffset);
    317351
    318352#if USE(ACCELERATED_COMPOSITING)
     
    324358    if (m_marquee)
    325359        m_marquee->updateMarqueePosition();
     360
     361    if (cachedOffset)
     362        *cachedOffset = oldCachedOffset;
    326363}
    327364
  • trunk/WebCore/rendering/RenderLayer.h

    r55090 r56941  
    306306    };
    307307    typedef unsigned UpdateLayerPositionsFlags;
    308     void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers);
     308    void updateLayerPositions(UpdateLayerPositionsFlags = DoFullRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers, IntPoint* cachedOffset = 0);
    309309
    310310    void updateTransform();
  • trunk/WebCore/rendering/RenderObject.h

    r56831 r56941  
    794794    void arenaDelete(RenderArena*, void* objectBase);
    795795
    796     virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/) const { return IntRect(); }
     796    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* /*cachedOffsetToRepaintContainer*/ = 0) const { return IntRect(); }
    797797
    798798    class LayoutRepainter {
  • trunk/WebCore/rendering/RenderSVGModelObject.cpp

    r54991 r56941  
    6464// FIXME: This may also need to move into SVGRenderBase as the RenderBox version depends
    6565// on borderBoundingBox() which SVG RenderBox subclases (like SVGRenderBlock) do not implement.
    66 IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const
     66IntRect RenderSVGModelObject::outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const
    6767{
    6868    IntRect box = enclosingIntRect(repaintRectInLocalCoordinates());
  • trunk/WebCore/rendering/RenderSVGModelObject.h

    r54991 r56941  
    5656    virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
    5757    virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false);
    58     virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer) const;
     58    virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* repaintContainer, IntPoint*) const;
    5959
    6060    virtual void absoluteRects(Vector<IntRect>& rects, int tx, int ty);
Note: See TracChangeset for help on using the changeset viewer.