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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 { | 177 { |
178 } | 178 } |
179 | 179 |
180 Vector<GridTrack> columnTracks; | 180 Vector<GridTrack> columnTracks; |
181 Vector<GridTrack> rowTracks; | 181 Vector<GridTrack> rowTracks; |
182 Vector<size_t> contentSizedTracksIndex; | 182 Vector<size_t> contentSizedTracksIndex; |
183 | 183 |
184 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. | 184 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. |
185 Vector<LayoutUnit> distributeTrackVector; | 185 Vector<LayoutUnit> distributeTrackVector; |
186 Vector<GridTrack*> filteredTracks; | 186 Vector<GridTrack*> filteredTracks; |
187 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; | |
187 }; | 188 }; |
188 | 189 |
189 RenderGrid::RenderGrid(Element* element) | 190 RenderGrid::RenderGrid(Element* element) |
190 : RenderBlock(element) | 191 : RenderBlock(element) |
191 , m_gridIsDirty(true) | 192 , m_gridIsDirty(true) |
192 , m_orderIterator(this) | 193 , m_orderIterator(this) |
193 { | 194 { |
194 ASSERT(!childrenInline()); | 195 ASSERT(!childrenInline()); |
195 } | 196 } |
196 | 197 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
653 | 654 |
654 if (direction == ForColumns) { | 655 if (direction == ForColumns) { |
655 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. | 656 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. |
656 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 657 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
657 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(&child); | 658 return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthFor Child(&child); |
658 } | 659 } |
659 | 660 |
660 return logicalHeightForChild(child, columnTracks); | 661 return logicalHeightForChild(child, columnTracks); |
661 } | 662 } |
662 | 663 |
663 size_t RenderGrid::gridItemSpan(const RenderBox& child, GridTrackSizingDirection direction) | 664 class GridItemWithSpan { |
Julien - ping for review
2014/09/23 23:17:31
Can't we just reuse GridCoordinate or GridSpan by
svillar
2014/09/24 08:33:11
Thing is that we want to sort grid items but we ne
Julien - ping for review
2014/10/09 19:01:57
We could get the same functionality with std::pair
svillar
2014/10/10 06:50:28
Accessing the members of the class seems more expl
svillar
2014/10/10 07:58:31
Said that I think using a class is still better ba
| |
664 { | 665 public: |
665 GridCoordinate childCoordinate = cachedGridCoordinate(child); | 666 GridItemWithSpan(RenderBox& gridItem, GridCoordinate coordinate, GridTrackSi zingDirection direction) |
Julien - ping for review
2014/10/09 19:01:57
Nit: const GridCoordinate&
| |
666 GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCo ordinate.columns; | 667 : m_gridItem(gridItem) |
668 , m_coordinate(coordinate) | |
669 { | |
670 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi nate.columns; | |
671 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi on.toInt() + 1; | |
672 } | |
667 | 673 |
668 return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPo sition.toInt() + 1; | 674 RenderBox& gridItem() const { return m_gridItem; } |
669 } | 675 GridCoordinate coordinate() const { return m_coordinate; } |
670 | 676 |
671 typedef std::pair<RenderBox*, size_t> GridItemWithSpan; | 677 bool operator<(const GridItemWithSpan other) const |
678 { | |
679 return m_span < other.m_span; | |
680 } | |
672 | 681 |
673 // This function sorts by span (.second in the pair) but also places pointers (. first in the pair) to the same object in | 682 private: |
674 // consecutive positions so duplicates could be easily removed with std::unique( ) for example. | 683 std::reference_wrapper<RenderBox> m_gridItem; |
Julien - ping for review
2014/10/09 19:01:57
This is unused in blink. Why can't we just use a r
svillar
2014/10/10 06:50:28
It was required by the std::sort() algorithm as th
| |
675 static bool gridItemWithSpanSorter(const GridItemWithSpan& item1, const GridItem WithSpan& item2) | 684 GridCoordinate m_coordinate; |
676 { | 685 size_t m_span; |
677 if (item1.second != item2.second) | 686 }; |
678 return item1.second < item2.second; | |
679 | |
680 return item1.first < item2.first; | |
681 } | |
682 | |
683 static bool uniquePointerInPair(const GridItemWithSpan& item1, const GridItemWit hSpan& item2) | |
684 { | |
685 return item1.first == item2.first; | |
686 } | |
687 | 687 |
688 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) | 688 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
689 { | 689 { |
690 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id track (crbug.com/235258). | 690 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id track (crbug.com/235258). |
Julien - ping for review
2014/09/23 23:17:31
We should move this comment below and update it as
svillar
2014/09/24 08:33:11
OK will do. I've updated a CL for that issue long
| |
691 | 691 |
692 for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) { | 692 sizingData.itemsSortedByIncreasingSpan.shrink(0); |
693 size_t contentSizedTracksCount = sizingData.contentSizedTracksIndex.size(); | |
694 for (size_t i = 0; i < contentSizedTracksCount; ++i) { | |
695 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn dex[i]); | |
Julien - ping for review
2014/09/23 23:17:31
Is it really good to follow the grid cells' order
svillar
2014/09/24 08:33:11
Following (order modified) DOM order will force us
| |
696 HashSet<RenderBox*> itemsSet; | |
697 | |
698 while (RenderBox* gridItem = iterator.nextGridItem()) { | |
699 if (itemsSet.add(gridItem).isNewEntry) | |
700 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(* gridItem, cachedGridCoordinate(*gridItem), direction)); | |
701 } | |
702 } | |
703 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); | |
Julien - ping for review
2014/09/23 23:17:31
We should use stable_sort whenever we sort, else w
svillar
2014/09/24 08:33:11
Well the specs don't really mention anything relat
Julien - ping for review
2014/10/09 19:01:56
I think you're right and that's due to step 1 of t
| |
704 | |
705 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); | |
706 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { | |
707 GridItemWithSpan itemWithSpan = *it; | |
708 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | |
709 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | |
710 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth ); | |
711 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); | |
712 } | |
713 | |
714 for (size_t i = 0; i < contentSizedTracksCount; ++i) { | |
693 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; | 715 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; |
694 GridIterator iterator(m_grid, direction, trackIndex); | |
695 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; | |
696 | |
697 while (RenderBox* gridItem = iterator.nextGridItem()) | |
698 itemsSortedByIncreasingSpan.append(std::make_pair(gridItem, gridItem Span(*gridItem, direction))); | |
699 std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncre asingSpan.end(), gridItemWithSpanSorter); | |
700 Vector<GridItemWithSpan>::iterator end = std::unique(itemsSortedByIncrea singSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair); | |
701 | |
702 for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan .begin(); it != end; ++it) { | |
703 RenderBox* gridItem = it->first; | |
704 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::mi nContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | |
705 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxCont entForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | |
706 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::mi nContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadt h); | |
707 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxCont entForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); | |
708 } | |
709 | |
710 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; | 716 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; |
711 if (track.m_maxBreadth == infinity) | 717 if (track.m_maxBreadth == infinity) |
712 track.m_maxBreadth = track.m_usedBreadth; | 718 track.m_maxBreadth = track.m_usedBreadth; |
713 } | 719 } |
714 } | 720 } |
715 | 721 |
716 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, RenderBox& gridItem, FilterFunc tion filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGette r, AccumulatorGrowFunction trackGrowthFunction) | 722 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
717 { | 723 { |
718 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 724 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); |
719 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; | 725 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; |
720 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; | 726 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; |
721 | 727 |
722 sizingData.filteredTracks.shrink(0); | 728 sizingData.filteredTracks.shrink(0); |
723 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { | 729 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { |
724 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt()); | 730 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt()); |
725 if (!(trackSize.*filterFunction)()) | 731 if (!(trackSize.*filterFunction)()) |
726 continue; | 732 continue; |
727 | 733 |
728 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; | 734 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; |
729 sizingData.filteredTracks.append(&track); | 735 sizingData.filteredTracks.append(&track); |
730 } | 736 } |
731 | 737 |
732 if (sizingData.filteredTracks.isEmpty()) | 738 if (sizingData.filteredTracks.isEmpty()) |
733 return; | 739 return; |
734 | 740 |
735 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct ion, sizingData.columnTracks); | 741 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItemWithSpan .gridItem(), direction, sizingData.columnTracks); |
736 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) { | 742 for (GridResolvedPosition trackIndexForSpace = initialTrackPosition; trackIn dexForSpace <= finalTrackPosition; ++trackIndexForSpace) { |
737 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()]; | 743 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace.toInt()] : sizingData.rowTracks[trackIndexForSpace.toInt()]; |
738 additionalBreadthSpace -= (track.*trackGetter)(); | 744 additionalBreadthSpace -= (track.*trackGetter)(); |
739 } | 745 } |
740 | 746 |
741 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|. | 747 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|. |
742 | 748 |
743 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function | 749 // Specs mandate to floor additionalBreadthSpace (extra-space in specs) to 0 . Instead we directly avoid the function |
744 // call in those cases as it will be a noop in terms of track sizing. | 750 // call in those cases as it will be a noop in terms of track sizing. |
745 if (additionalBreadthSpace > 0) | 751 if (additionalBreadthSpace > 0) |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1454 if (isOutOfFlowPositioned()) | 1460 if (isOutOfFlowPositioned()) |
1455 return "RenderGrid (positioned)"; | 1461 return "RenderGrid (positioned)"; |
1456 if (isAnonymous()) | 1462 if (isAnonymous()) |
1457 return "RenderGrid (generated)"; | 1463 return "RenderGrid (generated)"; |
1458 if (isRelPositioned()) | 1464 if (isRelPositioned()) |
1459 return "RenderGrid (relative positioned)"; | 1465 return "RenderGrid (relative positioned)"; |
1460 return "RenderGrid"; | 1466 return "RenderGrid"; |
1461 } | 1467 } |
1462 | 1468 |
1463 } // namespace blink | 1469 } // namespace blink |
OLD | NEW |