| 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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |