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..80cf4b8afb51cede78547ff1096dbd7d5e66a8c5 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<size_t> growAboveMaxBreadthTrackIndexes; |
| }; |
| RenderGrid::RenderGrid(Element* element) |
| @@ -701,8 +702,8 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
| 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::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); |
| + resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth); |
| resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, *gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
| } |
| @@ -713,12 +714,13 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
| } |
| } |
| -void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
| +void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction) |
| { |
| const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
| const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
| const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition; |
| + sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); |
| sizingData.filteredTracks.shrink(0); |
| for (GridResolvedPosition trackPosition = initialTrackPosition; trackPosition <= finalTrackPosition; ++trackPosition) { |
| const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition.toInt()); |
| @@ -727,6 +729,9 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing |
| GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; |
| sizingData.filteredTracks.append(&track); |
| + |
| + if (growAboveMaxBreadthFilterFunction && (trackSize.*growAboveMaxBreadthFilterFunction)()) |
| + sizingData.growAboveMaxBreadthTrackIndexes.append(sizingData.filteredTracks.size() - 1); |
|
Julien - ping for review
2014/09/30 17:36:57
This line seems really weird: we are checking the
svillar
2014/10/01 07:48:56
The reason is because this function and distribute
Julien - ping for review
2014/10/21 16:58:08
Now I understand the rationale for the logic but s
svillar
2014/10/22 07:16:17
Exactly that's the reason why I used the indexes,
|
| } |
| if (sizingData.filteredTracks.isEmpty()) |
| @@ -738,12 +743,10 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing |
| additionalBreadthSpace -= (track.*trackGetter)(); |
| } |
| - // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadth|. |
| - |
| // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0. Instead we directly avoid the function |
| // call in those cases as it will be a noop in terms of track sizing. |
| if (additionalBreadthSpace > 0) |
| - distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.filteredTracks, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace); |
| + distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.growAboveMaxBreadthTrackIndexes, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace); |
| } |
| static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTrack* track2) |
| @@ -759,7 +762,7 @@ static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr |
| return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadth - track2->m_usedBreadth); |
| } |
| -void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
| +void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<size_t>* growAboveMaxBreadthTrackIndexes, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
| { |
| ASSERT(availableLogicalSpace > 0); |
| std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); |
| @@ -781,11 +784,15 @@ void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid |
| } |
| } |
| - if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { |
| - tracksSize = tracksForGrowthAboveMaxBreadth->size(); |
| - for (size_t i = 0; i < tracksSize; ++i) { |
| - LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); |
| - sizingData.distributeTrackVector[i] += growthShare; |
| + if (availableLogicalSpace > 0 && growAboveMaxBreadthTrackIndexes) { |
| + size_t indexesSize = growAboveMaxBreadthTrackIndexes->size(); |
| + size_t tracksGrowingAboveMaxBreadthSize = indexesSize ? indexesSize : tracksSize; |
| + // If we have a non-null empty vector of track indexes to grow above max breadth means that we should grow all |
| + // affected tracks. |
|
Julien - ping for review
2014/09/30 17:36:57
The specification uses 2 passes for growth. Is thi
svillar
2014/10/01 07:48:57
Hmm I don't get this. Which 2 passes are you talki
Julien - ping for review
2014/10/21 16:58:08
I think I was referring to this text from step 2:
svillar
2014/10/22 07:16:17
Yeah it isn't obvious after a first read but the f
|
| + for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { |
| + LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAboveMaxBreadthSize - i); |
| + size_t distributeTrackIndex = indexesSize ? growAboveMaxBreadthTrackIndexes->at(i) : i; |
| + sizingData.distributeTrackVector[distributeTrackIndex] += growthShare; |
| availableLogicalSpace -= growthShare; |
| } |
| } |