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

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

Issue 2536703002: [css-grid] Pass Grid as argument to the items' placements methods (Closed)
Patch Set: Created 4 years 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 613 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); 624 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope);
625 625
626 // TODO(svillar): we won't need to do this once the intrinsic width 626 // TODO(svillar): we won't need to do this once the intrinsic width
627 // computation is isolated from the LayoutGrid object state (it should not 627 // computation is isolated from the LayoutGrid object state (it should not
628 // touch any attribute) (see crbug.com/627812) 628 // touch any attribute) (see crbug.com/627812)
629 size_t autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns); 629 size_t autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns);
630 if (autoRepeatColumns && 630 if (autoRepeatColumns &&
631 autoRepeatColumns != 631 autoRepeatColumns !=
632 computeAutoRepeatTracksCount(ForColumns, TrackSizing)) 632 computeAutoRepeatTracksCount(ForColumns, TrackSizing))
633 dirtyGrid(); 633 dirtyGrid();
634 placeItemsOnGrid(TrackSizing); 634 placeItemsOnGrid(m_grid, TrackSizing);
635 635
636 GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows)); 636 GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows));
637 637
638 // 1- First, the track sizing algorithm is used to resolve the sizes of the 638 // 1- First, the track sizing algorithm is used to resolve the sizes of the
639 // grid columns. 639 // grid columns.
640 // At this point the logical width is always definite as the above call to 640 // At this point the logical width is always definite as the above call to
641 // updateLogicalWidth() properly resolves intrinsic sizes. We cannot do the 641 // updateLogicalWidth() properly resolves intrinsic sizes. We cannot do the
642 // same for heights though because many code paths inside 642 // same for heights though because many code paths inside
643 // updateLogicalHeight() require a previous call to setLogicalHeight() to 643 // updateLogicalHeight() require a previous call to setLogicalHeight() to
644 // resolve heights properly (like for positioned items for example). 644 // resolve heights properly (like for positioned items for example).
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 if (nonEmptyTracksAfterEndLine) 782 if (nonEmptyTracksAfterEndLine)
783 gapAccumulator += gap; 783 gapAccumulator += gap;
784 } 784 }
785 785
786 return gapAccumulator; 786 return gapAccumulator;
787 } 787 }
788 788
789 void LayoutGrid::computeIntrinsicLogicalWidths( 789 void LayoutGrid::computeIntrinsicLogicalWidths(
790 LayoutUnit& minLogicalWidth, 790 LayoutUnit& minLogicalWidth,
791 LayoutUnit& maxLogicalWidth) const { 791 LayoutUnit& maxLogicalWidth) const {
792 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation); 792 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(const_cast<Grid&>(m_grid),
793 IntrinsicSizeComputation);
793 794
794 GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows)); 795 GridSizingData sizingData(numTracks(ForColumns), numTracks(ForRows));
795 computeTrackSizesForIndefiniteSize(ForColumns, sizingData, minLogicalWidth, 796 computeTrackSizesForIndefiniteSize(ForColumns, sizingData, minLogicalWidth,
796 maxLogicalWidth); 797 maxLogicalWidth);
797 798
798 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth()); 799 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth());
799 minLogicalWidth += scrollbarWidth; 800 minLogicalWidth += scrollbarWidth;
800 maxLogicalWidth += scrollbarWidth; 801 maxLogicalWidth += scrollbarWidth;
801 } 802 }
802 803
(...skipping 1232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 if (!iterator.nextGridItem()) { 2036 if (!iterator.nextGridItem()) {
2036 if (!emptyTrackIndexes) 2037 if (!emptyTrackIndexes)
2037 emptyTrackIndexes = wrapUnique(new OrderedTrackIndexSet); 2038 emptyTrackIndexes = wrapUnique(new OrderedTrackIndexSet);
2038 emptyTrackIndexes->add(trackIndex); 2039 emptyTrackIndexes->add(trackIndex);
2039 } 2040 }
2040 } 2041 }
2041 } 2042 }
2042 return emptyTrackIndexes; 2043 return emptyTrackIndexes;
2043 } 2044 }
2044 2045
2045 void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) { 2046 void LayoutGrid::placeItemsOnGrid(LayoutGrid::Grid& grid,
2047 SizingOperation sizingOperation) {
2046 if (!m_gridIsDirty) 2048 if (!m_gridIsDirty)
2047 return; 2049 return;
2048 2050
2049 DCHECK(!m_grid.hasInFlowGridItems()); 2051 DCHECK(!grid.hasInFlowGridItems());
2050 2052
2051 size_t autoRepeatColumns; 2053 size_t autoRepeatColumns;
2052 size_t autoRepeatRows = 2054 size_t autoRepeatRows =
2053 computeAutoRepeatTracksCount(ForRows, sizingOperation); 2055 computeAutoRepeatTracksCount(ForRows, sizingOperation);
2054 if (sizingOperation == IntrinsicSizeComputation) { 2056 if (sizingOperation == IntrinsicSizeComputation) {
2055 autoRepeatColumns = styleRef().gridAutoRepeatColumns().size(); 2057 autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
2056 } else { 2058 } else {
2057 autoRepeatColumns = 2059 autoRepeatColumns =
2058 computeAutoRepeatTracksCount(ForColumns, sizingOperation); 2060 computeAutoRepeatTracksCount(ForColumns, sizingOperation);
2059 } 2061 }
2060 m_grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns); 2062 m_grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns);
Manuel Rego 2016/11/29 13:03:20 It still uses m_grid here, I guess it's just becua
svillar 2016/11/29 18:33:28 Yeah, this patch is just changing some calls insid
2061 2063
2062 populateExplicitGridAndOrderIterator(); 2064 populateExplicitGridAndOrderIterator(grid);
2063 2065
2064 // We clear the dirty bit here as the grid sizes have been updated. 2066 // We clear the dirty bit here as the grid sizes have been updated.
2065 m_gridIsDirty = false; 2067 m_gridIsDirty = false;
2066 2068
2067 Vector<LayoutBox*> autoMajorAxisAutoGridItems; 2069 Vector<LayoutBox*> autoMajorAxisAutoGridItems;
2068 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; 2070 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
2069 #if ENABLE(ASSERT) 2071 #if ENABLE(ASSERT)
2070 DCHECK(!m_grid.hasAnyGridItemPaintOrder()); 2072 DCHECK(!grid.hasAnyGridItemPaintOrder());
2071 #endif 2073 #endif
2072 DCHECK(!m_grid.hasAnyOrthogonalChildren()); 2074 DCHECK(!grid.hasAnyOrthogonalChildren());
2073 size_t childIndex = 0; 2075 size_t childIndex = 0;
2074 for (LayoutBox* child = m_grid.orderIterator().first(); child; 2076 for (LayoutBox* child = grid.orderIterator().first(); child;
2075 child = m_grid.orderIterator().next()) { 2077 child = grid.orderIterator().next()) {
2076 if (child->isOutOfFlowPositioned()) 2078 if (child->isOutOfFlowPositioned())
2077 continue; 2079 continue;
2078 2080
2079 m_grid.setGridItemPaintOrder(*child, childIndex++); 2081 grid.setGridItemPaintOrder(*child, childIndex++);
2080 2082
2081 GridArea area = m_grid.gridItemArea(*child); 2083 GridArea area = grid.gridItemArea(*child);
2082 if (!area.rows.isIndefinite()) 2084 if (!area.rows.isIndefinite())
2083 area.rows.translate(abs(m_grid.smallestTrackStart(ForRows))); 2085 area.rows.translate(abs(grid.smallestTrackStart(ForRows)));
2084 if (!area.columns.isIndefinite()) 2086 if (!area.columns.isIndefinite())
2085 area.columns.translate(abs(m_grid.smallestTrackStart(ForColumns))); 2087 area.columns.translate(abs(grid.smallestTrackStart(ForColumns)));
2086 2088
2087 if (area.rows.isIndefinite() || area.columns.isIndefinite()) { 2089 if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
2088 m_grid.setGridItemArea(*child, area); 2090 grid.setGridItemArea(*child, area);
2089 GridSpan majorAxisPositions = 2091 GridSpan majorAxisPositions =
2090 (autoPlacementMajorAxisDirection() == ForColumns) ? area.columns 2092 (autoPlacementMajorAxisDirection() == ForColumns) ? area.columns
2091 : area.rows; 2093 : area.rows;
2092 if (majorAxisPositions.isIndefinite()) 2094 if (majorAxisPositions.isIndefinite())
2093 autoMajorAxisAutoGridItems.append(child); 2095 autoMajorAxisAutoGridItems.append(child);
2094 else 2096 else
2095 specifiedMajorAxisAutoGridItems.append(child); 2097 specifiedMajorAxisAutoGridItems.append(child);
2096 continue; 2098 continue;
2097 } 2099 }
2098 m_grid.insert(*child, area, isOrthogonalChild(*child)); 2100 grid.insert(*child, area, isOrthogonalChild(*child));
2099 } 2101 }
2100 2102
2101 #if ENABLE(ASSERT) 2103 #if ENABLE(ASSERT)
2102 if (m_grid.hasInFlowGridItems()) { 2104 if (grid.hasInFlowGridItems()) {
2103 DCHECK_GE(m_grid.numTracks(ForRows), 2105 DCHECK_GE(grid.numTracks(ForRows),
2104 GridPositionsResolver::explicitGridRowCount( 2106 GridPositionsResolver::explicitGridRowCount(
2105 *style(), m_grid.autoRepeatTracks(ForRows))); 2107 *style(), grid.autoRepeatTracks(ForRows)));
2106 DCHECK_GE(m_grid.numTracks(ForColumns), 2108 DCHECK_GE(grid.numTracks(ForColumns),
2107 GridPositionsResolver::explicitGridColumnCount( 2109 GridPositionsResolver::explicitGridColumnCount(
2108 *style(), m_grid.autoRepeatTracks(ForColumns))); 2110 *style(), grid.autoRepeatTracks(ForColumns)));
2109 } 2111 }
2110 #endif 2112 #endif
2111 2113
2112 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); 2114 placeSpecifiedMajorAxisItemsOnGrid(grid, specifiedMajorAxisAutoGridItems);
2113 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); 2115 placeAutoMajorAxisItemsOnGrid(grid, autoMajorAxisAutoGridItems);
2114 2116
2115 m_grid.shrinkToFit(); 2117 grid.shrinkToFit();
2116 2118
2117 // Compute collapsable tracks for auto-fit. 2119 // Compute collapsable tracks for auto-fit.
2118 m_grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(ForColumns)); 2120 grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(ForColumns));
2119 m_grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(ForRows)); 2121 grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(ForRows));
2120 2122
2121 #if ENABLE(ASSERT) 2123 #if ENABLE(ASSERT)
2122 for (LayoutBox* child = m_grid.orderIterator().first(); child; 2124 for (LayoutBox* child = grid.orderIterator().first(); child;
2123 child = m_grid.orderIterator().next()) { 2125 child = grid.orderIterator().next()) {
2124 if (child->isOutOfFlowPositioned()) 2126 if (child->isOutOfFlowPositioned())
2125 continue; 2127 continue;
2126 2128
2127 GridArea area = m_grid.gridItemArea(*child); 2129 GridArea area = grid.gridItemArea(*child);
2128 ASSERT(area.rows.isTranslatedDefinite() && 2130 ASSERT(area.rows.isTranslatedDefinite() &&
2129 area.columns.isTranslatedDefinite()); 2131 area.columns.isTranslatedDefinite());
2130 } 2132 }
2131 #endif 2133 #endif
2132 } 2134 }
2133 2135
2134 void LayoutGrid::populateExplicitGridAndOrderIterator() { 2136 void LayoutGrid::populateExplicitGridAndOrderIterator(Grid& grid) const {
2135 OrderIteratorPopulator populator(m_grid.orderIterator()); 2137 OrderIteratorPopulator populator(grid.orderIterator());
2136 int smallestRowStart = 0; 2138 int smallestRowStart = 0;
2137 int smallestColumnStart = 0; 2139 int smallestColumnStart = 0;
2138 2140
2139 size_t autoRepeatRows = m_grid.autoRepeatTracks(ForRows); 2141 size_t autoRepeatRows = grid.autoRepeatTracks(ForRows);
2140 size_t autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns); 2142 size_t autoRepeatColumns = grid.autoRepeatTracks(ForColumns);
2141 size_t maximumRowIndex = 2143 size_t maximumRowIndex =
2142 GridPositionsResolver::explicitGridRowCount(*style(), autoRepeatRows); 2144 GridPositionsResolver::explicitGridRowCount(*style(), autoRepeatRows);
2143 size_t maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount( 2145 size_t maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(
2144 *style(), autoRepeatColumns); 2146 *style(), autoRepeatColumns);
2145 2147
2146 for (LayoutBox* child = firstInFlowChildBox(); child; 2148 for (LayoutBox* child = firstInFlowChildBox(); child;
2147 child = child->nextInFlowSiblingBox()) { 2149 child = child->nextInFlowSiblingBox()) {
2148 populator.collectChild(child); 2150 populator.collectChild(child);
2149 2151
2150 // This function bypasses the cache (gridItemArea()) as it is used to 2152 // This function bypasses the cache (gridItemArea()) as it is used to
2151 // build it. 2153 // build it.
2152 GridSpan rowPositions = 2154 GridSpan rowPositions =
2153 GridPositionsResolver::resolveGridPositionsFromStyle( 2155 GridPositionsResolver::resolveGridPositionsFromStyle(
2154 *style(), *child, ForRows, autoRepeatRows); 2156 *style(), *child, ForRows, autoRepeatRows);
2155 GridSpan columnPositions = 2157 GridSpan columnPositions =
2156 GridPositionsResolver::resolveGridPositionsFromStyle( 2158 GridPositionsResolver::resolveGridPositionsFromStyle(
2157 *style(), *child, ForColumns, autoRepeatColumns); 2159 *style(), *child, ForColumns, autoRepeatColumns);
2158 m_grid.setGridItemArea(*child, GridArea(rowPositions, columnPositions)); 2160 grid.setGridItemArea(*child, GridArea(rowPositions, columnPositions));
2159 2161
2160 // |positions| is 0 if we need to run the auto-placement algorithm. 2162 // |positions| is 0 if we need to run the auto-placement algorithm.
2161 if (!rowPositions.isIndefinite()) { 2163 if (!rowPositions.isIndefinite()) {
2162 smallestRowStart = 2164 smallestRowStart =
2163 std::min(smallestRowStart, rowPositions.untranslatedStartLine()); 2165 std::min(smallestRowStart, rowPositions.untranslatedStartLine());
2164 maximumRowIndex = 2166 maximumRowIndex =
2165 std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine()); 2167 std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine());
2166 } else { 2168 } else {
2167 // Grow the grid for items with a definite row span, getting the largest 2169 // Grow the grid for items with a definite row span, getting the largest
2168 // such span. 2170 // such span.
2169 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( 2171 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
2170 *style(), *child, ForRows); 2172 *style(), *child, ForRows);
2171 maximumRowIndex = std::max(maximumRowIndex, spanSize); 2173 maximumRowIndex = std::max(maximumRowIndex, spanSize);
2172 } 2174 }
2173 2175
2174 if (!columnPositions.isIndefinite()) { 2176 if (!columnPositions.isIndefinite()) {
2175 smallestColumnStart = std::min(smallestColumnStart, 2177 smallestColumnStart = std::min(smallestColumnStart,
2176 columnPositions.untranslatedStartLine()); 2178 columnPositions.untranslatedStartLine());
2177 maximumColumnIndex = std::max<int>(maximumColumnIndex, 2179 maximumColumnIndex = std::max<int>(maximumColumnIndex,
2178 columnPositions.untranslatedEndLine()); 2180 columnPositions.untranslatedEndLine());
2179 } else { 2181 } else {
2180 // Grow the grid for items with a definite column span, getting the 2182 // Grow the grid for items with a definite column span, getting the
2181 // largest such span. 2183 // largest such span.
2182 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( 2184 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
2183 *style(), *child, ForColumns); 2185 *style(), *child, ForColumns);
2184 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); 2186 maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
2185 } 2187 }
2186 } 2188 }
2187 2189
2188 m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart); 2190 grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);
2189 m_grid.ensureGridSize(maximumRowIndex + abs(smallestRowStart), 2191 grid.ensureGridSize(maximumRowIndex + abs(smallestRowStart),
2190 maximumColumnIndex + abs(smallestColumnStart)); 2192 maximumColumnIndex + abs(smallestColumnStart));
2191 } 2193 }
2192 2194
2193 std::unique_ptr<GridArea> 2195 std::unique_ptr<GridArea>
2194 LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( 2196 LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
2195 const LayoutBox& gridItem, 2197 const LayoutBox& gridItem,
2196 GridTrackSizingDirection specifiedDirection, 2198 GridTrackSizingDirection specifiedDirection,
2197 const GridSpan& specifiedPositions) const { 2199 const GridSpan& specifiedPositions) const {
2198 GridTrackSizingDirection crossDirection = 2200 GridTrackSizingDirection crossDirection =
2199 specifiedDirection == ForColumns ? ForRows : ForColumns; 2201 specifiedDirection == ForColumns ? ForRows : ForColumns;
2200 const size_t endOfCrossDirection = m_grid.numTracks(crossDirection); 2202 const size_t endOfCrossDirection = m_grid.numTracks(crossDirection);
2201 size_t crossDirectionSpanSize = 2203 size_t crossDirectionSpanSize =
2202 GridPositionsResolver::spanSizeForAutoPlacedItem(*style(), gridItem, 2204 GridPositionsResolver::spanSizeForAutoPlacedItem(*style(), gridItem,
2203 crossDirection); 2205 crossDirection);
2204 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan( 2206 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(
2205 endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize); 2207 endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize);
2206 return wrapUnique( 2208 return wrapUnique(
2207 new GridArea(specifiedDirection == ForColumns ? crossDirectionPositions 2209 new GridArea(specifiedDirection == ForColumns ? crossDirectionPositions
2208 : specifiedPositions, 2210 : specifiedPositions,
2209 specifiedDirection == ForColumns ? specifiedPositions 2211 specifiedDirection == ForColumns ? specifiedPositions
2210 : crossDirectionPositions)); 2212 : crossDirectionPositions));
2211 } 2213 }
2212 2214
2213 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid( 2215 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(
2214 const Vector<LayoutBox*>& autoGridItems) { 2216 Grid& grid,
2217 const Vector<LayoutBox*>& autoGridItems) const {
2215 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; 2218 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
2216 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 2219 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
2217 2220
2218 // Mapping between the major axis tracks (rows or columns) and the last 2221 // Mapping between the major axis tracks (rows or columns) and the last
2219 // auto-placed item's position inserted on that track. This is needed to 2222 // auto-placed item's position inserted on that track. This is needed to
2220 // implement "sparse" packing for items locked to a given track. 2223 // implement "sparse" packing for items locked to a given track.
2221 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo 2224 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
2222 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, 2225 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash,
2223 WTF::UnsignedWithZeroKeyHashTraits<unsigned>> 2226 WTF::UnsignedWithZeroKeyHashTraits<unsigned>>
2224 minorAxisCursors; 2227 minorAxisCursors;
2225 2228
2226 for (const auto& autoGridItem : autoGridItems) { 2229 for (const auto& autoGridItem : autoGridItems) {
2227 GridSpan majorAxisPositions = 2230 GridSpan majorAxisPositions =
2228 m_grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection()); 2231 grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection());
2229 ASSERT(majorAxisPositions.isTranslatedDefinite()); 2232 ASSERT(majorAxisPositions.isTranslatedDefinite());
2230 DCHECK( 2233 DCHECK(!grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection())
2231 !m_grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection()) 2234 .isTranslatedDefinite());
2232 .isTranslatedDefinite());
2233 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( 2235 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
2234 *style(), *autoGridItem, autoPlacementMinorAxisDirection()); 2236 *style(), *autoGridItem, autoPlacementMinorAxisDirection());
2235 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); 2237 unsigned majorAxisInitialPosition = majorAxisPositions.startLine();
2236 2238
2237 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), 2239 GridIterator iterator(
2238 majorAxisPositions.startLine(), 2240 grid, autoPlacementMajorAxisDirection(), majorAxisPositions.startLine(),
2239 isGridAutoFlowDense 2241 isGridAutoFlowDense ? 0
2240 ? 0 2242 : minorAxisCursors.get(majorAxisInitialPosition));
2241 : minorAxisCursors.get(majorAxisInitialPosition));
2242 std::unique_ptr<GridArea> emptyGridArea = iterator.nextEmptyGridArea( 2243 std::unique_ptr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(
2243 majorAxisPositions.integerSpan(), minorAxisSpanSize); 2244 majorAxisPositions.integerSpan(), minorAxisSpanSize);
2244 if (!emptyGridArea) 2245 if (!emptyGridArea)
2245 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( 2246 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
2246 *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 2247 *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
2247 2248
2248 m_grid.insert(*autoGridItem, *emptyGridArea, 2249 grid.insert(*autoGridItem, *emptyGridArea,
2249 isOrthogonalChild(*autoGridItem)); 2250 isOrthogonalChild(*autoGridItem));
2250 2251
2251 if (!isGridAutoFlowDense) 2252 if (!isGridAutoFlowDense)
2252 minorAxisCursors.set(majorAxisInitialPosition, 2253 minorAxisCursors.set(majorAxisInitialPosition,
2253 isForColumns ? emptyGridArea->rows.startLine() 2254 isForColumns ? emptyGridArea->rows.startLine()
2254 : emptyGridArea->columns.startLine()); 2255 : emptyGridArea->columns.startLine());
2255 } 2256 }
2256 } 2257 }
2257 2258
2258 void LayoutGrid::placeAutoMajorAxisItemsOnGrid( 2259 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(
2259 const Vector<LayoutBox*>& autoGridItems) { 2260 Grid& grid,
2261 const Vector<LayoutBox*>& autoGridItems) const {
2260 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); 2262 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0);
2261 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); 2263 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
2262 2264
2263 for (const auto& autoGridItem : autoGridItems) { 2265 for (const auto& autoGridItem : autoGridItems) {
2264 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); 2266 placeAutoMajorAxisItemOnGrid(grid, *autoGridItem, autoPlacementCursor);
2265 2267
2266 // If grid-auto-flow is dense, reset auto-placement cursor. 2268 // If grid-auto-flow is dense, reset auto-placement cursor.
2267 if (isGridAutoFlowDense) { 2269 if (isGridAutoFlowDense) {
2268 autoPlacementCursor.first = 0; 2270 autoPlacementCursor.first = 0;
2269 autoPlacementCursor.second = 0; 2271 autoPlacementCursor.second = 0;
2270 } 2272 }
2271 } 2273 }
2272 } 2274 }
2273 2275
2274 void LayoutGrid::placeAutoMajorAxisItemOnGrid( 2276 void LayoutGrid::placeAutoMajorAxisItemOnGrid(
2277 Grid& grid,
2275 LayoutBox& gridItem, 2278 LayoutBox& gridItem,
2276 std::pair<size_t, size_t>& autoPlacementCursor) { 2279 std::pair<size_t, size_t>& autoPlacementCursor) const {
2277 GridSpan minorAxisPositions = 2280 GridSpan minorAxisPositions =
2278 m_grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection()); 2281 grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection());
2279 DCHECK(!m_grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection()) 2282 DCHECK(!grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection())
2280 .isTranslatedDefinite()); 2283 .isTranslatedDefinite());
2281 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( 2284 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
2282 *style(), gridItem, autoPlacementMajorAxisDirection()); 2285 *style(), gridItem, autoPlacementMajorAxisDirection());
2283 2286
2284 const size_t endOfMajorAxis = 2287 const size_t endOfMajorAxis =
2285 m_grid.numTracks(autoPlacementMajorAxisDirection()); 2288 grid.numTracks(autoPlacementMajorAxisDirection());
2286 size_t majorAxisAutoPlacementCursor = 2289 size_t majorAxisAutoPlacementCursor =
2287 autoPlacementMajorAxisDirection() == ForColumns 2290 autoPlacementMajorAxisDirection() == ForColumns
2288 ? autoPlacementCursor.second 2291 ? autoPlacementCursor.second
2289 : autoPlacementCursor.first; 2292 : autoPlacementCursor.first;
2290 size_t minorAxisAutoPlacementCursor = 2293 size_t minorAxisAutoPlacementCursor =
2291 autoPlacementMajorAxisDirection() == ForColumns 2294 autoPlacementMajorAxisDirection() == ForColumns
2292 ? autoPlacementCursor.first 2295 ? autoPlacementCursor.first
2293 : autoPlacementCursor.second; 2296 : autoPlacementCursor.second;
2294 2297
2295 std::unique_ptr<GridArea> emptyGridArea; 2298 std::unique_ptr<GridArea> emptyGridArea;
2296 if (minorAxisPositions.isTranslatedDefinite()) { 2299 if (minorAxisPositions.isTranslatedDefinite()) {
2297 // Move to the next track in major axis if initial position in minor axis is 2300 // Move to the next track in major axis if initial position in minor axis is
2298 // before auto-placement cursor. 2301 // before auto-placement cursor.
2299 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) 2302 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor)
2300 majorAxisAutoPlacementCursor++; 2303 majorAxisAutoPlacementCursor++;
2301 2304
2302 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 2305 if (majorAxisAutoPlacementCursor < endOfMajorAxis) {
2303 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), 2306 GridIterator iterator(grid, autoPlacementMinorAxisDirection(),
2304 minorAxisPositions.startLine(), 2307 minorAxisPositions.startLine(),
2305 majorAxisAutoPlacementCursor); 2308 majorAxisAutoPlacementCursor);
2306 emptyGridArea = iterator.nextEmptyGridArea( 2309 emptyGridArea = iterator.nextEmptyGridArea(
2307 minorAxisPositions.integerSpan(), majorAxisSpanSize); 2310 minorAxisPositions.integerSpan(), majorAxisSpanSize);
2308 } 2311 }
2309 2312
2310 if (!emptyGridArea) 2313 if (!emptyGridArea)
2311 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( 2314 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
2312 gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 2315 gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions);
2313 } else { 2316 } else {
2314 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem( 2317 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
2315 *style(), gridItem, autoPlacementMinorAxisDirection()); 2318 *style(), gridItem, autoPlacementMinorAxisDirection());
2316 2319
2317 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; 2320 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor;
2318 majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) { 2321 majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) {
2319 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), 2322 GridIterator iterator(grid, autoPlacementMajorAxisDirection(),
2320 majorAxisIndex, minorAxisAutoPlacementCursor); 2323 majorAxisIndex, minorAxisAutoPlacementCursor);
2321 emptyGridArea = 2324 emptyGridArea =
2322 iterator.nextEmptyGridArea(majorAxisSpanSize, minorAxisSpanSize); 2325 iterator.nextEmptyGridArea(majorAxisSpanSize, minorAxisSpanSize);
2323 2326
2324 if (emptyGridArea) { 2327 if (emptyGridArea) {
2325 // Check that it fits in the minor axis direction, as we shouldn't grow 2328 // Check that it fits in the minor axis direction, as we shouldn't grow
2326 // in that direction here (it was already managed in 2329 // in that direction here (it was already managed in
2327 // populateExplicitGridAndOrderIterator()). 2330 // populateExplicitGridAndOrderIterator()).
2328 size_t minorAxisFinalPositionIndex = 2331 size_t minorAxisFinalPositionIndex =
2329 autoPlacementMinorAxisDirection() == ForColumns 2332 autoPlacementMinorAxisDirection() == ForColumns
2330 ? emptyGridArea->columns.endLine() 2333 ? emptyGridArea->columns.endLine()
2331 : emptyGridArea->rows.endLine(); 2334 : emptyGridArea->rows.endLine();
2332 const size_t endOfMinorAxis = 2335 const size_t endOfMinorAxis =
2333 m_grid.numTracks(autoPlacementMinorAxisDirection()); 2336 grid.numTracks(autoPlacementMinorAxisDirection());
2334 if (minorAxisFinalPositionIndex <= endOfMinorAxis) 2337 if (minorAxisFinalPositionIndex <= endOfMinorAxis)
2335 break; 2338 break;
2336 2339
2337 // Discard empty grid area as it does not fit in the minor axis 2340 // Discard empty grid area as it does not fit in the minor axis
2338 // direction. We don't need to create a new empty grid area yet as we 2341 // direction. We don't need to create a new empty grid area yet as we
2339 // might find a valid one in the next iteration. 2342 // might find a valid one in the next iteration.
2340 emptyGridArea = nullptr; 2343 emptyGridArea = nullptr;
2341 } 2344 }
2342 2345
2343 // As we're moving to the next track in the major axis we should reset the 2346 // As we're moving to the next track in the major axis we should reset the
2344 // auto-placement cursor in the minor axis. 2347 // auto-placement cursor in the minor axis.
2345 minorAxisAutoPlacementCursor = 0; 2348 minorAxisAutoPlacementCursor = 0;
2346 } 2349 }
2347 2350
2348 if (!emptyGridArea) 2351 if (!emptyGridArea)
2349 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( 2352 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(
2350 gridItem, autoPlacementMinorAxisDirection(), 2353 gridItem, autoPlacementMinorAxisDirection(),
2351 GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize)); 2354 GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
2352 } 2355 }
2353 2356
2354 m_grid.insert(gridItem, *emptyGridArea, isOrthogonalChild(gridItem)); 2357 grid.insert(gridItem, *emptyGridArea, isOrthogonalChild(gridItem));
2355 // Move auto-placement cursor to the new position. 2358 // Move auto-placement cursor to the new position.
2356 autoPlacementCursor.first = emptyGridArea->rows.startLine(); 2359 autoPlacementCursor.first = emptyGridArea->rows.startLine();
2357 autoPlacementCursor.second = emptyGridArea->columns.startLine(); 2360 autoPlacementCursor.second = emptyGridArea->columns.startLine();
2358 } 2361 }
2359 2362
2360 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const { 2363 GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const {
2361 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; 2364 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows;
2362 } 2365 }
2363 2366
2364 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const { 2367 GridTrackSizingDirection LayoutGrid::autoPlacementMinorAxisDirection() const {
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after
3568 if (direction == ForRows) 3571 if (direction == ForRows)
3569 return m_grid.numTracks(ForRows); 3572 return m_grid.numTracks(ForRows);
3570 3573
3571 return m_grid.numTracks(ForRows) 3574 return m_grid.numTracks(ForRows)
3572 ? m_grid.numTracks(ForColumns) 3575 ? m_grid.numTracks(ForColumns)
3573 : GridPositionsResolver::explicitGridColumnCount( 3576 : GridPositionsResolver::explicitGridColumnCount(
3574 styleRef(), m_grid.autoRepeatTracks(ForColumns)); 3577 styleRef(), m_grid.autoRepeatTracks(ForColumns));
3575 } 3578 }
3576 3579
3577 } // namespace blink 3580 } // 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