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 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1133 | 1133 |
1134 // We clear the dirty bit here as the grid sizes have been updated. | 1134 // We clear the dirty bit here as the grid sizes have been updated. |
1135 m_gridIsDirty = false; | 1135 m_gridIsDirty = false; |
1136 | 1136 |
1137 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1137 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1138 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1138 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1139 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { | 1139 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { |
1140 if (child->isOutOfFlowPositioned()) | 1140 if (child->isOutOfFlowPositioned()) |
1141 continue; | 1141 continue; |
1142 | 1142 |
1143 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio
nsFromStyle(*style(), *child, ForRows); | 1143 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt
yle(styleRef(), *child, ForRows); |
1144 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi
tionsFromStyle(*style(), *child, ForColumns); | 1144 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro
mStyle(styleRef(), *child, ForColumns); |
1145 if (!rowPositions || !columnPositions) { | 1145 |
1146 GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() ==
ForColumns) ? columnPositions.get() : rowPositions.get(); | 1146 if (unresolvedRowPositions.requiresAutoPlacement() || unresolvedColumnPo
sitions.requiresAutoPlacement()) { |
1147 if (!majorAxisPositions) | 1147 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirectio
n() == ForColumns; |
| 1148 if ((majorAxisDirectionIsForColumns && unresolvedColumnPositions.req
uiresAutoPlacement()) |
| 1149 || (!majorAxisDirectionIsForColumns && unresolvedRowPositions.re
quiresAutoPlacement())) |
1148 autoMajorAxisAutoGridItems.append(child); | 1150 autoMajorAxisAutoGridItems.append(child); |
1149 else | 1151 else |
1150 specifiedMajorAxisAutoGridItems.append(child); | 1152 specifiedMajorAxisAutoGridItems.append(child); |
1151 continue; | 1153 continue; |
1152 } | 1154 } |
1153 insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPosition
s)); | 1155 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt
yle(unresolvedRowPositions, styleRef()); |
| 1156 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro
mStyle(unresolvedColumnPositions, styleRef()); |
| 1157 insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions)
); |
1154 } | 1158 } |
1155 | 1159 |
1156 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); | 1160 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); |
1157 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); | 1161 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); |
1158 | 1162 |
1159 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); | 1163 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); |
1160 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); | 1164 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); |
1161 | 1165 |
1162 m_grid.shrinkToFit(); | 1166 m_grid.shrinkToFit(); |
1163 } | 1167 } |
1164 | 1168 |
1165 void LayoutGrid::populateExplicitGridAndOrderIterator() | 1169 void LayoutGrid::populateExplicitGridAndOrderIterator() |
1166 { | 1170 { |
1167 OrderIteratorPopulator populator(m_orderIterator); | 1171 OrderIteratorPopulator populator(m_orderIterator); |
1168 | 1172 |
1169 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG
ridRowCount(*style())); | 1173 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG
ridRowCount(*style())); |
1170 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic
itGridColumnCount(*style())); | 1174 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic
itGridColumnCount(*style())); |
1171 | 1175 |
1172 ASSERT(m_gridItemsIndexesMap.isEmpty()); | 1176 ASSERT(m_gridItemsIndexesMap.isEmpty()); |
1173 size_t childIndex = 0; | 1177 size_t childIndex = 0; |
1174 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { | 1178 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { |
1175 if (child->isOutOfFlowPositioned()) | 1179 if (child->isOutOfFlowPositioned()) |
1176 continue; | 1180 continue; |
1177 | 1181 |
1178 populator.collectChild(child); | 1182 populator.collectChild(child); |
1179 m_gridItemsIndexesMap.set(child, childIndex++); | 1183 m_gridItemsIndexesMap.set(child, childIndex++); |
1180 | 1184 |
1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. | 1185 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. |
1182 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio
nsFromStyle(*style(), *child, ForRows); | 1186 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt
yle(styleRef(), *child, ForRows); |
1183 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi
tionsFromStyle(*style(), *child, ForColumns); | 1187 if (!unresolvedRowPositions.requiresAutoPlacement()) { |
1184 | 1188 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFr
omStyle(unresolvedRowPositions, styleRef()); |
1185 // |positions| is 0 if we need to run the auto-placement algorithm. | 1189 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFin
alPosition.next().toInt()); |
1186 if (rowPositions) { | |
1187 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions->re
solvedFinalPosition.next().toInt()); | |
1188 } else { | 1190 } else { |
1189 // Grow the grid for items with a definite row span, getting the lar
gest such span. | 1191 // Grow the grid for items with a definite row span, getting the lar
gest such span. |
1190 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA
utoPlacementPosition(*style(), *child, ForRows, GridResolvedPosition(0)); | 1192 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA
utoPlacementPosition(styleRef(), *child, ForRows, GridResolvedPosition(0)); |
1191 maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolv
edFinalPosition.next().toInt()); | 1193 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalP
osition.next().toInt()); |
1192 } | 1194 } |
1193 | 1195 |
1194 if (columnPositions) { | 1196 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro
mStyle(styleRef(), *child, ForColumns); |
1195 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi
tions->resolvedFinalPosition.next().toInt()); | 1197 if (!unresolvedColumnPositions.requiresAutoPlacement()) { |
| 1198 GridSpan columnPositions = GridResolvedPosition::resolveGridPosition
sFromStyle(unresolvedColumnPositions, styleRef()); |
| 1199 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.re
solvedFinalPosition.next().toInt()); |
1196 } else { | 1200 } else { |
1197 // Grow the grid for items with a definite column span, getting the
largest such span. | 1201 // Grow the grid for items with a definite column span, getting the
largest such span. |
1198 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA
utoPlacementPosition(*style(), *child, ForColumns, GridResolvedPosition(0)); | 1202 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA
utoPlacementPosition(styleRef(), *child, ForColumns, GridResolvedPosition(0)); |
1199 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions.
resolvedFinalPosition.next().toInt()); | 1203 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolved
FinalPosition.next().toInt()); |
1200 } | 1204 } |
| 1205 |
1201 } | 1206 } |
1202 | 1207 |
1203 m_grid.grow(maximumRowIndex); | 1208 m_grid.grow(maximumRowIndex); |
1204 for (auto& column : m_grid) | 1209 for (auto& column : m_grid) |
1205 column.grow(maximumColumnIndex); | 1210 column.grow(maximumColumnIndex); |
1206 } | 1211 } |
1207 | 1212 |
1208 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const | 1213 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const |
1209 { | 1214 { |
1210 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 1215 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
1211 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 1216 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
1212 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition
sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit
ion(endOfCrossDirection)); | 1217 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition
sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit
ion(endOfCrossDirection)); |
1213 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); | 1218 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); |
1214 } | 1219 } |
1215 | 1220 |
1216 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) | 1221 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) |
1217 { | 1222 { |
1218 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1223 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
1219 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1224 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1220 | 1225 |
1221 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1226 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
1222 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1227 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
1223 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1228 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1224 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1229 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
1225 | 1230 |
1226 for (const auto& autoGridItem : autoGridItems) { | 1231 for (const auto& autoGridItem : autoGridItems) { |
1227 OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridP
ositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); | 1232 auto unresolvedMajorAxisPositions = GridResolvedPosition::unresolvedSpan
FromStyle(styleRef(), *autoGridItem, autoPlacementMajorAxisDirection()); |
| 1233 ASSERT(!unresolvedMajorAxisPositions.requiresAutoPlacement()); |
| 1234 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositions
FromStyle(unresolvedMajorAxisPositions, styleRef()); |
1228 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti
on(), GridResolvedPosition(0)); | 1235 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti
on(), GridResolvedPosition(0)); |
1229 unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialP
osition.toInt(); | 1236 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition.toInt(); |
1230 | 1237 |
1231 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxi
sCursors.get(majorAxisInitialPosition)); | 1238 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxis
Cursors.get(majorAxisInitialPosition)); |
1232 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); | 1239 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions.integerSpan(), minorAxisPositions.integerSpan()); |
1233 if (!emptyGridArea) | 1240 if (!emptyGridArea) |
1234 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); | 1241 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1235 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1242 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
1236 | 1243 |
1237 if (!isGridAutoFlowDense) | 1244 if (!isGridAutoFlowDense) |
1238 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI
nitialPosition.toInt()); | 1245 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI
nitialPosition.toInt()); |
1239 } | 1246 } |
1240 } | 1247 } |
1241 | 1248 |
1242 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri
dItems) | 1249 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri
dItems) |
1243 { | 1250 { |
1244 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); | 1251 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
1245 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1252 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1246 | 1253 |
1247 for (const auto& autoGridItem : autoGridItems) { | 1254 for (const auto& autoGridItem : autoGridItems) { |
1248 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); | 1255 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); |
1249 | 1256 |
1250 // If grid-auto-flow is dense, reset auto-placement cursor. | 1257 // If grid-auto-flow is dense, reset auto-placement cursor. |
1251 if (isGridAutoFlowDense) { | 1258 if (isGridAutoFlowDense) { |
1252 autoPlacementCursor.first = 0; | 1259 autoPlacementCursor.first = 0; |
1253 autoPlacementCursor.second = 0; | 1260 autoPlacementCursor.second = 0; |
1254 } | 1261 } |
1255 } | 1262 } |
1256 } | 1263 } |
1257 | 1264 |
1258 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) | 1265 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
1259 { | 1266 { |
1260 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit
ionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection()); | 1267 ASSERT(GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), gridItem, a
utoPlacementMajorAxisDirection()).requiresAutoPlacement()); |
1261 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridIt
em, autoPlacementMajorAxisDirection())); | 1268 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(styleRef(), gridItem, autoPlacementMajorAxisDirection(), G
ridResolvedPosition(0)); |
1262 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), Gri
dResolvedPosition(0)); | |
1263 | 1269 |
1264 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1270 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
1265 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1271 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1266 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1272 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1267 | 1273 |
1268 OwnPtr<GridCoordinate> emptyGridArea; | 1274 OwnPtr<GridCoordinate> emptyGridArea; |
1269 if (minorAxisPositions) { | 1275 auto unresolvedMinorAxisPositions = GridResolvedPosition::unresolvedSpanFrom
Style(styleRef(), gridItem, autoPlacementMinorAxisDirection()); |
| 1276 if (!unresolvedMinorAxisPositions.requiresAutoPlacement()) { |
| 1277 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromStyle(unresolvedMinorAxisPositions, styleRef()); |
| 1278 |
1270 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1279 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
1271 if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoP
lacementCursor) | 1280 if (minorAxisPositions.resolvedInitialPosition.toInt() < minorAxisAutoPl
acementCursor) |
1272 majorAxisAutoPlacementCursor++; | 1281 majorAxisAutoPlacementCursor++; |
1273 | 1282 |
1274 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1283 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1275 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); | 1284 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); |
1276 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integ
erSpan(), majorAxisPositions.integerSpan()); | 1285 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisPositions.integerSpan()); |
1277 } | 1286 } |
1278 | 1287 |
1279 if (!emptyGridArea) | 1288 if (!emptyGridArea) |
1280 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); | 1289 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
1281 } else { | 1290 } else { |
1282 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(),
GridResolvedPosition(0)); | 1291 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(),
GridResolvedPosition(0)); |
1283 | 1292 |
1284 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { | 1293 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { |
1285 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); | 1294 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); |
1286 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); | 1295 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); |
1287 | 1296 |
1288 if (emptyGridArea) { | 1297 if (emptyGridArea) { |
1289 // 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()). | 1298 // 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()). |
1290 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; | 1299 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 child->setExtraBlockOffset(rowOffset); | 1470 child->setExtraBlockOffset(rowOffset); |
1462 } | 1471 } |
1463 | 1472 |
1464 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); | 1473 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); |
1465 } | 1474 } |
1466 | 1475 |
1467 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) | 1476 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
1468 { | 1477 { |
1469 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); | 1478 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
1470 | 1479 |
1471 OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromS
tyle(*style(), child, direction); | 1480 auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(sty
leRef(), child, direction); |
1472 if (!positions) { | 1481 if (unresolvedPositions.requiresAutoPlacement()) { |
1473 offset = LayoutUnit(); | 1482 offset = LayoutUnit(); |
1474 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic
alHeight(); | 1483 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic
alHeight(); |
1475 return; | 1484 return; |
1476 } | 1485 } |
1477 | 1486 |
1478 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid
ColumnStart() : child.style()->gridRowStart(); | 1487 bool isForColumns = direction == ForColumns; |
1479 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo
lumnEnd() : child.style()->gridRowEnd(); | 1488 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart()
: child.style()->gridRowStart(); |
1480 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR
owCount()) - 1; | 1489 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c
hild.style()->gridRowEnd(); |
| 1490 size_t lastTrackIndex = (isForColumns ? gridColumnCount() : gridRowCount())
- 1; |
1481 | 1491 |
| 1492 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(unr
esolvedPositions, styleRef()); |
1482 bool startIsAuto = startPosition.isAuto() | 1493 bool startIsAuto = startPosition.isAuto() |
1483 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam
edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in
itialPositionSide(direction))) | 1494 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam
edLineOrArea(startPosition.namedGridLine(), styleRef(), isForColumns ? ColumnSta
rtSide : RowStartSide)) |
1484 || (positions->resolvedInitialPosition.toInt() > lastTrackIndex); | 1495 || (positions.resolvedInitialPosition.toInt() > lastTrackIndex); |
1485 bool endIsAuto = endPosition.isAuto() | 1496 bool endIsAuto = endPosition.isAuto() |
1486 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed
LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP
ositionSide(direction))) | 1497 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed
LineOrArea(endPosition.namedGridLine(), styleRef(), isForColumns ? ColumnEndSide
: RowEndSide)) |
1487 || (positions->resolvedFinalPosition.toInt() > lastTrackIndex); | 1498 || (positions.resolvedFinalPosition.toInt() > lastTrackIndex); |
1488 | 1499 |
1489 GridResolvedPosition firstPosition = GridResolvedPosition(0); | 1500 GridResolvedPosition firstPosition = GridResolvedPosition(0); |
1490 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio
ns->resolvedInitialPosition; | 1501 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio
ns.resolvedInitialPosition; |
1491 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); | 1502 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); |
1492 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions->r
esolvedFinalPosition; | 1503 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.re
solvedFinalPosition; |
1493 | 1504 |
1494 // Positioned children do not grow the grid, so we need to clamp the positio
ns to avoid ending up outside of it. | 1505 // Positioned children do not grow the grid, so we need to clamp the positio
ns to avoid ending up outside of it. |
1495 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi
on); | 1506 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi
on); |
1496 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); | 1507 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); |
1497 | 1508 |
1498 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ?
m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toI
nt()]; | 1509 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi
tions[initialPosition.toInt()] : m_rowPositions[initialPosition.toInt()]; |
1499 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : lo
gicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.nex
t().toInt()] : m_rowPositions[finalPosition.next().toInt()]; | 1510 LayoutUnit end = endIsAuto ? (isForColumns ? logicalWidth() : logicalHeight(
)) : isForColumns ? m_columnPositions[finalPosition.next().toInt()] : m_rowPosi
tions[finalPosition.next().toInt()]; |
1500 | 1511 |
1501 breadth = end - start; | 1512 breadth = end - start; |
1502 | 1513 |
1503 if (startIsAuto) | 1514 if (startIsAuto) |
1504 breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); | 1515 breadth -= isForColumns ? borderStart() : borderBefore(); |
1505 else | 1516 else |
1506 start -= ((direction == ForColumns) ? borderStart() : borderBefore()); | 1517 start -= isForColumns ? borderStart() : borderBefore(); |
1507 | 1518 |
1508 if (endIsAuto) { | 1519 if (endIsAuto) { |
1509 breadth -= (direction == ForColumns) ? borderEnd() : borderAfter(); | 1520 breadth -= isForColumns ? borderEnd() : borderAfter(); |
1510 breadth -= scrollbarLogicalWidth(); | 1521 breadth -= scrollbarLogicalWidth(); |
1511 } | 1522 } |
1512 | 1523 |
1513 offset = start; | 1524 offset = start; |
1514 | 1525 |
1515 if (child.parent() == this && !startIsAuto) { | 1526 if (child.parent() == this && !startIsAuto) { |
1516 // If column/row start is "auto" the static position has been already se
t in prepareChildForPositionedLayout(). | 1527 // If column/row start is "auto" the static position has been already se
t in prepareChildForPositionedLayout(). |
1517 PaintLayer* childLayer = child.layer(); | 1528 PaintLayer* childLayer = child.layer(); |
1518 if (direction == ForColumns) | 1529 if (isForColumns) |
1519 childLayer->setStaticInlinePosition(borderStart() + offset); | 1530 childLayer->setStaticInlinePosition(borderStart() + offset); |
1520 else | 1531 else |
1521 childLayer->setStaticBlockPosition(borderBefore() + offset); | 1532 childLayer->setStaticBlockPosition(borderBefore() + offset); |
1522 } | 1533 } |
1523 } | 1534 } |
1524 | 1535 |
1525 GridCoordinate LayoutGrid::cachedGridCoordinate(const LayoutBox& gridItem) const | 1536 GridCoordinate LayoutGrid::cachedGridCoordinate(const LayoutBox& gridItem) const |
1526 { | 1537 { |
1527 ASSERT(m_gridItemCoordinate.contains(&gridItem)); | 1538 ASSERT(m_gridItemCoordinate.contains(&gridItem)); |
1528 return m_gridItemCoordinate.get(&gridItem); | 1539 return m_gridItemCoordinate.get(&gridItem); |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2050 | 2061 |
2051 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2062 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2052 } | 2063 } |
2053 | 2064 |
2054 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2065 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2055 { | 2066 { |
2056 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2067 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2057 } | 2068 } |
2058 | 2069 |
2059 } // namespace blink | 2070 } // namespace blink |
OLD | NEW |