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 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
655 } | 655 } |
656 | 656 |
657 size_t RenderGrid::gridItemSpan(const RenderBox* child, GridTrackSizingDirection direction) | 657 size_t RenderGrid::gridItemSpan(const RenderBox* child, GridTrackSizingDirection direction) |
658 { | 658 { |
659 GridCoordinate childCoordinate = cachedGridCoordinate(child); | 659 GridCoordinate childCoordinate = cachedGridCoordinate(child); |
660 GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCo ordinate.columns; | 660 GridSpan childSpan = (direction == ForRows) ? childCoordinate.rows : childCo ordinate.columns; |
661 | 661 |
662 return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPo sition.toInt() + 1; | 662 return childSpan.resolvedFinalPosition.toInt() - childSpan.resolvedInitialPo sition.toInt() + 1; |
663 } | 663 } |
664 | 664 |
665 typedef std::pair<RenderBox*, size_t> GridItemWithSpan; | |
666 | |
667 // This function sorts by span (.second in the pair) but also places pointers (. first in the pair) to the same object in | 665 // This function sorts by span (.second in the pair) but also places pointers (. first in the pair) to the same object in |
668 // consecutive positions so duplicates could be easily removed with std::unique( ) for example. | 666 // consecutive positions so duplicates could be easily removed with std::unique( ) for example. |
669 static bool gridItemWithSpanSorter(const GridItemWithSpan& item1, const GridItem WithSpan& item2) | 667 static bool gridItemWithSpanSorter(const GridItemWithSpan& item1, const GridItem WithSpan& item2) |
670 { | 668 { |
671 if (item1.second != item2.second) | 669 if (item1.second != item2.second) |
672 return item1.second < item2.second; | 670 return item1.second < item2.second; |
673 | 671 |
674 return item1.first < item2.first; | 672 return item1.first < item2.first; |
675 } | 673 } |
676 | 674 |
(...skipping 10 matching lines...) Expand all Loading... | |
687 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; | 685 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; |
688 GridIterator iterator(m_grid, direction, trackIndex); | 686 GridIterator iterator(m_grid, direction, trackIndex); |
689 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; | 687 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; |
690 | 688 |
691 while (RenderBox* gridItem = iterator.nextGridItem()) | 689 while (RenderBox* gridItem = iterator.nextGridItem()) |
692 itemsSortedByIncreasingSpan.append(std::make_pair(gridItem, gridItem Span(gridItem, direction))); | 690 itemsSortedByIncreasingSpan.append(std::make_pair(gridItem, gridItem Span(gridItem, direction))); |
693 std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncre asingSpan.end(), gridItemWithSpanSorter); | 691 std::stable_sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncre asingSpan.end(), gridItemWithSpanSorter); |
694 Vector<GridItemWithSpan>::iterator end = std::unique(itemsSortedByIncrea singSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair); | 692 Vector<GridItemWithSpan>::iterator end = std::unique(itemsSortedByIncrea singSpan.begin(), itemsSortedByIncreasingSpan.end(), uniquePointerInPair); |
695 | 693 |
696 for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan .begin(); it != end; ++it) { | 694 for (Vector<GridItemWithSpan>::iterator it = itemsSortedByIncreasingSpan .begin(); it != end; ++it) { |
697 RenderBox* gridItem = it->first; | 695 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *it, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
698 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 696 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *it, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentFor Child, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
699 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 697 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *it, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
700 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth ); | 698 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, *it, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxContentFor Child, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
701 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); | |
702 } | 699 } |
703 | 700 |
704 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; | 701 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; |
705 if (track.m_maxBreadth == infinity) | 702 if (track.m_maxBreadth == infinity) |
706 track.m_maxBreadth = track.m_usedBreadth; | 703 track.m_maxBreadth = track.m_usedBreadth; |
707 } | 704 } |
708 } | 705 } |
709 | 706 |
710 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, RenderBox* gridItem, FilterFunc tion filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGette r, AccumulatorGrowFunction trackGrowthFunction) | 707 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
711 { | 708 { |
709 RenderBox* gridItem = gridItemWithSpan.first; | |
712 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 710 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
713 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; | 711 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; |
714 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; | 712 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; |
715 | 713 |
716 sizingData.filteredTracks.shrink(0); | 714 sizingData.filteredTracks.shrink(0); |
715 size_t gridItemSpan = gridItemWithSpan.second; | |
717 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { | 716 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { |
718 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt()); | 717 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt()); |
718 // We should not consider items spanning more than one track that span t racks with flexible sizing functions. | |
719 if (gridItemSpan > 1 && (trackSize.minTrackBreadth().isFlex() || trackSi ze.maxTrackBreadth().isFlex())) | |
Julien - ping for review
2014/10/10 18:09:16
While this will work and remove any grid item span
svillar
2014/10/13 06:52:32
That's true.
svillar
2014/10/13 14:38:44
BTW doing this would involve an extra hash lookup
Julien - ping for review
2014/10/13 19:43:48
I would go with incremental changes for that as it
Julien - ping for review
2014/10/13 19:43:48
Another argument for the class, I am officially ov
svillar
2014/10/14 06:29:13
Yeah but note that this step was already present i
Julien - ping for review
2014/10/15 16:04:58
100% agreed! I was just mentioning that as it may
| |
720 return; | |
721 | |
719 if (!(trackSize.*filterFunction)()) | 722 if (!(trackSize.*filterFunction)()) |
720 continue; | 723 continue; |
721 | 724 |
722 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; | 725 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackPosition.toInt()] : sizingData.rowTracks[trackPosition.toInt()]; |
723 sizingData.filteredTracks.append(&track); | 726 sizingData.filteredTracks.append(&track); |
724 } | 727 } |
725 | 728 |
726 if (sizingData.filteredTracks.isEmpty()) | 729 if (sizingData.filteredTracks.isEmpty()) |
727 return; | 730 return; |
728 | 731 |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1423 if (isOutOfFlowPositioned()) | 1426 if (isOutOfFlowPositioned()) |
1424 return "RenderGrid (positioned)"; | 1427 return "RenderGrid (positioned)"; |
1425 if (isAnonymous()) | 1428 if (isAnonymous()) |
1426 return "RenderGrid (generated)"; | 1429 return "RenderGrid (generated)"; |
1427 if (isRelPositioned()) | 1430 if (isRelPositioned()) |
1428 return "RenderGrid (relative positioned)"; | 1431 return "RenderGrid (relative positioned)"; |
1429 return "RenderGrid"; | 1432 return "RenderGrid"; |
1430 } | 1433 } |
1431 | 1434 |
1432 } // namespace blink | 1435 } // namespace blink |
OLD | NEW |