Title: [145762] trunk/Source/WebCore
Revision
145762
Author
[email protected]
Date
2013-03-13 15:28:10 -0700 (Wed, 13 Mar 2013)

Log Message

[CSS Grid Layout] Refactor GridCoordinate to hold GridSpans
https://bugs.webkit.org/show_bug.cgi?id=112211

Reviewed by Tony Chang.

In order to bring more spanning knowledge to RenderGrid without having
duplicated GridSpan resolution, it became needed to store them into
GridCoordinate. Note that this change is needed as we can only resolve
all the positions with enough context in one place: when we place the
item in the grid.

Refactoring, no change in behavior expected.

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::GridIterator::nextEmptyGridArea):
Updated to create 2 GridSpans. Also fixed a style violation (PassOwnPtr
as local member, not sure why it wasn't caught earlier).

(WebCore::RenderGrid::placeItemsOnGrid):
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
(WebCore::RenderGrid::gridAreaBreadthForChild):
(WebCore::RenderGrid::findChildLogicalPosition):
Updated the original function after GridCoordinate internal representation change.

(WebCore::RenderGrid::insertItemIntoGrid):
Ditto. Also added a new overloaded function that does resolution after auto-placement.

(WebCore::RenderGrid::resolveGridPositionsFromAutoPlacementPosition):
Removed the extra GridSpan computation, which was wrong.

* rendering/RenderGrid.h:
(WebCore::RenderGrid::GridCoordinate::GridCoordinate):
Updated GridCoordinate to hold 2 GridSpan. Also removed the 2 position
constructor (it would have been a hazard), replaced by a 2 GridSpan constructor.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (145761 => 145762)


--- trunk/Source/WebCore/ChangeLog	2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/ChangeLog	2013-03-13 22:28:10 UTC (rev 145762)
@@ -1,3 +1,41 @@
+2013-03-13  Julien Chaffraix  <[email protected]>
+
+        [CSS Grid Layout] Refactor GridCoordinate to hold GridSpans
+        https://bugs.webkit.org/show_bug.cgi?id=112211
+
+        Reviewed by Tony Chang.
+
+        In order to bring more spanning knowledge to RenderGrid without having
+        duplicated GridSpan resolution, it became needed to store them into
+        GridCoordinate. Note that this change is needed as we can only resolve
+        all the positions with enough context in one place: when we place the
+        item in the grid.
+
+        Refactoring, no change in behavior expected.
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::GridIterator::nextEmptyGridArea):
+        Updated to create 2 GridSpans. Also fixed a style violation (PassOwnPtr
+        as local member, not sure why it wasn't caught earlier).
+
+        (WebCore::RenderGrid::placeItemsOnGrid):
+        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid):
+        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid):
+        (WebCore::RenderGrid::gridAreaBreadthForChild):
+        (WebCore::RenderGrid::findChildLogicalPosition):
+        Updated the original function after GridCoordinate internal representation change.
+
+        (WebCore::RenderGrid::insertItemIntoGrid):
+        Ditto. Also added a new overloaded function that does resolution after auto-placement.
+
+        (WebCore::RenderGrid::resolveGridPositionsFromAutoPlacementPosition):
+        Removed the extra GridSpan computation, which was wrong.
+
+        * rendering/RenderGrid.h:
+        (WebCore::RenderGrid::GridCoordinate::GridCoordinate):
+        Updated GridCoordinate to hold 2 GridSpan. Also removed the 2 position
+        constructor (it would have been a hazard), replaced by a 2 GridSpan constructor.
+
 2013-03-13  Jochen Eisinger  <[email protected]>
 
         Also don't log error messages from the GraphicsContext3D if webGLErrorsToConsoleEnabled is false

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (145761 => 145762)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2013-03-13 22:28:10 UTC (rev 145762)
@@ -109,10 +109,10 @@
         for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) {
             const Vector<RenderBox*>& children = m_grid[m_rowIndex][m_columnIndex];
             if (children.isEmpty()) {
-                PassOwnPtr<GridCoordinate> result =  adoptPtr(new GridCoordinate(m_rowIndex, m_columnIndex));
+                OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, m_rowIndex), GridSpan(m_columnIndex, m_columnIndex)));
                 // Advance the iterator to avoid an infinite loop where we would return the same grid area over and over.
                 ++varyingTrackIndex;
-                return result;
+                return result.release();
             }
         }
         return nullptr;
@@ -514,10 +514,17 @@
     }
 }
 
+void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coordinate)
+{
+    m_grid[coordinate.rows.initialPositionIndex][coordinate.columns.initialPositionIndex].append(child);
+    m_gridItemCoordinate.set(child, coordinate);
+}
+
 void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t columnTrack)
 {
-    m_grid[rowTrack][columnTrack].append(child);
-    m_gridItemCoordinate.set(child, GridCoordinate(rowTrack, columnTrack));
+    const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForRows, rowTrack);
+    const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(child, ForColumns, columnTrack);
+    insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan));
 }
 
 void RenderGrid::placeItemsOnGrid()
@@ -546,7 +553,7 @@
                 specifiedMajorAxisAutoGridItems.append(child);
             continue;
         }
-        insertItemIntoGrid(child, rowPositions->initialPositionIndex, columnPositions->initialPositionIndex);
+        insertItemIntoGrid(child, GridCoordinate(*rowPositions, *columnPositions));
     }
 
     ASSERT(gridRowCount() >= style()->gridRows().size());
