| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 m_flex = o.m_flex; | 132 m_flex = o.m_flex; |
| 133 m_normalizedFlexValue = o.m_normalizedFlexValue; | 133 m_normalizedFlexValue = o.m_normalizedFlexValue; |
| 134 return *this; | 134 return *this; |
| 135 } | 135 } |
| 136 | 136 |
| 137 const GridTrack* m_track; | 137 const GridTrack* m_track; |
| 138 double m_flex; | 138 double m_flex; |
| 139 LayoutUnit m_normalizedFlexValue; | 139 LayoutUnit m_normalizedFlexValue; |
| 140 }; | 140 }; |
| 141 | 141 |
| 142 enum TrackSizeRestriction { |
| 143 AllowInfinity, |
| 144 ForbidInfinity, |
| 145 }; |
| 146 |
| 142 class LayoutGrid::GridIterator { | 147 class LayoutGrid::GridIterator { |
| 143 WTF_MAKE_NONCOPYABLE(GridIterator); | 148 WTF_MAKE_NONCOPYABLE(GridIterator); |
| 144 public: | 149 public: |
| 145 // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g | 150 // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g |
| 146 // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd co
lumn. | 151 // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd co
lumn. |
| 147 GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direct
ion, size_t fixedTrackIndex, size_t varyingTrackIndex = 0) | 152 GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direct
ion, size_t fixedTrackIndex, size_t varyingTrackIndex = 0) |
| 148 : m_grid(grid) | 153 : m_grid(grid) |
| 149 , m_direction(direction) | 154 , m_direction(direction) |
| 150 , m_rowIndex((direction == ForColumns) ? varyingTrackIndex : fixedTrackI
ndex) | 155 , m_rowIndex((direction == ForColumns) ? varyingTrackIndex : fixedTrackI
ndex) |
| 151 , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : varyingTra
ckIndex) | 156 , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : varyingTra
ckIndex) |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 } | 460 } |
| 456 | 461 |
| 457 Vector<GridTrack*> tracksToStretch(sizingData.contentSizedTracksIndex.si
ze()); | 462 Vector<GridTrack*> tracksToStretch(sizingData.contentSizedTracksIndex.si
ze()); |
| 458 if (needToStretch) { | 463 if (needToStretch) { |
| 459 unsigned i = 0; | 464 unsigned i = 0; |
| 460 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 465 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
| 461 tracksToStretch[i++] = tracks.data() + trackIndex; | 466 tracksToStretch[i++] = tracks.data() + trackIndex; |
| 462 } | 467 } |
| 463 } | 468 } |
| 464 | 469 |
| 465 distributeSpaceToTracks(tracksForDistribution, needToStretch ? &tracksTo
Stretch : nullptr, &GridTrack::baseSize, sizingData, freeSpace); | 470 distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, needToStr
etch ? &tracksToStretch : nullptr, sizingData, freeSpace); |
| 466 | 471 |
| 467 for (auto* track : tracksForDistribution) | 472 for (auto* track : tracksForDistribution) |
| 468 track->growBaseSize(track->m_plannedIncrease); | 473 track->growBaseSize(track->m_plannedIncrease); |
| 469 } else { | 474 } else { |
| 470 for (auto& track : tracks) | 475 for (auto& track : tracks) |
| 471 track.setBaseSize(track.growthLimit()); | 476 track.setBaseSize(track.growthLimit()); |
| 472 } | 477 } |
| 473 | 478 |
| 474 if (flexibleSizedTracksIndex.isEmpty()) | 479 if (flexibleSizedTracksIndex.isEmpty()) |
| 475 return; | 480 return; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 } | 760 } |
| 756 } | 761 } |
| 757 } | 762 } |
| 758 } | 763 } |
| 759 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo
rtedByIncreasingSpan.end()); | 764 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo
rtedByIncreasingSpan.end()); |
| 760 | 765 |
| 761 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); | 766 auto it = sizingData.itemsSortedByIncreasingSpan.begin(); |
| 762 auto end = sizingData.itemsSortedByIncreasingSpan.end(); | 767 auto end = sizingData.itemsSortedByIncreasingSpan.end(); |
| 763 while (it != end) { | 768 while (it != end) { |
| 764 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end,
*it) }; | 769 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end,
*it) }; |
| 765 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s
panGroupRange, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &LayoutGrid::m
inContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSiz
e::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); | 770 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums
>(direction, sizingData, spanGroupRange); |
| 766 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s
panGroupRange, &GridTrackSize::hasMaxContentMinTrackBreadth, &LayoutGrid::maxCon
tentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::ha
sMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth); | 771 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimum
s>(direction, sizingData, spanGroupRange); |
| 767 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s
panGroupRange, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &LayoutGrid::m
inContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthL
imit); | 772 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums
>(direction, sizingData, spanGroupRange); |
| 768 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, s
panGroupRange, &GridTrackSize::hasMaxContentMaxTrackBreadth, &LayoutGrid::maxCon
tentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit)
; | 773 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximum
s>(direction, sizingData, spanGroupRange); |
| 769 it = spanGroupRange.rangeEnd; | 774 it = spanGroupRange.rangeEnd; |
| 770 } | 775 } |
| 771 | 776 |
| 772 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 777 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
| 773 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; | 778 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; |
| 774 if (track.growthLimitIsInfinite()) | 779 if (track.growthLimitIsInfinite()) |
| 775 track.setGrowthLimit(track.baseSize()); | 780 track.setGrowthLimit(track.baseSize()); |
| 776 } | 781 } |
| 777 } | 782 } |
| 778 | 783 |
| 779 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
TrackSizingDirection direction, const GridCoordinate& coordinate, LayoutBox& gri
dItem, GridTrack& track, Vector<GridTrack>& columnTracks) | 784 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
TrackSizingDirection direction, const GridCoordinate& coordinate, LayoutBox& gri
dItem, GridTrack& track, Vector<GridTrack>& columnTracks) |
| 780 { | 785 { |
| 781 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord
inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; | 786 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord
inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
| 782 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); | 787 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); |
| 783 | 788 |
| 784 if (trackSize.hasMinContentMinTrackBreadth()) | 789 if (trackSize.hasMinContentMinTrackBreadth()) |
| 785 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem
, direction, columnTracks))); | 790 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem
, direction, columnTracks))); |
| 786 else if (trackSize.hasMaxContentMinTrackBreadth()) | 791 else if (trackSize.hasMaxContentMinTrackBreadth()) |
| 787 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem
, direction, columnTracks))); | 792 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem
, direction, columnTracks))); |
| 788 | 793 |
| 789 if (trackSize.hasMinContentMaxTrackBreadth()) | 794 if (trackSize.hasMinContentMaxTrackBreadth()) |
| 790 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr
idItem, direction, columnTracks))); | 795 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr
idItem, direction, columnTracks))); |
| 791 else if (trackSize.hasMaxContentMaxTrackBreadth()) | 796 else if (trackSize.hasMaxContentMaxTrackBreadth()) |
| 792 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr
idItem, direction, columnTracks))); | 797 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr
idItem, direction, columnTracks))); |
| 793 } | 798 } |
| 794 | 799 |
| 795 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
Direction direction, GridSizingData& sizingData, const GridItemsSpanGroupRange&
gridItemsWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction,
AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, Fil
terFunction growAboveMaxBreadthFilterFunction) | 800 static const LayoutUnit& trackSizeForTrackSizeComputationPhase(TrackSizeComputat
ionPhase phase, const GridTrack& track, TrackSizeRestriction restriction) |
| 801 { |
| 802 switch (phase) { |
| 803 case ResolveIntrinsicMinimums: |
| 804 case ResolveMaxContentMinimums: |
| 805 case MaximizeTracks: |
| 806 return track.baseSize(); |
| 807 break; |
| 808 case ResolveIntrinsicMaximums: |
| 809 case ResolveMaxContentMaximums: |
| 810 return restriction == AllowInfinity ? track.growthLimit() : track.growth
LimitIfNotInfinite(); |
| 811 break; |
| 812 } |
| 813 |
| 814 ASSERT_NOT_REACHED(); |
| 815 return track.baseSize(); |
| 816 } |
| 817 |
| 818 static bool shouldProcessTrackForTrackSizeComputationPhase(TrackSizeComputationP
hase phase, const GridTrackSize& trackSize) |
| 819 { |
| 820 switch (phase) { |
| 821 case ResolveIntrinsicMinimums: |
| 822 return trackSize.hasMinOrMaxContentMinTrackBreadth(); |
| 823 case ResolveMaxContentMinimums: |
| 824 return trackSize.hasMaxContentMinTrackBreadth(); |
| 825 case ResolveIntrinsicMaximums: |
| 826 return trackSize.hasMinOrMaxContentMaxTrackBreadth(); |
| 827 case ResolveMaxContentMaximums: |
| 828 return trackSize.hasMaxContentMaxTrackBreadth(); |
| 829 case MaximizeTracks: |
| 830 ASSERT_NOT_REACHED(); |
| 831 return false; |
| 832 } |
| 833 |
| 834 ASSERT_NOT_REACHED(); |
| 835 return false; |
| 836 } |
| 837 |
| 838 static bool trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(TrackS
izeComputationPhase phase, const GridTrackSize& trackSize) |
| 839 { |
| 840 switch (phase) { |
| 841 case ResolveIntrinsicMinimums: |
| 842 return trackSize.hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackB
readth(); |
| 843 case ResolveMaxContentMinimums: |
| 844 return trackSize.hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadt
h(); |
| 845 case ResolveIntrinsicMaximums: |
| 846 case ResolveMaxContentMaximums: |
| 847 return true; |
| 848 case MaximizeTracks: |
| 849 ASSERT_NOT_REACHED(); |
| 850 return false; |
| 851 } |
| 852 |
| 853 ASSERT_NOT_REACHED(); |
| 854 return false; |
| 855 } |
| 856 |
| 857 static void updateTrackSizeForTrackSizeComputationPhase(TrackSizeComputationPhas
e phase, GridTrack& track) |
| 858 { |
| 859 switch (phase) { |
| 860 case ResolveIntrinsicMinimums: |
| 861 case ResolveMaxContentMinimums: |
| 862 track.growBaseSize(track.m_plannedIncrease); |
| 863 return; |
| 864 case ResolveIntrinsicMaximums: |
| 865 case ResolveMaxContentMaximums: |
| 866 track.growGrowthLimit(track.m_plannedIncrease); |
| 867 return; |
| 868 case MaximizeTracks: |
| 869 ASSERT_NOT_REACHED(); |
| 870 return; |
| 871 } |
| 872 |
| 873 ASSERT_NOT_REACHED(); |
| 874 } |
| 875 |
| 876 LayoutUnit LayoutGrid::currentItemSizeForTrackSizeComputationPhase(TrackSizeComp
utationPhase phase, LayoutBox& gridItem, GridTrackSizingDirection direction, Vec
tor<GridTrack>& columnTracks) |
| 877 { |
| 878 switch (phase) { |
| 879 case ResolveIntrinsicMinimums: |
| 880 case ResolveIntrinsicMaximums: |
| 881 return minContentForChild(gridItem, direction, columnTracks); |
| 882 case ResolveMaxContentMinimums: |
| 883 case ResolveMaxContentMaximums: |
| 884 return maxContentForChild(gridItem, direction, columnTracks); |
| 885 case MaximizeTracks: |
| 886 ASSERT_NOT_REACHED(); |
| 887 return 0; |
| 888 } |
| 889 |
| 890 ASSERT_NOT_REACHED(); |
| 891 return 0; |
| 892 } |
| 893 |
| 894 template <TrackSizeComputationPhase phase> |
| 895 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
Direction direction, GridSizingData& sizingData, const GridItemsSpanGroupRange&
gridItemsWithSpan) |
| 796 { | 896 { |
| 797 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra
cks : sizingData.rowTracks; | 897 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra
cks : sizingData.rowTracks; |
| 798 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) | 898 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) |
| 799 tracks[trackIndex].m_plannedIncrease = 0; | 899 tracks[trackIndex].m_plannedIncrease = 0; |
| 800 | 900 |
| 801 for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEn
d; ++it) { | 901 for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEn
d; ++it) { |
| 802 GridItemWithSpan& gridItemWithSpan = *it; | 902 GridItemWithSpan& gridItemWithSpan = *it; |
| 803 ASSERT(gridItemWithSpan.span() > 1); | 903 ASSERT(gridItemWithSpan.span() > 1); |
| 804 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); | 904 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); |
| 805 const GridSpan& itemSpan = (direction == ForColumns) ? coordinate.column
s : coordinate.rows; | 905 const GridSpan& itemSpan = (direction == ForColumns) ? coordinate.column
s : coordinate.rows; |
| 806 | 906 |
| 807 sizingData.growBeyondGrowthLimitsTracks.shrink(0); | 907 sizingData.growBeyondGrowthLimitsTracks.shrink(0); |
| 808 sizingData.filteredTracks.shrink(0); | 908 sizingData.filteredTracks.shrink(0); |
| 809 LayoutUnit spanningTracksSize; | 909 LayoutUnit spanningTracksSize; |
| 810 for (const auto& trackPosition : itemSpan) { | 910 for (const auto& trackPosition : itemSpan) { |
| 811 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toI
nt()); | 911 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toI
nt()); |
| 812 GridTrack& track = (direction == ForColumns) ? sizingData.columnTrac
ks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; | 912 GridTrack& track = (direction == ForColumns) ? sizingData.columnTrac
ks[trackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; |
| 813 spanningTracksSize += (track.*trackGetter)(); | 913 spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, t
rack, ForbidInfinity); |
| 814 if (!(trackSize.*filterFunction)()) | 914 if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize
)) |
| 815 continue; | 915 continue; |
| 816 | 916 |
| 817 sizingData.filteredTracks.append(&track); | 917 sizingData.filteredTracks.append(&track); |
| 818 | 918 |
| 819 if (!growAboveMaxBreadthFilterFunction || (trackSize.*growAboveMaxBr
eadthFilterFunction)()) | 919 if (trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(ph
ase, trackSize)) |
| 820 sizingData.growBeyondGrowthLimitsTracks.append(&track); | 920 sizingData.growBeyondGrowthLimitsTracks.append(&track); |
| 821 } | 921 } |
| 822 | 922 |
| 823 if (sizingData.filteredTracks.isEmpty()) | 923 if (sizingData.filteredTracks.isEmpty()) |
| 824 continue; | 924 continue; |
| 825 | 925 |
| 826 // Specs mandate to floor extraSpace to 0. Instead we directly avoid the
function call in those cases as it will be | 926 // Specs mandate to floor extraSpace to 0. Instead we directly avoid the
function call in those cases as it will be |
| 827 // a noop in terms of track sizing. | 927 // a noop in terms of track sizing. |
| 828 LayoutUnit extraSpace = (this->*sizingFunction)(gridItemWithSpan.gridIte
m(), direction, sizingData.columnTracks) - spanningTracksSize; | 928 LayoutUnit extraSpace = currentItemSizeForTrackSizeComputationPhase(phas
e, gridItemWithSpan.gridItem(), direction, sizingData.columnTracks) - spanningTr
acksSize; |
| 829 if (extraSpace > 0) { | 929 if (extraSpace > 0) { |
| 830 Vector<GridTrack*>* tracksToGrowBeyondGrowthLimits = sizingData.grow
BeyondGrowthLimitsTracks.isEmpty() ? &sizingData.filteredTracks : &sizingData.gr
owBeyondGrowthLimitsTracks; | 930 Vector<GridTrack*>* tracksToGrowBeyondGrowthLimits = sizingData.grow
BeyondGrowthLimitsTracks.isEmpty() ? &sizingData.filteredTracks : &sizingData.gr
owBeyondGrowthLimitsTracks; |
| 831 distributeSpaceToTracks(sizingData.filteredTracks, tracksToGrowBeyon
dGrowthLimits, trackGetter, sizingData, extraSpace); | 931 distributeSpaceToTracks<phase>(sizingData.filteredTracks, tracksToGr
owBeyondGrowthLimits, sizingData, extraSpace); |
| 832 } | 932 } |
| 833 } | 933 } |
| 834 | 934 |
| 835 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 935 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
| 836 GridTrack& track = tracks[trackIndex]; | 936 GridTrack& track = tracks[trackIndex]; |
| 837 if (track.m_plannedIncrease) | 937 if (track.m_plannedIncrease) |
| 838 (track.*trackGrowthFunction)(track.m_plannedIncrease); | 938 updateTrackSizeForTrackSizeComputationPhase(phase, track); |
| 839 } | 939 } |
| 840 } | 940 } |
| 841 | 941 |
| 842 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
ack* track2) | 942 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr
ack* track2) |
| 843 { | 943 { |
| 844 // This check ensures that we respect the irreflexivity property of the stri
ct weak ordering required by std::sort | 944 // This check ensures that we respect the irreflexivity property of the stri
ct weak ordering required by std::sort |
| 845 // (forall x: NOT x < x). | 945 // (forall x: NOT x < x). |
| 846 if (track1->growthLimitIsInfinite() && track2->growthLimitIsInfinite()) | 946 if (track1->growthLimitIsInfinite() && track2->growthLimitIsInfinite()) |
| 847 return false; | 947 return false; |
| 848 | 948 |
| 849 if (track1->growthLimitIsInfinite() || track2->growthLimitIsInfinite()) | 949 if (track1->growthLimitIsInfinite() || track2->growthLimitIsInfinite()) |
| 850 return track2->growthLimitIsInfinite(); | 950 return track2->growthLimitIsInfinite(); |
| 851 | 951 |
| 852 return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit()
- track2->baseSize()); | 952 return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit()
- track2->baseSize()); |
| 853 } | 953 } |
| 854 | 954 |
| 855 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto
r<GridTrack*>* growBeyondGrowthLimitsTracks, AccumulatorGetter trackGetter, Grid
SizingData& sizingData, LayoutUnit& availableLogicalSpace) | 955 template <TrackSizeComputationPhase phase> |
| 956 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto
r<GridTrack*>* growBeyondGrowthLimitsTracks, GridSizingData& sizingData, LayoutU
nit& availableLogicalSpace) |
| 856 { | 957 { |
| 857 ASSERT(availableLogicalSpace > 0); | 958 ASSERT(availableLogicalSpace > 0); |
| 858 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); | 959 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); |
| 859 | 960 |
| 860 size_t tracksSize = tracks.size(); | 961 size_t tracksSize = tracks.size(); |
| 861 for (size_t i = 0; i < tracksSize; ++i) { | 962 for (size_t i = 0; i < tracksSize; ++i) { |
| 862 GridTrack& track = *tracks[i]; | 963 GridTrack& track = *tracks[i]; |
| 863 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS
ize - i); | 964 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS
ize - i); |
| 864 const LayoutUnit& trackBreadth = (track.*trackGetter)(); | 965 const LayoutUnit& trackBreadth = trackSizeForTrackSizeComputationPhase(p
hase, track, ForbidInfinity); |
| 865 LayoutUnit growthShare = track.growthLimitIsInfinite() ? availableLogica
lSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - trackBr
eadth); | 966 LayoutUnit growthShare = track.growthLimitIsInfinite() ? availableLogica
lSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - trackBr
eadth); |
| 866 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."); | 967 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."); |
| 867 track.m_increaseDuringDistribution = growthShare; | 968 track.m_increaseDuringDistribution = growthShare; |
| 868 availableLogicalSpace -= growthShare; | 969 availableLogicalSpace -= growthShare; |
| 869 } | 970 } |
| 870 | 971 |
| 871 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) { | 972 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) { |
| 872 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks->
size(); | 973 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks->
size(); |
| 873 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { | 974 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { |
| 874 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); | 975 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1833 | 1934 |
| 1834 return LayoutPoint(columnPosition, rowPositionForChild(child)); | 1935 return LayoutPoint(columnPosition, rowPositionForChild(child)); |
| 1835 } | 1936 } |
| 1836 | 1937 |
| 1837 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) | 1938 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) |
| 1838 { | 1939 { |
| 1839 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 1940 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
| 1840 } | 1941 } |
| 1841 | 1942 |
| 1842 } // namespace blink | 1943 } // namespace blink |
| OLD | NEW |