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

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

Issue 1808193002: [css-grid] Rename GridSpan properties (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix typo opossiteLine vs oppositeLine Created 4 years, 9 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 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 } else { 544 } else {
545 for (const auto& trackIndex : flexibleSizedTracksIndex) 545 for (const auto& trackIndex : flexibleSizedTracksIndex)
546 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[ trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); 546 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[ trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex()));
547 547
548 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) { 548 for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
549 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i] ); 549 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i] );
550 while (LayoutBox* gridItem = iterator.nextGridItem()) { 550 while (LayoutBox* gridItem = iterator.nextGridItem()) {
551 const GridSpan span = cachedGridSpan(*gridItem, direction); 551 const GridSpan span = cachedGridSpan(*gridItem, direction);
552 552
553 // Do not include already processed items. 553 // Do not include already processed items.
554 if (i > 0 && span.resolvedInitialPosition() <= flexibleSizedTrac ksIndex[i - 1]) 554 if (i > 0 && span.startLine() <= flexibleSizedTracksIndex[i - 1] )
555 continue; 555 continue;
556 556
557 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra cks, span, direction, maxContentForChild(*gridItem, direction, sizingData.column Tracks))); 557 flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tra cks, span, direction, maxContentForChild(*gridItem, direction, sizingData.column Tracks)));
558 } 558 }
559 } 559 }
560 } 560 }
561 561
562 for (const auto& trackIndex : flexibleSizedTracksIndex) { 562 for (const auto& trackIndex : flexibleSizedTracksIndex) {
563 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); 563 GridTrackSize trackSize = gridTrackSize(direction, trackIndex);
564 564
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 832
833 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 833 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
834 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 834 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
835 if (track.growthLimitIsInfinite()) 835 if (track.growthLimitIsInfinite())
836 track.setGrowthLimit(track.baseSize()); 836 track.setGrowthLimit(track.baseSize());
837 } 837 }
838 } 838 }
839 839
840 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, Vector<GridTrack>& columnTracks) 840 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, Vector<GridTrack>& columnTracks)
841 { 841 {
842 const size_t trackPosition = span.resolvedInitialPosition(); 842 const size_t trackPosition = span.startLine();
843 GridTrackSize trackSize = gridTrackSize(direction, trackPosition); 843 GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
844 844
845 if (trackSize.hasMinContentMinTrackBreadth()) 845 if (trackSize.hasMinContentMinTrackBreadth())
846 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks))); 846 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks)));
847 else if (trackSize.hasMaxContentMinTrackBreadth()) 847 else if (trackSize.hasMaxContentMinTrackBreadth())
848 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks))); 848 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks)));
849 else if (trackSize.hasAutoMinTrackBreadth()) 849 else if (trackSize.hasAutoMinTrackBreadth())
850 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, columnTracks))); 850 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, columnTracks)));
851 851
852 if (trackSize.hasMinContentMaxTrackBreadth()) 852 if (trackSize.hasMinContentMaxTrackBreadth())
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 1104
1105 if (maximumColumnSize > gridColumnCount()) { 1105 if (maximumColumnSize > gridColumnCount()) {
1106 for (size_t row = 0; row < gridRowCount(); ++row) 1106 for (size_t row = 0; row < gridRowCount(); ++row)
1107 m_grid[row].grow(maximumColumnSize); 1107 m_grid[row].grow(maximumColumnSize);
1108 } 1108 }
1109 } 1109 }
1110 1110
1111 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area) 1111 void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area)
1112 { 1112 {
1113 RELEASE_ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslated Definite()); 1113 RELEASE_ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslated Definite());
1114 ensureGridSize(area.rows.resolvedFinalPosition(), area.columns.resolvedFinal Position()); 1114 ensureGridSize(area.rows.endLine(), area.columns.endLine());
1115 1115
1116 for (const auto& row : area.rows) { 1116 for (const auto& row : area.rows) {
1117 for (const auto& column: area.columns) 1117 for (const auto& column: area.columns)
1118 m_grid[row][column].append(&child); 1118 m_grid[row][column].append(&child);
1119 } 1119 }
1120 } 1120 }
1121 1121
1122 void LayoutGrid::placeItemsOnGrid() 1122 void LayoutGrid::placeItemsOnGrid()
1123 { 1123 {
1124 if (!m_gridIsDirty) 1124 if (!m_gridIsDirty)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 populator.collectChild(child); 1192 populator.collectChild(child);
1193 m_gridItemsIndexesMap.set(child, childIndex++); 1193 m_gridItemsIndexesMap.set(child, childIndex++);
1194 1194
1195 // This function bypasses the cache (cachedGridArea()) as it is used to build it. 1195 // This function bypasses the cache (cachedGridArea()) as it is used to build it.
1196 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS tyle(*style(), *child, ForRows); 1196 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS tyle(*style(), *child, ForRows);
1197 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr omStyle(*style(), *child, ForColumns); 1197 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr omStyle(*style(), *child, ForColumns);
1198 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions)); 1198 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions));
1199 1199
1200 // |positions| is 0 if we need to run the auto-placement algorithm. 1200 // |positions| is 0 if we need to run the auto-placement algorithm.
1201 if (!rowPositions.isIndefinite()) { 1201 if (!rowPositions.isIndefinite()) {
1202 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedResolvedInitialPosition()); 1202 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedStartLine());
1203 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedResolvedFinalPosition()); 1203 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedEndLine());
1204 } else { 1204 } else {
1205 // Grow the grid for items with a definite row span, getting the lar gest such span. 1205 // Grow the grid for items with a definite row span, getting the lar gest such span.
1206 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForRows); 1206 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForRows);
1207 maximumRowIndex = std::max(maximumRowIndex, spanSize); 1207 maximumRowIndex = std::max(maximumRowIndex, spanSize);
1208 } 1208 }
1209 1209
1210 if (!columnPositions.isIndefinite()) { 1210 if (!columnPositions.isIndefinite()) {
1211 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedResolvedInitialPosition()); 1211 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedStartLine());
1212 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedResolvedFinalPosition()); 1212 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedEndLine());
1213 } else { 1213 } else {
1214 // Grow the grid for items with a definite column span, getting the largest such span. 1214 // Grow the grid for items with a definite column span, getting the largest such span.
1215 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForColumns); 1215 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(* style(), *child, ForColumns);
1216 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); 1216 maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
1217 } 1217 }
1218 } 1218 }
1219 1219
1220 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); 1220 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart));
1221 for (auto& column : m_grid) 1221 for (auto& column : m_grid)
1222 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); 1222 column.grow(maximumColumnIndex + abs(m_smallestColumnStart));
(...skipping 16 matching lines...) Expand all
1239 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on 1239 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on
1240 // that track. This is needed to implement "sparse" packing for items locked to a given track. 1240 // that track. This is needed to implement "sparse" packing for items locked to a given track.
1241 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo 1241 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
1242 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; 1242 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors;
1243 1243
1244 for (const auto& autoGridItem : autoGridItems) { 1244 for (const auto& autoGridItem : autoGridItems) {
1245 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection()); 1245 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen tMajorAxisDirection());
1246 ASSERT(majorAxisPositions.isTranslatedDefinite()); 1246 ASSERT(majorAxisPositions.isTranslatedDefinite());
1247 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isTranslatedDefinite()); 1247 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()) .isTranslatedDefinite());
1248 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); 1248 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection());
1249 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition(); 1249 unsigned majorAxisInitialPosition = majorAxisPositions.startLine();
1250 1250
1251 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor s.get(majorAxisInitialPosition)); 1251 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi sInitialPosition));
1252 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos itions.integerSpan(), minorAxisSpanSize); 1252 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos itions.integerSpan(), minorAxisSpanSize);
1253 if (!emptyGridArea) 1253 if (!emptyGridArea)
1254 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 1254 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
1255 1255
1256 m_gridItemArea.set(autoGridItem, *emptyGridArea); 1256 m_gridItemArea.set(autoGridItem, *emptyGridArea);
1257 insertItemIntoGrid(*autoGridItem, *emptyGridArea); 1257 insertItemIntoGrid(*autoGridItem, *emptyGridArea);
1258 1258
1259 if (!isGridAutoFlowDense) 1259 if (!isGridAutoFlowDense)
1260 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition() : emptyGridArea->columns.resolvedInitial Position()); 1260 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.startLine() : emptyGridArea->columns.startLine());
1261 } 1261 }
1262 } 1262 }
1263 1263
1264 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems) 1264 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems)
1265 { 1265 {
1266 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); 1266 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0);
1267 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 1267 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
1268 1268
1269 for (const auto& autoGridItem : autoGridItems) { 1269 for (const auto& autoGridItem : autoGridItems) {
1270 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); 1270 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor);
(...skipping 12 matching lines...) Expand all
1283 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl atedDefinite()); 1283 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl atedDefinite());
1284 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( *style(), gridItem, autoPlacementMajorAxisDirection()); 1284 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( *style(), gridItem, autoPlacementMajorAxisDirection());
1285 1285
1286 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); 1286 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount();
1287 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; 1287 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first;
1288 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; 1288 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second;
1289 1289
1290 OwnPtr<GridArea> emptyGridArea; 1290 OwnPtr<GridArea> emptyGridArea;
1291 if (minorAxisPositions.isTranslatedDefinite()) { 1291 if (minorAxisPositions.isTranslatedDefinite()) {
1292 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor. 1292 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor.
1293 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen tCursor) 1293 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor)
1294 majorAxisAutoPlacementCursor++; 1294 majorAxisAutoPlacementCursor++;
1295 1295
1296 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1296 if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
1297 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); 1297 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.startLine(), majorAxisAutoPlacementCursor);
1298 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisSpanSize); 1298 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisSpanSize);
1299 } 1299 }
1300 1300
1301 if (!emptyGridArea) 1301 if (!emptyGridArea)
1302 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 1302 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
1303 } else { 1303 } else {
1304 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), gridItem, autoPlacementMinorAxisDirection()); 1304 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI tem(*style(), gridItem, autoPlacementMinorAxisDirection());
1305 1305
1306 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) { 1306 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) {
1307 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor); 1307 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor);
1308 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA xisSpanSize); 1308 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA xisSpanSize);
1309 1309
1310 if (emptyGridArea) { 1310 if (emptyGridArea) {
1311 // 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()). 1311 // 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()).
1312 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri dArea->rows.resolvedFinalPosition(); 1312 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec tion() == ForColumns ? emptyGridArea->columns.endLine() : emptyGridArea->rows.en dLine();
1313 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); 1313 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount();
1314 if (minorAxisFinalPositionIndex <= endOfMinorAxis) 1314 if (minorAxisFinalPositionIndex <= endOfMinorAxis)
1315 break; 1315 break;
1316 1316
1317 // Discard empty grid area as it does not fit in the minor axis direction. 1317 // Discard empty grid area as it does not fit in the minor axis direction.
1318 // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration. 1318 // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration.
1319 emptyGridArea = nullptr; 1319 emptyGridArea = nullptr;
1320 } 1320 }
1321 1321
1322 // As we're moving to the next track in the major axis we should res et the auto-placement cursor in the minor axis. 1322 // As we're moving to the next track in the major axis we should res et the auto-placement cursor in the minor axis.
1323 minorAxisAutoPlacementCursor = 0; 1323 minorAxisAutoPlacementCursor = 0;
1324 } 1324 }
1325 1325
1326 if (!emptyGridArea) 1326 if (!emptyGridArea)
1327 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan (0, minorAxisSpanSize)); 1327 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan (0, minorAxisSpanSize));
1328 } 1328 }
1329 1329
1330 m_gridItemArea.set(&gridItem, *emptyGridArea); 1330 m_gridItemArea.set(&gridItem, *emptyGridArea);
1331 insertItemIntoGrid(gridItem, *emptyGridArea); 1331 insertItemIntoGrid(gridItem, *emptyGridArea);
1332 // Move auto-placement cursor to the new position. 1332 // Move auto-placement cursor to the new position.
1333 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition(); 1333 autoPlacementCursor.first = emptyGridArea->rows.startLine();
1334 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition( ); 1334 autoPlacementCursor.second = emptyGridArea->columns.startLine();
1335 } 1335 }
1336 1336
1337 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const 1337 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const
1338 { 1338 {
1339 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; 1339 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows;
1340 } 1340 }
1341 1341
1342 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const 1342 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const
1343 { 1343 {
1344 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; 1344 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 applyStretchAlignmentToChildIfNeeded(*child); 1431 applyStretchAlignmentToChildIfNeeded(*child);
1432 1432
1433 child->layoutIfNeeded(); 1433 child->layoutIfNeeded();
1434 1434
1435 // We need pending layouts to be done in order to compute auto-margins p roperly. 1435 // We need pending layouts to be done in order to compute auto-margins p roperly.
1436 updateAutoMarginsInColumnAxisIfNeeded(*child); 1436 updateAutoMarginsInColumnAxisIfNeeded(*child);
1437 updateAutoMarginsInRowAxisIfNeeded(*child); 1437 updateAutoMarginsInRowAxisIfNeeded(*child);
1438 1438
1439 #if ENABLE(ASSERT) 1439 #if ENABLE(ASSERT)
1440 const GridArea& area = cachedGridArea(*child); 1440 const GridArea& area = cachedGridArea(*child);
1441 ASSERT(area.columns.resolvedInitialPosition() < sizingData.columnTracks. size()); 1441 ASSERT(area.columns.startLine() < sizingData.columnTracks.size());
1442 ASSERT(area.rows.resolvedInitialPosition() < sizingData.rowTracks.size() ); 1442 ASSERT(area.rows.startLine() < sizingData.rowTracks.size());
1443 #endif 1443 #endif
1444 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); 1444 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
1445 1445
1446 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is 1446 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is
1447 // not visible 1447 // not visible
1448 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight 1448 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight
1449 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h) 1449 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h)
1450 m_gridItemsOverflowingGridArea.append(child); 1450 m_gridItemsOverflowingGridArea.append(child);
1451 } 1451 }
1452 } 1452 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1498 1498
1499 GridSpan positions = GridPositionsResolver::resolveGridPositionsFromStyle(*s tyle(), child, direction); 1499 GridSpan positions = GridPositionsResolver::resolveGridPositionsFromStyle(*s tyle(), child, direction);
1500 if (positions.isIndefinite()) { 1500 if (positions.isIndefinite()) {
1501 offset = LayoutUnit(); 1501 offset = LayoutUnit();
1502 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); 1502 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight();
1503 return; 1503 return;
1504 } 1504 }
1505 1505
1506 // For positioned items we cannot use GridSpan::translate(). Because we coul d end up with negative values, as the positioned items do not create implicit tr acks per spec. 1506 // For positioned items we cannot use GridSpan::translate(). Because we coul d end up with negative values, as the positioned items do not create implicit tr acks per spec.
1507 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow Start); 1507 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow Start);
1508 int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition( ) + smallestStart; 1508 int startLine = positions.untranslatedStartLine() + smallestStart;
1509 int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() + smallestStart; 1509 int endLine = positions.untranslatedEndLine() + smallestStart;
1510 1510
1511 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart(); 1511 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart();
1512 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c hild.style()->gridRowEnd(); 1512 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c hild.style()->gridRowEnd();
1513 int firstExplicitLine = smallestStart; 1513 int firstExplicitLine = smallestStart;
1514 int lastExplicitLine = (isForColumns ? GridPositionsResolver::explicitGridCo lumnCount(styleRef()) : GridPositionsResolver::explicitGridRowCount(styleRef())) + smallestStart; 1514 int lastExplicitLine = (isForColumns ? GridPositionsResolver::explicitGridCo lumnCount(styleRef()) : GridPositionsResolver::explicitGridRowCount(styleRef())) + smallestStart;
1515 1515
1516 bool startIsAuto = startPosition.isAuto() 1516 bool startIsAuto = startPosition.isAuto()
1517 || (startPosition.isNamedGridArea() && !GridPositionsResolver::isValidNa medLineOrArea(startPosition.namedGridLine(), styleRef(), GridPositionsResolver:: initialPositionSide(direction))) 1517 || (startPosition.isNamedGridArea() && !GridPositionsResolver::isValidNa medLineOrArea(startPosition.namedGridLine(), styleRef(), GridPositionsResolver:: initialPositionSide(direction)))
1518 || (resolvedInitialPosition < firstExplicitLine) 1518 || (startLine < firstExplicitLine)
1519 || (resolvedInitialPosition > lastExplicitLine); 1519 || (startLine > lastExplicitLine);
1520 bool endIsAuto = endPosition.isAuto() 1520 bool endIsAuto = endPosition.isAuto()
1521 || (endPosition.isNamedGridArea() && !GridPositionsResolver::isValidName dLineOrArea(endPosition.namedGridLine(), styleRef(), GridPositionsResolver::fina lPositionSide(direction))) 1521 || (endPosition.isNamedGridArea() && !GridPositionsResolver::isValidName dLineOrArea(endPosition.namedGridLine(), styleRef(), GridPositionsResolver::fina lPositionSide(direction)))
1522 || (resolvedFinalPosition < firstExplicitLine) 1522 || (endLine < firstExplicitLine)
1523 || (resolvedFinalPosition > lastExplicitLine); 1523 || (endLine > lastExplicitLine);
1524 1524
1525 size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition; 1525 size_t initialPosition = startIsAuto ? 0 : startLine;
1526 size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition; 1526 size_t finalPosition = endIsAuto ? lastExplicitLine : endLine;
1527 1527
1528 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi tions[initialPosition] : m_rowPositions[initialPosition]; 1528 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi tions[initialPosition] : m_rowPositions[initialPosition];
1529 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight() : isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi on]; 1529 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight() : isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi on];
1530 1530
1531 breadth = end - start; 1531 breadth = end - start;
1532 1532
1533 if (startIsAuto) 1533 if (startIsAuto)
1534 breadth -= isForColumns ? borderStart() : borderBefore(); 1534 breadth -= isForColumns ? borderStart() : borderBefore();
1535 else 1535 else
1536 start -= isForColumns ? borderStart() : borderBefore(); 1536 start -= isForColumns ? borderStart() : borderBefore();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 return gridAreaBreadth; 1576 return gridAreaBreadth;
1577 } 1577 }
1578 1578
1579 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const 1579 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const
1580 { 1580 {
1581 // We need the cached value when available because Content Distribution alig nment properties 1581 // We need the cached value when available because Content Distribution alig nment properties
1582 // may have some influence in the final grid area breadth. 1582 // may have some influence in the final grid area breadth.
1583 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks; 1583 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks;
1584 const GridSpan& span = cachedGridSpan(child, direction); 1584 const GridSpan& span = cachedGridSpan(child, direction);
1585 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions; 1585 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions;
1586 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition ()]; 1586 LayoutUnit initialTrackPosition = linePositions[span.startLine()];
1587 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition() - 1]; 1587 LayoutUnit finalTrackPosition = linePositions[span.endLine() - 1];
1588 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize. 1588 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize.
1589 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal Position() - 1].baseSize(); 1589 return finalTrackPosition - initialTrackPosition + tracks[span.endLine() - 1 ].baseSize();
1590 } 1590 }
1591 1591
1592 void LayoutGrid::populateGridPositions(GridSizingData& sizingData) 1592 void LayoutGrid::populateGridPositions(GridSizingData& sizingData)
1593 { 1593 {
1594 // Since we add alignment offsets and track gutters, grid lines are not alwa ys adjacent. Hence we will have to 1594 // Since we add alignment offsets and track gutters, grid lines are not alwa ys adjacent. Hence we will have to
1595 // assume from now on that we just store positions of the initial grid lines of each track, 1595 // assume from now on that we just store positions of the initial grid lines of each track,
1596 // except the last one, which is the only one considered as a final grid lin e of a track. 1596 // except the last one, which is the only one considered as a final grid lin e of a track.
1597 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are 1597 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are
1598 // using these positions to compute them. 1598 // using these positions to compute them.
1599 1599
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1886 1886
1887 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio n, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) 1887 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio n, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth)
1888 { 1888 {
1889 return (distribution == ContentDistributionStretch || ContentDistributionStr etch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPo sitions[0] - childBreadth; 1889 return (distribution == ContentDistributionStretch || ContentDistributionStr etch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPo sitions[0] - childBreadth;
1890 1890
1891 } 1891 }
1892 1892
1893 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const 1893 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const
1894 { 1894 {
1895 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); 1895 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows);
1896 size_t childStartLine = rowsSpan.resolvedInitialPosition(); 1896 size_t childStartLine = rowsSpan.startLine();
1897 LayoutUnit startOfRow = m_rowPositions[childStartLine]; 1897 LayoutUnit startOfRow = m_rowPositions[childStartLine];
1898 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); 1898 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
1899 if (hasAutoMarginsInColumnAxis(child)) 1899 if (hasAutoMarginsInColumnAxis(child))
1900 return startPosition; 1900 return startPosition;
1901 GridAxisPosition axisPosition = columnAxisPositionForChild(child); 1901 GridAxisPosition axisPosition = columnAxisPositionForChild(child);
1902 switch (axisPosition) { 1902 switch (axisPosition) {
1903 case GridAxisStart: 1903 case GridAxisStart:
1904 return startPosition; 1904 return startPosition;
1905 case GridAxisEnd: 1905 case GridAxisEnd:
1906 case GridAxisCenter: { 1906 case GridAxisCenter: {
1907 size_t childEndLine = rowsSpan.resolvedFinalPosition(); 1907 size_t childEndLine = rowsSpan.endLine();
1908 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1908 LayoutUnit endOfRow = m_rowPositions[childEndLine];
1909 // m_rowPositions include gutters so we need to subtract them to get the actual end position for a given 1909 // m_rowPositions include gutters so we need to subtract them to get the actual end position for a given
1910 // row (this does not have to be done for the last track as there are no more m_rowPositions after it) 1910 // row (this does not have to be done for the last track as there are no more m_rowPositions after it)
1911 if (childEndLine < m_rowPositions.size() - 1) 1911 if (childEndLine < m_rowPositions.size() - 1)
1912 endOfRow -= guttersSize(ForRows, 2); 1912 endOfRow -= guttersSize(ForRows, 2);
1913 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght(); 1913 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght();
1914 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1) 1914 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1)
1915 endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistr ibution(normalValueBehavior()), m_rowPositions, childBreadth); 1915 endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistr ibution(normalValueBehavior()), m_rowPositions, childBreadth);
1916 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow(); 1916 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow();
1917 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, childBreadth); 1917 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, childBreadth);
1918 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1918 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1919 } 1919 }
1920 } 1920 }
1921 1921
1922 ASSERT_NOT_REACHED(); 1922 ASSERT_NOT_REACHED();
1923 return LayoutUnit(); 1923 return LayoutUnit();
1924 } 1924 }
1925 1925
1926 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const 1926 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const
1927 { 1927 {
1928 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); 1928 const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns);
1929 size_t childStartLine = columnsSpan.resolvedInitialPosition(); 1929 size_t childStartLine = columnsSpan.startLine();
1930 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; 1930 LayoutUnit startOfColumn = m_columnPositions[childStartLine];
1931 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); 1931 LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
1932 if (hasAutoMarginsInRowAxis(child)) 1932 if (hasAutoMarginsInRowAxis(child))
1933 return startPosition; 1933 return startPosition;
1934 GridAxisPosition axisPosition = rowAxisPositionForChild(child); 1934 GridAxisPosition axisPosition = rowAxisPositionForChild(child);
1935 switch (axisPosition) { 1935 switch (axisPosition) {
1936 case GridAxisStart: 1936 case GridAxisStart:
1937 return startPosition; 1937 return startPosition;
1938 case GridAxisEnd: 1938 case GridAxisEnd:
1939 case GridAxisCenter: { 1939 case GridAxisCenter: {
1940 size_t childEndLine = columnsSpan.resolvedFinalPosition(); 1940 size_t childEndLine = columnsSpan.endLine();
1941 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1941 LayoutUnit endOfColumn = m_columnPositions[childEndLine];
1942 // m_columnPositions include gutters so we need to subtract them to get the actual end position for a given 1942 // m_columnPositions include gutters so we need to subtract them to get the actual end position for a given
1943 // column (this does not have to be done for the last track as there are no more m_columnPositions after it) 1943 // column (this does not have to be done for the last track as there are no more m_columnPositions after it)
1944 if (childEndLine < m_columnPositions.size() - 1) 1944 if (childEndLine < m_columnPositions.size() - 1)
1945 endOfColumn -= guttersSize(ForRows, 2); 1945 endOfColumn -= guttersSize(ForRows, 2);
1946 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h(); 1946 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h();
1947 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1) 1947 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1)
1948 endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContent Distribution(normalValueBehavior()), m_columnPositions, childBreadth); 1948 endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContent Distribution(normalValueBehavior()), m_columnPositions, childBreadth);
1949 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth); 1949 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth);
1950 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1950 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 2069
2070 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2070 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
2071 } 2071 }
2072 2072
2073 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2073 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2074 { 2074 {
2075 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2075 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2076 } 2076 }
2077 2077
2078 } // namespace blink 2078 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp ('k') | third_party/WebKit/Source/core/style/GridArea.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698