Chromium Code Reviews| 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 |