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