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

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

Issue 1309513008: [css-grid] Implement grid gutters (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Changes after rune's review Created 5 years, 2 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 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 341
342 computeOverflow(oldClientAfterEdge); 342 computeOverflow(oldClientAfterEdge);
343 } 343 }
344 344
345 updateLayerTransformAfterLayout(); 345 updateLayerTransformAfterLayout();
346 updateScrollInfoAfterLayout(); 346 updateScrollInfoAfterLayout();
347 347
348 clearNeedsLayout(); 348 clearNeedsLayout();
349 } 349 }
350 350
351 LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t sp an) const
352 {
353 ASSERT(span >= 1);
354
355 if (span == 1)
356 return 0;
357
358 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap( ) : styleRef().gridRowGap();
359 return valueForLength(trackGap, 0) * (span - 1);
360 }
361
351 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const 362 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const
352 { 363 {
353 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); 364 const_cast<LayoutGrid*>(this)->placeItemsOnGrid();
354 365
355 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 366 GridSizingData sizingData(gridColumnCount(), gridRowCount());
356 LayoutUnit availableLogicalSpace = 0; 367 LayoutUnit availableLogicalSpace = 0;
357 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, availableLogicalSpace); 368 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, availableLogicalSpace);
358 369
359 for (const auto& column : sizingData.columnTracks) { 370 for (const auto& column : sizingData.columnTracks) {
360 const LayoutUnit& minTrackBreadth = column.baseSize(); 371 const LayoutUnit& minTrackBreadth = column.baseSize();
361 const LayoutUnit& maxTrackBreadth = column.growthLimit(); 372 const LayoutUnit& maxTrackBreadth = column.growthLimit();
362 373
363 minLogicalWidth += minTrackBreadth; 374 minLogicalWidth += minTrackBreadth;
364 maxLogicalWidth += maxTrackBreadth; 375 maxLogicalWidth += maxTrackBreadth;
365 } 376 }
366 377
378 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack s.size());
379 minLogicalWidth += totalGuttersSize;
380 maxLogicalWidth += totalGuttersSize;
381
367 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); 382 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth();
368 minLogicalWidth += scrollbarWidth; 383 minLogicalWidth += scrollbarWidth;
369 maxLogicalWidth += scrollbarWidth; 384 maxLogicalWidth += scrollbarWidth;
370 } 385 }
371 386
372 bool LayoutGrid::gridElementIsShrinkToFit() 387 bool LayoutGrid::gridElementIsShrinkToFit()
373 { 388 {
374 return isFloatingOrOutOfFlowPositioned(); 389 return isFloatingOrOutOfFlowPositioned();
375 } 390 }
376 391
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 945
931 sizingData.filteredTracks.append(&track); 946 sizingData.filteredTracks.append(&track);
932 947
933 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize)) 948 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize))
934 sizingData.growBeyondGrowthLimitsTracks.append(&track); 949 sizingData.growBeyondGrowthLimitsTracks.append(&track);
935 } 950 }
936 951
937 if (sizingData.filteredTracks.isEmpty()) 952 if (sizingData.filteredTracks.isEmpty())
938 continue; 953 continue;
939 954
955 spanningTracksSize += guttersSize(direction, itemSpan.integerSpan());
956
940 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr acksSize; 957 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr acksSize;
941 extraSpace = std::max<LayoutUnit>(extraSpace, 0); 958 extraSpace = std::max<LayoutUnit>(extraSpace, 0);
942 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks; 959 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks;
943 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace); 960 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace);
944 } 961 }
945 962
946 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 963 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
947 GridTrack& track = tracks[trackIndex]; 964 GridTrack& track = tracks[trackIndex];
948 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track); 965 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track);
949 updateTrackSizeForTrackSizeComputationPhase(phase, track); 966 updateTrackSizeForTrackSizeComputationPhase(phase, track);
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 track->setBaseSize(baseSize); 1305 track->setBaseSize(baseSize);
1289 } 1306 }
1290 } 1307 }
1291 1308
1292 void LayoutGrid::layoutGridItems() 1309 void LayoutGrid::layoutGridItems()
1293 { 1310 {
1294 placeItemsOnGrid(); 1311 placeItemsOnGrid();
1295 1312
1296 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); 1313 LayoutUnit availableSpaceForColumns = availableLogicalWidth();
1297 LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorde rPadding); 1314 LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorde rPadding);
1315
1316 // Remove space consumed by gutters from the available logical space.
1317 availableSpaceForColumns -= guttersSize(ForColumns, gridColumnCount());
1318 availableSpaceForRows -= guttersSize(ForRows, gridRowCount());
1319
1298 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 1320 GridSizingData sizingData(gridColumnCount(), gridRowCount());
1299 computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColu mns); 1321 computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColu mns);
1300 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks )); 1322 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks ));
1301 computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows); 1323 computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows);
1302 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks)); 1324 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks));
1303 1325
1304 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData, availableSpace ForColumns); 1326 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData, availableSpace ForColumns);
1305 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData, availableSpaceFor Rows); 1327 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData, availableSpaceFor Rows);
1306 1328
1307 populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceFo rRows); 1329 populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceFo rRows);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 #endif 1368 #endif
1347 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); 1369 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
1348 1370
1349 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is 1371 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is
1350 // not visible 1372 // not visible
1351 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight 1373 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight
1352 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h) 1374 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h)
1353 m_gridItemsOverflowingGridArea.append(child); 1375 m_gridItemsOverflowingGridArea.append(child);
1354 } 1376 }
1355 1377
1378 LayoutUnit height = borderAndPaddingLogicalHeight() + scrollbarLogicalHeight ();
1356 for (const auto& row : sizingData.rowTracks) 1379 for (const auto& row : sizingData.rowTracks)
1357 setLogicalHeight(logicalHeight() + row.baseSize()); 1380 height += row.baseSize();
1358 1381
1359 LayoutUnit height = logicalHeight() + borderAndPaddingLogicalHeight() + scro llbarLogicalHeight(); 1382 height += guttersSize(ForRows, sizingData.rowTracks.size());
1383
1360 if (hasLineIfEmpty()) 1384 if (hasLineIfEmpty())
1361 height = std::max(height, minimumLogicalHeightForEmptyLine()); 1385 height = std::max(height, minimumLogicalHeightForEmptyLine());
1362 1386
1363 // Min / max logical height is handled by the call to updateLogicalHeight in layoutBlock. 1387 // Min / max logical height is handled by the call to updateLogicalHeight in layoutBlock.
1364 setLogicalHeight(height); 1388 setLogicalHeight(height);
1365 } 1389 }
1366 1390
1367 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child) 1391 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child)
1368 { 1392 {
1369 ASSERT(child.isOutOfFlowPositioned()); 1393 ASSERT(child.isOutOfFlowPositioned());
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 return m_gridItemCoordinate.get(&gridItem); 1492 return m_gridItemCoordinate.get(&gridItem);
1469 } 1493 }
1470 1494
1471 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const 1495 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const
1472 { 1496 {
1473 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1497 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1474 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows; 1498 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows;
1475 LayoutUnit gridAreaBreadth = 0; 1499 LayoutUnit gridAreaBreadth = 0;
1476 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition) 1500 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition)
1477 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize(); 1501 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize();
1502
1503 gridAreaBreadth += guttersSize(direction, span.integerSpan());
1504
1478 return gridAreaBreadth; 1505 return gridAreaBreadth;
1479 } 1506 }
1480 1507
1481 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const 1508 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const
1482 { 1509 {
1483 // We need the cached value when available because Content Distribution alig nment properties 1510 // We need the cached value when available because Content Distribution alig nment properties
1484 // may have some influence in the final grid area breadth. 1511 // may have some influence in the final grid area breadth.
1485 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks; 1512 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks;
1486 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1513 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1487 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows; 1514 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows;
1488 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions; 1515 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions;
1489 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition .toInt()]; 1516 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition .toInt()];
1490 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toI nt()]; 1517 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toI nt()];
1491 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize. 1518 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize.
1492 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal Position.toInt()].baseSize(); 1519 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal Position.toInt()].baseSize();
1493 } 1520 }
1494 1521
1495 void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av ailableSpaceForColumns, LayoutUnit availableSpaceForRows) 1522 void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av ailableSpaceForColumns, LayoutUnit availableSpaceForRows)
1496 { 1523 {
1497 // Since we add alignment offsets, grid lines are not always adjacent. Hence we will have to 1524 // Since we add alignment offsets and track gutters, grid lines are not alwa ys adjacent. Hence we will have to
1498 // assume from now on that we just store positions of the initial grid lines of each track, 1525 // assume from now on that we just store positions of the initial grid lines of each track,
1499 // except the last one, which is the only one considered as a final grid lin e of a track. 1526 // except the last one, which is the only one considered as a final grid lin e of a track.
1500 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are 1527 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are
1501 // using these positions to compute them. 1528 // using these positions to compute them.
1502 1529
1503 unsigned numberOfTracks = sizingData.columnTracks.size(); 1530 unsigned numberOfTracks = sizingData.columnTracks.size();
1504 unsigned numberOfLines = numberOfTracks + 1; 1531 unsigned numberOfLines = numberOfTracks + 1;
1505 unsigned lastLine = numberOfLines - 1; 1532 unsigned lastLine = numberOfLines - 1;
1506 unsigned nextToLastLine = numberOfLines - 2; 1533 unsigned nextToLastLine = numberOfLines - 2;
1507 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, availableSpaceForColumns, numberOfTracks); 1534 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, availableSpaceForColumns, numberOfTracks);
1535 LayoutUnit trackGap = guttersSize(ForColumns, 2);
1508 m_columnPositions.resize(numberOfLines); 1536 m_columnPositions.resize(numberOfLines);
1509 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; 1537 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset;
1510 for (unsigned i = 0; i < lastLine; ++i) 1538 for (unsigned i = 0; i < lastLine; ++i)
1511 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize(); 1539 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap;
1512 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize(); 1540 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize();
1513 1541
1514 numberOfTracks = sizingData.rowTracks.size(); 1542 numberOfTracks = sizingData.rowTracks.size();
1515 numberOfLines = numberOfTracks + 1; 1543 numberOfLines = numberOfTracks + 1;
1516 lastLine = numberOfLines - 1; 1544 lastLine = numberOfLines - 1;
1517 nextToLastLine = numberOfLines - 2; 1545 nextToLastLine = numberOfLines - 2;
1518 offset = computeContentPositionAndDistributionOffset(ForRows, availableSpace ForRows, numberOfTracks); 1546 offset = computeContentPositionAndDistributionOffset(ForRows, availableSpace ForRows, numberOfTracks);
1547 trackGap = guttersSize(ForRows, 2);
1519 m_rowPositions.resize(numberOfLines); 1548 m_rowPositions.resize(numberOfLines);
1520 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; 1549 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset;
1521 for (unsigned i = 0; i < lastLine; ++i) 1550 for (unsigned i = 0; i < lastLine; ++i)
1522 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize(); 1551 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap;
1523 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize(); 1552 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize();
1524 } 1553 }
1525 1554
1526 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) 1555 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth)
1527 { 1556 {
1528 LayoutUnit offset = trackBreadth - childBreadth; 1557 LayoutUnit offset = trackBreadth - childBreadth;
1529 switch (overflow) { 1558 switch (overflow) {
1530 case OverflowAlignmentSafe: 1559 case OverflowAlignmentSafe:
1531 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' 1560 // If overflow is 'safe', we have to make sure we don't overflow the 'st art'
1532 // edge (potentially cause some data loss as the overflow is unreachable ). 1561 // edge (potentially cause some data loss as the overflow is unreachable ).
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 if (hasAutoMarginsInColumnAxis(child)) 1846 if (hasAutoMarginsInColumnAxis(child))
1818 return startPosition; 1847 return startPosition;
1819 GridAxisPosition axisPosition = columnAxisPositionForChild(child); 1848 GridAxisPosition axisPosition = columnAxisPositionForChild(child);
1820 switch (axisPosition) { 1849 switch (axisPosition) {
1821 case GridAxisStart: 1850 case GridAxisStart:
1822 return startPosition; 1851 return startPosition;
1823 case GridAxisEnd: 1852 case GridAxisEnd:
1824 case GridAxisCenter: { 1853 case GridAxisCenter: {
1825 size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt (); 1854 size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt ();
1826 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1855 LayoutUnit endOfRow = m_rowPositions[childEndLine];
1856 // m_rowPositions include gutters so we need to substract them to get th e actual end position for a given
1857 // row (this does not have to be done for the last track as there are no more m_rowPositions after it)
1858 if (childEndLine < m_rowPositions.size() - 1)
1859 endOfRow -= guttersSize(ForRows, 2);
1827 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght(); 1860 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght();
1828 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1) 1861 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1)
1829 endOfRow -= offsetBetweenTracks(styleRef().alignContentDistribution( ), m_rowPositions, childBreadth); 1862 endOfRow -= offsetBetweenTracks(styleRef().alignContentDistribution( ), m_rowPositions, childBreadth);
1830 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, childBreadth); 1863 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, childBreadth);
1831 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1864 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1832 } 1865 }
1833 } 1866 }
1834 1867
1835 ASSERT_NOT_REACHED(); 1868 ASSERT_NOT_REACHED();
1836 return 0; 1869 return 0;
1837 } 1870 }
1838 1871
1839 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const 1872 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const
1840 { 1873 {
1841 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1874 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1842 size_t childStartLine = coordinate.columns.resolvedInitialPosition.toInt(); 1875 size_t childStartLine = coordinate.columns.resolvedInitialPosition.toInt();
1843 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; 1876 LayoutUnit startOfColumn = m_columnPositions[childStartLine];
1844 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); 1877 LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
1845 if (hasAutoMarginsInRowAxis(child)) 1878 if (hasAutoMarginsInRowAxis(child))
1846 return startPosition; 1879 return startPosition;
1847 GridAxisPosition axisPosition = rowAxisPositionForChild(child); 1880 GridAxisPosition axisPosition = rowAxisPositionForChild(child);
1848 switch (axisPosition) { 1881 switch (axisPosition) {
1849 case GridAxisStart: 1882 case GridAxisStart:
1850 return startPosition; 1883 return startPosition;
1851 case GridAxisEnd: 1884 case GridAxisEnd:
1852 case GridAxisCenter: { 1885 case GridAxisCenter: {
1853 size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().to Int(); 1886 size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().to Int();
1854 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1887 LayoutUnit endOfColumn = m_columnPositions[childEndLine];
1888 // m_columnPositions include gutters so we need to substract them to get the actual end position for a given
1889 // column (this does not have to be done for the last track as there are no more m_columnPositions after it)
1890 if (childEndLine < m_columnPositions.size() - 1)
1891 endOfColumn -= guttersSize(ForRows, 2);
1855 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h(); 1892 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h();
1856 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1) 1893 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1)
1857 endOfColumn -= offsetBetweenTracks(styleRef().justifyContentDistribu tion(), m_columnPositions, childBreadth); 1894 endOfColumn -= offsetBetweenTracks(styleRef().justifyContentDistribu tion(), m_columnPositions, childBreadth);
1858 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth); 1895 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth);
1859 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1896 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1860 } 1897 }
1861 } 1898 }
1862 1899
1863 ASSERT_NOT_REACHED(); 1900 ASSERT_NOT_REACHED();
1864 return 0; 1901 return 0;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 2027
1991 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2028 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
1992 } 2029 }
1993 2030
1994 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2031 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
1995 { 2032 {
1996 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2033 GridPainter(*this).paintChildren(paintInfo, paintOffset);
1997 } 2034 }
1998 2035
1999 } // namespace blink 2036 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698