Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 592803003: [CSS Grid Layout] Size tracks using a list of all items sorted by span (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)();

Powered by Google App Engine
This is Rietveld 408576698