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

Side by Side 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 unified diff | Download patch
OLDNEW
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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 { 177 {
178 } 178 }
179 179
180 Vector<GridTrack> columnTracks; 180 Vector<GridTrack> columnTracks;
181 Vector<GridTrack> rowTracks; 181 Vector<GridTrack> rowTracks;
182 Vector<size_t> contentSizedTracksIndex; 182 Vector<size_t> contentSizedTracksIndex;
183 183
184 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. 184 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
185 Vector<LayoutUnit> distributeTrackVector; 185 Vector<LayoutUnit> distributeTrackVector;
186 Vector<GridTrack*> filteredTracks; 186 Vector<GridTrack*> filteredTracks;
187 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
187 }; 188 };
188 189
189 RenderGrid::RenderGrid(Element* element) 190 RenderGrid::RenderGrid(Element* element)
190 : RenderBlock(element) 191 : RenderBlock(element)
191 , m_gridIsDirty(true) 192 , m_gridIsDirty(true)
192 , m_orderIterator(this) 193 , m_orderIterator(this)
193 { 194 {
194 ASSERT(!childrenInline()); 195 ASSERT(!childrenInline());
195 } 196 }
196 197
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 654
654 if (direction == ForColumns) { 655 if (direction == ForColumns) {
655 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. 656 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width.
656 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html 657 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
657 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(&child); 658 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(&child);
658 } 659 }
659 660
660 return logicalHeightForChild(child, columnTracks); 661 return logicalHeightForChild(child, columnTracks);
661 } 662 }
662 663
663 size_t RenderGrid::gridItemSpan(const RenderBox& child, GridTrackSizingDirection direction) 664 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
664 { 665 public:
665 GridCoordinate childCoordinate = cachedGridCoordinate(child); 666 GridItemWithSpan(RenderBox& gridItem, GridCoordinate coordinate, GridTrackSi zingDirection direction)
Julien - ping for review 2014/10/09 19:01:57 Nit: const GridCoordinate&
666 GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCo ordinate.columns; 667 : m_gridItem(gridItem)
668 , m_coordinate(coordinate)
669 {
670 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi nate.columns;
671 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi on.toInt() + 1;
672 }
667 673
668 return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPo sition.toInt() + 1; 674 RenderBox& gridItem() const { return m_gridItem; }
669 } 675 GridCoordinate coordinate() const { return m_coordinate; }
670 676
671 typedef std::pair<RenderBox*, size_t> GridItemWithSpan; 677 bool operator<(const GridItemWithSpan other) const
678 {
679 return m_span < other.m_span;
680 }
672 681
673 // This function sorts by span (.second in the pair) but also places pointers (. first in the pair) to the same object in 682 private:
674 // consecutive positions so duplicates could be easily removed with std::unique( ) for example. 683 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
675 static bool gridItemWithSpanSorter(const GridItemWithSpan& item1, const GridItem WithSpan& item2) 684 GridCoordinate m_coordinate;
676 { 685 size_t m_span;
677 if (item1.second != item2.second) 686 };
678 return item1.second < item2.second;
679
680 return item1.first < item2.first;
681 }
682
683 static bool uniquePointerInPair(const GridItemWithSpan& item1, const GridItemWit hSpan& item2)
684 {
685 return item1.first == item2.first;
686 }
687 687
688 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) 688 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
689 { 689 {
690 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id track (crbug.com/235258). 690 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id 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
691 691
692 for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) { 692 sizingData.itemsSortedByIncreasingSpan.shrink(0);
693 size_t contentSizedTracksCount = sizingData.contentSizedTracksIndex.size();
694 for (size_t i = 0; i < contentSizedTracksCount; ++i) {
695 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn dex[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
696 HashSet<RenderBox*> itemsSet;
697
698 while (RenderBox* gridItem = iterator.nextGridItem()) {
699 if (itemsSet.add(gridItem).isNewEntry)
700 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(* gridItem, cachedGridCoordinate(*gridItem), direction));
701 }
702 }
703 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.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
704
705 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
706 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
707 GridItemWithSpan itemWithSpan = *it;
708 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
709 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
710 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth );
711 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
712 }
713
714 for (size_t i = 0; i < contentSizedTracksCount; ++i) {
693 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; 715 size_t trackIndex = sizingData.contentSizedTracksIndex[i];
694 GridIterator iterator(m_grid, direction, trackIndex);
695 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
696
697 while (RenderBox* gridItem = iterator.nextGridItem())
698 itemsSortedByIncreasingSpan.append(std::make_pair(gridItem, gridItem Span(*gridItem, direction)));
699 std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncre asingSpan.end(), gridItemWithSpanSorter);
700 Vector<GridItemWithSpan>::iterator end = std::unique(itemsSortedByIncrea singSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair);
701
702 for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan .begin(); it != end; ++it) {
703 RenderBox* gridItem = it->first;
704 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::mi nContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
705 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxCont entForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
706 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::mi nContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadt h);
707 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxCont entForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
708 }
709
710 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 716 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
711 if (track.m_maxBreadth == infinity) 717 if (track.m_maxBreadth == infinity)
712 track.m_maxBreadth = track.m_usedBreadth; 718 track.m_maxBreadth = track.m_usedBreadth;
713 } 719 }
714 } 720 }
715 721
716 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunc tion filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGette r, AccumulatorGrowFunction trackGrowthFunction) 722 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction)
717 { 723 {
718 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); 724 const GridCoordinate coordinate = gridItemWithSpan.coordinate();
719 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; 725 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
720 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; 726 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
721 727
722 sizingData.filteredTracks.shrink(0); 728 sizingData.filteredTracks.shrink(0);
723 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { 729 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
724 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt()); 730 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt());
725 if (!(trackSize.*filterFunction)()) 731 if (!(trackSize.*filterFunction)())
726 continue; 732 continue;
727 733
728 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; 734 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()];
729 sizingData.filteredTracks.append(&track); 735 sizingData.filteredTracks.append(&track);
730 } 736 }
731 737
732 if (sizingData.filteredTracks.isEmpty()) 738 if (sizingData.filteredTracks.isEmpty())
733 return; 739 return;
734 740
735 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct ion, sizingData.columnTracks); 741 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItemWithSpan .gridItem(), direction, sizingData.columnTracks);
736 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) { 742 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) {
737 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()]; 743 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()];
738 additionalBreadthSpace -= (track.*trackGetter)(); 744 additionalBreadthSpace -= (track.*trackGetter)();
739 } 745 }
740 746
741 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|. 747 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|.
742 748
743 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function 749 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function
744 // call in those cases as it will be a noop in terms of track sizing. 750 // call in those cases as it will be a noop in terms of track sizing.
745 if (additionalBreadthSpace > 0) 751 if (additionalBreadthSpace > 0)
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 if (isOutOfFlowPositioned()) 1460 if (isOutOfFlowPositioned())
1455 return "RenderGrid (positioned)"; 1461 return "RenderGrid (positioned)";
1456 if (isAnonymous()) 1462 if (isAnonymous())
1457 return "RenderGrid (generated)"; 1463 return "RenderGrid (generated)";
1458 if (isRelPositioned()) 1464 if (isRelPositioned())
1459 return "RenderGrid (relative positioned)"; 1465 return "RenderGrid (relative positioned)";
1460 return "RenderGrid"; 1466 return "RenderGrid";
1461 } 1467 }
1462 1468
1463 } // namespace blink 1469 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698