Title: [196983] trunk/Source/WebCore
Revision
196983
Author
[email protected]
Date
2016-02-23 10:17:17 -0800 (Tue, 23 Feb 2016)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (196982 => 196983)


--- trunk/Source/WebCore/ChangeLog	2016-02-23 17:57:46 UTC (rev 196982)
+++ trunk/Source/WebCore/ChangeLog	2016-02-23 18:17:17 UTC (rev 196983)
@@ -1,5 +1,33 @@
 2016-02-23  Manuel Rego Casasnovas  <[email protected]>
 
+        [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:
+
+2016-02-23  Manuel Rego Casasnovas  <[email protected]>
+
         [css-grid] Rows track sizes are optional in grid-template shorthand
         https://bugs.webkit.org/show_bug.cgi?id=154586
 

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (196982 => 196983)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-02-23 17:57:46 UTC (rev 196982)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-02-23 18:17:17 UTC (rev 196983)
@@ -1138,13 +1138,13 @@
 
 void RenderGrid::insertItemIntoGrid(RenderBox& child, const GridCoordinate& coordinate)
 {
+    ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite());
     ensureGridSize(coordinate.rows.resolvedFinalPosition().toInt(), coordinate.columns.resolvedFinalPosition().toInt());
 
     for (auto& row : coordinate.rows) {
         for (auto& column : coordinate.columns)
             m_grid[row.toInt()][column.toInt()].append(&child);
     }
-    m_gridItemCoordinate.set(&child, coordinate);
 }
 
 void RenderGrid::placeItemsOnGrid()
@@ -1160,19 +1160,18 @@
         if (child->isOutOfFlowPositioned())
             continue;
 
-        GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows);
-        GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns);
+        GridCoordinate coordinate = cachedGridCoordinate(*child);
 
-        if (!rowPositions.isDefinite() || !columnPositions.isDefinite()) {
+        if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) {
             bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns;
-            if ((majorAxisDirectionIsForColumns && !columnPositions.isDefinite())
-                || (!majorAxisDirectionIsForColumns && !rowPositions.isDefinite()))
+            if ((majorAxisDirectionIsForColumns && !coordinate.columns.isDefinite())
+                || (!majorAxisDirectionIsForColumns && !coordinate.rows.isDefinite()))
                 autoMajorAxisAutoGridItems.append(child);
             else
                 specifiedMajorAxisAutoGridItems.append(child);
             continue;
         }
-        insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions));
+        insertItemIntoGrid(*child, GridCoordinate(coordinate.rows, coordinate.columns));
     }
 
     ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(style()));
@@ -1180,6 +1179,16 @@
 
     placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
     placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
+
+#if ENABLE(ASSERT)
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
+        if (child->isOutOfFlowPositioned())
+            continue;
+
+        GridCoordinate coordinate = cachedGridCoordinate(*child);
+        ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite());
+    }
+#endif
 }
 
 void RenderGrid::populateExplicitGridAndOrderIterator()
@@ -1211,6 +1220,8 @@
             GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *child, ForColumns, GridResolvedPosition(0));
             maximumColumnIndex = std::max(maximumColumnIndex, positions.resolvedFinalPosition().toInt());
         }
+
+        m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPositions));
     }
 
     m_grid.grow(maximumRowIndex);
@@ -1237,8 +1248,9 @@
     HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> minorAxisCursors;
 
     for (auto& autoGridItem : autoGridItems) {
-        GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *autoGridItem, autoPlacementMajorAxisDirection());
+        GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacementMajorAxisDirection());
         ASSERT(majorAxisPositions.isDefinite());
+        ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isDefinite());
         GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0));
         unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition().toInt();
 
@@ -1246,6 +1258,8 @@
         std::unique_ptr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan());
         if (!emptyGridArea)
             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
+
+        m_gridItemCoordinate.set(autoGridItem, *emptyGridArea);
         insertItemIntoGrid(*autoGridItem, *emptyGridArea);
 
         if (!isGridAutoFlowDense)
@@ -1270,7 +1284,7 @@
 
 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor)
 {
-    ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMajorAxisDirection()).isDefinite());
+    ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefinite());
     GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0));
 
     const unsigned endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount();
@@ -1278,7 +1292,7 @@
     unsigned minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
 
     std::unique_ptr<GridCoordinate> emptyGridArea;
-    GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), gridItem, autoPlacementMinorAxisDirection());
+    GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxisDirection());
     if (minorAxisPositions.isDefinite()) {
         // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
         if (minorAxisPositions.resolvedInitialPosition().toInt() < minorAxisAutoPlacementCursor)
@@ -1318,6 +1332,7 @@
             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
     }
 
+    m_gridItemCoordinate.set(&gridItem, *emptyGridArea);
     insertItemIntoGrid(gridItem, *emptyGridArea);
     autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition().toInt();
     autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition().toInt();
@@ -1506,10 +1521,15 @@
     }
 }
 
+GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox& gridItem) const
+{
+    ASSERT(m_gridItemCoordinate.contains(&gridItem));
+    return m_gridItemCoordinate.get(&gridItem);
+}
+
 GridSpan RenderGrid::cachedGridSpan(const RenderBox& gridItem, GridTrackSizingDirection direction) const
 {
-    ASSERT(m_gridItemCoordinate.contains(&gridItem));
-    GridCoordinate coordinate = m_gridItemCoordinate.get(&gridItem);
+    GridCoordinate coordinate = cachedGridCoordinate(gridItem);
     return direction == ForColumns ? coordinate.columns : coordinate.rows;
 }
 

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (196982 => 196983)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2016-02-23 17:57:46 UTC (rev 196982)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2016-02-23 18:17:17 UTC (rev 196983)
@@ -140,6 +140,7 @@
     LayoutUnit rowAxisOffsetForChild(const RenderBox&) const;
     ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, const LayoutUnit& availableFreeSpace, unsigned numberOfGridTracks) const;
     LayoutPoint findChildLogicalPosition(const RenderBox&) const;
+    GridCoordinate cachedGridCoordinate(const RenderBox&) const;
     GridSpan cachedGridSpan(const RenderBox&, GridTrackSizingDirection) const;
 
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to