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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 1496863004: [css-grid] Simplify method to resolve auto-placed items (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@kill-grid-resolved-position
Patch Set: Created 5 years 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. 1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it.
1182 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows); 1182 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows);
1183 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns); 1183 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns);
1184 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions)); 1184 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions));
1185 1185
1186 // |positions| is 0 if we need to run the auto-placement algorithm. 1186 // |positions| is 0 if we need to run the auto-placement algorithm.
1187 if (rowPositions.isDefinite()) { 1187 if (rowPositions.isDefinite()) {
1188 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.res olvedFinalPosition()); 1188 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.res olvedFinalPosition());
1189 } else { 1189 } else {
1190 // Grow the grid for items with a definite row span, getting the lar gest such span. 1190 // Grow the grid for items with a definite row span, getting the lar gest such span.
1191 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForRows, 0); 1191 size_t spanSize = GridResolvedPosition::spanSizeFromAutoPlacementPos ition(*style(), *child, ForRows);
1192 maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolv edFinalPosition()); 1192 maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize);
1193 } 1193 }
1194 1194
1195 if (columnPositions.isDefinite()) { 1195 if (columnPositions.isDefinite()) {
1196 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions.resolvedFinalPosition()); 1196 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions.resolvedFinalPosition());
1197 } else { 1197 } else {
1198 // Grow the grid for items with a definite column span, getting the largest such span. 1198 // Grow the grid for items with a definite column span, getting the largest such span.
1199 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForColumns, 0); 1199 size_t spanSize = GridResolvedPosition::spanSizeFromAutoPlacementPos ition(*style(), *child, ForColumns);
1200 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions. resolvedFinalPosition()); 1200 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize);
1201 } 1201 }
1202 } 1202 }
1203 1203
1204 m_grid.grow(maximumRowIndex); 1204 m_grid.grow(maximumRowIndex);
1205 for (auto& column : m_grid) 1205 for (auto& column : m_grid)
1206 column.grow(maximumColumnIndex); 1206 column.grow(maximumColumnIndex);
1207 } 1207 }
1208 1208
1209 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const 1209 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const
1210 { 1210 {
1211 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1211 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns;
1212 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); 1212 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount();
1213 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition sFromAutoPlacementPosition(*style(), gridItem, crossDirection, endOfCrossDirecti on); 1213 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeFromAutoPlacem entPosition(*style(), gridItem, crossDirection);
1214 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire ction, endOfCrossDirection + crossDirectionSpanSize);
1214 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); 1215 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions));
1215 } 1216 }
1216 1217
1217 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems) 1218 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems)
1218 { 1219 {
1219 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1220 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
1220 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 1221 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
1221 1222
1222 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on 1223 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on
1223 // that track. This is needed to implement "sparse" packing for items locked to a given track. 1224 // that track. This is needed to implement "sparse" packing for items locked to a given track.
1224 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo 1225 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
1225 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; 1226 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors;
1226 1227
1227 for (const auto& autoGridItem : autoGridItems) { 1228 for (const auto& autoGridItem : autoGridItems) {
1228 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection()); 1229 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection());
1229 ASSERT(majorAxisPositions.isDefinite()); 1230 ASSERT(majorAxisPositions.isDefinite());
1230 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isDefinite()); 1231 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isDefinite());
1231 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti on(), 0); 1232 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeFromAutoPlaceme ntPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirection());
1232 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition(); 1233 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition();
1233 1234
1234 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor s.get(majorAxisInitialPosition)); 1235 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor s.get(majorAxisInitialPosition));
1235 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions.integerSpan(), minorAxisPositions.integerSpan()); 1236 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions.integerSpan(), minorAxisSpanSize);
1236 if (!emptyGridArea) 1237 if (!emptyGridArea)
1237 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 1238 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
1238 1239
1239 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); 1240 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea);
1240 insertItemIntoGrid(*autoGridItem, *emptyGridArea); 1241 insertItemIntoGrid(*autoGridItem, *emptyGridArea);
1241 1242
1242 if (!isGridAutoFlowDense) 1243 if (!isGridAutoFlowDense)
1243 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial Position()); 1244 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial Position());
1244 } 1245 }
1245 } 1246 }
(...skipping 11 matching lines...) Expand all
1257 autoPlacementCursor.first = 0; 1258 autoPlacementCursor.first = 0;
1258 autoPlacementCursor.second = 0; 1259 autoPlacementCursor.second = 0;
1259 } 1260 }
1260 } 1261 }
1261 } 1262 }
1262 1263
1263 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor) 1264 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor)
1264 { 1265 {
1265 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi sDirection()); 1266 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi sDirection());
1266 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefini te()); 1267 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefini te());
1267 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom AutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), 0); 1268 size_t majorAxisSpanSize = GridResolvedPosition::spanSizeFromAutoPlacementPo sition(*style(), gridItem, autoPlacementMajorAxisDirection());
1268 1269
1269 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); 1270 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount();
1270 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; 1271 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
1271 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; 1272 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
1272 1273
1273 OwnPtr<GridCoordinate> emptyGridArea; 1274 OwnPtr<GridCoordinate> emptyGridArea;
1274 if (minorAxisPositions.isDefinite()) { 1275 if (minorAxisPositions.isDefinite()) {
1275 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor. 1276 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor.
1276 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen tCursor) 1277 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen tCursor)
1277 majorAxisAutoPlacementCursor++; 1278 majorAxisAutoPlacementCursor++;
1278 1279
1279 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1280 if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
1280 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); 1281 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor);
1281 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisPositions.integerSpan()); 1282 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisSpanSize);
1282 } 1283 }
1283 1284
1284 if (!emptyGridArea) 1285 if (!emptyGridArea)
1285 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 1286 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
1286 } else { 1287 } else {
1287 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), 0); 1288 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeFromAutoPlaceme ntPosition(*style(), gridItem, autoPlacementMinorAxisDirection());
1288 1289
1289 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) { 1290 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) {
1290 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor); 1291 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor);
1291 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege rSpan(), minorAxisPositions.integerSpan()); 1292 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA xisSpanSize);
1292 1293
1293 if (emptyGridArea) { 1294 if (emptyGridArea) {
1294 // Check that it fits in the minor axis direction, as we shouldn 't grow in that direction here (it was already managed in populateExplicitGridAn dOrderIterator()). 1295 // Check that it fits in the minor axis direction, as we shouldn 't grow in that direction here (it was already managed in populateExplicitGridAn dOrderIterator()).
1295 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri dArea->rows.resolvedFinalPosition(); 1296 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri dArea->rows.resolvedFinalPosition();
1296 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); 1297 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount();
1297 if (minorAxisFinalPositionIndex <= endOfMinorAxis) 1298 if (minorAxisFinalPositionIndex <= endOfMinorAxis)
1298 break; 1299 break;
1299 1300
1300 // Discard empty grid area as it does not fit in the minor axis direction. 1301 // Discard empty grid area as it does not fit in the minor axis direction.
1301 // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration. 1302 // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration.
1302 emptyGridArea = nullptr; 1303 emptyGridArea = nullptr;
1303 } 1304 }
1304 1305
1305 // As we're moving to the next track in the major axis we should res et the auto-placement cursor in the minor axis. 1306 // As we're moving to the next track in the major axis we should res et the auto-placement cursor in the minor axis.
1306 minorAxisAutoPlacementCursor = 0; 1307 minorAxisAutoPlacementCursor = 0;
1307 } 1308 }
1308 1309
1309 if (!emptyGridArea) 1310 if (!emptyGridArea)
1310 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 1311 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), GridSpan::definiteGridSpan(0, minorA xisSpanSize));
1311 } 1312 }
1312 1313
1313 m_gridItemCoordinate.set(&gridItem, *emptyGridArea); 1314 m_gridItemCoordinate.set(&gridItem, *emptyGridArea);
1314 insertItemIntoGrid(gridItem, *emptyGridArea); 1315 insertItemIntoGrid(gridItem, *emptyGridArea);
1315 // Move auto-placement cursor to the new position. 1316 // Move auto-placement cursor to the new position.
1316 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); 1317 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition();
1317 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition( ); 1318 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition( );
1318 } 1319 }
1319 1320
1320 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const 1321 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
2056 2057
2057 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2058 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
2058 } 2059 }
2059 2060
2060 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2061 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2061 { 2062 {
2062 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2063 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2063 } 2064 }
2064 2065
2065 } // namespace blink 2066 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698