@@ -569,14 +576,14 @@
         OwnPtr<GridSpan> majorAxisPositions = resolveGridPositionsFromStyle(autoGridItems[i], autoPlacementMajorAxisDirection());
         GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->initialPositionIndex);
         if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
-            insertItemIntoGrid(autoGridItems[i], emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+            insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
             continue;
         }
 
         growGrid(autoPlacementMinorAxisDirection());
         OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea();
         ASSERT(emptyGridArea);
-        insertItemIntoGrid(autoGridItems[i], emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+        insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
     }
 }
 
@@ -595,7 +602,7 @@
         minorAxisIndex = minorAxisPositions->initialPositionIndex;
         GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisIndex);
         if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
-            insertItemIntoGrid(gridItem, emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+            insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
             return;
         }
     } else {
@@ -603,7 +610,7 @@
         for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) {
             GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex);
             if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) {
-                insertItemIntoGrid(gridItem, emptyGridArea->rowIndex, emptyGridArea->columnIndex);
+                insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex);
                 return;
             }
         }
@@ -689,6 +696,13 @@
     return m_gridItemCoordinate.get(gridItem);
 }
 
+RenderGrid::GridSpan RenderGrid::resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t initialPosition) const
+{
+    // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong. Also we should make
+    // sure the grid can accomodate the new item as we only grow 1 position in a given direction.
+    return GridSpan(initialPosition, initialPosition);
+}
+
 PassOwnPtr<RenderGrid::GridSpan> RenderGrid::resolveGridPositionsFromStyle(const RenderBox* gridItem, TrackSizingDirection direction) const
 {
     ASSERT(gridWasPopulated());
@@ -750,16 +764,9 @@
 LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizingDirection direction, const Vector<GridTrack>& tracks) const
 {
     const GridCoordinate& coordinate = cachedGridCoordinate(child);
-    size_t trackIndex = (direction == ForColumns) ? coordinate.columnIndex : coordinate.rowIndex;
-    OwnPtr<GridSpan> span = resolveGridPositionsFromStyle(child, direction);
-    if (!span) {
-        // FIXME: We don't support spanning with auto positions yet. Once we do, this is wrong.
-        span = adoptPtr(new GridSpan(trackIndex, trackIndex));
-    }
-
-    ASSERT(span->initialPositionIndex == trackIndex);
+    const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coordinate.rows;
     LayoutUnit gridAreaBreadth = 0;
-    for (; trackIndex <= span->finalPositionIndex; ++trackIndex)
+    for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.finalPositionIndex; ++trackIndex)
         gridAreaBreadth += tracks[trackIndex].m_usedBreadth;
     return gridAreaBreadth;
 }
@@ -770,9 +777,9 @@
 
     LayoutPoint offset;
     // FIXME: |columnTrack| and |rowTrack| should be smaller than our column / row count.
-    for (size_t i = 0; i < coordinate.columnIndex && i < columnTracks.size(); ++i)
+    for (size_t i = 0; i < coordinate.columns.initialPositionIndex && i < columnTracks.size(); ++i)
         offset.setX(offset.x() + columnTracks[i].m_usedBreadth);
-    for (size_t i = 0; i < coordinate.rowIndex && i < rowTracks.size(); ++i)
+    for (size_t i = 0; i < coordinate.rows.initialPositionIndex && i < rowTracks.size(); ++i)
         offset.setY(offset.y() + rowTracks[i].m_usedBreadth);
 
     // FIXME: Handle margins on the grid item.

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (145761 => 145762)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2013-03-13 22:24:08 UTC (rev 145761)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2013-03-13 22:28:10 UTC (rev 145762)
@@ -51,24 +51,6 @@
 
     LayoutUnit computePreferredTrackWidth(const Length&, size_t) const;
 
-    struct GridCoordinate {
-        // HashMap requires a default constuctor.
-        GridCoordinate()
-            : columnIndex(0)
-            , rowIndex(0)
-        {
-        }
-
-        GridCoordinate(size_t row, size_t column)
-            : columnIndex(column)
-            , rowIndex(row)
-        {
-        }
-
-        size_t columnIndex;
-        size_t rowIndex;
-    };
-
     struct GridSpan {
         GridSpan(size_t initialPosition, size_t finalPosition)
             : initialPositionIndex(initialPosition)
@@ -81,6 +63,24 @@
         size_t finalPositionIndex;
     };
 
+    struct GridCoordinate {
+        // HashMap requires a default constuctor.
+        GridCoordinate()
+            : columns(0, 0)
+            , rows(0, 0)
+        {
+        }
+
+        GridCoordinate(const GridSpan& r, const GridSpan& c)
+            : columns(c)
+            , rows(r)
+        {
+        }
+
+        GridSpan columns;
+        GridSpan rows;
+    };
+
     class GridIterator;
     enum TrackSizingDirection { ForColumns, ForRows };
     void computedUsedBreadthOfGridTracks(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks);
@@ -91,6 +91,7 @@
 
     void growGrid(TrackSizingDirection);
     void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack);
+    void insertItemIntoGrid(RenderBox*, const GridCoordinate&);
     void placeItemsOnGrid();
     void placeSpecifiedMajorAxisItemsOnGrid(Vector<RenderBox*>);
     void placeAutoMajorAxisItemsOnGrid(Vector<RenderBox*>);
@@ -116,6 +117,7 @@
     LayoutPoint findChildLogicalPosition(RenderBox*, const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks);
     GridCoordinate cachedGridCoordinate(const RenderBox*) const;
 
+    GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t) const;
     PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const RenderBox*, TrackSizingDirection) const;
     enum GridPositionSide {
         StartSide,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to