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

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

Issue 1648333002: [css-grid] Rename GridCoordinate to GridArea (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months 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 12 matching lines...) Expand all
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "core/layout/LayoutGrid.h" 26 #include "core/layout/LayoutGrid.h"
27 27
28 #include "core/layout/LayoutView.h" 28 #include "core/layout/LayoutView.h"
29 #include "core/layout/TextAutosizer.h" 29 #include "core/layout/TextAutosizer.h"
30 #include "core/paint/GridPainter.h" 30 #include "core/paint/GridPainter.h"
31 #include "core/paint/PaintLayer.h" 31 #include "core/paint/PaintLayer.h"
32 #include "core/style/ComputedStyle.h" 32 #include "core/style/ComputedStyle.h"
33 #include "core/style/GridCoordinate.h" 33 #include "core/style/GridArea.h"
34 #include "platform/LengthFunctions.h" 34 #include "platform/LengthFunctions.h"
35 #include <algorithm> 35 #include <algorithm>
36 36
37 namespace blink { 37 namespace blink {
38 38
39 static const int infinity = -1; 39 static const int infinity = -1;
40 40
41 class GridItemWithSpan; 41 class GridItemWithSpan;
42 42
43 class GridTrack { 43 class GridTrack {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 for (size_t column = m_columnIndex; column < maxColumns; ++column) { 190 for (size_t column = m_columnIndex; column < maxColumns; ++column) {
191 const GridCell& children = m_grid[row][column]; 191 const GridCell& children = m_grid[row][column];
192 if (!children.isEmpty()) 192 if (!children.isEmpty())
193 return false; 193 return false;
194 } 194 }
195 } 195 }
196 196
197 return true; 197 return true;
198 } 198 }
199 199
200 PassOwnPtr<GridCoordinate> nextEmptyGridArea(size_t fixedTrackSpan, size_t v aryingTrackSpan) 200 PassOwnPtr<GridArea> nextEmptyGridArea(size_t fixedTrackSpan, size_t varying TrackSpan)
201 { 201 {
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::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::tr anslatedDefiniteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); 212 OwnPtr<GridArea> result = adoptPtr(new GridArea(GridSpan::transl atedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::translatedDefi niteGridSpan(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 874 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 for (size_t row = oldRowSize; row < gridRowCount(); ++row) 1097 for (size_t row = oldRowSize; row < gridRowCount(); ++row)
1098 m_grid[row].grow(gridColumnCount()); 1098 m_grid[row].grow(gridColumnCount());
1099 } 1099 }
1100 1100
1101 if (maximumColumnSize > gridColumnCount()) { 1101 if (maximumColumnSize > gridColumnCount()) {
1102 for (size_t row = 0; row < gridRowCount(); ++row) 1102 for (size_t row = 0; row < gridRowCount(); ++row)
1103 m_grid[row].grow(maximumColumnSize); 1103 m_grid[row].grow(maximumColumnSize);
1104 } 1104 }
1105 } 1105 }
1106 1106
1107 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridCoordinate& coor dinate) 1107 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area)
1108 { 1108 {
1109 RELEASE_ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns. isTranslatedDefinite()); 1109 RELEASE_ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslated Definite());
1110 ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.r esolvedFinalPosition()); 1110 ensureGridSize(area.rows.resolvedFinalPosition(), area.columns.resolvedFinal Position());
1111 1111
1112 for (const auto& row : coordinate.rows) { 1112 for (const auto& row : area.rows) {
1113 for (const auto& column: coordinate.columns) 1113 for (const auto& column: area.columns)
1114 m_grid[row][column].append(&child); 1114 m_grid[row][column].append(&child);
1115 } 1115 }
1116 } 1116 }
1117 1117
1118 void LayoutGrid::placeItemsOnGrid() 1118 void LayoutGrid::placeItemsOnGrid()
1119 { 1119 {
1120 if (!m_gridIsDirty) 1120 if (!m_gridIsDirty)
1121 return; 1121 return;
1122 1122
1123 ASSERT(m_gridItemCoordinate.isEmpty()); 1123 ASSERT(m_gridItemArea.isEmpty());
1124 1124
1125 populateExplicitGridAndOrderIterator(); 1125 populateExplicitGridAndOrderIterator();
1126 1126
1127 // 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.
1128 m_gridIsDirty = false; 1128 m_gridIsDirty = false;
1129 1129
1130 Vector<LayoutBox*> autoMajorAxisAutoGridItems; 1130 Vector<LayoutBox*> autoMajorAxisAutoGridItems;
1131 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; 1131 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
1132 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()) {
1133 if (child->isOutOfFlowPositioned()) 1133 if (child->isOutOfFlowPositioned())
1134 continue; 1134 continue;
1135 1135
1136 GridCoordinate coordinate = cachedGridCoordinate(*child); 1136 GridArea area = cachedGridArea(*child);
1137 if (!coordinate.rows.isIndefinite()) 1137 if (!area.rows.isIndefinite())
1138 coordinate.rows.translate(abs(m_smallestRowStart)); 1138 area.rows.translate(abs(m_smallestRowStart));
1139 if (!coordinate.columns.isIndefinite()) 1139 if (!area.columns.isIndefinite())
1140 coordinate.columns.translate(abs(m_smallestColumnStart)); 1140 area.columns.translate(abs(m_smallestColumnStart));
1141 m_gridItemCoordinate.set(child, coordinate); 1141 m_gridItemArea.set(child, area);
1142 1142
1143 if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) { 1143 if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows; 1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? area.columns : area.rows;
1145 if (majorAxisPositions.isIndefinite()) 1145 if (majorAxisPositions.isIndefinite())
1146 autoMajorAxisAutoGridItems.append(child); 1146 autoMajorAxisAutoGridItems.append(child);
1147 else 1147 else
1148 specifiedMajorAxisAutoGridItems.append(child); 1148 specifiedMajorAxisAutoGridItems.append(child);
1149 continue; 1149 continue;
1150 } 1150 }
1151 insertItemIntoGrid(*child, coordinate); 1151 insertItemIntoGrid(*child, area);
1152 } 1152 }
1153 1153
1154 ASSERT(gridRowCount() >= GridPositionsResolver::explicitGridRowCount(*style( ))); 1154 ASSERT(gridRowCount() >= GridPositionsResolver::explicitGridRowCount(*style( )));
1155 ASSERT(gridColumnCount() >= GridPositionsResolver::explicitGridColumnCount(* style())); 1155 ASSERT(gridColumnCount() >= GridPositionsResolver::explicitGridColumnCount(* style()));
1156 1156
1157 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); 1157 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems);
1158 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); 1158 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems);
1159 1159
1160 m_grid.shrinkToFit(); 1160 m_grid.shrinkToFit();
1161 1161
1162 #if ENABLE(ASSERT) 1162 #if ENABLE(ASSERT)
1163 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()) {
1164 if (child->isOutOfFlowPositioned()) 1164 if (child->isOutOfFlowPositioned())
1165 continue; 1165 continue;
1166 1166
1167 GridCoordinate coordinate = cachedGridCoordinate(*child); 1167 GridArea area = cachedGridArea(*child);
1168 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTr anslatedDefinite()); 1168 ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslatedDefi nite());
1169 } 1169 }
1170 #endif 1170 #endif
1171 } 1171 }
1172 1172
1173 void LayoutGrid::populateExplicitGridAndOrderIterator() 1173 void LayoutGrid::populateExplicitGridAndOrderIterator()
1174 { 1174 {
1175 OrderIteratorPopulator populator(m_orderIterator); 1175 OrderIteratorPopulator populator(m_orderIterator);
1176 1176
1177 m_smallestRowStart = m_smallestColumnStart = 0; 1177 m_smallestRowStart = m_smallestColumnStart = 0;
1178 1178
1179 size_t maximumRowIndex = std::max<size_t>(1, GridPositionsResolver::explicit GridRowCount(*style())); 1179 size_t maximumRowIndex = std::max<size_t>(1, GridPositionsResolver::explicit GridRowCount(*style()));
1180 size_t maximumColumnIndex = std::max<size_t>(1, GridPositionsResolver::expli citGridColumnCount(*style())); 1180 size_t maximumColumnIndex = std::max<size_t>(1, GridPositionsResolver::expli citGridColumnCount(*style()));
1181 1181
1182 ASSERT(m_gridItemsIndexesMap.isEmpty()); 1182 ASSERT(m_gridItemsIndexesMap.isEmpty());
1183 size_t childIndex = 0; 1183 size_t childIndex = 0;
1184 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { 1184 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) {
1185 if (child->isOutOfFlowPositioned()) 1185 if (child->isOutOfFlowPositioned())
1186 continue; 1186 continue;
1187 1187
1188 populator.collectChild(child); 1188 populator.collectChild(child);
1189 m_gridItemsIndexesMap.set(child, childIndex++); 1189 m_gridItemsIndexesMap.set(child, childIndex++);
1190 1190
1191 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. 1191 // This function bypasses the cache (cachedGridArea()) as it is used to build it.
1192 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS tyle(*style(), *child, ForRows); 1192 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS tyle(*style(), *child, ForRows);
1193 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr omStyle(*style(), *child, ForColumns); 1193 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr omStyle(*style(), *child, ForColumns);
1194 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions)); 1194 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions));
1195 1195
1196 // |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.
1197 if (!rowPositions.isIndefinite()) { 1197 if (!rowPositions.isIndefinite()) {
1198 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedResolvedInitialPosition()); 1198 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedResolvedInitialPosition());
1199 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedResolvedFinalPosition()); 1199 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedResolvedFinalPosition());
1200 } else { 1200 } else {
1201 // 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.
1202 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForRows); 1202 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForRows);
1203 maximumRowIndex = std::max(maximumRowIndex, spanSize); 1203 maximumRowIndex = std::max(maximumRowIndex, spanSize);
1204 } 1204 }
1205 1205
1206 if (!columnPositions.isIndefinite()) { 1206 if (!columnPositions.isIndefinite()) {
1207 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedResolvedInitialPosition()); 1207 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedResolvedInitialPosition());
1208 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedResolvedFinalPosition()); 1208 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedResolvedFinalPosition());
1209 } else { 1209 } else {
1210 // 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.
1211 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForColumns); 1211 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForColumns);
1212 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); 1212 maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
1213 } 1213 }
1214 } 1214 }
1215 1215
1216 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); 1216 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart));
1217 for (auto& column : m_grid) 1217 for (auto& column : m_grid)
1218 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); 1218 column.grow(maximumColumnIndex + abs(m_smallestColumnStart));
1219 } 1219 }
1220 1220
1221 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const 1221 PassOwnPtr<GridArea> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideG rid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection, cons t GridSpan& specifiedPositions) const
1222 { 1222 {
1223 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1223 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns;
1224 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); 1224 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount();
1225 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced Item(*style(), gridItem, crossDirection); 1225 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced Item(*style(), gridItem, crossDirection);
1226 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); 1226 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO fCrossDirection, endOfCrossDirection + crossDirectionSpanSize);
1227 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); 1227 return adoptPtr(new GridArea(specifiedDirection == ForColumns ? crossDirecti onPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPo sitions : crossDirectionPositions));
1228 } 1228 }
1229 1229
1230 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems) 1230 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems)
1231 { 1231 {
1232 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1232 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
1233 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 1233 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
1234 1234
1235 // 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
1236 // 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.
1237 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo 1237 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
1238 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; 1238 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors;
1239 1239
1240 for (const auto& autoGridItem : autoGridItems) { 1240 for (const auto& autoGridItem : autoGridItems) {
1241 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection()); 1241 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection());
1242 ASSERT(majorAxisPositions.isTranslatedDefinite()); 1242 ASSERT(majorAxisPositions.isTranslatedDefinite());
1243 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isTranslatedDefinite()); 1243 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isTranslatedDefinite());
1244 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); 1244 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection());
1245 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition(); 1245 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition();
1246 1246
1247 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));
1248 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions.integerSpan(), minorAxisSpanSize); 1248 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos itions.integerSpan(), minorAxisSpanSize);
1249 if (!emptyGridArea) 1249 if (!emptyGridArea)
1250 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 1250 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
1251 1251
1252 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); 1252 m_gridItemArea.set(autoGridItem, *emptyGridArea);
1253 insertItemIntoGrid(*autoGridItem, *emptyGridArea); 1253 insertItemIntoGrid(*autoGridItem, *emptyGridArea);
1254 1254
1255 if (!isGridAutoFlowDense) 1255 if (!isGridAutoFlowDense)
1256 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial Position()); 1256 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial Position());
1257 } 1257 }
1258 } 1258 }
1259 1259
1260 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems) 1260 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems)
1261 { 1261 {
1262 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); 1262 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0);
(...skipping 13 matching lines...) Expand all
1276 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)
1277 { 1277 {
1278 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi sDirection()); 1278 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi sDirection());
1279 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl atedDefinite()); 1279 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl atedDefinite());
1280 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( *style(), gridItem, autoPlacementMajorAxisDirection()); 1280 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( *style(), gridItem, autoPlacementMajorAxisDirection());
1281 1281
1282 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); 1282 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount();
1283 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; 1283 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
1284 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; 1284 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
1285 1285
1286 OwnPtr<GridCoordinate> emptyGridArea; 1286 OwnPtr<GridArea> emptyGridArea;
1287 if (minorAxisPositions.isTranslatedDefinite()) { 1287 if (minorAxisPositions.isTranslatedDefinite()) {
1288 // 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.
1289 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen tCursor) 1289 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen tCursor)
1290 majorAxisAutoPlacementCursor++; 1290 majorAxisAutoPlacementCursor++;
1291 1291
1292 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1292 if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
1293 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); 1293 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor);
1294 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisSpanSize); 1294 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisSpanSize);
1295 } 1295 }
1296 1296
(...skipping 19 matching lines...) Expand all
1316 } 1316 }
1317 1317
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. 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.
1319 minorAxisAutoPlacementCursor = 0; 1319 minorAxisAutoPlacementCursor = 0;
1320 } 1320 }
1321 1321
1322 if (!emptyGridArea) 1322 if (!emptyGridArea)
1323 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan (0, minorAxisSpanSize)); 1323 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan (0, minorAxisSpanSize));
1324 } 1324 }
1325 1325
1326 m_gridItemCoordinate.set(&gridItem, *emptyGridArea); 1326 m_gridItemArea.set(&gridItem, *emptyGridArea);
1327 insertItemIntoGrid(gridItem, *emptyGridArea); 1327 insertItemIntoGrid(gridItem, *emptyGridArea);
1328 // Move auto-placement cursor to the new position. 1328 // Move auto-placement cursor to the new position.
1329 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); 1329 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition();
1330 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition( ); 1330 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition( );
1331 } 1331 }
1332 1332
1333 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const 1333 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const
1334 { 1334 {
1335 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; 1335 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows;
1336 } 1336 }
1337 1337
1338 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const 1338 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const
1339 { 1339 {
1340 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; 1340 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns;
1341 } 1341 }
1342 1342
1343 void LayoutGrid::dirtyGrid() 1343 void LayoutGrid::dirtyGrid()
1344 { 1344 {
1345 if (m_gridIsDirty) 1345 if (m_gridIsDirty)
1346 return; 1346 return;
1347 1347
1348 // Even if this could be redundant, it could be seen as a defensive strategy against 1348 // Even if this could be redundant, it could be seen as a defensive strategy against
1349 // style changes events happening during the layout phase or even while the painting process 1349 // style changes events happening during the layout phase or even while the painting process
1350 // is still ongoing. 1350 // is still ongoing.
1351 // Forcing a new layout for the Grid layout would cancel any ongoing paintin g and ensure 1351 // Forcing a new layout for the Grid layout would cancel any ongoing paintin g and ensure
1352 // the grid and its children are correctly laid out according to the new sty le rules. 1352 // the grid and its children are correctly laid out according to the new sty le rules.
1353 setNeedsLayout(LayoutInvalidationReason::GridChanged); 1353 setNeedsLayout(LayoutInvalidationReason::GridChanged);
1354 1354
1355 m_grid.resize(0); 1355 m_grid.resize(0);
1356 m_gridItemCoordinate.clear(); 1356 m_gridItemArea.clear();
1357 m_gridItemsOverflowingGridArea.resize(0); 1357 m_gridItemsOverflowingGridArea.resize(0);
1358 m_gridItemsIndexesMap.clear(); 1358 m_gridItemsIndexesMap.clear();
1359 m_gridIsDirty = true; 1359 m_gridIsDirty = true;
1360 } 1360 }
1361 1361
1362 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData) 1362 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData)
1363 { 1363 {
1364 LayoutUnit& availableSpace = sizingData.freeSpaceForDirection(direction); 1364 LayoutUnit& availableSpace = sizingData.freeSpaceForDirection(direction);
1365 if (availableSpace <= 0 1365 if (availableSpace <= 0
1366 || (direction == ForColumns && styleRef().justifyContentDistribution() ! = ContentDistributionStretch) 1366 || (direction == ForColumns && styleRef().justifyContentDistribution() ! = ContentDistributionStretch)
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 // determine the available space before stretching, are not set yet. 1422 // determine the available space before stretching, are not set yet.
1423 applyStretchAlignmentToChildIfNeeded(*child); 1423 applyStretchAlignmentToChildIfNeeded(*child);
1424 1424
1425 child->layoutIfNeeded(); 1425 child->layoutIfNeeded();
1426 1426
1427 // We need pending layouts to be done in order to compute auto-margins p roperly. 1427 // We need pending layouts to be done in order to compute auto-margins p roperly.
1428 updateAutoMarginsInColumnAxisIfNeeded(*child); 1428 updateAutoMarginsInColumnAxisIfNeeded(*child);
1429 updateAutoMarginsInRowAxisIfNeeded(*child); 1429 updateAutoMarginsInRowAxisIfNeeded(*child);
1430 1430
1431 #if ENABLE(ASSERT) 1431 #if ENABLE(ASSERT)
1432 const GridCoordinate& coordinate = cachedGridCoordinate(*child); 1432 const GridArea& area = cachedGridArea(*child);
1433 ASSERT(coordinate.columns.resolvedInitialPosition() < sizingData.columnT racks.size()); 1433 ASSERT(area.columns.resolvedInitialPosition() < sizingData.columnTracks. size());
1434 ASSERT(coordinate.rows.resolvedInitialPosition() < sizingData.rowTracks. size()); 1434 ASSERT(area.rows.resolvedInitialPosition() < sizingData.rowTracks.size() );
1435 #endif 1435 #endif
1436 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); 1436 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
1437 1437
1438 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is 1438 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is
1439 // not visible 1439 // not visible
1440 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight 1440 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight
1441 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h) 1441 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h)
1442 m_gridItemsOverflowingGridArea.append(child); 1442 m_gridItemsOverflowingGridArea.append(child);
1443 } 1443 }
1444 } 1444 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 if (child.parent() == this && !startIsAuto) { 1537 if (child.parent() == this && !startIsAuto) {
1538 // If column/row start is "auto" the static position has been already se t in prepareChildForPositionedLayout(). 1538 // If column/row start is "auto" the static position has been already se t in prepareChildForPositionedLayout().
1539 PaintLayer* childLayer = child.layer(); 1539 PaintLayer* childLayer = child.layer();
1540 if (isForColumns) 1540 if (isForColumns)
1541 childLayer->setStaticInlinePosition(borderStart() + offset); 1541 childLayer->setStaticInlinePosition(borderStart() + offset);
1542 else 1542 else
1543 childLayer->setStaticBlockPosition(borderBefore() + offset); 1543 childLayer->setStaticBlockPosition(borderBefore() + offset);
1544 } 1544 }
1545 } 1545 }
1546 1546
1547 GridCoordinate LayoutGrid::cachedGridCoordinate(const LayoutBox& gridItem) const 1547 GridArea LayoutGrid::cachedGridArea(const LayoutBox& gridItem) const
1548 { 1548 {
1549 ASSERT(m_gridItemCoordinate.contains(&gridItem)); 1549 ASSERT(m_gridItemArea.contains(&gridItem));
1550 return m_gridItemCoordinate.get(&gridItem); 1550 return m_gridItemArea.get(&gridItem);
1551 } 1551 }
1552 1552
1553 GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi rection direction) const 1553 GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi rection direction) const
1554 { 1554 {
1555 GridCoordinate coordinate = cachedGridCoordinate(gridItem); 1555 GridArea area = cachedGridArea(gridItem);
1556 return direction == ForColumns ? coordinate.columns : coordinate.rows; 1556 return direction == ForColumns ? area.columns : area.rows;
1557 } 1557 }
1558 1558
1559 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const 1559 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const
1560 { 1560 {
1561 const GridSpan& span = cachedGridSpan(child, direction); 1561 const GridSpan& span = cachedGridSpan(child, direction);
1562 LayoutUnit gridAreaBreadth = 0; 1562 LayoutUnit gridAreaBreadth = 0;
1563 for (const auto& trackPosition : span) 1563 for (const auto& trackPosition : span)
1564 gridAreaBreadth += tracks[trackPosition].baseSize(); 1564 gridAreaBreadth += tracks[trackPosition].baseSize();
1565 1565
1566 gridAreaBreadth += guttersSize(direction, span.integerSpan()); 1566 gridAreaBreadth += guttersSize(direction, span.integerSpan());
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
2072 2072
2073 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2073 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
2074 } 2074 }
2075 2075
2076 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2076 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2077 { 2077 {
2078 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2078 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2079 } 2079 }
2080 2080
2081 } // namespace blink 2081 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | third_party/WebKit/Source/core/style/GridArea.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698