Chromium Code Reviews| Index: Source/core/rendering/RenderGrid.cpp |
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
| index 351881084b582f24de06651ade28f7fd5595239d..843772c1107c821fc1396dbabe9d1a92f3b8b5b0 100644 |
| --- a/Source/core/rendering/RenderGrid.cpp |
| +++ b/Source/core/rendering/RenderGrid.cpp |
| @@ -122,16 +122,37 @@ public: |
| return 0; |
| } |
| - PassOwnPtr<GridCoordinate> nextEmptyGridArea() |
| + bool areCellsEmpty(size_t spanningAreas) |
|
Julien - ping for review
2014/03/21 18:18:02
Note that this introduces some O(N^2) behavior. It
|
| + { |
| + if (m_direction == ForColumns) { |
| + for (size_t i = m_columnIndex; i < m_columnIndex + spanningAreas; ++i) { |
| + const GridCell& children = m_grid[m_rowIndex][i]; |
| + if (!children.isEmpty()) |
| + return false; |
| + } |
| + } else { |
| + for (size_t i = m_rowIndex; i < m_rowIndex + spanningAreas; ++i) { |
| + const GridCell& children = m_grid[i][m_columnIndex]; |
| + if (!children.isEmpty()) |
| + return false; |
| + } |
| + } |
| + |
| + return true; |
| + } |
| + |
| + PassOwnPtr<GridCoordinate> nextEmptyGridArea(size_t spanningAreas) |
|
Julien - ping for review
2014/03/21 18:18:02
It is weird to have the *same* |spanningAreas| for
|
| { |
| ASSERT(!m_grid.isEmpty()); |
| + ASSERT(spanningAreas >= 1); |
| size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m_columnIndex; |
| const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_grid.size() : m_grid[0].size(); |
| for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) { |
| - const GridCell& children = m_grid[m_rowIndex][m_columnIndex]; |
| - if (children.isEmpty()) { |
| - OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, m_rowIndex), GridSpan(m_columnIndex, m_columnIndex))); |
| + if (areCellsEmpty(spanningAreas)) { |
| + GridSpan rowSpan = GridSpan(m_rowIndex, (m_direction == ForColumns) ? m_rowIndex : m_rowIndex + spanningAreas - 1); |
| + GridSpan columnSpan = GridSpan(m_columnIndex, (m_direction == ForColumns) ? m_columnIndex + spanningAreas - 1 : m_columnIndex); |
| + OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(rowSpan, columnSpan)); |
|
Julien - ping for review
2014/03/21 18:18:02
I wonder if just having a single m_direction == Fo
|
| // Advance the iterator to avoid an infinite loop where we would return the same grid area over and over. |
| ++varyingTrackIndex; |
| return result.release(); |
| @@ -819,15 +840,15 @@ void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& au |
| for (size_t i = 0; i < autoGridItems.size(); ++i) { |
| OwnPtr<GridSpan> majorAxisPositions = resolveGridPositionsFromStyle(autoGridItems[i], autoPlacementMajorAxisDirection()); |
| GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->initialPositionIndex); |
| - if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) { |
| - insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
| + if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->finalPositionIndex - majorAxisPositions->initialPositionIndex + 1)) { |
|
Julien - ping for review
2014/03/21 18:18:02
How about adding a helper function to return the s
|
| + insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
| continue; |
| } |
| growGrid(autoPlacementMinorAxisDirection()); |
| - OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(); |
| + OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->finalPositionIndex - majorAxisPositions->initialPositionIndex + 1); |
| ASSERT(emptyGridArea); |
| - insertItemIntoGrid(autoGridItems[i], emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
| + insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
| } |
| } |
| @@ -841,19 +862,18 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) |
| { |
| OwnPtr<GridSpan> minorAxisPositions = resolveGridPositionsFromStyle(gridItem, autoPlacementMinorAxisDirection()); |
| ASSERT(!resolveGridPositionsFromStyle(gridItem, autoPlacementMajorAxisDirection())); |
| - size_t minorAxisIndex = 0; |
| if (minorAxisPositions) { |
| - minorAxisIndex = minorAxisPositions->initialPositionIndex; |
| + size_t minorAxisIndex = minorAxisPositions->initialPositionIndex; |
| GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisIndex); |
| - if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) { |
| - insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
| + if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->finalPositionIndex - minorAxisPositions->initialPositionIndex + 1)) { |
| + insertItemIntoGrid(gridItem, *emptyGridArea); |
| return; |
| } |
| } else { |
| const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount(); |
| for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) { |
| GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex); |
| - if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea()) { |
| + if (OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(1)) { |
| insertItemIntoGrid(gridItem, emptyGridArea->rows.initialPositionIndex, emptyGridArea->columns.initialPositionIndex); |
| return; |
| } |
| @@ -861,10 +881,11 @@ void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) |
| } |
| // We didn't find an empty grid area so we need to create an extra major axis line and insert our gridItem in it. |
| - const size_t columnIndex = (autoPlacementMajorAxisDirection() == ForColumns) ? m_grid[0].size() : minorAxisIndex; |
| - const size_t rowIndex = (autoPlacementMajorAxisDirection() == ForColumns) ? minorAxisIndex : m_grid.size(); |
| + GridSpan minorAxisSpan = minorAxisPositions ? *minorAxisPositions : GridSpan(0, 0); |
| + GridSpan columnSpan = (autoPlacementMajorAxisDirection() == ForColumns) ? GridSpan(m_grid[0].size(), m_grid[0].size()) : minorAxisSpan; |
| + GridSpan rowSpan = (autoPlacementMajorAxisDirection() == ForColumns) ? minorAxisSpan : GridSpan(m_grid.size(), m_grid.size()); |
| growGrid(autoPlacementMajorAxisDirection()); |
| - insertItemIntoGrid(gridItem, rowIndex, columnIndex); |
| + insertItemIntoGrid(gridItem, GridCoordinate(rowSpan, columnSpan)); |
| } |
| GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const |