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

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

Issue 1870623002: [css-grid] Fix positioned items with content alignment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Patch for landing Created 4 years, 8 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 | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | 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 1521 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 } 1532 }
1533 1533
1534 LayoutUnit end = isForColumns ? clientLogicalWidth() : clientLogicalHeight() ; 1534 LayoutUnit end = isForColumns ? clientLogicalWidth() : clientLogicalHeight() ;
1535 if (!endIsAuto) { 1535 if (!endIsAuto) {
1536 if (isForColumns) 1536 if (isForColumns)
1537 end = m_columnPositions[endLine] - m_columnPositions[0] + paddingSta rt(); 1537 end = m_columnPositions[endLine] - m_columnPositions[0] + paddingSta rt();
1538 else 1538 else
1539 end = m_rowPositions[endLine] - m_rowPositions[0] + paddingBefore(); 1539 end = m_rowPositions[endLine] - m_rowPositions[0] + paddingBefore();
1540 1540
1541 // These vectors store line positions including gaps, but we shouldn't c onsider them for the edges of the grid. 1541 // These vectors store line positions including gaps, but we shouldn't c onsider them for the edges of the grid.
1542 if (endLine > firstExplicitLine && endLine < lastExplicitLine) 1542 if (endLine > firstExplicitLine && endLine < lastExplicitLine) {
1543 end -= guttersSize(direction, 2); 1543 end -= guttersSize(direction, 2);
1544 end -= isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
1545 }
1544 } 1546 }
1545 1547
1548 LayoutUnit alignmentOffset = isForColumns ? m_columnPositions[0] - borderAnd PaddingStart() : m_rowPositions[0] - borderAndPaddingBefore();
1549 if (isForColumns && !styleRef().isLeftToRightDirection())
1550 alignmentOffset = contentLogicalWidth() - (m_columnPositions[m_columnPos itions.size() - 1] - borderAndPaddingStart());
1551
1552 if (!startIsAuto)
1553 start += alignmentOffset;
1554 if (!endIsAuto)
1555 end += alignmentOffset;
1556
1546 breadth = end - start; 1557 breadth = end - start;
1547 offset = start; 1558 offset = start;
1548 1559
1549 if (isForColumns && !styleRef().isLeftToRightDirection() && !child.styleRef( ).hasStaticInlinePosition(child.isHorizontalWritingMode())) { 1560 if (isForColumns && !styleRef().isLeftToRightDirection() && !child.styleRef( ).hasStaticInlinePosition(child.isHorizontalWritingMode())) {
1550 // If the child doesn't have a static inline position (i.e. "left" and/o r "right" aren't "auto", 1561 // If the child doesn't have a static inline position (i.e. "left" and/o r "right" aren't "auto",
1551 // we need to calculate the offset from the left (even if we're in RTL). 1562 // we need to calculate the offset from the left (even if we're in RTL).
1552 if (endIsAuto) { 1563 if (endIsAuto) {
1553 offset = LayoutUnit(); 1564 offset = LayoutUnit();
1554 } else { 1565 } else {
1555 LayoutUnit alignmentOffset = m_columnPositions[0] - borderAndPaddin gStart(); 1566 alignmentOffset = m_columnPositions[0] - borderAndPaddingStart();
1556 LayoutUnit offsetFromLastLine = m_columnPositions[m_columnPositions. size() - 1] - m_columnPositions[endLine]; 1567 LayoutUnit offsetFromLastLine = m_columnPositions[m_columnPositions. size() - 1] - m_columnPositions[endLine];
1557 offset = paddingLeft() + alignmentOffset + offsetFromLastLine; 1568 offset = paddingLeft() + alignmentOffset + offsetFromLastLine;
1558 1569
1559 if (endLine > firstExplicitLine && endLine < lastExplicitLine) 1570 if (endLine > firstExplicitLine && endLine < lastExplicitLine) {
1560 offset += guttersSize(direction, 2); 1571 offset += guttersSize(direction, 2);
1572 offset += isForColumns ? m_offsetBetweenColumns : m_offsetBetwee nRows;
1573 }
1561 } 1574 }
1562 } 1575 }
1563 1576
1564 if (child.parent() == this && !startIsAuto) { 1577 if (child.parent() == this && !startIsAuto) {
1565 // If column/row start is "auto" the static position has been already se t in prepareChildForPositionedLayout(). 1578 // If column/row start is "auto" the static position has been already se t in prepareChildForPositionedLayout().
1566 PaintLayer* childLayer = child.layer(); 1579 PaintLayer* childLayer = child.layer();
1567 if (isForColumns) 1580 if (isForColumns)
1568 childLayer->setStaticInlinePosition(borderStart() + offset); 1581 childLayer->setStaticInlinePosition(borderStart() + offset);
1569 else 1582 else
1570 childLayer->setStaticBlockPosition(borderBefore() + offset); 1583 childLayer->setStaticBlockPosition(borderBefore() + offset);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 unsigned numberOfLines = numberOfTracks + 1; 1633 unsigned numberOfLines = numberOfTracks + 1;
1621 unsigned lastLine = numberOfLines - 1; 1634 unsigned lastLine = numberOfLines - 1;
1622 unsigned nextToLastLine = numberOfLines - 2; 1635 unsigned nextToLastLine = numberOfLines - 2;
1623 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, sizingData.freeSpaceForDirection(ForColumns), numberOfTracks); 1636 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(Fo rColumns, sizingData.freeSpaceForDirection(ForColumns), numberOfTracks);
1624 LayoutUnit trackGap = guttersSize(ForColumns, 2); 1637 LayoutUnit trackGap = guttersSize(ForColumns, 2);
1625 m_columnPositions.resize(numberOfLines); 1638 m_columnPositions.resize(numberOfLines);
1626 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; 1639 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset;
1627 for (unsigned i = 0; i < lastLine; ++i) 1640 for (unsigned i = 0; i < lastLine; ++i)
1628 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap; 1641 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOff set + sizingData.columnTracks[i].baseSize() + trackGap;
1629 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize(); 1642 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData .columnTracks[nextToLastLine].baseSize();
1643 m_offsetBetweenColumns = offset.distributionOffset;
1630 1644
1631 numberOfTracks = sizingData.rowTracks.size(); 1645 numberOfTracks = sizingData.rowTracks.size();
1632 numberOfLines = numberOfTracks + 1; 1646 numberOfLines = numberOfTracks + 1;
1633 lastLine = numberOfLines - 1; 1647 lastLine = numberOfLines - 1;
1634 nextToLastLine = numberOfLines - 2; 1648 nextToLastLine = numberOfLines - 2;
1635 offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.fre eSpaceForDirection(ForRows), numberOfTracks); 1649 offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.fre eSpaceForDirection(ForRows), numberOfTracks);
1636 trackGap = guttersSize(ForRows, 2); 1650 trackGap = guttersSize(ForRows, 2);
1637 m_rowPositions.resize(numberOfLines); 1651 m_rowPositions.resize(numberOfLines);
1638 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; 1652 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset;
1639 for (unsigned i = 0; i < lastLine; ++i) 1653 for (unsigned i = 0; i < lastLine; ++i)
1640 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap; 1654 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize() + trackGap;
1641 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize(); 1655 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTr acks[nextToLastLine].baseSize();
1656 m_offsetBetweenRows = offset.distributionOffset;
1642 } 1657 }
1643 1658
1644 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) 1659 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth)
1645 { 1660 {
1646 LayoutUnit offset = trackBreadth - childBreadth; 1661 LayoutUnit offset = trackBreadth - childBreadth;
1647 switch (overflow) { 1662 switch (overflow) {
1648 case OverflowAlignmentSafe: 1663 case OverflowAlignmentSafe:
1649 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' 1664 // If overflow is 'safe', we have to make sure we don't overflow the 'st art'
1650 // edge (potentially cause some data loss as the overflow is unreachable ). 1665 // edge (potentially cause some data loss as the overflow is unreachable ).
1651 return offset.clampNegativeToZero(); 1666 return offset.clampNegativeToZero();
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1859 // crbug.com/234191 1874 // crbug.com/234191
1860 return GridAxisStart; 1875 return GridAxisStart;
1861 case ItemPositionAuto: 1876 case ItemPositionAuto:
1862 break; 1877 break;
1863 } 1878 }
1864 1879
1865 ASSERT_NOT_REACHED(); 1880 ASSERT_NOT_REACHED();
1866 return GridAxisStart; 1881 return GridAxisStart;
1867 } 1882 }
1868 1883
1869 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio n, const Vector<GridTrack>& trackSizes, const Vector<LayoutUnit>& trackPositions , LayoutUnit trackGap)
1870 {
1871 // FIXME: Perhaps a good idea to cache the result of this operation, since t he ContentDistribution offset between tracks is always the same,
1872 return (distribution == ContentDistributionStretch || distribution == Conten tDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPositions[0] - t rackSizes[0].baseSize() - trackGap;
1873 }
1874
1875 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child, GridSizi ngData& sizingData) const 1884 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child, GridSizi ngData& sizingData) const
1876 { 1885 {
1877 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); 1886 const GridSpan& rowsSpan = cachedGridSpan(child, ForRows);
1878 size_t childStartLine = rowsSpan.startLine(); 1887 size_t childStartLine = rowsSpan.startLine();
1879 LayoutUnit startOfRow = m_rowPositions[childStartLine]; 1888 LayoutUnit startOfRow = m_rowPositions[childStartLine];
1880 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); 1889 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
1881 if (hasAutoMarginsInColumnAxis(child)) 1890 if (hasAutoMarginsInColumnAxis(child))
1882 return startPosition; 1891 return startPosition;
1883 GridAxisPosition axisPosition = columnAxisPositionForChild(child); 1892 GridAxisPosition axisPosition = columnAxisPositionForChild(child);
1884 switch (axisPosition) { 1893 switch (axisPosition) {
1885 case GridAxisStart: 1894 case GridAxisStart:
1886 return startPosition; 1895 return startPosition;
1887 case GridAxisEnd: 1896 case GridAxisEnd:
1888 case GridAxisCenter: { 1897 case GridAxisCenter: {
1889 size_t childEndLine = rowsSpan.endLine(); 1898 size_t childEndLine = rowsSpan.endLine();
1890 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1899 LayoutUnit endOfRow = m_rowPositions[childEndLine];
1891 // m_rowPositions include gutters so we need to subtract them to get the actual end position for a given 1900 // m_rowPositions include gutters so we need to subtract them to get the actual end position for a given
1892 // row (this does not have to be done for the last track as there are no more m_rowPositions after it) 1901 // row (this does not have to be done for the last track as there are no more m_rowPositions after it)
1893 LayoutUnit trackGap = guttersSize(ForRows, 2); 1902 LayoutUnit trackGap = guttersSize(ForRows, 2);
1894 if (childEndLine < m_rowPositions.size() - 1) 1903 if (childEndLine < m_rowPositions.size() - 1)
1895 endOfRow -= trackGap; 1904 endOfRow -= trackGap;
1896 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght(); 1905 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght();
1897 // The track's start and end lines may be not adjacent because of conten t alignment, so we assume the stored 1906 // The track's start and end lines may be not adjacent because of conten t alignment, so we assume the stored
1898 // lines are all start plus a content-alignment distribution offset. 1907 // lines are all start plus a content-alignment distribution offset.
1899 // We must subtract last line's offset because is not part of the track the items belongs to. 1908 // We must subtract last line's offset because is not part of the track the items belongs to.
1900 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1) 1909 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.s ize() - 1)
1901 endOfRow -= offsetBetweenTracks(styleRef().resolvedAlignContentDistr ibution(normalValueBehavior()), sizingData.rowTracks, m_rowPositions, trackGap); 1910 endOfRow -= m_offsetBetweenRows;
1902 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow(); 1911 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow();
1903 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, childBreadth); 1912 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, childBreadth);
1904 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1913 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1905 } 1914 }
1906 } 1915 }
1907 1916
1908 ASSERT_NOT_REACHED(); 1917 ASSERT_NOT_REACHED();
1909 return LayoutUnit(); 1918 return LayoutUnit();
1910 } 1919 }
1911 1920
(...skipping 16 matching lines...) Expand all
1928 // m_columnPositions include gutters so we need to subtract them to get the actual end position for a given 1937 // m_columnPositions include gutters so we need to subtract them to get the actual end position for a given
1929 // column (this does not have to be done for the last track as there are no more m_columnPositions after it) 1938 // column (this does not have to be done for the last track as there are no more m_columnPositions after it)
1930 LayoutUnit trackGap = guttersSize(ForColumns, 2); 1939 LayoutUnit trackGap = guttersSize(ForColumns, 2);
1931 if (childEndLine < m_columnPositions.size() - 1) 1940 if (childEndLine < m_columnPositions.size() - 1)
1932 endOfColumn -= trackGap; 1941 endOfColumn -= trackGap;
1933 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h(); 1942 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h();
1934 // The track's start and end lines may be not adjacent because of conten t alignment, so we assume the stored 1943 // The track's start and end lines may be not adjacent because of conten t alignment, so we assume the stored
1935 // lines are all start plus a content-alignment distribution offset. 1944 // lines are all start plus a content-alignment distribution offset.
1936 // We must subtract last line's offset because is not part of the track the items belongs to. 1945 // We must subtract last line's offset because is not part of the track the items belongs to.
1937 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1) 1946 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPosition s.size() - 1)
1938 endOfColumn -= offsetBetweenTracks(styleRef().resolvedJustifyContent Distribution(normalValueBehavior()), sizingData.columnTracks, m_columnPositions, trackGap); 1947 endOfColumn -= m_offsetBetweenColumns;
1939 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth); 1948 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth);
1940 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 1949 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
1941 } 1950 }
1942 } 1951 }
1943 1952
1944 ASSERT_NOT_REACHED(); 1953 ASSERT_NOT_REACHED();
1945 return LayoutUnit(); 1954 return LayoutUnit();
1946 } 1955 }
1947 1956
1948 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution) 1957 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution)
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
2059 2068
2060 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData )); 2069 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData ));
2061 } 2070 }
2062 2071
2063 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2072 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2064 { 2073 {
2065 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2074 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2066 } 2075 }
2067 2076
2068 } // namespace blink 2077 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698