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 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 GridItemWithSpan(RenderBox& gridItem, const GridCoordinate& coordinate, Grid
TrackSizingDirection direction) | 722 GridItemWithSpan(RenderBox& gridItem, const GridCoordinate& coordinate, Grid
TrackSizingDirection direction) |
723 : m_gridItem(gridItem) | 723 : m_gridItem(gridItem) |
724 , m_coordinate(coordinate) | 724 , m_coordinate(coordinate) |
725 { | 725 { |
726 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi
nate.columns; | 726 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi
nate.columns; |
727 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi
on.toInt() + 1; | 727 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi
on.toInt() + 1; |
728 } | 728 } |
729 | 729 |
730 RenderBox& gridItem() const { return *m_gridItem; } | 730 RenderBox& gridItem() const { return *m_gridItem; } |
731 GridCoordinate coordinate() const { return m_coordinate; } | 731 GridCoordinate coordinate() const { return m_coordinate; } |
| 732 #if ENABLE(ASSERT) |
| 733 size_t span() const { return m_span; } |
| 734 #endif |
732 | 735 |
733 bool operator<(const GridItemWithSpan other) const { return m_span < other.m
_span; } | 736 bool operator<(const GridItemWithSpan other) const { return m_span < other.m
_span; } |
734 | 737 |
735 void trace(Visitor* visitor) | 738 void trace(Visitor* visitor) |
736 { | 739 { |
737 visitor->trace(m_gridItem); | 740 visitor->trace(m_gridItem); |
738 } | 741 } |
739 | 742 |
740 private: | 743 private: |
741 RawPtrWillBeMember<RenderBox> m_gridItem; | 744 RawPtrWillBeMember<RenderBox> m_gridItem; |
(...skipping 19 matching lines...) Expand all Loading... |
761 { | 764 { |
762 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c
olumns.integerSpan(); | 765 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c
olumns.integerSpan(); |
763 } | 766 } |
764 | 767 |
765 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) | 768 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
766 { | 769 { |
767 sizingData.itemsSortedByIncreasingSpan.shrink(0); | 770 sizingData.itemsSortedByIncreasingSpan.shrink(0); |
768 HashSet<RenderBox*> itemsSet; | 771 HashSet<RenderBox*> itemsSet; |
769 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 772 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
770 GridIterator iterator(m_grid, direction, trackIndex); | 773 GridIterator iterator(m_grid, direction, trackIndex); |
| 774 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; |
771 while (RenderBox* gridItem = iterator.nextGridItem()) { | 775 while (RenderBox* gridItem = iterator.nextGridItem()) { |
772 if (itemsSet.add(gridItem).isNewEntry) { | 776 if (itemsSet.add(gridItem).isNewEntry) { |
773 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte
m); | 777 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte
m); |
774 // We should not include items spanning more than one track that
span tracks with flexible sizing functions. | 778 if (integerSpanForDirection(coordinate, direction) == 1) { |
775 if (integerSpanForDirection(coordinate, direction) == 1 || !span
ningItemCrossesFlexibleSizedTracks(coordinate, direction)) | 779 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d
irection, coordinate, *gridItem, track, sizingData.columnTracks); |
| 780 } else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, d
irection)) { |
776 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp
an(*gridItem, coordinate, direction)); | 781 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp
an(*gridItem, coordinate, direction)); |
| 782 } |
777 } | 783 } |
778 } | 784 } |
779 } | 785 } |
780 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo
rtedByIncreasingSpan.end()); | 786 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo
rtedByIncreasingSpan.end()); |
781 | 787 |
782 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS
pan.end(); | 788 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS
pan.end(); |
783 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas
ingSpan.begin(); it != end; ++it) { | 789 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas
ingSpan.begin(); it != end; ++it) { |
784 GridItemWithSpan itemWithSpan = *it; | 790 GridItemWithSpan itemWithSpan = *it; |
785 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize:
:hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); | 791 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize:
:hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); |
786 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasM
axContentMinTrackBreadthAndMaxContentMaxTrackBreadth); | 792 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasM
axContentMinTrackBreadthAndMaxContentMaxTrackBreadth); |
787 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLim
it); | 793 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min
ContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLim
it); |
788 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit); | 794 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i
temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte
ntForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit); |
789 } | 795 } |
790 | 796 |
791 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { | 797 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { |
792 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; | 798 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t
rackIndex] : sizingData.rowTracks[trackIndex]; |
793 if (track.growthLimitIsInfinite()) | 799 if (track.growthLimitIsInfinite()) |
794 track.setGrowthLimit(track.baseSize()); | 800 track.setGrowthLimit(track.baseSize()); |
795 } | 801 } |
796 } | 802 } |
797 | 803 |
| 804 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid
TrackSizingDirection direction, const GridCoordinate& coordinate, RenderBox& gri
dItem, GridTrack& track, Vector<GridTrack>& columnTracks) |
| 805 { |
| 806 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord
inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
| 807 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); |
| 808 |
| 809 if (trackSize.hasMinContentMinTrackBreadth()) |
| 810 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem
, direction, columnTracks))); |
| 811 else if (trackSize.hasMaxContentMinTrackBreadth()) |
| 812 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem
, direction, columnTracks))); |
| 813 |
| 814 if (trackSize.hasMinContentMaxTrackBreadth()) |
| 815 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr
idItem, direction, columnTracks))); |
| 816 else if (trackSize.hasMaxContentMaxTrackBreadth()) |
| 817 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr
idItem, direction, columnTracks))); |
| 818 } |
| 819 |
798 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS
pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe
tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr
owAboveMaxBreadthFilterFunction) | 820 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS
pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe
tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr
owAboveMaxBreadthFilterFunction) |
799 { | 821 { |
| 822 ASSERT(gridItemWithSpan.span() > 1); |
800 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); | 823 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); |
801 const GridResolvedPosition initialTrackPosition = (direction == ForColumns)
? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo
sition; | 824 const GridResolvedPosition initialTrackPosition = (direction == ForColumns)
? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo
sition; |
802 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ?
coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition
; | 825 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ?
coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition
; |
803 | 826 |
804 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); | 827 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); |
805 sizingData.filteredTracks.shrink(0); | 828 sizingData.filteredTracks.shrink(0); |
806 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio
n <= finalTrackPosition; ++trackPosition) { | 829 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio
n <= finalTrackPosition; ++trackPosition) { |
807 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()
); | 830 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()
); |
808 if (!(trackSize.*filterFunction)()) | 831 if (!(trackSize.*filterFunction)()) |
809 continue; | 832 continue; |
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 if (isOutOfFlowPositioned()) | 1738 if (isOutOfFlowPositioned()) |
1716 return "RenderGrid (positioned)"; | 1739 return "RenderGrid (positioned)"; |
1717 if (isAnonymous()) | 1740 if (isAnonymous()) |
1718 return "RenderGrid (generated)"; | 1741 return "RenderGrid (generated)"; |
1719 if (isRelPositioned()) | 1742 if (isRelPositioned()) |
1720 return "RenderGrid (relative positioned)"; | 1743 return "RenderGrid (relative positioned)"; |
1721 return "RenderGrid"; | 1744 return "RenderGrid"; |
1722 } | 1745 } |
1723 | 1746 |
1724 } // namespace blink | 1747 } // namespace blink |
OLD | NEW |