Changeset 196983 in webkit


Ignore:
Timestamp:
Feb 23, 2016 10:17:17 AM (8 years ago)
Author:
Manuel Rego Casasnovas
Message:

[css-grid] Avoid duplicated calls to resolution code
https://bugs.webkit.org/show_bug.cgi?id=154336

Reviewed by Sergio Villar Senin.

We were calling GridResolvedPosition::resolveGridPositionsFromStyle()
several times per item.

We can store the GridCoordinates in
RenderGrid::populateExplicitGridAndOrderIterator()
and reuse them in the placement code.
Once RenderGrid::placeItemsOnGrid() is over,
all the items will have a definite position in both axis.

No new tests, no change of behavior.

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::insertItemIntoGrid):
(WebCore::RenderGrid::placeItemsOnGrid):
(WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
(WebCore::RenderGrid::cachedGridCoordinate):
(WebCore::RenderGrid::cachedGridSpan):

  • rendering/RenderGrid.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r196978 r196983  
     12016-02-23  Manuel Rego Casasnovas  <rego@igalia.com>
     2
     3        [css-grid] Avoid duplicated calls to resolution code
     4        https://bugs.webkit.org/show_bug.cgi?id=154336
     5
     6        Reviewed by Sergio Villar Senin.
     7
     8        We were calling GridResolvedPosition::resolveGridPositionsFromStyle()
     9        several times per item.
     10
     11        We can store the GridCoordinates in
     12        RenderGrid::populateExplicitGridAndOrderIterator()
     13        and reuse them in the placement code.
     14        Once RenderGrid::placeItemsOnGrid() is over,
     15        all the items will have a definite position in both axis.
     16
     17        No new tests, no change of behavior.
     18
     19        * rendering/RenderGrid.cpp:
     20        (WebCore::RenderGrid::insertItemIntoGrid):
     21        (WebCore::RenderGrid::placeItemsOnGrid):
     22        (WebCore::RenderGrid::populateExplicitGridAndOrderIterator):
     23        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
     24        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
     25        (WebCore::RenderGrid::cachedGridCoordinate):
     26        (WebCore::RenderGrid::cachedGridSpan):
     27        * rendering/RenderGrid.h:
     28
    1292016-02-23  Manuel Rego Casasnovas  <rego@igalia.com>
    230
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r196691 r196983  
    11391139void RenderGrid::insertItemIntoGrid(RenderBox& child, const GridCoordinate& coordinate)
    11401140{
     1141    ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite());
    11411142    ensureGridSize(coordinate.rows.resolvedFinalPosition().toInt(), coordinate.columns.resolvedFinalPosition().toInt());
    11421143
     
    11451146            m_grid[row.toInt()][column.toInt()].append(&child);
    11461147    }
    1147     m_gridItemCoordinate.set(&child, coordinate);
    11481148}
    11491149
     
    11611161            continue;
    11621162
    1163         GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows);
    1164         GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns);
    1165 
    1166         if (!rowPositions.isDefinite() || !columnPositions.isDefinite()) {
     1163        GridCoordinate coordinate = cachedGridCoordinate(*child);
     1164
     1165        if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) {
    11671166            bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns;
    1168             if ((majorAxisDirectionIsForColumns && !columnPositions.isDefinite())
    1169                 || (!majorAxisDirectionIsForColumns && !rowPositions.isDefinite()))
     1167            if ((majorAxisDirectionIsForColumns && !coordinate.columns.isDefinite())
     1168                || (!majorAxisDirectionIsForColumns && !coordinate.rows.isDefinite()))
    11701169                autoMajorAxisAutoGridItems.append(child);
    11711170            else
     
    11731172            continue;
    11741173        }
    1175         insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions));
     1174        insertItemIntoGrid(*child, GridCoordinate(coordinate.rows, coordinate.columns));
    11761175    }
    11771176
     
    11811180    placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
    11821181    placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
     1182
     1183#if ENABLE(ASSERT)
     1184    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
     1185        if (child->isOutOfFlowPositioned())
     1186            continue;
     1187
     1188        GridCoordinate coordinate = cachedGridCoordinate(*child);
     1189        ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite());
     1190    }
     1191#endif
    11831192}
    11841193
     
    12121221            maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition().toInt());
    12131222        }
     1223
     1224        m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPositions));
    12141225    }
    12151226
     
    12381249
    12391250    for (auto& autoGridItem : autoGridItems) {
    1240         GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *autoGridItem, autoPlacementMajorAxisDirection());
     1251        GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacementMajorAxisDirection());
    12411252        ASSERT(majorAxisPositions.isDefinite());
     1253        ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isDefinite());
    12421254        GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
    12431255        unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition().toInt();
     
    12471259        if (!emptyGridArea)
    12481260            emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
     1261
     1262        m_gridItemCoordinate.set(autoGridItem, *emptyGridArea);
    12491263        insertItemIntoGrid(*autoGridItem, *emptyGridArea);
    12501264
     
    12711285void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor)
    12721286{
    1273     ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMajorAxisDirection()).isDefinite());
     1287    ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefinite());
    12741288    GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0));
    12751289
     
    12791293
    12801294    std::unique_ptr<GridCoordinate> emptyGridArea;
    1281     GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMinorAxisDirection());
     1295    GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxisDirection());
    12821296    if (minorAxisPositions.isDefinite()) {
    12831297        // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
     
    13191333    }
    13201334
     1335    m_gridItemCoordinate.set(&gridItem, *emptyGridArea);
    13211336    insertItemIntoGrid(gridItem, *emptyGridArea);
    13221337    autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition().toInt();
     
    15071522}
    15081523
     1524GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox& gridItem) const
     1525{
     1526    ASSERT(m_gridItemCoordinate.contains(&gridItem));
     1527    return m_gridItemCoordinate.get(&gridItem);
     1528}
     1529
    15091530GridSpan RenderGrid::cachedGridSpan(const RenderBox& gridItem, GridTrackSizingDirection direction) const
    15101531{
    1511     ASSERT(m_gridItemCoordinate.contains(&gridItem));
    1512     GridCoordinate coordinate = m_gridItemCoordinate.get(&gridItem);
     1532    GridCoordinate coordinate = cachedGridCoordinate(gridItem);
    15131533    return direction == ForColumns ? coordinate.columns : coordinate.rows;
    15141534}
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r195808 r196983  
    141141    ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, const LayoutUnit& availableFreeSpace, unsigned numberOfGridTracks) const;
    142142    LayoutPoint findChildLogicalPosition(const RenderBox&) const;
     143    GridCoordinate cachedGridCoordinate(const RenderBox&) const;
    143144    GridSpan cachedGridSpan(const RenderBox&, GridTrackSizingDirection) const;
    144145
Note: See TracChangeset for help on using the changeset viewer.