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

Side by Side Diff: 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: Fixed test cases Created 5 years, 3 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
« no previous file with comments | « Source/core/layout/LayoutGrid.h ('k') | Source/core/style/ComputedStyle.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 363
364 computeOverflow(oldClientAfterEdge); 364 computeOverflow(oldClientAfterEdge);
365 } 365 }
366 366
367 updateLayerTransformAfterLayout(); 367 updateLayerTransformAfterLayout();
368 updateScrollInfoAfterLayout(); 368 updateScrollInfoAfterLayout();
369 369
370 clearNeedsLayout(); 370 clearNeedsLayout();
371 } 371 }
372 372
373 LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t sp an) const
374 {
375 if (span == 1)
376 return 0;
377
378 DEFINE_STATIC_LOCAL(LayoutUnit, zero, ());
esprehn 2015/10/01 08:46:48 LayoutUnit is basically just an int, don't define
svillar 2015/10/02 10:00:29 Acknowledged.
379 const Length& trackGap = direction == ForColumns ? styleRef().gridColumnGap( ) : styleRef().gridRowGap();
380 return valueForLength(trackGap, zero) * (span - 1);
esprehn 2015/10/01 08:46:48 just pass 0, it'll be made into a LayoutUnit if s
svillar 2015/10/02 10:00:29 span cannot be negative as it is a size_t. In any
381 }
382
373 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const 383 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const
374 { 384 {
375 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(); 385 const_cast<LayoutGrid*>(this)->placeItemsOnGrid();
376 386
377 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 387 GridSizingData sizingData(gridColumnCount(), gridRowCount());
378 LayoutUnit availableLogicalSpace = 0; 388 LayoutUnit availableLogicalSpace = 0;
379 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, availableLogicalSpace); 389 const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, si zingData, availableLogicalSpace);
380 390
381 for (const auto& column : sizingData.columnTracks) { 391 for (const auto& column : sizingData.columnTracks) {
382 const LayoutUnit& minTrackBreadth = column.baseSize(); 392 const LayoutUnit& minTrackBreadth = column.baseSize();
383 const LayoutUnit& maxTrackBreadth = column.growthLimit(); 393 const LayoutUnit& maxTrackBreadth = column.growthLimit();
384 394
385 minLogicalWidth += minTrackBreadth; 395 minLogicalWidth += minTrackBreadth;
386 maxLogicalWidth += maxTrackBreadth; 396 maxLogicalWidth += maxTrackBreadth;
387 } 397 }
388 398
399 LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTrack s.size());
400 minLogicalWidth += totalGuttersSize;
401 maxLogicalWidth += totalGuttersSize;
402
389 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); 403 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth();
390 minLogicalWidth += scrollbarWidth; 404 minLogicalWidth += scrollbarWidth;
391 maxLogicalWidth += scrollbarWidth; 405 maxLogicalWidth += scrollbarWidth;
392 } 406 }
393 407
394 bool LayoutGrid::gridElementIsShrinkToFit() 408 bool LayoutGrid::gridElementIsShrinkToFit()
395 { 409 {
396 return isFloatingOrOutOfFlowPositioned(); 410 return isFloatingOrOutOfFlowPositioned();
397 } 411 }
398 412
399 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& freeSpace) 413 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& freeSpace)
400 { 414 {
401 const LayoutUnit initialFreeSpace = freeSpace; 415 const LayoutUnit initialFreeSpace = freeSpace;
402 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; 416 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks;
417
403 Vector<size_t> flexibleSizedTracksIndex; 418 Vector<size_t> flexibleSizedTracksIndex;
404 sizingData.contentSizedTracksIndex.shrink(0); 419 sizingData.contentSizedTracksIndex.shrink(0);
405 420
406 // 1. Initialize per Grid track variables. 421 // 1. Initialize per Grid track variables.
407 for (size_t i = 0; i < tracks.size(); ++i) { 422 for (size_t i = 0; i < tracks.size(); ++i) {
408 GridTrack& track = tracks[i]; 423 GridTrack& track = tracks[i];
409 GridTrackSize trackSize = gridTrackSize(direction, i); 424 GridTrackSize trackSize = gridTrackSize(direction, i);
410 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); 425 const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
411 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); 426 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
412 427
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 961
947 sizingData.filteredTracks.append(&track); 962 sizingData.filteredTracks.append(&track);
948 963
949 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize)) 964 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph ase, trackSize))
950 sizingData.growBeyondGrowthLimitsTracks.append(&track); 965 sizingData.growBeyondGrowthLimitsTracks.append(&track);
951 } 966 }
952 967
953 if (sizingData.filteredTracks.isEmpty()) 968 if (sizingData.filteredTracks.isEmpty())
954 continue; 969 continue;
955 970
971 spanningTracksSize += guttersSize(direction, itemSpan.integerSpan());
972
956 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr acksSize; 973 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr acksSize;
957 extraSpace = std::max<LayoutUnit>(extraSpace, 0); 974 extraSpace = std::max<LayoutUnit>(extraSpace, 0);
958 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks; 975 auto& tracksToGrowBeyondGrowthLimits = sizingData.growBeyondGrowthLimits Tracks.isEmpty() ? sizingData.filteredTracks : sizingData.growBeyondGrowthLimits Tracks;
959 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace); 976 distributeSpaceToTracks<phase>(sizingData.filteredTracks, &tracksToGrowB eyondGrowthLimits, sizingData, extraSpace);
960 } 977 }
961 978
962 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 979 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
963 GridTrack& track = tracks[trackIndex]; 980 GridTrack& track = tracks[trackIndex];
964 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track); 981 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track);
965 updateTrackSizeForTrackSizeComputationPhase(phase, track); 982 updateTrackSizeForTrackSizeComputationPhase(phase, track);
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 track->setBaseSize(baseSize); 1319 track->setBaseSize(baseSize);
1303 } 1320 }
1304 } 1321 }
1305 1322
1306 void LayoutGrid::layoutGridItems() 1323 void LayoutGrid::layoutGridItems()
1307 { 1324 {
1308 placeItemsOnGrid(); 1325 placeItemsOnGrid();
1309 1326
1310 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); 1327 LayoutUnit availableSpaceForColumns = availableLogicalWidth();
1311 LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorde rPadding); 1328 LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorde rPadding);
1329
1330 // Remove space consumed by gutters from the available logical space.
1331 availableSpaceForColumns -= guttersSize(ForColumns, gridColumnCount());
1332 availableSpaceForRows -= guttersSize(ForRows, gridRowCount());
1333
1312 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 1334 GridSizingData sizingData(gridColumnCount(), gridRowCount());
1313 computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColu mns); 1335 computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColu mns);
1314 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks )); 1336 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks ));
1315 computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows); 1337 computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows);
1316 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks)); 1338 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks));
1317 1339
1318 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData, availableSpace ForColumns); 1340 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData, availableSpace ForColumns);
1319 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData, availableSpaceFor Rows); 1341 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData, availableSpaceFor Rows);
1320 1342
1321 populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceFo rRows); 1343 populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceFo rRows);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 #endif 1378 #endif
1357 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); 1379 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
1358 1380
1359 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is 1381 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is
1360 // not visible 1382 // not visible
1361 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight 1383 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight
1362 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h) 1384 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h)
1363 m_gridItemsOverflowingGridArea.append(child); 1385 m_gridItemsOverflowingGridArea.append(child);
1364 } 1386 }
1365 1387
1388 LayoutUnit height = borderAndPaddingLogicalHeight();
1366 for (const auto& row : sizingData.rowTracks) 1389 for (const auto& row : sizingData.rowTracks)
1367 setLogicalHeight(logicalHeight() + row.baseSize()); 1390 height += row.baseSize();
1368 1391
1369 LayoutUnit height = logicalHeight() + borderAndPaddingLogicalHeight(); 1392 height += guttersSize(ForRows, sizingData.rowTracks.size());
1393
1370 if (hasLineIfEmpty()) 1394 if (hasLineIfEmpty())
1371 height = std::max(height, minimumLogicalHeightForEmptyLine()); 1395 height = std::max(height, minimumLogicalHeightForEmptyLine());
1372 1396
1373 // Min / max logical height is handled by the call to updateLogicalHeight in layoutBlock. 1397 // Min / max logical height is handled by the call to updateLogicalHeight in layoutBlock.
1374 setLogicalHeight(height); 1398 setLogicalHeight(height);
1375 } 1399 }
1376 1400
1377 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child) 1401 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child)
1378 { 1402 {
1379 ASSERT(child.isOutOfFlowPositioned()); 1403 ASSERT(child.isOutOfFlowPositioned());
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 return m_gridItemCoordinate.get(&gridItem); 1495 return m_gridItemCoordinate.get(&gridItem);
1472 } 1496 }
1473 1497
1474 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const 1498 LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack SizingDirection direction, const Vector<GridTrack>& tracks) const
1475 { 1499 {
1476 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1500 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1477 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows; 1501 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows;
1478 LayoutUnit gridAreaBreadth = 0; 1502 LayoutUnit gridAreaBreadth = 0;
1479 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition) 1503 for (GridSpan::iterator trackPosition = span.begin(); trackPosition != span. end(); ++trackPosition)
1480 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize(); 1504 gridAreaBreadth += tracks[trackPosition.toInt()].baseSize();
1505
1506 gridAreaBreadth += guttersSize(direction, span.integerSpan());
1507
1481 return gridAreaBreadth; 1508 return gridAreaBreadth;
1482 } 1509 }
1483 1510
1484 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const 1511 LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La youtBox& child, GridTrackSizingDirection direction, const GridSizingData& sizing Data) const
1485 { 1512 {
1486 // We need the cached value when available because Content Distribution alig nment properties 1513 // We need the cached value when available because Content Distribution alig nment properties
1487 // may have some influence in the final grid area breadth. 1514 // may have some influence in the final grid area breadth.
1488 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks; 1515 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks;
1489 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1516 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1490 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows; 1517 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows;
1491 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions; 1518 const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_colu mnPositions : m_rowPositions;
1492 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition .toInt()]; 1519 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition .toInt()];
1493 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toI nt()]; 1520 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toI nt()];
1494 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize. 1521 // Track Positions vector stores the 'start' grid line of each track, so w h ave to add last track's baseSize.
1495 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal Position.toInt()].baseSize(); 1522 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinal Position.toInt()].baseSize();
1496 } 1523 }
1497 1524
1498 void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av ailableSpaceForColumns, LayoutUnit availableSpaceForRows) 1525 void LayoutGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit av ailableSpaceForColumns, LayoutUnit availableSpaceForRows)
1499 { 1526 {
1500 // Since we add alignment offsets, grid lines are not always adjacent. Hence we will have to 1527 // Since we add alignment offsets and track gutters, grid lines are not alwa ys adjacent. Hence we will have to
1501 // assume from now on that we just store positions of the initial grid lines of each track, 1528 // assume from now on that we just store positions of the initial grid lines of each track,
1502 // except the last one, which is the only one considered as a final grid lin e of a track. 1529 // except the last one, which is the only one considered as a final grid lin e of a track.
1503 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are 1530 // FIXME: This will affect the computed style value of grid tracks size, sin ce we are
1504 // using these positions to compute them. 1531 // using these positions to compute them.
1505 1532
1506 unsigned numberOfTracks = sizingData.columnTracks.size(); 1533 unsigned numberOfTracks = sizingData.columnTracks.size();
1507 unsigned numberOfLines = numberOfTracks + 1; 1534 unsigned numberOfLines = numberOfTracks + 1;
1508 unsigned lastLine = numberOfLines - 1; 1535 unsigned lastLine = numberOfLines - 1;
1509 unsigned nextToLastLine = numberOfLines - 2; 1536 unsigned nextToLastLine = numberOfLines - 2;
1510 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, availableSpaceForColumns, numberOfTracks); 1537 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, availableSpaceForColumns, numberOfTracks);
1538 LayoutUnit trackGap = guttersSize(ForColumns, 2);
1511 m_columnPositions.resize(numberOfLines); 1539 m_columnPositions.resize(numberOfLines);
1512 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; 1540 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset;
1513 for (unsigned i = 0; i < lastLine; ++i) 1541 for (unsigned i = 0; i < lastLine; ++i)
1514 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize(); 1542 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap;
1515 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize(); 1543 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize();
1516 1544
1517 numberOfTracks = sizingData.rowTracks.size(); 1545 numberOfTracks = sizingData.rowTracks.size();
1518 numberOfLines = numberOfTracks + 1; 1546 numberOfLines = numberOfTracks + 1;
1519 lastLine = numberOfLines - 1; 1547 lastLine = numberOfLines - 1;
1520 nextToLastLine = numberOfLines - 2; 1548 nextToLastLine = numberOfLines - 2;
1521 offset = computeContentPositionAndDistributionOffset(ForRows, availableSpace ForRows, numberOfTracks); 1549 offset = computeContentPositionAndDistributionOffset(ForRows, availableSpace ForRows, numberOfTracks);
1550 trackGap = guttersSize(ForRows, 2);
1522 m_rowPositions.resize(numberOfLines); 1551 m_rowPositions.resize(numberOfLines);
1523 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; 1552 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset;
1524 for (unsigned i = 0; i < lastLine; ++i) 1553 for (unsigned i = 0; i < lastLine; ++i)
1525 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize(); 1554 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap;
1526 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize(); 1555 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize();
1527 } 1556 }
1528 1557
1529 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) 1558 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth)
1530 { 1559 {
1531 LayoutUnit offset = trackBreadth - childBreadth; 1560 LayoutUnit offset = trackBreadth - childBreadth;
1532 switch (overflow) { 1561 switch (overflow) {
1533 case OverflowAlignmentSafe: 1562 case OverflowAlignmentSafe:
1534 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' 1563 // If overflow is 'safe', we have to make sure we don't overflow the 'st art'
1535 // edge (potentially cause some data loss as the overflow is unreachable ). 1564 // edge (potentially cause some data loss as the overflow is unreachable ).
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
1756 { 1785 {
1757 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1786 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1758 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPositi on.toInt()]; 1787 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPositi on.toInt()];
1759 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); 1788 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
1760 GridAxisPosition axisPosition = columnAxisPositionForChild(child); 1789 GridAxisPosition axisPosition = columnAxisPositionForChild(child);
1761 switch (axisPosition) { 1790 switch (axisPosition) {
1762 case GridAxisStart: 1791 case GridAxisStart:
1763 return startPosition; 1792 return startPosition;
1764 case GridAxisEnd: 1793 case GridAxisEnd:
1765 case GridAxisCenter: { 1794 case GridAxisCenter: {
1766 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPositi on.next().toInt()]; 1795 size_t childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt ();
1796 LayoutUnit endOfRow = m_rowPositions[childEndLine];
1797 // // m_rowPositions include gutters so we need to substract them to get the actual end position for a given
cbiesinger 2015/09/30 15:22:42 remove one of the //
1798 // // row (this does not have to be done for the last track as there are no more m_rowPositions after it)
1799 if (childEndLine < m_rowPositions.size() - 1)
1800 endOfRow -= guttersSize(ForRows, 2);
1767 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalH eight() + child.marginLogicalHeight()); 1801 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalH eight() + child.marginLogicalHeight());
1768 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1802 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1769 } 1803 }
1770 } 1804 }
1771 1805
1772 ASSERT_NOT_REACHED(); 1806 ASSERT_NOT_REACHED();
1773 return 0; 1807 return 0;
1774 } 1808 }
1775 1809
1776 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const 1810 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const
1777 { 1811 {
1778 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1812 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1779 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInit ialPosition.toInt()]; 1813 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInit ialPosition.toInt()];
1780 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); 1814 LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
1781 GridAxisPosition axisPosition = rowAxisPositionForChild(child); 1815 GridAxisPosition axisPosition = rowAxisPositionForChild(child);
1782 switch (axisPosition) { 1816 switch (axisPosition) {
1783 case GridAxisStart: 1817 case GridAxisStart:
1784 return startPosition; 1818 return startPosition;
1785 case GridAxisEnd: 1819 case GridAxisEnd:
1786 case GridAxisCenter: { 1820 case GridAxisCenter: {
1787 LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFi nalPosition.next().toInt()]; 1821 size_t childEndLine = coordinate.columns.resolvedFinalPosition.next().to Int();
1822 LayoutUnit endOfColumn = m_columnPositions[childEndLine];
1823 // m_columnPositions include gutters so we need to substract them to get the actual end position for a given
1824 // column (this does not have to be done for the last track as there are no more m_columnPositions after it)
1825 if (childEndLine < m_columnPositions.size() - 1)
1826 endOfColumn -= guttersSize(ForRows, 2);
1788 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child. logicalWidth() + child.marginLogicalWidth()); 1827 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child. logicalWidth() + child.marginLogicalWidth());
1789 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1828 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1790 } 1829 }
1791 } 1830 }
1792 1831
1793 ASSERT_NOT_REACHED(); 1832 ASSERT_NOT_REACHED();
1794 return 0; 1833 return 0;
1795 } 1834 }
1796 1835
1797 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution) 1836 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1920 1959
1921 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 1960 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
1922 } 1961 }
1923 1962
1924 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) 1963 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset)
1925 { 1964 {
1926 GridPainter(*this).paintChildren(paintInfo, paintOffset); 1965 GridPainter(*this).paintChildren(paintInfo, paintOffset);
1927 } 1966 }
1928 1967
1929 } // namespace blink 1968 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutGrid.h ('k') | Source/core/style/ComputedStyle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698