| 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 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |