OLD | NEW |
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 Loading... |
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::spanSizeForAutoPlacedItem(*s
tyle(), *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::spanSizeForAutoPlacedItem(*s
tyle(), *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::spanSizeForAutoPlacedI
tem(*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::spanSizeForAutoPlacedIt
em(*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 Loading... |
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::spanSizeForAutoPlacedItem(*
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::spanSizeForAutoPlacedIt
em(*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 Loading... |
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 |
OLD | NEW |