Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 1529083006: [css-grid] Initial support for implicit grid before explicit grid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Apply suggested changes Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698