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

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