Changeset 208995 in webkit
- Timestamp:
- Nov 28, 2016 3:28:41 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r208993 r208995 1 2016-11-24 Sergio Villar Senin <svillar@igalia.com> 2 3 [css-grid] Move attributes from RenderGrid to the new Grid class 4 https://bugs.webkit.org/show_bug.cgi?id=165065 5 6 Reviewed by Darin Adler. 7 8 A new class called Grid was added in 208973. This is the first of a couple of patches moving 9 private attributes from RenderGrid to Grid. 10 11 Apart from that this is adding a couple of new helper functions that will decouple the 12 existence of in-flow items from the actual data structures storing that information. 13 14 Last but not least, the Grid::insert() method does not only insert the item in the m_grid 15 data structure, but also stores the GridArea associated to that item, so there is no need to 16 do it in two different calls. 17 18 No new tests required as this is a refactoring. 19 20 * rendering/RenderGrid.cpp: 21 (WebCore::RenderGrid::Grid::insert): Added a new parameter. 22 (WebCore::RenderGrid::Grid::setSmallestTracksStart): 23 (WebCore::RenderGrid::Grid::smallestTrackStart): 24 (WebCore::RenderGrid::Grid::gridItemArea): 25 (WebCore::RenderGrid::Grid::setGridItemArea): 26 (WebCore::RenderGrid::Grid::clear): Clear the newly added attributes. 27 (WebCore::RenderGrid::repeatTracksSizingIfNeeded): 28 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 29 (WebCore::RenderGrid::rawGridTrackSize): 30 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): 31 (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat): 32 (WebCore::RenderGrid::placeItemsOnGrid): 33 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): 34 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): 35 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): 36 (WebCore::RenderGrid::clearGrid): 37 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 38 (WebCore::RenderGrid::cachedGridSpan): 39 (WebCore::RenderGrid::cachedGridArea): Deleted. 40 * rendering/RenderGrid.h: 41 1 42 2016-11-27 Sam Weinig <sam@webkit.org> 2 43 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r208985 r208995 72 72 m_grid[row][column].append(&child); 73 73 } 74 75 setGridItemArea(child, area); 76 } 77 78 void RenderGrid::Grid::setSmallestTracksStart(int rowStart, int columnStart) 79 { 80 m_smallestRowStart = rowStart; 81 m_smallestColumnStart = columnStart; 82 } 83 84 int RenderGrid::Grid::smallestTrackStart(GridTrackSizingDirection direction) const 85 { 86 return direction == ForRows ? m_smallestRowStart : m_smallestColumnStart; 87 } 88 89 GridArea RenderGrid::Grid::gridItemArea(const RenderBox& item) const 90 { 91 ASSERT(m_gridItemArea.contains(&item)); 92 return m_gridItemArea.get(&item); 93 } 94 95 void RenderGrid::Grid::setGridItemArea(const RenderBox& item, GridArea area) 96 { 97 m_gridItemArea.set(&item, area); 74 98 } 75 99 … … 77 101 { 78 102 m_grid.resize(0); 103 m_gridItemArea.clear(); 104 m_hasAnyOrthogonalGridItem = false; 105 m_smallestRowStart = 0; 106 m_smallestColumnStart = 0; 79 107 } 80 108 … … 468 496 // cases with orthogonal flows require this extra cycle; we need a more specific 469 497 // condition to detect whether child's min-content contribution has changed or not. 470 if (m_ hasAnyOrthogonalChild) {498 if (m_grid.hasAnyOrthogonalGridItem()) { 471 499 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForColumns); 472 500 computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows); … … 822 850 flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex, sizingData.sizingOperation).maxTrackBreadth().flex())); 823 851 824 if ( !m_gridItemArea.isEmpty()) {852 if (m_grid.hasGridItems()) { 825 853 for (unsigned i = 0; i < flexibleSizedTracksIndex.size(); ++i) { 826 854 GridIterator iterator(m_grid, direction, flexibleSizedTracksIndex[i]); … … 1008 1036 unsigned explicitTracksCount = trackStyles.size() + autoRepeatTracksCount; 1009 1037 1010 int untranslatedIndexAsInt = translatedIndex + (isRowAxis ? m_smallestColumnStart : m_smallestRowStart);1038 int untranslatedIndexAsInt = translatedIndex + m_grid.smallestTrackStart(direction); 1011 1039 unsigned autoTrackStylesSize = autoTrackStyles.size(); 1012 1040 if (untranslatedIndexAsInt < 0) { … … 1221 1249 sizingData.itemsSortedByIncreasingSpan.shrink(0); 1222 1250 HashSet<RenderBox*> itemsSet; 1223 if ( !m_gridItemArea.isEmpty()) {1251 if (m_grid.hasGridItems()) { 1224 1252 for (auto trackIndex : sizingData.contentSizedTracksIndex) { 1225 1253 GridIterator iterator(m_grid, direction, trackIndex); … … 1630 1658 std::unique_ptr<OrderedTrackIndexSet> emptyTrackIndexes; 1631 1659 unsigned insertionPoint = isRowAxis ? style().gridAutoRepeatColumnsInsertionPoint() : style().gridAutoRepeatRowsInsertionPoint(); 1632 unsigned firstAutoRepeatTrack = insertionPoint + std::abs( isRowAxis ? m_smallestColumnStart : m_smallestRowStart);1660 unsigned firstAutoRepeatTrack = insertionPoint + std::abs(m_grid.smallestTrackStart(direction)); 1633 1661 unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + autoRepeatCountForDirection(direction); 1634 1662 1635 if ( m_gridItemArea.isEmpty()) {1663 if (!m_grid.hasGridItems()) { 1636 1664 emptyTrackIndexes = std::make_unique<OrderedTrackIndexSet>(); 1637 1665 for (unsigned trackIndex = firstAutoRepeatTrack; trackIndex < lastAutoRepeatTrack; ++trackIndex) … … 1653 1681 { 1654 1682 ASSERT(m_gridIsDirty); 1655 ASSERT( m_gridItemArea.isEmpty());1683 ASSERT(!m_grid.hasGridItems()); 1656 1684 1657 1685 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOperation); … … 1660 1688 populateExplicitGridAndOrderIterator(); 1661 1689 m_gridIsDirty = false; 1690 bool hasAnyOrthogonalGridItem = false; 1662 1691 1663 1692 Vector<RenderBox*> autoMajorAxisAutoGridItems; 1664 1693 Vector<RenderBox*> specifiedMajorAxisAutoGridItems; 1665 m_hasAnyOrthogonalChild = false;1666 1694 for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { 1667 1695 if (child->isOutOfFlowPositioned()) 1668 1696 continue; 1669 1697 1670 m_hasAnyOrthogonalChild = m_hasAnyOrthogonalChild|| isOrthogonalChild(*child);1671 1672 GridArea area = cachedGridArea(*child);1698 hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem || isOrthogonalChild(*child); 1699 1700 GridArea area = m_grid.gridItemArea(*child); 1673 1701 if (!area.rows.isIndefinite()) 1674 area.rows.translate(std::abs(m_ smallestRowStart));1702 area.rows.translate(std::abs(m_grid.smallestTrackStart(ForRows))); 1675 1703 if (!area.columns.isIndefinite()) 1676 area.columns.translate(std::abs(m_smallestColumnStart)); 1677 m_gridItemArea.set(child, area); 1704 area.columns.translate(std::abs(m_grid.smallestTrackStart(ForColumns))); 1678 1705 1679 1706 if (area.rows.isIndefinite() || area.columns.isIndefinite()) { 1707 m_grid.setGridItemArea(*child, area); 1680 1708 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1681 1709 if ((majorAxisDirectionIsForColumns && area.columns.isIndefinite()) … … 1688 1716 m_grid.insert(*child, { area.rows, area.columns }); 1689 1717 } 1718 m_grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem); 1690 1719 1691 1720 #if ENABLE(ASSERT) 1692 if ( !m_gridItemArea.isEmpty()) {1721 if (m_grid.hasGridItems()) { 1693 1722 ASSERT(gridRowCount() >= GridPositionsResolver::explicitGridRowCount(style(), m_autoRepeatRows)); 1694 1723 ASSERT(gridColumnCount() >= GridPositionsResolver::explicitGridColumnCount(style(), m_autoRepeatColumns)); … … 1708 1737 continue; 1709 1738 1710 GridArea area = cachedGridArea(*child);1739 GridArea area = m_grid.gridItemArea(*child); 1711 1740 ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslatedDefinite()); 1712 1741 } … … 1717 1746 { 1718 1747 OrderIteratorPopulator populator(m_orderIterator); 1719 m_smallestRowStart = m_smallestColumnStart = 0; 1748 int smallestRowStart = 0; 1749 int smallestColumnStart = 0; 1720 1750 unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(style(), m_autoRepeatRows); 1721 1751 unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(style(), m_autoRepeatColumns); … … 1729 1759 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForRows, m_autoRepeatRows); 1730 1760 if (!rowPositions.isIndefinite()) { 1731 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untranslatedStartLine());1761 smallestRowStart = std::min(smallestRowStart, rowPositions.untranslatedStartLine()); 1732 1762 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine()); 1733 1763 } else { … … 1739 1769 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForColumns, m_autoRepeatColumns); 1740 1770 if (!columnPositions.isIndefinite()) { 1741 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositions.untranslatedStartLine());1771 smallestColumnStart = std::min(smallestColumnStart, columnPositions.untranslatedStartLine()); 1742 1772 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedEndLine()); 1743 1773 } else { … … 1747 1777 } 1748 1778 1749 m_gridItemArea.set(child, GridArea(rowPositions, columnPositions)); 1750 } 1751 1752 m_grid.ensureGridSize(maximumRowIndex + std::abs(m_smallestRowStart), maximumColumnIndex + std::abs(m_smallestColumnStart)); 1779 m_grid.setGridItemArea(*child, { rowPositions, columnPositions }); 1780 } 1781 1782 m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart); 1783 m_grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart)); 1753 1784 } 1754 1785 … … 1784 1815 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 1785 1816 1786 m_gridItemArea.set(autoGridItem, *emptyGridArea);1787 1817 m_grid.insert(*autoGridItem, *emptyGridArea); 1788 1818 … … 1857 1887 } 1858 1888 1859 m_gridItemArea.set(&gridItem, *emptyGridArea);1860 1889 m_grid.insert(gridItem, *emptyGridArea); 1861 1890 autoPlacementCursor.first = emptyGridArea->rows.startLine(); … … 1876 1905 { 1877 1906 m_grid.clear(); 1878 m_gridItemArea.clear();1879 1907 m_gridIsDirty = true; 1880 1908 } … … 2055 2083 2056 2084 // For positioned items we cannot use GridSpan::translate() because we could end up with negative values, as the positioned items do not create implicit tracks per spec. 2057 int smallestStart = std::abs( isRowAxis ? m_smallestColumnStart : m_smallestRowStart);2085 int smallestStart = std::abs(m_grid.smallestTrackStart(direction)); 2058 2086 int startLine = positions.untranslatedStartLine() + smallestStart; 2059 2087 int endLine = positions.untranslatedEndLine() + smallestStart; … … 2120 2148 } 2121 2149 2122 GridArea RenderGrid::cachedGridArea(const RenderBox& gridItem) const2123 {2124 ASSERT(m_gridItemArea.contains(&gridItem));2125 return m_gridItemArea.get(&gridItem);2126 }2127 2128 2150 GridSpan RenderGrid::cachedGridSpan(const RenderBox& gridItem, GridTrackSizingDirection direction) const 2129 2151 { 2130 GridArea area = cachedGridArea(gridItem);2152 GridArea area = m_grid.gridItemArea(gridItem); 2131 2153 return direction == ForColumns ? area.columns : area.rows; 2132 2154 } -
trunk/Source/WebCore/rendering/RenderGrid.h
r208985 r208995 210 210 void insert(RenderBox&, const GridArea&); 211 211 212 // Note that each in flow child of a grid container becomes a grid item. This means that 213 // this method will return false for a grid container with only out of flow children. 214 bool hasGridItems() const { return !m_gridItemArea.isEmpty(); } 215 216 // FIXME: move this to SizingData once placeItemsOnGrid() takes it as argument. 217 bool hasAnyOrthogonalGridItem() const { return m_hasAnyOrthogonalGridItem; } 218 void setHasAnyOrthogonalGridItem(bool hasAnyOrthogonalGridItem) { m_hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem; } 219 220 GridArea gridItemArea(const RenderBox& item) const; 221 void setGridItemArea(const RenderBox& item, GridArea); 222 212 223 const GridCell& cell(unsigned row, unsigned column) const { return m_grid[row][column]; } 213 224 225 int smallestTrackStart(GridTrackSizingDirection) const; 226 void setSmallestTracksStart(int rowStart, int columnStart); 214 227 void shrinkToFit() { m_grid.shrinkToFit(); } 215 228 … … 218 231 private: 219 232 friend class GridIterator; 233 234 int m_smallestColumnStart { 0 }; 235 int m_smallestRowStart { 0 }; 236 237 bool m_hasAnyOrthogonalGridItem { false }; 238 220 239 GridAsMatrix m_grid; 240 241 HashMap<const RenderBox*, GridArea> m_gridItemArea; 242 HashMap<const RenderBox*, size_t> m_gridItemsIndexesMap; 221 243 }; 222 244 Grid m_grid; … … 226 248 LayoutUnit m_offsetBetweenColumns; 227 249 LayoutUnit m_offsetBetweenRows; 228 HashMap<const RenderBox*, GridArea> m_gridItemArea;229 250 OrderIterator m_orderIterator; 230 251 … … 232 253 std::optional<LayoutUnit> m_maxContentHeight; 233 254 234 int m_smallestColumnStart;235 int m_smallestRowStart;236 237 255 unsigned m_autoRepeatColumns { 0 }; 238 256 unsigned m_autoRepeatRows { 0 }; 239 240 bool m_hasAnyOrthogonalChild;241 257 242 258 bool m_gridIsDirty { true };
Note: See TracChangeset
for help on using the changeset viewer.