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

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 582733003: [CSSGridLayout] Pass the valid tracks for |tracksForGrowAboveMaxBreadth| (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Build fixes Created 6 years, 2 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
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | Source/core/rendering/style/GridTrackSize.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 } 181 }
182 182
183 Vector<GridTrack> columnTracks; 183 Vector<GridTrack> columnTracks;
184 Vector<GridTrack> rowTracks; 184 Vector<GridTrack> rowTracks;
185 Vector<size_t> contentSizedTracksIndex; 185 Vector<size_t> contentSizedTracksIndex;
186 186
187 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. 187 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
188 Vector<LayoutUnit> distributeTrackVector; 188 Vector<LayoutUnit> distributeTrackVector;
189 Vector<GridTrack*> filteredTracks; 189 Vector<GridTrack*> filteredTracks;
190 WillBeHeapVector<GridItemWithSpan> itemsSortedByIncreasingSpan; 190 WillBeHeapVector<GridItemWithSpan> itemsSortedByIncreasingSpan;
191 Vector<size_t> growAboveMaxBreadthTrackIndexes;
191 }; 192 };
192 193
193 RenderGrid::RenderGrid(Element* element) 194 RenderGrid::RenderGrid(Element* element)
194 : RenderBlock(element) 195 : RenderBlock(element)
195 , m_gridIsDirty(true) 196 , m_gridIsDirty(true)
196 , m_orderIterator(this) 197 , m_orderIterator(this)
197 { 198 {
198 ASSERT(!childrenInline()); 199 ASSERT(!childrenInline());
199 } 200 }
200 201
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction)) 729 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction))
729 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction)); 730 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction));
730 } 731 }
731 } 732 }
732 } 733 }
733 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); 734 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end());
734 735
735 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); 736 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
736 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { 737 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
737 GridItemWithSpan itemWithSpan = *it; 738 GridItemWithSpan itemWithSpan = *it;
738 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 739 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrac kSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
739 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 740 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize ::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
740 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth ); 741 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth );
741 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); 742 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
742 } 743 }
743 744
744 for (size_t i = 0; i < contentSizedTracksCount; ++i) { 745 for (size_t i = 0; i < contentSizedTracksCount; ++i) {
745 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; 746 size_t trackIndex = sizingData.contentSizedTracksIndex[i];
746 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 747 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
747 if (track.m_maxBreadth == infinity) 748 if (track.m_maxBreadth == infinity)
748 track.m_maxBreadth = track.m_usedBreadth; 749 track.m_maxBreadth = track.m_usedBreadth;
749 } 750 }
750 } 751 }
751 752
752 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction) 753 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction)
753 { 754 {
754 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); 755 const GridCoordinate coordinate = gridItemWithSpan.coordinate();
755 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; 756 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
756 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; 757 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
757 758
759 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0);
758 sizingData.filteredTracks.shrink(0); 760 sizingData.filteredTracks.shrink(0);
759 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { 761 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
760 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() ); 762 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() );
761 if (!(trackSize.*filterFunction)()) 763 if (!(trackSize.*filterFunction)())
762 continue; 764 continue;
763 765
764 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; 766 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()];
765 sizingData.filteredTracks.append(&track); 767 sizingData.filteredTracks.append(&track);
768
769 if (growAboveMaxBreadthFilterFunction && (trackSize.*growAboveMaxBreadth FilterFunction)())
770 sizingData.growAboveMaxBreadthTrackIndexes.append(sizingData.filtere dTracks.size() - 1);
766 } 771 }
767 772
768 if (sizingData.filteredTracks.isEmpty()) 773 if (sizingData.filteredTracks.isEmpty())
769 return; 774 return;
770 775
771 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItemWithSpan .gridItem(), direction, sizingData.columnTracks); 776 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItemWithSpan .gridItem(), direction, sizingData.columnTracks);
772 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) { 777 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) {
773 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()]; 778 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()];
774 additionalBreadthSpace -= (track.*trackGetter)(); 779 additionalBreadthSpace -= (track.*trackGetter)();
775 } 780 }
776 781
777 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|.
778
779 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function 782 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function
780 // call in those cases as it will be a noop in terms of track sizing. 783 // call in those cases as it will be a noop in terms of track sizing.
781 if (additionalBreadthSpace > 0) 784 if (additionalBreadthSpace > 0)
782 distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.filteredT racks, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace); 785 distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.growAbove MaxBreadthTrackIndexes, trackGetter, trackGrowthFunction, sizingData, additional BreadthSpace);
783 } 786 }
784 787
785 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2) 788 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2)
786 { 789 {
787 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort 790 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort
788 // (forall x: NOT x < x). 791 // (forall x: NOT x < x).
789 if (track1->m_maxBreadth == infinity && track2->m_maxBreadth == infinity) 792 if (track1->m_maxBreadth == infinity && track2->m_maxBreadth == infinity)
790 return false; 793 return false;
791 794
792 if (track1->m_maxBreadth == infinity || track2->m_maxBreadth == infinity) 795 if (track1->m_maxBreadth == infinity || track2->m_maxBreadth == infinity)
793 return track2->m_maxBreadth == infinity; 796 return track2->m_maxBreadth == infinity;
794 797
795 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt h - track2->m_usedBreadth); 798 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt h - track2->m_usedBreadth);
796 } 799 }
797 800
798 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid Track*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, Accumula torGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& ava ilableLogicalSpace) 801 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<size _t>* growAboveMaxBreadthTrackIndexes, AccumulatorGetter trackGetter, Accumulator GrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& availa bleLogicalSpace)
799 { 802 {
800 ASSERT(availableLogicalSpace > 0); 803 ASSERT(availableLogicalSpace > 0);
801 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); 804 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
802 805
803 size_t tracksSize = tracks.size(); 806 size_t tracksSize = tracks.size();
804 sizingData.distributeTrackVector.resize(tracksSize); 807 sizingData.distributeTrackVector.resize(tracksSize);
805 808
806 for (size_t i = 0; i < tracksSize; ++i) { 809 for (size_t i = 0; i < tracksSize; ++i) {
807 GridTrack& track = *tracks[i]; 810 GridTrack& track = *tracks[i];
808 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS ize - i); 811 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS ize - i);
809 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); 812 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)();
810 LayoutUnit growthShare = track.m_maxBreadth == infinity ? availableLogic alSpaceShare : std::min(availableLogicalSpaceShare, track.m_maxBreadth - trackBr eadth); 813 LayoutUnit growthShare = track.m_maxBreadth == infinity ? availableLogic alSpaceShare : std::min(availableLogicalSpaceShare, track.m_maxBreadth - trackBr eadth);
811 sizingData.distributeTrackVector[i] = trackBreadth; 814 sizingData.distributeTrackVector[i] = trackBreadth;
812 // We should never shrink any grid track or else we can't guarantee we a bide by our min-sizing function. 815 // We should never shrink any grid track or else we can't guarantee we a bide by our min-sizing function.
813 if (growthShare > 0) { 816 if (growthShare > 0) {
814 sizingData.distributeTrackVector[i] += growthShare; 817 sizingData.distributeTrackVector[i] += growthShare;
815 availableLogicalSpace -= growthShare; 818 availableLogicalSpace -= growthShare;
816 } 819 }
817 } 820 }
818 821
819 if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { 822 if (availableLogicalSpace > 0 && growAboveMaxBreadthTrackIndexes) {
820 tracksSize = tracksForGrowthAboveMaxBreadth->size(); 823 size_t indexesSize = growAboveMaxBreadthTrackIndexes->size();
821 for (size_t i = 0; i < tracksSize; ++i) { 824 size_t tracksGrowingAboveMaxBreadthSize = indexesSize ? indexesSize : tr acksSize;
822 LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); 825 // If we have a non-null empty vector of track indexes to grow above max breadth means that we should grow all
823 sizingData.distributeTrackVector[i] += growthShare; 826 // affected tracks.
827 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) {
828 LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAbove MaxBreadthSize - i);
829 size_t distributeTrackIndex = indexesSize ? growAboveMaxBreadthTrack Indexes->at(i) : i;
830 sizingData.distributeTrackVector[distributeTrackIndex] += growthShar e;
824 availableLogicalSpace -= growthShare; 831 availableLogicalSpace -= growthShare;
825 } 832 }
826 } 833 }
827 834
828 for (size_t i = 0; i < tracksSize; ++i) { 835 for (size_t i = 0; i < tracksSize; ++i) {
829 LayoutUnit growth = sizingData.distributeTrackVector[i] - (tracks[i]->*t rackGetter)(); 836 LayoutUnit growth = sizingData.distributeTrackVector[i] - (tracks[i]->*t rackGetter)();
830 if (growth >= 0) 837 if (growth >= 0)
831 (tracks[i]->*trackGrowthFunction)(growth); 838 (tracks[i]->*trackGrowthFunction)(growth);
832 } 839 }
833 } 840 }
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 if (isOutOfFlowPositioned()) 1429 if (isOutOfFlowPositioned())
1423 return "RenderGrid (positioned)"; 1430 return "RenderGrid (positioned)";
1424 if (isAnonymous()) 1431 if (isAnonymous())
1425 return "RenderGrid (generated)"; 1432 return "RenderGrid (generated)";
1426 if (isRelPositioned()) 1433 if (isRelPositioned())
1427 return "RenderGrid (relative positioned)"; 1434 return "RenderGrid (relative positioned)";
1428 return "RenderGrid"; 1435 return "RenderGrid";
1429 } 1436 }
1430 1437
1431 } // namespace blink 1438 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | Source/core/rendering/style/GridTrackSize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698