| 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::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 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::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 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 |