Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(552)

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 448993002: [CSSGridLayout] Skip items spanning flex tracks in track sizing algo (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698