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

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

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

Powered by Google App Engine
This is Rietveld 408576698