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 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 ASSERT(!m_grid.isEmpty()); | 202 ASSERT(!m_grid.isEmpty()); |
203 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); | 203 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); |
204 | 204 |
205 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; | 205 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; |
206 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; | 206 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; |
207 | 207 |
208 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; | 208 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; |
209 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); | 209 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); |
210 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ | 210 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ |
211 if (checkEmptyCells(rowSpan, columnSpan)) { | 211 if (checkEmptyCells(rowSpan, columnSpan)) { |
212 OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(Grid
Span::definiteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::definiteGrid
Span(m_columnIndex, m_columnIndex + columnSpan))); | 212 OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(Grid
Span::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::tr
anslatedDefiniteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
213 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. | 213 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. |
214 ++varyingTrackIndex; | 214 ++varyingTrackIndex; |
215 return result.release(); | 215 return result.release(); |
216 } | 216 } |
217 } | 217 } |
218 return nullptr; | 218 return nullptr; |
219 } | 219 } |
220 | 220 |
221 private: | 221 private: |
222 const GridRepresentation& m_grid; | 222 const GridRepresentation& m_grid; |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 for (auto& track : tracks) | 529 for (auto& track : tracks) |
530 track.setBaseSize(track.growthLimit()); | 530 track.setBaseSize(track.growthLimit()); |
531 } | 531 } |
532 | 532 |
533 if (flexibleSizedTracksIndex.isEmpty()) | 533 if (flexibleSizedTracksIndex.isEmpty()) |
534 return; | 534 return; |
535 | 535 |
536 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. | 536 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. |
537 double flexFraction = 0; | 537 double flexFraction = 0; |
538 if (hasDefiniteFreeSpace) { | 538 if (hasDefiniteFreeSpace) { |
539 flexFraction = findFlexFactorUnitSize(tracks, GridSpan::definiteGridSpan
(0, tracks.size()), direction, initialFreeSpace); | 539 flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefini
teGridSpan(0, tracks.size()), direction, initialFreeSpace); |
540 } else { | 540 } else { |
541 for (const auto& trackIndex : flexibleSizedTracksIndex) | 541 for (const auto& trackIndex : flexibleSizedTracksIndex) |
542 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[
trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); | 542 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[
trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); |
543 | 543 |
544 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { | 544 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { |
545 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]
); | 545 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]
); |
546 while (LayoutBox* gridItem = iterator.nextGridItem()) { | 546 while (LayoutBox* gridItem = iterator.nextGridItem()) { |
547 const GridSpan span = cachedGridSpan(*gridItem, direction); | 547 const GridSpan span = cachedGridSpan(*gridItem, direction); |
548 | 548 |
549 // Do not include already processed items. | 549 // Do not include already processed items. |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 649 |
650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons
t | 650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons
t |
651 { | 651 { |
652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi
calWidth(); | 652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi
calWidth(); |
653 } | 653 } |
654 | 654 |
655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size
_t i) const | 655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size
_t i) const |
656 { | 656 { |
657 bool isForColumns = direction == ForColumns; | 657 bool isForColumns = direction == ForColumns; |
658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl
ateColumns() : style()->gridTemplateRows(); | 658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl
ateColumns() : style()->gridTemplateRows(); |
659 const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ?
style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; | 659 const GridTrackSize& autoTrackSize = isForColumns ? style()->gridAutoColumns
() : style()->gridAutoRows(); |
| 660 int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallest
RowStart); |
| 661 const GridTrackSize& trackSize = (translatedIndex < 0 || translatedIndex >=
static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIn
dex]; |
660 | 662 |
661 GridLength minTrackBreadth = trackSize.minTrackBreadth(); | 663 GridLength minTrackBreadth = trackSize.minTrackBreadth(); |
662 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); | 664 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); |
663 | 665 |
664 // If the logical width/height of the grid container is indefinite, percenta
ge values are treated as <auto> | 666 // If the logical width/height of the grid container is indefinite, percenta
ge values are treated as <auto> |
665 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { | 667 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { |
666 if (!hasDefiniteLogicalSize(direction)) { | 668 if (!hasDefiniteLogicalSize(direction)) { |
667 if (minTrackBreadth.hasPercentage()) | 669 if (minTrackBreadth.hasPercentage()) |
668 minTrackBreadth = Length(Auto); | 670 minTrackBreadth = Length(Auto); |
669 if (maxTrackBreadth.hasPercentage()) | 671 if (maxTrackBreadth.hasPercentage()) |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 } | 1099 } |
1098 | 1100 |
1099 if (maximumColumnSize > gridColumnCount()) { | 1101 if (maximumColumnSize > gridColumnCount()) { |
1100 for (size_t row = 0; row < gridRowCount(); ++row) | 1102 for (size_t row = 0; row < gridRowCount(); ++row) |
1101 m_grid[row].grow(maximumColumnSize); | 1103 m_grid[row].grow(maximumColumnSize); |
1102 } | 1104 } |
1103 } | 1105 } |
1104 | 1106 |
1105 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridCoordinate& coor
dinate) | 1107 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridCoordinate& coor
dinate) |
1106 { | 1108 { |
1107 RELEASE_ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite
()); | 1109 RELEASE_ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.
isTranslatedDefinite()); |
1108 ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.r
esolvedFinalPosition()); | 1110 ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.r
esolvedFinalPosition()); |
1109 | 1111 |
1110 for (const auto& row : coordinate.rows) { | 1112 for (const auto& row : coordinate.rows) { |
1111 for (const auto& column: coordinate.columns) | 1113 for (const auto& column: coordinate.columns) |
1112 m_grid[row][column].append(&child); | 1114 m_grid[row][column].append(&child); |
1113 } | 1115 } |
1114 } | 1116 } |
1115 | 1117 |
1116 void LayoutGrid::placeItemsOnGrid() | 1118 void LayoutGrid::placeItemsOnGrid() |
1117 { | 1119 { |
1118 if (!m_gridIsDirty) | 1120 if (!m_gridIsDirty) |
1119 return; | 1121 return; |
1120 | 1122 |
1121 ASSERT(m_gridItemCoordinate.isEmpty()); | 1123 ASSERT(m_gridItemCoordinate.isEmpty()); |
1122 | 1124 |
1123 populateExplicitGridAndOrderIterator(); | 1125 populateExplicitGridAndOrderIterator(); |
1124 | 1126 |
1125 // We clear the dirty bit here as the grid sizes have been updated. | 1127 // We clear the dirty bit here as the grid sizes have been updated. |
1126 m_gridIsDirty = false; | 1128 m_gridIsDirty = false; |
1127 | 1129 |
1128 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1130 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1129 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1131 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1130 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { | 1132 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { |
1131 if (child->isOutOfFlowPositioned()) | 1133 if (child->isOutOfFlowPositioned()) |
1132 continue; | 1134 continue; |
1133 | 1135 |
1134 GridCoordinate coordinate = cachedGridCoordinate(*child); | 1136 GridCoordinate coordinate = cachedGridCoordinate(*child); |
1135 if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) { | 1137 if (!coordinate.rows.isIndefinite()) |
| 1138 coordinate.rows.translate(abs(m_smallestRowStart)); |
| 1139 if (!coordinate.columns.isIndefinite()) |
| 1140 coordinate.columns.translate(abs(m_smallestColumnStart)); |
| 1141 m_gridItemCoordinate.set(child, coordinate); |
| 1142 |
| 1143 if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite())
{ |
1136 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() ==
ForColumns) ? coordinate.columns : coordinate.rows; | 1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() ==
ForColumns) ? coordinate.columns : coordinate.rows; |
1137 if (!majorAxisPositions.isDefinite()) | 1145 if (majorAxisPositions.isIndefinite()) |
1138 autoMajorAxisAutoGridItems.append(child); | 1146 autoMajorAxisAutoGridItems.append(child); |
1139 else | 1147 else |
1140 specifiedMajorAxisAutoGridItems.append(child); | 1148 specifiedMajorAxisAutoGridItems.append(child); |
1141 continue; | 1149 continue; |
1142 } | 1150 } |
1143 insertItemIntoGrid(*child, coordinate); | 1151 insertItemIntoGrid(*child, coordinate); |
1144 } | 1152 } |
1145 | 1153 |
1146 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); | 1154 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); |
1147 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); | 1155 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); |
1148 | 1156 |
1149 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); | 1157 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); |
1150 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); | 1158 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); |
1151 | 1159 |
1152 m_grid.shrinkToFit(); | 1160 m_grid.shrinkToFit(); |
1153 | 1161 |
1154 #if ENABLE(ASSERT) | 1162 #if ENABLE(ASSERT) |
1155 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { | 1163 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { |
1156 if (child->isOutOfFlowPositioned()) | 1164 if (child->isOutOfFlowPositioned()) |
1157 continue; | 1165 continue; |
1158 | 1166 |
1159 GridCoordinate coordinate = cachedGridCoordinate(*child); | 1167 GridCoordinate coordinate = cachedGridCoordinate(*child); |
1160 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); | 1168 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTr
anslatedDefinite()); |
1161 } | 1169 } |
1162 #endif | 1170 #endif |
1163 } | 1171 } |
1164 | 1172 |
1165 void LayoutGrid::populateExplicitGridAndOrderIterator() | 1173 void LayoutGrid::populateExplicitGridAndOrderIterator() |
1166 { | 1174 { |
1167 OrderIteratorPopulator populator(m_orderIterator); | 1175 OrderIteratorPopulator populator(m_orderIterator); |
1168 | 1176 |
| 1177 m_smallestRowStart = m_smallestColumnStart = 0; |
| 1178 |
1169 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG
ridRowCount(*style())); | 1179 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())); | 1180 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic
itGridColumnCount(*style())); |
1171 | 1181 |
1172 ASSERT(m_gridItemsIndexesMap.isEmpty()); | 1182 ASSERT(m_gridItemsIndexesMap.isEmpty()); |
1173 size_t childIndex = 0; | 1183 size_t childIndex = 0; |
1174 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { | 1184 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { |
1175 if (child->isOutOfFlowPositioned()) | 1185 if (child->isOutOfFlowPositioned()) |
1176 continue; | 1186 continue; |
1177 | 1187 |
1178 populator.collectChild(child); | 1188 populator.collectChild(child); |
1179 m_gridItemsIndexesMap.set(child, childIndex++); | 1189 m_gridItemsIndexesMap.set(child, childIndex++); |
1180 | 1190 |
1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. | 1191 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. |
1182 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt
yle(*style(), *child, ForRows); | 1192 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt
yle(*style(), *child, ForRows); |
1183 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro
mStyle(*style(), *child, ForColumns); | 1193 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro
mStyle(*style(), *child, ForColumns); |
1184 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit
ions)); | 1194 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit
ions)); |
1185 | 1195 |
1186 // |positions| is 0 if we need to run the auto-placement algorithm. | 1196 // |positions| is 0 if we need to run the auto-placement algorithm. |
1187 if (rowPositions.isDefinite()) { | 1197 if (!rowPositions.isIndefinite()) { |
1188 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.res
olvedFinalPosition()); | 1198 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra
nslatedResolvedInitialPosition()); |
| 1199 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran
slatedResolvedFinalPosition()); |
1189 } else { | 1200 } else { |
1190 // Grow the grid for items with a definite row span, getting the lar
gest such span. | 1201 // Grow the grid for items with a definite row span, getting the lar
gest such span. |
1191 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForRows); | 1202 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForRows); |
1192 maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize); | 1203 maximumRowIndex = std::max(maximumRowIndex, spanSize); |
1193 } | 1204 } |
1194 | 1205 |
1195 if (columnPositions.isDefinite()) { | 1206 if (!columnPositions.isIndefinite()) { |
1196 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi
tions.resolvedFinalPosition()); | 1207 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi
ons.untranslatedResolvedInitialPosition()); |
| 1208 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio
ns.untranslatedResolvedFinalPosition()); |
1197 } else { | 1209 } else { |
1198 // Grow the grid for items with a definite column span, getting the
largest such span. | 1210 // Grow the grid for items with a definite column span, getting the
largest such span. |
1199 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForColumns); | 1211 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForColumns); |
1200 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize); | 1212 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
1201 } | 1213 } |
1202 } | 1214 } |
1203 | 1215 |
1204 m_grid.grow(maximumRowIndex); | 1216 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
1205 for (auto& column : m_grid) | 1217 for (auto& column : m_grid) |
1206 column.grow(maximumColumnIndex); | 1218 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
1207 } | 1219 } |
1208 | 1220 |
1209 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const | 1221 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const |
1210 { | 1222 { |
1211 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 1223 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
1212 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 1224 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
1213 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI
tem(*style(), gridItem, crossDirection); | 1225 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI
tem(*style(), gridItem, crossDirection); |
1214 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire
ction, endOfCrossDirection + crossDirectionSpanSize); | 1226 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
1215 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); | 1227 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); |
1216 } | 1228 } |
1217 | 1229 |
1218 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) | 1230 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) |
1219 { | 1231 { |
1220 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1232 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
1221 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1233 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1222 | 1234 |
1223 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1235 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
1224 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1236 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
1225 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1237 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1226 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1238 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
1227 | 1239 |
1228 for (const auto& autoGridItem : autoGridItems) { | 1240 for (const auto& autoGridItem : autoGridItems) { |
1229 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); | 1241 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); |
1230 ASSERT(majorAxisPositions.isDefinite()); | 1242 ASSERT(majorAxisPositions.isTranslatedDefinite()); |
1231 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isDefinite()); | 1243 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); |
1232 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedIt
em(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); | 1244 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedIt
em(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
1233 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition(); | 1245 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition(); |
1234 | 1246 |
1235 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor
s.get(majorAxisInitialPosition)); | 1247 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor
s.get(majorAxisInitialPosition)); |
1236 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions.integerSpan(), minorAxisSpanSize); | 1248 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions.integerSpan(), minorAxisSpanSize); |
1237 if (!emptyGridArea) | 1249 if (!emptyGridArea) |
1238 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); | 1250 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1239 | 1251 |
1240 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); | 1252 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); |
1241 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1253 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
(...skipping 15 matching lines...) Expand all Loading... |
1257 if (isGridAutoFlowDense) { | 1269 if (isGridAutoFlowDense) { |
1258 autoPlacementCursor.first = 0; | 1270 autoPlacementCursor.first = 0; |
1259 autoPlacementCursor.second = 0; | 1271 autoPlacementCursor.second = 0; |
1260 } | 1272 } |
1261 } | 1273 } |
1262 } | 1274 } |
1263 | 1275 |
1264 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) | 1276 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
1265 { | 1277 { |
1266 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); | 1278 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); |
1267 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefini
te()); | 1279 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); |
1268 size_t majorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*
style(), gridItem, autoPlacementMajorAxisDirection()); | 1280 size_t majorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*
style(), gridItem, autoPlacementMajorAxisDirection()); |
1269 | 1281 |
1270 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1282 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
1271 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1283 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1272 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1284 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1273 | 1285 |
1274 OwnPtr<GridCoordinate> emptyGridArea; | 1286 OwnPtr<GridCoordinate> emptyGridArea; |
1275 if (minorAxisPositions.isDefinite()) { | 1287 if (minorAxisPositions.isTranslatedDefinite()) { |
1276 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1288 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
1277 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen
tCursor) | 1289 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen
tCursor) |
1278 majorAxisAutoPlacementCursor++; | 1290 majorAxisAutoPlacementCursor++; |
1279 | 1291 |
1280 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1292 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1281 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); | 1293 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); |
1282 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); | 1294 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); |
1283 } | 1295 } |
1284 | 1296 |
1285 if (!emptyGridArea) | 1297 if (!emptyGridArea) |
(...skipping 15 matching lines...) Expand all Loading... |
1301 // Discard empty grid area as it does not fit in the minor axis
direction. | 1313 // Discard empty grid area as it does not fit in the minor axis
direction. |
1302 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. | 1314 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. |
1303 emptyGridArea = nullptr; | 1315 emptyGridArea = nullptr; |
1304 } | 1316 } |
1305 | 1317 |
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. | 1318 // As we're moving to the next track in the major axis we should res
et the auto-placement cursor in the minor axis. |
1307 minorAxisAutoPlacementCursor = 0; | 1319 minorAxisAutoPlacementCursor = 0; |
1308 } | 1320 } |
1309 | 1321 |
1310 if (!emptyGridArea) | 1322 if (!emptyGridArea) |
1311 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), GridSpan::definiteGridSpan(0, minorA
xisSpanSize)); | 1323 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan
(0, minorAxisSpanSize)); |
1312 } | 1324 } |
1313 | 1325 |
1314 m_gridItemCoordinate.set(&gridItem, *emptyGridArea); | 1326 m_gridItemCoordinate.set(&gridItem, *emptyGridArea); |
1315 insertItemIntoGrid(gridItem, *emptyGridArea); | 1327 insertItemIntoGrid(gridItem, *emptyGridArea); |
1316 // Move auto-placement cursor to the new position. | 1328 // Move auto-placement cursor to the new position. |
1317 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); | 1329 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); |
1318 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition(
); | 1330 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition(
); |
1319 } | 1331 } |
1320 | 1332 |
1321 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const | 1333 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1469 } | 1481 } |
1470 | 1482 |
1471 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); | 1483 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); |
1472 } | 1484 } |
1473 | 1485 |
1474 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) | 1486 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
1475 { | 1487 { |
1476 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); | 1488 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
1477 | 1489 |
1478 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st
yle(), child, direction); | 1490 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st
yle(), child, direction); |
1479 if (!positions.isDefinite()) { | 1491 if (positions.isIndefinite()) { |
1480 offset = LayoutUnit(); | 1492 offset = LayoutUnit(); |
1481 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic
alHeight(); | 1493 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic
alHeight(); |
1482 return; | 1494 return; |
1483 } | 1495 } |
| 1496 positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smal
lestRowStart); |
1484 | 1497 |
1485 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid
ColumnStart() : child.style()->gridRowStart(); | 1498 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid
ColumnStart() : child.style()->gridRowStart(); |
1486 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo
lumnEnd() : child.style()->gridRowEnd(); | 1499 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo
lumnEnd() : child.style()->gridRowEnd(); |
1487 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR
owCount()) - 1; | 1500 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR
owCount()) - 1; |
1488 | 1501 |
1489 bool startIsAuto = startPosition.isAuto() | 1502 bool startIsAuto = startPosition.isAuto() |
1490 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam
edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in
itialPositionSide(direction))) | 1503 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam
edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in
itialPositionSide(direction))) |
1491 || (positions.resolvedInitialPosition() > lastTrackIndex); | 1504 || (positions.resolvedInitialPosition() > lastTrackIndex); |
1492 bool endIsAuto = endPosition.isAuto() | 1505 bool endIsAuto = endPosition.isAuto() |
1493 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed
LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP
ositionSide(direction))) | 1506 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed
LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP
ositionSide(direction))) |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2057 | 2070 |
2058 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2071 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2059 } | 2072 } |
2060 | 2073 |
2061 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2074 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2062 { | 2075 { |
2063 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2076 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2064 } | 2077 } |
2065 | 2078 |
2066 } // namespace blink | 2079 } // namespace blink |
OLD | NEW |