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

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

Issue 842193004: [css-grid] Handle alignment with orthogonal flows (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@orthogonal-flows
Patch Set: Added the TODO comment suggested. Created 4 years, 5 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 1804 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 1815
1816 LayoutUnit sizeToIncrease = availableSpace / numberOfAutoSizedTracks; 1816 LayoutUnit sizeToIncrease = availableSpace / numberOfAutoSizedTracks;
1817 for (const auto& trackIndex : autoSizedTracksIndex) { 1817 for (const auto& trackIndex : autoSizedTracksIndex) {
1818 GridTrack* track = tracks.data() + trackIndex; 1818 GridTrack* track = tracks.data() + trackIndex;
1819 LayoutUnit baseSize = track->baseSize() + sizeToIncrease; 1819 LayoutUnit baseSize = track->baseSize() + sizeToIncrease;
1820 track->setBaseSize(baseSize); 1820 track->setBaseSize(baseSize);
1821 } 1821 }
1822 availableSpace = LayoutUnit(); 1822 availableSpace = LayoutUnit();
1823 } 1823 }
1824 1824
1825 bool LayoutGrid::isChildOverflowingContainingBlockHeight(const LayoutBox& child) const
1826 {
1827 // TODO (lajava) We must consider margins to determine whether it overflows or not (see https://crbug/628155)
1828 LayoutUnit containingBlockContentHeight = child.hasOverrideContainingBlockHe ight() ? child.overrideContainingBlockContentHeight() : LayoutUnit();
1829 return child.size().height() > containingBlockContentHeight;
1830 }
1831
1832 bool LayoutGrid::isChildOverflowingContainingBlockWidth(const LayoutBox& child) const
1833 {
1834 // TODO (lajava) We must consider margins to determine whether it overflows or not (see https://crbug/628155)
1835 LayoutUnit containingBlockContentWidth = child.hasOverrideContainingBlockWid th() ? child.overrideContainingBlockContentWidth() : LayoutUnit();
1836 return child.size().width() > containingBlockContentWidth;
1837 }
1838
1825 void LayoutGrid::layoutGridItems(GridSizingData& sizingData) 1839 void LayoutGrid::layoutGridItems(GridSizingData& sizingData)
1826 { 1840 {
1827 populateGridPositionsForDirection(sizingData, ForColumns); 1841 populateGridPositionsForDirection(sizingData, ForColumns);
1828 populateGridPositionsForDirection(sizingData, ForRows); 1842 populateGridPositionsForDirection(sizingData, ForRows);
1829 m_gridItemsOverflowingGridArea.resize(0); 1843 m_gridItemsOverflowingGridArea.resize(0);
1830 1844
1831 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) { 1845 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) {
1832 if (child->isOutOfFlowPositioned()) { 1846 if (child->isOutOfFlowPositioned()) {
1833 prepareChildForPositionedLayout(*child); 1847 prepareChildForPositionedLayout(*child);
1834 continue; 1848 continue;
1835 } 1849 }
1836 1850
1837 // Because the grid area cannot be styled, we don't need to adjust 1851 // Because the grid area cannot be styled, we don't need to adjust
1838 // the grid breadth to account for 'box-sizing'. 1852 // the grid breadth to account for 'box-sizing'.
1839 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit(); 1853 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit();
1840 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit(); 1854 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit();
1841 1855
1842 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChildIncludingAlignmentOffsets(*child, ForColumns, sizingData); 1856 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChildIncludingAlignmentOffsets(*child, ForColumns, sizingData);
1843 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChildIncludingAlignmentOffsets(*child, ForRows, sizingData); 1857 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChildIncludingAlignmentOffsets(*child, ForRows, sizingData);
1844 1858
1845 SubtreeLayoutScope layoutScope(*child); 1859 SubtreeLayoutScope layoutScope(*child);
1846 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (oldOverrideContainingBlockContentLogicalHeight != ov errideContainingBlockContentLogicalHeight && (child->hasRelativeLogicalHeight() || isOrthogonalChild(*child)))) 1860 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (oldOverrideContainingBlockContentLogicalHeight != ov errideContainingBlockContentLogicalHeight && child->hasRelativeLogicalHeight()))
svillar 2016/07/20 09:23:36 Why don't we need to force a layout for orthogonal
jfernandez 2016/07/20 13:46:14 Sincerely, that condition has been added in r40124
1847 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::GridChan ged); 1861 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::GridChan ged);
1848 1862
1849 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth); 1863 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth);
1850 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight); 1864 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight);
1851 1865
1852 // Stretching logic might force a child layout, so we need to run it bef ore the layoutIfNeeded 1866 // Stretching logic might force a child layout, so we need to run it bef ore the layoutIfNeeded
1853 // call to avoid unnecessary relayouts. This might imply that child marg ins, needed to correctly 1867 // call to avoid unnecessary relayouts. This might imply that child marg ins, needed to correctly
1854 // determine the available space before stretching, are not set yet. 1868 // determine the available space before stretching, are not set yet.
1855 applyStretchAlignmentToChildIfNeeded(*child); 1869 applyStretchAlignmentToChildIfNeeded(*child);
1856 1870
1857 child->layoutIfNeeded(); 1871 child->layoutIfNeeded();
1858 1872
1859 // We need pending layouts to be done in order to compute auto-margins p roperly. 1873 // We need pending layouts to be done in order to compute auto-margins p roperly.
1860 updateAutoMarginsInColumnAxisIfNeeded(*child); 1874 updateAutoMarginsInColumnAxisIfNeeded(*child);
1861 updateAutoMarginsInRowAxisIfNeeded(*child); 1875 updateAutoMarginsInRowAxisIfNeeded(*child);
1862 1876
1863 #if ENABLE(ASSERT) 1877 #if ENABLE(ASSERT)
1864 const GridArea& area = cachedGridArea(*child); 1878 const GridArea& area = cachedGridArea(*child);
1865 ASSERT(area.columns.startLine() < sizingData.columnTracks.size()); 1879 ASSERT(area.columns.startLine() < sizingData.columnTracks.size());
1866 ASSERT(area.rows.startLine() < sizingData.rowTracks.size()); 1880 ASSERT(area.rows.startLine() < sizingData.rowTracks.size());
1867 #endif 1881 #endif
1868 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); 1882 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
1869 1883
1870 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is 1884 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is
1871 // not visible 1885 // not visible.
1872 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight 1886 // Using physical dimensions for simplicity, so we can forget about orth ogonalty.
1873 || child->logicalWidth() > overrideContainingBlockContentLogicalWidt h) 1887 if (isChildOverflowingContainingBlockHeight(*child)
1888 || isChildOverflowingContainingBlockWidth(*child))
svillar 2016/07/20 09:23:36 One line.
jfernandez 2016/07/20 13:46:14 Done.
1874 m_gridItemsOverflowingGridArea.append(child); 1889 m_gridItemsOverflowingGridArea.append(child);
1875 } 1890 }
1876 } 1891 }
1877 1892
1878 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child) 1893 void LayoutGrid::prepareChildForPositionedLayout(LayoutBox& child)
1879 { 1894 {
1880 ASSERT(child.isOutOfFlowPositioned()); 1895 ASSERT(child.isOutOfFlowPositioned());
1881 child.containingBlock()->insertPositionedObject(&child); 1896 child.containingBlock()->insertPositionedObject(&child);
1882 1897
1883 PaintLayer* childLayer = child.layer(); 1898 PaintLayer* childLayer = child.layer();
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
2110 } 2125 }
2111 positions[i] += gapAccumulator; 2126 positions[i] += gapAccumulator;
2112 } 2127 }
2113 positions[lastLine] += gapAccumulator; 2128 positions[lastLine] += gapAccumulator;
2114 } 2129 }
2115 } 2130 }
2116 auto& offsetBetweenTracks = isRowAxis ? m_offsetBetweenColumns : m_offsetBet weenRows; 2131 auto& offsetBetweenTracks = isRowAxis ? m_offsetBetweenColumns : m_offsetBet weenRows;
2117 offsetBetweenTracks = offset.distributionOffset; 2132 offsetBetweenTracks = offset.distributionOffset;
2118 } 2133 }
2119 2134
2120 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackBreadth, LayoutUnit childBreadth) 2135 static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow, Lay outUnit trackSize, LayoutUnit childSize)
2121 { 2136 {
2122 LayoutUnit offset = trackBreadth - childBreadth; 2137 LayoutUnit offset = trackSize - childSize;
2123 switch (overflow) { 2138 switch (overflow) {
2124 case OverflowAlignmentSafe: 2139 case OverflowAlignmentSafe:
2125 // If overflow is 'safe', we have to make sure we don't overflow the 'st art' 2140 // If overflow is 'safe', we have to make sure we don't overflow the 'st art'
2126 // edge (potentially cause some data loss as the overflow is unreachable ). 2141 // edge (potentially cause some data loss as the overflow is unreachable ).
2127 return offset.clampNegativeToZero(); 2142 return offset.clampNegativeToZero();
2128 case OverflowAlignmentUnsafe: 2143 case OverflowAlignmentUnsafe:
2129 case OverflowAlignmentDefault: 2144 case OverflowAlignmentDefault:
2130 // If we overflow our alignment container and overflow is 'true' (defaul t), we 2145 // If we overflow our alignment container and overflow is 'true' (defaul t), we
2131 // ignore the overflow and just return the value regardless (which may c ause data 2146 // ignore the overflow and just return the value regardless (which may c ause data
2132 // loss as we overflow the 'start' edge). 2147 // loss as we overflow the 'start' edge).
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2249 } else if (marginBefore.isAuto()) { 2264 } else if (marginBefore.isAuto()) {
2250 child.setMarginBefore(availableAlignmentSpace, style()); 2265 child.setMarginBefore(availableAlignmentSpace, style());
2251 } else if (marginAfter.isAuto()) { 2266 } else if (marginAfter.isAuto()) {
2252 child.setMarginAfter(availableAlignmentSpace, style()); 2267 child.setMarginAfter(availableAlignmentSpace, style());
2253 } 2268 }
2254 } 2269 }
2255 2270
2256 GridAxisPosition LayoutGrid::columnAxisPositionForChild(const LayoutBox& child) const 2271 GridAxisPosition LayoutGrid::columnAxisPositionForChild(const LayoutBox& child) const
2257 { 2272 {
2258 bool hasSameWritingMode = child.styleRef().getWritingMode() == styleRef().ge tWritingMode(); 2273 bool hasSameWritingMode = child.styleRef().getWritingMode() == styleRef().ge tWritingMode();
2259 2274
svillar 2016/07/20 09:23:36 I think it'd be a good idea to store in a bool the
jfernandez 2016/07/20 13:46:14 Acknowledged.
2260 switch (ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPo sitionStretch)) { 2275 switch (ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPo sitionStretch)) {
2261 case ItemPositionSelfStart: 2276 case ItemPositionSelfStart:
2262 // If orthogonal writing-modes, this computes to 'start'. 2277 // Aligns the alignment subject to be flush with the edge of the alignme nt container
2263 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. 2278 // corresponding to the alignment subject's 'start' side in the column a xis.
2264 // self-start is based on the child's block axis direction. That's why w e need to check against the grid container's block flow. 2279 if (isOrthogonalChild(child)) {
2265 return (isOrthogonalChild(child) || hasSameWritingMode) ? GridAxisStart : GridAxisEnd; 2280 // If orthogonal writing-modes, self-start will be based on the chil d's inline-axis
2281 // direction (inline-start), because it's the one parallel to the co lumn axis.
2282 if (isFlippedBlocksWritingMode(style()->getWritingMode()))
2283 return child.style()->isLeftToRightDirection() ? GridAxisEnd : G ridAxisStart;
2284 return child.style()->isLeftToRightDirection() ? GridAxisStart : Gri dAxisEnd;
2285 }
svillar 2016/07/20 09:23:36 I definitely think we should move this code block
jfernandez 2016/07/20 13:46:14 This logic, and the similar one implemented in row
2286 // self-start is based on the child's block-flow direction. That's why w e need to check against the grid container's block-flow direction.
2287 return hasSameWritingMode ? GridAxisStart : GridAxisEnd;
2266 case ItemPositionSelfEnd: 2288 case ItemPositionSelfEnd:
2267 // If orthogonal writing-modes, this computes to 'end'. 2289 // Aligns the alignment subject to be flush with the edge of the alignme nt container
2268 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. 2290 // corresponding to the alignment subject's 'end' side in the column axi s.
2269 // self-end is based on the child's block axis direction. That's why we need to check against the grid container's block flow. 2291 if (isOrthogonalChild(child)) {
2270 return (isOrthogonalChild(child) || hasSameWritingMode) ? GridAxisEnd : GridAxisStart; 2292 // If orthogonal writing-modes, self-end will be based on the child' s inline-axis
2293 // direction, (inline-end) because it's the one parallel to the colu mn axis.
2294 if (isFlippedBlocksWritingMode(style()->getWritingMode()))
2295 return child.style()->isLeftToRightDirection() ? GridAxisStart : GridAxisEnd;
2296 return child.style()->isLeftToRightDirection() ? GridAxisEnd : GridA xisStart;
2297 }
2298 // self-end is based on the child's block-flow direction. That's why we need to check against the grid container's block-flow direction.
2299 return hasSameWritingMode ? GridAxisEnd : GridAxisStart;
2271 case ItemPositionLeft: 2300 case ItemPositionLeft:
2272 // The alignment axis (column axis) and the inline axis are parallell in 2301 // Aligns the alignment subject to be flush with the alignment container 's 'line-left' edge.
2273 // orthogonal writing mode. Otherwise this this is equivalent to 'start' . 2302 // The alignment axis (column axis) is always orthogonal to the inline a xis, hence this value behaves as 'start'.
2274 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet.
2275 return GridAxisStart; 2303 return GridAxisStart;
2276 case ItemPositionRight: 2304 case ItemPositionRight:
2277 // The alignment axis (column axis) and the inline axis are parallell in 2305 // Aligns the alignment subject to be flush with the alignment container 's 'line-right' edge.
2278 // orthogonal writing mode. Otherwise this this is equivalent to 'start' . 2306 // The alignment axis (column axis) is always orthogonal to the inline a xis, hence this value behaves as 'start'.
2279 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. 2307 return GridAxisStart;
2280 return isOrthogonalChild(child) ? GridAxisEnd : GridAxisStart;
2281 case ItemPositionCenter: 2308 case ItemPositionCenter:
2282 return GridAxisCenter; 2309 return GridAxisCenter;
2283 case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalen t to 'start'. 2310 case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalen t to 'start'.
2311 // Aligns the alignment subject to be flush with the alignment container 's 'start' edge (block-start) in the column axis.
2284 case ItemPositionStart: 2312 case ItemPositionStart:
2285 return GridAxisStart; 2313 return GridAxisStart;
2286 case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'. 2314 case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
2315 // Aligns the alignment subject to be flush with the alignment container 's 'end' edge (block-end) in the column axis.
2287 case ItemPositionEnd: 2316 case ItemPositionEnd:
2288 return GridAxisEnd; 2317 return GridAxisEnd;
2289 case ItemPositionStretch: 2318 case ItemPositionStretch:
2290 return GridAxisStart; 2319 return GridAxisStart;
2291 case ItemPositionBaseline: 2320 case ItemPositionBaseline:
2292 case ItemPositionLastBaseline: 2321 case ItemPositionLastBaseline:
2293 // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child. 2322 // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child.
2294 // crbug.com/234191 2323 // crbug.com/234191
2295 return GridAxisStart; 2324 return GridAxisStart;
2296 case ItemPositionAuto: 2325 case ItemPositionAuto:
2297 break; 2326 break;
2298 } 2327 }
2299 2328
2300 ASSERT_NOT_REACHED(); 2329 ASSERT_NOT_REACHED();
2301 return GridAxisStart; 2330 return GridAxisStart;
2302 } 2331 }
2303 2332
2304 GridAxisPosition LayoutGrid::rowAxisPositionForChild(const LayoutBox& child) con st 2333 GridAxisPosition LayoutGrid::rowAxisPositionForChild(const LayoutBox& child) con st
2305 { 2334 {
2306 bool hasSameDirection = child.styleRef().direction() == styleRef().direction (); 2335 bool hasSameDirection = child.styleRef().direction() == styleRef().direction ();
2307 bool isLTR = styleRef().isLeftToRightDirection();
2308 2336
2309 switch (ComputedStyle::resolveJustification(styleRef(), child.styleRef(), It emPositionStretch)) { 2337 switch (ComputedStyle::resolveJustification(styleRef(), child.styleRef(), It emPositionStretch)) {
2310 case ItemPositionSelfStart: 2338 case ItemPositionSelfStart:
2311 // For orthogonal writing-modes, this computes to 'start' 2339 // Aligns the alignment subject to be flush with the edge of the alignme nt container
2312 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. 2340 // corresponding to the alignment subject's 'start' side in the row axis .
2313 // self-start is based on the child's direction. That's why we need to c heck against the grid container's direction. 2341 if (isOrthogonalChild(child)) {
2314 return (isOrthogonalChild(child) || hasSameDirection) ? GridAxisStart : GridAxisEnd; 2342 // If orthogonal writing-modes, self-start will be based on the chil d's block-axis
2343 // direction, because it's the one parallel to the row axis.
2344 if (isFlippedBlocksWritingMode(child.style()->getWritingMode()))
2345 return styleRef().isLeftToRightDirection() ? GridAxisEnd : GridA xisStart;
2346 return styleRef().isLeftToRightDirection() ? GridAxisStart : GridAxi sEnd;
2347 }
2348 // self-start is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
2349 return hasSameDirection ? GridAxisStart : GridAxisEnd;
2315 case ItemPositionSelfEnd: 2350 case ItemPositionSelfEnd:
2316 // For orthogonal writing-modes, this computes to 'start' 2351 // Aligns the alignment subject to be flush with the edge of the alignme nt container
2317 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. 2352 // corresponding to the alignment subject's 'end' side in the row axis.
2318 return (isOrthogonalChild(child) || hasSameDirection) ? GridAxisEnd : Gr idAxisStart; 2353 if (isOrthogonalChild(child)) {
2354 // If orthogonal writing-modes, self-end will be based on the child' s block-axis
2355 // direction, because it's the one parallel to the row axis.
2356 if (isFlippedBlocksWritingMode(child.style()->getWritingMode()))
2357 return styleRef().isLeftToRightDirection() ? GridAxisStart : Gri dAxisEnd;
2358 return styleRef().isLeftToRightDirection() ? GridAxisEnd : GridAxisS tart;
2359 }
2360 // self-end is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
2361 return hasSameDirection ? GridAxisEnd : GridAxisStart;
2319 case ItemPositionLeft: 2362 case ItemPositionLeft:
2320 return isLTR ? GridAxisStart : GridAxisEnd; 2363 // Aligns the alignment subject to be flush with the alignment container 's 'line-left' edge.
2364 // We want the physical 'left' side, so we have to take account, contain er's inline-flow direction.
2365 return styleRef().isLeftToRightDirection() ? GridAxisStart : GridAxisEnd ;
2321 case ItemPositionRight: 2366 case ItemPositionRight:
2322 return isLTR ? GridAxisEnd : GridAxisStart; 2367 // Aligns the alignment subject to be flush with the alignment container 's 'line-right' edge.
2368 // We want the physical 'right' side, so we have to take account, contai ner's inline-flow direction.
2369 return styleRef().isLeftToRightDirection() ? GridAxisEnd : GridAxisStart ;
2323 case ItemPositionCenter: 2370 case ItemPositionCenter:
2324 return GridAxisCenter; 2371 return GridAxisCenter;
2325 case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalen t to 'start'. 2372 case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalen t to 'start'.
2373 // Aligns the alignment subject to be flush with the alignment container 's 'start' edge (inline-start) in the row axis.
2326 case ItemPositionStart: 2374 case ItemPositionStart:
2327 return GridAxisStart; 2375 return GridAxisStart;
2328 case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'. 2376 case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
2377 // Aligns the alignment subject to be flush with the alignment container 's 'end' edge (inline-end) in the row axis.
2329 case ItemPositionEnd: 2378 case ItemPositionEnd:
2330 return GridAxisEnd; 2379 return GridAxisEnd;
2331 case ItemPositionStretch: 2380 case ItemPositionStretch:
2332 return GridAxisStart; 2381 return GridAxisStart;
2333 case ItemPositionBaseline: 2382 case ItemPositionBaseline:
2334 case ItemPositionLastBaseline: 2383 case ItemPositionLastBaseline:
2335 // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child. 2384 // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child.
2336 // crbug.com/234191 2385 // crbug.com/234191
2337 return GridAxisStart; 2386 return GridAxisStart;
2338 case ItemPositionAuto: 2387 case ItemPositionAuto:
(...skipping 21 matching lines...) Expand all
2360 size_t childEndLine = rowsSpan.endLine(); 2409 size_t childEndLine = rowsSpan.endLine();
2361 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 2410 LayoutUnit endOfRow = m_rowPositions[childEndLine];
2362 // m_rowPositions include distribution offset (because of content alignm ent) and gutters 2411 // m_rowPositions include distribution offset (because of content alignm ent) and gutters
2363 // so we need to subtract them to get the actual end position for a give n row 2412 // so we need to subtract them to get the actual end position for a give n row
2364 // (this does not have to be done for the last track as there are no mor e m_columnPositions after it). 2413 // (this does not have to be done for the last track as there are no mor e m_columnPositions after it).
2365 LayoutUnit trackGap = gridGapForDirection(ForRows); 2414 LayoutUnit trackGap = gridGapForDirection(ForRows);
2366 if (childEndLine < m_rowPositions.size() - 1) { 2415 if (childEndLine < m_rowPositions.size() - 1) {
2367 endOfRow -= trackGap; 2416 endOfRow -= trackGap;
2368 endOfRow -= m_offsetBetweenRows; 2417 endOfRow -= m_offsetBetweenRows;
2369 } 2418 }
2370 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHei ght(); 2419 LayoutUnit columnAxisChildSize = isOrthogonalChild(child) ? child.logica lWidth() + child.marginLogicalWidth() : child.logicalHeight() + child.marginLogi calHeight();
2371 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow(); 2420 OverflowAlignment overflow = child.styleRef().resolvedAlignment(styleRef (), ItemPositionStretch).overflow();
2372 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, childBreadth); 2421 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(over flow, endOfRow - startOfRow, columnAxisChildSize);
2373 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 2422 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
2374 } 2423 }
2375 } 2424 }
2376 2425
2377 ASSERT_NOT_REACHED(); 2426 ASSERT_NOT_REACHED();
2378 return LayoutUnit(); 2427 return LayoutUnit();
2379 } 2428 }
2380 2429
2381 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child, GridSizingD ata& sizingData) const 2430 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child, GridSizingD ata& sizingData) const
2382 { 2431 {
(...skipping 12 matching lines...) Expand all
2395 size_t childEndLine = columnsSpan.endLine(); 2444 size_t childEndLine = columnsSpan.endLine();
2396 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 2445 LayoutUnit endOfColumn = m_columnPositions[childEndLine];
2397 // m_columnPositions include distribution offset (because of content ali gnment) and gutters 2446 // m_columnPositions include distribution offset (because of content ali gnment) and gutters
2398 // so we need to subtract them to get the actual end position for a give n column 2447 // so we need to subtract them to get the actual end position for a give n column
2399 // (this does not have to be done for the last track as there are no mor e m_columnPositions after it). 2448 // (this does not have to be done for the last track as there are no mor e m_columnPositions after it).
2400 LayoutUnit trackGap = gridGapForDirection(ForColumns); 2449 LayoutUnit trackGap = gridGapForDirection(ForColumns);
2401 if (childEndLine < m_columnPositions.size() - 1) { 2450 if (childEndLine < m_columnPositions.size() - 1) {
2402 endOfColumn -= trackGap; 2451 endOfColumn -= trackGap;
2403 endOfColumn -= m_offsetBetweenColumns; 2452 endOfColumn -= m_offsetBetweenColumns;
2404 } 2453 }
2405 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidt h(); 2454 LayoutUnit rowAxisChildSize = isOrthogonalChild(child) ? child.logicalHe ight() + child.marginLogicalHeight() : child.logicalWidth() + child.marginLogica lWidth();
2406 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, childB readth); 2455 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, rowAxi sChildSize);
2407 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); 2456 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2);
2408 } 2457 }
2409 } 2458 }
2410 2459
2411 ASSERT_NOT_REACHED(); 2460 ASSERT_NOT_REACHED();
2412 return LayoutUnit(); 2461 return LayoutUnit();
2413 } 2462 }
2414 2463
2415 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution) 2464 ContentPosition static resolveContentDistributionFallback(ContentDistributionTyp e distribution)
2416 { 2465 {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2522 return rightGridEdgePosition + alignmentOffset - coordinate; 2571 return rightGridEdgePosition + alignmentOffset - coordinate;
2523 } 2572 }
2524 2573
2525 LayoutPoint LayoutGrid::findChildLogicalPosition(const LayoutBox& child, GridSiz ingData& sizingData) const 2574 LayoutPoint LayoutGrid::findChildLogicalPosition(const LayoutBox& child, GridSiz ingData& sizingData) const
2526 { 2575 {
2527 LayoutUnit columnAxisOffset = columnAxisOffsetForChild(child, sizingData); 2576 LayoutUnit columnAxisOffset = columnAxisOffsetForChild(child, sizingData);
2528 LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child, sizingData); 2577 LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child, sizingData);
2529 // We stored m_columnPosition's data ignoring the direction, hence we might need now 2578 // We stored m_columnPosition's data ignoring the direction, hence we might need now
2530 // to translate positions from RTL to LTR, as it's more convenient for paint ing. 2579 // to translate positions from RTL to LTR, as it's more convenient for paint ing.
2531 if (!style()->isLeftToRightDirection()) 2580 if (!style()->isLeftToRightDirection())
2532 rowAxisOffset = translateRTLCoordinate(rowAxisOffset) - child.logicalWid th(); 2581 rowAxisOffset = translateRTLCoordinate(rowAxisOffset) - (isOrthogonalChi ld(child) ? child.logicalHeight() : child.logicalWidth());
2533 2582
2534 // "In the positioning phase [...] calculations are performed according to t he writing mode 2583 // "In the positioning phase [...] calculations are performed according to t he writing mode
2535 // of the containing block of the box establishing the orthogonal flow." How ever, the 2584 // of the containing block of the box establishing the orthogonal flow." How ever, the
2536 // resulting LayoutPoint will be used in 'setLogicalPosition' in order to se t the child's 2585 // resulting LayoutPoint will be used in 'setLogicalPosition' in order to se t the child's
2537 // logical position, which will only take into account the child's writing-m ode. 2586 // logical position, which will only take into account the child's writing-m ode.
2538 LayoutPoint childLocation(rowAxisOffset, columnAxisOffset); 2587 LayoutPoint childLocation(rowAxisOffset, columnAxisOffset);
2539 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation; 2588 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation;
2540 } 2589 }
2541 2590
2542 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2591 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2543 { 2592 {
2544 if (!m_gridItemArea.isEmpty()) 2593 if (!m_gridItemArea.isEmpty())
2545 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2594 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2546 } 2595 }
2547 2596
2548 } // namespace blink 2597 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698