Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1278)

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 196943026: [CSS Grid Layout] Support span in auto-placement algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: New patch applying review comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/fast/css-grid-layout/grid-item-auto-placement-definite-span-expected.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « LayoutTests/fast/css-grid-layout/grid-item-auto-placement-definite-span-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698