OLD | NEW |
---|---|
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 23 matching lines...) Expand all Loading... | |
34 #include "core/paint/GridPainter.h" | 34 #include "core/paint/GridPainter.h" |
35 #include "platform/LengthFunctions.h" | 35 #include "platform/LengthFunctions.h" |
36 | 36 |
37 namespace blink { | 37 namespace blink { |
38 | 38 |
39 static const int infinity = -1; | 39 static const int infinity = -1; |
40 | 40 |
41 class GridTrack { | 41 class GridTrack { |
42 public: | 42 public: |
43 GridTrack() | 43 GridTrack() |
44 : m_plannedIncrease(0) | 44 : m_baseSize(0) |
45 , m_increaseDuringDistribution(0) | |
46 , m_baseSize(0) | |
47 , m_growthLimit(0) | 45 , m_growthLimit(0) |
46 , m_plannedSize(0) | |
47 , m_sizeDuringDistribution(0) | |
48 , m_infinitelyGrowable(false) | |
48 { | 49 { |
49 } | 50 } |
50 | 51 |
51 const LayoutUnit& baseSize() const | 52 const LayoutUnit& baseSize() const |
52 { | 53 { |
53 ASSERT(isGrowthLimitBiggerThanBaseSize()); | 54 ASSERT(isGrowthLimitBiggerThanBaseSize()); |
54 return m_baseSize; | 55 return m_baseSize; |
55 } | 56 } |
56 | 57 |
57 const LayoutUnit& growthLimit() const | 58 const LayoutUnit& growthLimit() const |
58 { | 59 { |
59 ASSERT(isGrowthLimitBiggerThanBaseSize()); | 60 ASSERT(isGrowthLimitBiggerThanBaseSize()); |
60 return m_growthLimit; | 61 return m_growthLimit; |
61 } | 62 } |
62 | 63 |
63 void setBaseSize(LayoutUnit baseSize) | 64 void setBaseSize(LayoutUnit baseSize) |
64 { | 65 { |
65 m_baseSize = baseSize; | 66 m_baseSize = baseSize; |
66 ensureGrowthLimitIsBiggerThanBaseSize(); | 67 ensureGrowthLimitIsBiggerThanBaseSize(); |
67 } | 68 } |
68 | 69 |
69 void setGrowthLimit(LayoutUnit growthLimit) | 70 void setGrowthLimit(LayoutUnit growthLimit) |
70 { | 71 { |
71 m_growthLimit = growthLimit; | 72 m_growthLimit = growthLimit; |
72 ensureGrowthLimitIsBiggerThanBaseSize(); | 73 ensureGrowthLimitIsBiggerThanBaseSize(); |
73 } | 74 } |
74 | 75 |
75 void growBaseSize(LayoutUnit growth) | |
76 { | |
77 ASSERT(growth >= 0); | |
78 m_baseSize += growth; | |
79 ensureGrowthLimitIsBiggerThanBaseSize(); | |
80 } | |
81 | |
82 void growGrowthLimit(LayoutUnit growth) | |
83 { | |
84 ASSERT(growth >= 0); | |
85 if (m_growthLimit == infinity) | |
86 m_growthLimit = m_baseSize + growth; | |
87 else | |
88 m_growthLimit += growth; | |
89 | |
90 ASSERT(m_growthLimit >= m_baseSize); | |
91 } | |
92 | |
93 bool growthLimitIsInfinite() const | 76 bool growthLimitIsInfinite() const |
94 { | 77 { |
95 return m_growthLimit == infinity; | 78 return m_growthLimit == infinity; |
96 } | 79 } |
97 | 80 |
81 bool growthLimitIsInfiniteOrTrackIsInfinitelyGrowable() const | |
82 { | |
83 return growthLimitIsInfinite() || m_infinitelyGrowable; | |
84 } | |
85 | |
98 const LayoutUnit& growthLimitIfNotInfinite() const | 86 const LayoutUnit& growthLimitIfNotInfinite() const |
99 { | 87 { |
100 ASSERT(isGrowthLimitBiggerThanBaseSize()); | 88 ASSERT(isGrowthLimitBiggerThanBaseSize()); |
101 return (m_growthLimit == infinity) ? m_baseSize : m_growthLimit; | 89 return (m_growthLimit == infinity) ? m_baseSize : m_growthLimit; |
102 } | 90 } |
103 | 91 |
104 LayoutUnit m_plannedIncrease; | 92 const LayoutUnit& plannedSize() const { return m_plannedSize; } |
105 LayoutUnit m_increaseDuringDistribution; | 93 |
94 void setPlannedSize(const LayoutUnit& plannedSize) | |
95 { | |
96 ASSERT(plannedSize >= 0 || plannedSize == infinity); | |
97 m_plannedSize = plannedSize; | |
Julien - ping for review
2015/04/08 18:58:56
It seems weird to allow the plannedSize to be infi
svillar
2015/04/10 09:43:09
In theory that's true, although not possible with
| |
98 } | |
99 | |
100 const LayoutUnit& sizeDuringDistribution() { return m_sizeDuringDistribution ; } | |
101 | |
102 void setSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution) | |
103 { | |
104 ASSERT(sizeDuringDistribution >= 0); | |
105 m_sizeDuringDistribution = sizeDuringDistribution; | |
106 } | |
107 | |
108 void growSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution) | |
109 { | |
110 ASSERT(sizeDuringDistribution >= 0); | |
111 m_sizeDuringDistribution += sizeDuringDistribution; | |
112 } | |
113 | |
114 bool infinitelyGrowable() const { return m_infinitelyGrowable; } | |
115 void setInfinitelyGrowable(bool infinitelyGrowable) { m_infinitelyGrowable = infinitelyGrowable; } | |
106 | 116 |
107 private: | 117 private: |
108 bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite( ) || m_growthLimit >= m_baseSize; } | 118 bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite( ) || m_growthLimit >= m_baseSize; } |
109 | 119 |
110 void ensureGrowthLimitIsBiggerThanBaseSize() | 120 void ensureGrowthLimitIsBiggerThanBaseSize() |
111 { | 121 { |
112 if (m_growthLimit != infinity && m_growthLimit < m_baseSize) | 122 if (m_growthLimit != infinity && m_growthLimit < m_baseSize) |
113 m_growthLimit = m_baseSize; | 123 m_growthLimit = m_baseSize; |
114 } | 124 } |
115 | 125 |
116 LayoutUnit m_baseSize; | 126 LayoutUnit m_baseSize; |
117 LayoutUnit m_growthLimit; | 127 LayoutUnit m_growthLimit; |
128 LayoutUnit m_plannedSize; | |
129 LayoutUnit m_sizeDuringDistribution; | |
130 bool m_infinitelyGrowable; | |
Julien - ping for review
2015/04/08 18:58:56
We are storing one extra member compared to the sp
svillar
2015/04/10 09:43:09
It does exist in the original algorithm, it's call
| |
118 }; | 131 }; |
119 | 132 |
120 struct GridTrackForNormalization { | 133 struct GridTrackForNormalization { |
121 GridTrackForNormalization(const GridTrack& track, double flex) | 134 GridTrackForNormalization(const GridTrack& track, double flex) |
122 : m_track(&track) | 135 : m_track(&track) |
123 , m_flex(flex) | 136 , m_flex(flex) |
124 , m_normalizedFlexValue(track.baseSize() / flex) | 137 , m_normalizedFlexValue(track.baseSize() / flex) |
125 { | 138 { |
126 } | 139 } |
127 | 140 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
406 | 419 |
407 // 1. Initialize per Grid track variables. | 420 // 1. Initialize per Grid track variables. |
408 for (size_t i = 0; i < tracks.size(); ++i) { | 421 for (size_t i = 0; i < tracks.size(); ++i) { |
409 GridTrack& track = tracks[i]; | 422 GridTrack& track = tracks[i]; |
410 GridTrackSize trackSize = gridTrackSize(direction, i); | 423 GridTrackSize trackSize = gridTrackSize(direction, i); |
411 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 424 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
412 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); | 425 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); |
413 | 426 |
414 track.setBaseSize(computeUsedBreadthOfMinLength(direction, minTrackBread th)); | 427 track.setBaseSize(computeUsedBreadthOfMinLength(direction, minTrackBread th)); |
415 track.setGrowthLimit(computeUsedBreadthOfMaxLength(direction, maxTrackBr eadth, track.baseSize())); | 428 track.setGrowthLimit(computeUsedBreadthOfMaxLength(direction, maxTrackBr eadth, track.baseSize())); |
429 track.setInfinitelyGrowable(false); | |
416 | 430 |
417 if (trackSize.isContentSized()) | 431 if (trackSize.isContentSized()) |
418 sizingData.contentSizedTracksIndex.append(i); | 432 sizingData.contentSizedTracksIndex.append(i); |
419 if (trackSize.maxTrackBreadth().isFlex()) | 433 if (trackSize.maxTrackBreadth().isFlex()) |
420 flexibleSizedTracksIndex.append(i); | 434 flexibleSizedTracksIndex.append(i); |
421 } | 435 } |
422 | 436 |
423 // 2. Resolve content-based TrackSizingFunctions. | 437 // 2. Resolve content-based TrackSizingFunctions. |
424 if (!sizingData.contentSizedTracksIndex.isEmpty()) | 438 if (!sizingData.contentSizedTracksIndex.isEmpty()) |
425 resolveContentBasedTrackSizingFunctions(direction, sizingData); | 439 resolveContentBasedTrackSizingFunctions(direction, sizingData); |
426 | 440 |
427 for (const auto& track: tracks) { | 441 for (const auto& track: tracks) { |
428 ASSERT(!track.growthLimitIsInfinite()); | 442 ASSERT(!track.growthLimitIsInfinite() && !track.infinitelyGrowable()); |
Julien - ping for review
2015/04/08 18:58:56
This should be split in 2. Logical AND in ASSERT m
svillar
2015/04/10 09:43:09
Acknowledged.
| |
429 freeSpace -= track.baseSize(); | 443 freeSpace -= track.baseSize(); |
430 } | 444 } |
431 | 445 |
432 const bool hasUndefinedRemainingSpace = (direction == ForRows) ? style()->lo gicalHeight().isAuto() : gridElementIsShrinkToFit(); | 446 const bool hasUndefinedRemainingSpace = (direction == ForRows) ? style()->lo gicalHeight().isAuto() : gridElementIsShrinkToFit(); |
433 | 447 |
434 if (!hasUndefinedRemainingSpace && freeSpace <= 0) | 448 if (!hasUndefinedRemainingSpace && freeSpace <= 0) |
435 return; | 449 return; |
436 | 450 |
437 // 3. Grow all Grid tracks in GridTracks from their baseSize up to their gro wthLimit value until freeSpace is exhausted. | 451 // 3. Grow all Grid tracks in GridTracks from their baseSize up to their gro wthLimit value until freeSpace is exhausted. |
438 const size_t tracksSize = tracks.size(); | 452 const size_t tracksSize = tracks.size(); |
439 if (!hasUndefinedRemainingSpace) { | 453 if (!hasUndefinedRemainingSpace) { |
440 Vector<GridTrack*> tracksForDistribution(tracksSize); | 454 Vector<GridTrack*> tracksForDistribution(tracksSize); |
441 for (size_t i = 0; i < tracksSize; ++i) { | 455 for (size_t i = 0; i < tracksSize; ++i) { |
442 tracksForDistribution[i] = tracks.data() + i; | 456 tracksForDistribution[i] = tracks.data() + i; |
443 tracksForDistribution[i]->m_plannedIncrease = 0; | 457 tracksForDistribution[i]->setPlannedSize(tracksForDistribution[i]->b aseSize()); |
444 } | 458 } |
445 | 459 |
446 distributeSpaceToTracks(tracksForDistribution, nullptr, &GridTrack::base Size, sizingData, freeSpace); | 460 distributeSpaceToTracks(tracksForDistribution, nullptr, &GridTrack::base Size, sizingData, freeSpace); |
447 | 461 |
448 for (auto* track : tracksForDistribution) | 462 for (auto* track : tracksForDistribution) |
449 track->growBaseSize(track->m_plannedIncrease); | 463 track->setBaseSize(track->plannedSize()); |
450 } else { | 464 } else { |
451 for (auto& track : tracks) | 465 for (auto& track : tracks) |
452 track.setBaseSize(track.growthLimit()); | 466 track.setBaseSize(track.growthLimit()); |
453 } | 467 } |
454 | 468 |
455 if (flexibleSizedTracksIndex.isEmpty()) | 469 if (flexibleSizedTracksIndex.isEmpty()) |
456 return; | 470 return; |
457 | 471 |
458 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. | 472 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. |
459 double normalizedFractionBreadth = 0; | 473 double normalizedFractionBreadth = 0; |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
736 } | 750 } |
737 } | 751 } |
738 } | 752 } |
739 } | 753 } |
740 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); | 754 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); |
741 | 755 |
742 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); | 756 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); |
743 auto end = sizingData.itemsSortedByIncreasingSpan.end(); | 757 auto end = sizingData.itemsSortedByIncreasingSpan.end(); |
744 while (it != end) { | 758 while (it != end) { |
745 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) }; | 759 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) }; |
746 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &LayoutGrid::m inContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSiz e::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); | 760 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &LayoutGrid::m inContentForChild, &GridTrack::baseSize, &GridTrack::baseSize, &GridTrack::setBa seSize, &GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBr eadth); |
747 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMaxContentMinTrackBreadth, &LayoutGrid::maxCon tentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::ha sMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth); | 761 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMaxContentMinTrackBreadth, &LayoutGrid::maxCon tentForChild, &GridTrack::baseSize, &GridTrack::baseSize, &GridTrack::setBaseSiz e, &GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth); |
748 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &LayoutGrid::m inContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthL imit); | 762 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &LayoutGrid::m inContentForChild, &GridTrack::growthLimit, &GridTrack::growthLimitIfNotInfinite , &GridTrack::setGrowthLimit); |
749 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMaxContentMaxTrackBreadth, &LayoutGrid::maxCon tentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit) ; | 763 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s panGroupRange, &GridTrackSize::hasMaxContentMaxTrackBreadth, &LayoutGrid::maxCon tentForChild, &GridTrack::growthLimit, &GridTrack::growthLimitIfNotInfinite, &Gr idTrack::setGrowthLimit); |
750 it = spanGroupRange.rangeEnd; | 764 it = spanGroupRange.rangeEnd; |
751 } | 765 } |
752 | 766 |
753 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 767 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
754 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; | 768 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; |
755 if (track.growthLimitIsInfinite()) | 769 if (track.growthLimitIsInfinite()) |
756 track.setGrowthLimit(track.baseSize()); | 770 track.setGrowthLimit(track.baseSize()); |
757 } | 771 } |
758 } | 772 } |
759 | 773 |
760 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridCoordinate& coordinate, LayoutBox& gri dItem, GridTrack& track, Vector<GridTrack>& columnTracks) | 774 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridCoordinate& coordinate, LayoutBox& gri dItem, GridTrack& track, Vector<GridTrack>& columnTracks) |
761 { | 775 { |
762 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; | 776 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
763 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); | 777 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); |
764 | 778 |
765 if (trackSize.hasMinContentMinTrackBreadth()) | 779 if (trackSize.hasMinContentMinTrackBreadth()) |
766 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks))); | 780 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks))); |
767 else if (trackSize.hasMaxContentMinTrackBreadth()) | 781 else if (trackSize.hasMaxContentMinTrackBreadth()) |
768 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks))); | 782 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks))); |
769 | 783 |
770 if (trackSize.hasMinContentMaxTrackBreadth()) | 784 if (trackSize.hasMinContentMaxTrackBreadth()) |
771 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, columnTracks))); | 785 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, columnTracks))); |
772 else if (trackSize.hasMaxContentMaxTrackBreadth()) | 786 else if (trackSize.hasMaxContentMaxTrackBreadth()) |
773 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, columnTracks))); | 787 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, columnTracks))); |
774 } | 788 } |
775 | 789 |
776 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, const GridItemsSpanGroupRange& gridItemsWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, Fil terFunction growAboveMaxBreadthFilterFunction) | 790 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, const GridItemsSpanGroupRange& gridItemsWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGetter trackGetterIfNotInfinite, Accu mulatorSetterFunction trackSetterFunction, FilterFunction growAboveMaxBreadthFil terFunction) |
777 { | 791 { |
778 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; | 792 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; |
779 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) | 793 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
780 tracks[trackIndex].m_plannedIncrease = 0; | 794 GridTrack& track = tracks[trackIndex]; |
795 track.setPlannedSize((track.*trackGetter)()); | |
796 } | |
781 | 797 |
782 for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEn d; ++it) { | 798 for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEn d; ++it) { |
783 GridItemWithSpan& gridItemWithSpan = *it; | 799 GridItemWithSpan& gridItemWithSpan = *it; |
784 ASSERT(gridItemWithSpan.span() > 1); | 800 ASSERT(gridItemWithSpan.span() > 1); |
785 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); | 801 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); |
786 const GridSpan& itemSpan = (direction == ForColumns) ? coordinate.column s : coordinate.rows; | 802 const GridSpan& itemSpan = (direction == ForColumns) ? coordinate.column s : coordinate.rows; |
787 | 803 |
788 sizingData.growBeyondGrowthLimitsTracks.shrink(0); | 804 sizingData.growBeyondGrowthLimitsTracks.shrink(0); |
789 sizingData.filteredTracks.shrink(0); | 805 sizingData.filteredTracks.shrink(0); |
790 LayoutUnit spanningTracksSize; | 806 LayoutUnit spanningTracksSize; |
791 for (const auto& trackPosition : itemSpan) { | 807 for (const auto& trackPosition : itemSpan) { |
792 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toI nt()); | 808 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toI nt()); |
793 GridTrack& track = (direction == ForColumns) ? sizingData.columnTrac ks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; | 809 GridTrack& track = (direction == ForColumns) ? sizingData.columnTrac ks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; |
794 spanningTracksSize += (track.*trackGetter)(); | 810 spanningTracksSize += (track.*trackGetterIfNotInfinite)(); |
795 if (!(trackSize.*filterFunction)()) | 811 if (!(trackSize.*filterFunction)()) |
796 continue; | 812 continue; |
797 | 813 |
798 sizingData.filteredTracks.append(&track); | 814 sizingData.filteredTracks.append(&track); |
799 | 815 |
800 if (!growAboveMaxBreadthFilterFunction || (trackSize.*growAboveMaxBr eadthFilterFunction)()) | 816 if (!growAboveMaxBreadthFilterFunction || (trackSize.*growAboveMaxBr eadthFilterFunction)()) |
801 sizingData.growBeyondGrowthLimitsTracks.append(&track); | 817 sizingData.growBeyondGrowthLimitsTracks.append(&track); |
802 } | 818 } |
803 | 819 |
804 if (sizingData.filteredTracks.isEmpty()) | 820 if (sizingData.filteredTracks.isEmpty()) |
805 continue; | 821 continue; |
806 | 822 |
807 // Specs mandate to floor extraSpace to 0. Instead we directly avoid the function call in those cases as it will be | |
808 // a noop in terms of track sizing. | |
809 LayoutUnit extraSpace = (this->*sizingFunction)(gridItemWithSpan.gridIte m(), direction, sizingData.columnTracks) - spanningTracksSize; | 823 LayoutUnit extraSpace = (this->*sizingFunction)(gridItemWithSpan.gridIte m(), direction, sizingData.columnTracks) - spanningTracksSize; |
810 if (extraSpace > 0) { | 824 Vector<GridTrack*>* tracksToGrowBeyondGrowthLimits = sizingData.growBeyo ndGrowthLimitsTracks.isEmpty() ? &sizingData.filteredTracks : &sizingData.growBe yondGrowthLimitsTracks; |
811 Vector<GridTrack*>* tracksToGrowBeyondGrowthLimits = sizingData.grow BeyondGrowthLimitsTracks.isEmpty() ? &sizingData.filteredTracks : &sizingData.gr owBeyondGrowthLimitsTracks; | 825 extraSpace = std::max<LayoutUnit>(extraSpace, 0); |
812 distributeSpaceToTracks(sizingData.filteredTracks, tracksToGrowBeyon dGrowthLimits, trackGetter, sizingData, extraSpace); | 826 distributeSpaceToTracks(sizingData.filteredTracks, tracksToGrowBeyondGro wthLimits, trackGetterIfNotInfinite, sizingData, extraSpace); |
813 } | |
814 } | 827 } |
815 | 828 |
816 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 829 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
817 GridTrack& track = tracks[trackIndex]; | 830 GridTrack& track = tracks[trackIndex]; |
818 if (track.m_plannedIncrease) | 831 if ((track.*trackGetter)() == infinity && track.plannedSize() != infinit y) |
819 (track.*trackGrowthFunction)(track.m_plannedIncrease); | 832 track.setInfinitelyGrowable(true); |
833 else if (track.infinitelyGrowable()) | |
834 track.setInfinitelyGrowable(false); | |
835 (track.*trackSetterFunction)(track.plannedSize()); | |
820 } | 836 } |
821 } | 837 } |
822 | 838 |
823 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2) | 839 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2) |
824 { | 840 { |
825 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort | 841 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort |
826 // (forall x: NOT x < x). | 842 // (forall x: NOT x < x). |
827 if (track1->growthLimitIsInfinite() && track2->growthLimitIsInfinite()) | 843 if (track1->growthLimitIsInfiniteOrTrackIsInfinitelyGrowable() && track2->gr owthLimitIsInfiniteOrTrackIsInfinitelyGrowable()) |
828 return false; | 844 return false; |
829 | 845 |
830 if (track1->growthLimitIsInfinite() || track2->growthLimitIsInfinite()) | 846 if (track1->growthLimitIsInfiniteOrTrackIsInfinitelyGrowable() || track2->gr owthLimitIsInfiniteOrTrackIsInfinitelyGrowable()) |
831 return track2->growthLimitIsInfinite(); | 847 return track2->growthLimitIsInfiniteOrTrackIsInfinitelyGrowable(); |
832 | 848 |
833 return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit() - track2->baseSize()); | 849 return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit() - track2->baseSize()); |
834 } | 850 } |
835 | 851 |
836 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto r<GridTrack*>* growBeyondGrowthLimitsTracks, AccumulatorGetter trackGetter, Grid SizingData& sizingData, LayoutUnit& availableLogicalSpace) | 852 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto r<GridTrack*>* growBeyondGrowthLimitsTracks, AccumulatorGetter trackGetterIfNotI nfinite, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
837 { | 853 { |
838 ASSERT(availableLogicalSpace > 0); | 854 ASSERT(availableLogicalSpace >= 0); |
839 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); | 855 if (availableLogicalSpace > 0) { |
856 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); | |
840 | 857 |
841 size_t tracksSize = tracks.size(); | 858 size_t tracksSize = tracks.size(); |
842 for (size_t i = 0; i < tracksSize; ++i) { | 859 for (size_t i = 0; i < tracksSize; ++i) { |
843 GridTrack& track = *tracks[i]; | 860 GridTrack& track = *tracks[i]; |
844 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS ize - i); | 861 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tra cksSize - i); |
845 const LayoutUnit& trackBreadth = (track.*trackGetter)(); | 862 const LayoutUnit& trackBreadth = (track.*trackGetterIfNotInfinite)() ; |
846 LayoutUnit growthShare = track.growthLimitIsInfinite() ? availableLogica lSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - trackBr eadth); | 863 LayoutUnit growthShare = track.growthLimitIsInfiniteOrTrackIsInfinit elyGrowable() ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare , track.growthLimit() - trackBreadth); |
847 ASSERT_WITH_MESSAGE(growthShare >= 0, "We must never shrink any grid tra ck or else we can't guarantee we abide by our min-sizing function."); | 864 ASSERT_WITH_MESSAGE(growthShare >= 0, "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function."); |
848 track.m_increaseDuringDistribution = growthShare; | 865 track.setSizeDuringDistribution(trackBreadth + growthShare); |
849 availableLogicalSpace -= growthShare; | 866 availableLogicalSpace -= growthShare; |
867 } | |
868 } else { | |
869 for (auto* track : tracks) | |
870 track->setSizeDuringDistribution((track->*trackGetterIfNotInfinite)( )); | |
850 } | 871 } |
851 | 872 |
852 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) { | 873 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) { |
853 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks-> size(); | 874 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks-> size(); |
854 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { | 875 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { |
855 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); | 876 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); |
856 LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAbove MaxBreadthSize - i); | 877 LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAbove MaxBreadthSize - i); |
857 track->m_increaseDuringDistribution += growthShare; | 878 track->growSizeDuringDistribution(growthShare); |
858 availableLogicalSpace -= growthShare; | 879 availableLogicalSpace -= growthShare; |
859 } | 880 } |
860 } | 881 } |
861 | 882 |
862 for (auto* track : tracks) | 883 for (auto* track : tracks) |
863 track->m_plannedIncrease = std::max(track->m_plannedIncrease, track->m_i ncreaseDuringDistribution); | 884 track->setPlannedSize(track->plannedSize() == infinity ? track->sizeDuri ngDistribution() : std::max(track->plannedSize(), track->sizeDuringDistribution( ))); |
864 } | 885 } |
865 | 886 |
866 #if ENABLE(ASSERT) | 887 #if ENABLE(ASSERT) |
867 bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire ction, const Vector<GridTrack>& tracks) | 888 bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire ction, const Vector<GridTrack>& tracks) |
868 { | 889 { |
869 for (size_t i = 0; i < tracks.size(); ++i) { | 890 for (size_t i = 0; i < tracks.size(); ++i) { |
870 GridTrackSize trackSize = gridTrackSize(direction, i); | 891 GridTrackSize trackSize = gridTrackSize(direction, i); |
871 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 892 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
872 if (computeUsedBreadthOfMinLength(direction, minTrackBreadth) > tracks[i ].baseSize()) | 893 if (computeUsedBreadthOfMinLength(direction, minTrackBreadth) > tracks[i ].baseSize()) |
873 return false; | 894 return false; |
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1765 if (isFloating()) | 1786 if (isFloating()) |
1766 return "LayoutGrid (floating)"; | 1787 return "LayoutGrid (floating)"; |
1767 if (isAnonymous()) | 1788 if (isAnonymous()) |
1768 return "LayoutGrid (anonymous)"; | 1789 return "LayoutGrid (anonymous)"; |
1769 if (isRelPositioned()) | 1790 if (isRelPositioned()) |
1770 return "LayoutGrid (relative positioned)"; | 1791 return "LayoutGrid (relative positioned)"; |
1771 return "LayoutGrid"; | 1792 return "LayoutGrid"; |
1772 } | 1793 } |
1773 | 1794 |
1774 } // namespace blink | 1795 } // namespace blink |
OLD | NEW |