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 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 |