Chromium Code Reviews| Index: Source/core/rendering/RenderGrid.cpp |
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
| index 508b5fe0f880dec58c923b9335334aa292519cde..304dc6712bc589a6495e0472abbe7b0ecdfa14c9 100644 |
| --- a/Source/core/rendering/RenderGrid.cpp |
| +++ b/Source/core/rendering/RenderGrid.cpp |
| @@ -184,6 +184,7 @@ public: |
| // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. |
| Vector<LayoutUnit> distributeTrackVector; |
| Vector<GridTrack*> filteredTracks; |
| + Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; |
| }; |
| RenderGrid::RenderGrid(Element* element) |
| @@ -660,62 +661,67 @@ LayoutUnit RenderGrid::maxContentForChild(RenderBox& child, GridTrackSizingDirec |
| return logicalHeightForChild(child, columnTracks); |
| } |
| -size_t RenderGrid::gridItemSpan(const RenderBox& child, GridTrackSizingDirection direction) |
| -{ |
| - GridCoordinate childCoordinate = cachedGridCoordinate(child); |
| - GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCoordinate.columns; |
| - |
| - return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPosition.toInt() + 1; |
| -} |
| - |
| -typedef std::pair<RenderBox*, size_t> GridItemWithSpan; |
| +class GridItemWithSpan { |
|
Julien - ping for review
2014/09/23 23:17:31
Can't we just reuse GridCoordinate or GridSpan by
svillar
2014/09/24 08:33:11
Thing is that we want to sort grid items but we ne
Julien - ping for review
2014/10/09 19:01:57
We could get the same functionality with std::pair
svillar
2014/10/10 06:50:28
Accessing the members of the class seems more expl
svillar
2014/10/10 07:58:31
Said that I think using a class is still better ba
|
| +public: |
| + GridItemWithSpan(RenderBox& gridItem, GridCoordinate coordinate, GridTrackSizingDirection direction) |
|
Julien - ping for review
2014/10/09 19:01:57
Nit: const GridCoordinate&
|
| + : m_gridItem(gridItem) |
| + , m_coordinate(coordinate) |
| + { |
| + const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordinate.columns; |
| + m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPosition.toInt() + 1; |
| + } |
| -// This function sorts by span (.second in the pair) but also places pointers (.first in the pair) to the same object in |
| -// consecutive positions so duplicates could be easily removed with std::unique() for example. |
| -static bool gridItemWithSpanSorter(const GridItemWithSpan& item1, const GridItemWithSpan& item2) |
| -{ |
| - if (item1.second != item2.second) |
| - return item1.second < item2.second; |
| + RenderBox& gridItem() const { return m_gridItem; } |
| + GridCoordinate coordinate() const { return m_coordinate; } |
| - return item1.first < item2.first; |
| -} |
| + bool operator<(const GridItemWithSpan other) const |
| + { |
| + return m_span < other.m_span; |
| + } |
| -static bool uniquePointerInPair(const GridItemWithSpan& item1, const GridItemWithSpan& item2) |
| -{ |
| - return item1.first == item2.first; |
| -} |
| +private: |
| + std::reference_wrapper<RenderBox> m_gridItem; |
|
Julien - ping for review
2014/10/09 19:01:57
This is unused in blink. Why can't we just use a r
svillar
2014/10/10 06:50:28
It was required by the std::sort() algorithm as th
|
| + GridCoordinate m_coordinate; |
| + size_t m_span; |
| +}; |
| void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
| { |
| // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> grid track (crbug.com/235258). |
|
Julien - ping for review
2014/09/23 23:17:31
We should move this comment below and update it as
svillar
2014/09/24 08:33:11
OK will do. I've updated a CL for that issue long
|
| - for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) { |
| - size_t trackIndex = sizingData.contentSizedTracksIndex[i]; |
| - GridIterator iterator(m_grid, direction, trackIndex); |
| - Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; |
| - |
| - while (RenderBox* gridItem = iterator.nextGridItem()) |
| - itemsSortedByIncreasingSpan.append(std::make_pair(gridItem, gridItemSpan(*gridItem, direction))); |
| - std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end(), gridItemWithSpanSorter); |
| - Vector<GridItemWithSpan>::iterator end = std::unique(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair); |
| - |
| - for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan.begin(); it != end; ++it) { |
| - RenderBox* gridItem = it->first; |
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| - resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| + sizingData.itemsSortedByIncreasingSpan.shrink(0); |
| + size_t contentSizedTracksCount = sizingData.contentSizedTracksIndex.size(); |
| + for (size_t i = 0; i < contentSizedTracksCount; ++i) { |
| + GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]); |
|
Julien - ping for review
2014/09/23 23:17:31
Is it really good to follow the grid cells' order
svillar
2014/09/24 08:33:11
Following (order modified) DOM order will force us
|
| + HashSet<RenderBox*> itemsSet; |
| + |
| + while (RenderBox* gridItem = iterator.nextGridItem()) { |
| + if (itemsSet.add(gridItem).isNewEntry) |
| + sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, cachedGridCoordinate(*gridItem), direction)); |
| } |
| + } |
| + std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSortedByIncreasingSpan.end()); |
|
Julien - ping for review
2014/09/23 23:17:31
We should use stable_sort whenever we sort, else w
svillar
2014/09/24 08:33:11
Well the specs don't really mention anything relat
Julien - ping for review
2014/10/09 19:01:56
I think you're right and that's due to step 1 of t
|
| + |
| + Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingSpan.end(); |
| + for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreasingSpan.begin(); it != end; ++it) { |
| + GridItemWithSpan itemWithSpan = *it; |
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| + } |
| + for (size_t i = 0; i < contentSizedTracksCount; ++i) { |
| + size_t trackIndex = sizingData.contentSizedTracksIndex[i]; |
| GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex]; |
| if (track.m_maxBreadth == infinity) |
| track.m_maxBreadth = track.m_usedBreadth; |
| } |
| } |
| -void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
| +void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
| { |
| - const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
| + const GridCoordinate coordinate = gridItemWithSpan.coordinate(); |
| const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
| const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition; |
| @@ -732,7 +738,7 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing |
| if (sizingData.filteredTracks.isEmpty()) |
| return; |
| - LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direction, sizingData.columnTracks); |
| + LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItemWithSpan.gridItem(), direction, sizingData.columnTracks); |
| for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIndexForSpace <= finalTrackPosition; ++trackIndexForSpace) { |
| GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()]; |
| additionalBreadthSpace -= (track.*trackGetter)(); |