Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |