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

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: Patch for landing v2 Created 6 years, 2 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 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 // needsDestruction is by default defined in terms of IsPod<>, but as 705 // needsDestruction is by default defined in terms of IsPod<>, but as
706 // it doesn't handle embedded structs/enums (e.g., GridCoordinate), 706 // it doesn't handle embedded structs/enums (e.g., GridCoordinate),
707 // override it here. 707 // override it here.
708 static const bool needsDestruction = false; 708 static const bool needsDestruction = false;
709 }; 709 };
710 710
711 } // namespace WTF 711 } // namespace WTF
712 712
713 namespace blink { 713 namespace blink {
714 714
715 bool RenderGrid::spanningItemCrossesFlexibleSizedTracks(const GridCoordinate& co ordinate, GridTrackSizingDirection direction) const
716 {
717 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
718 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
719
720 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
721 const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition. toInt());
722 if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth(). isFlex())
723 return true;
724 }
725
726 return false;
727 }
728
729 static inline size_t integerSpanForDirection(const GridCoordinate& coordinate, G ridTrackSizingDirection direction)
730 {
731 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan();
732 }
733
715 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) 734 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
716 { 735 {
717 sizingData.itemsSortedByIncreasingSpan.shrink(0); 736 sizingData.itemsSortedByIncreasingSpan.shrink(0);
718 HashSet<RenderBox*> itemsSet; 737 HashSet<RenderBox*> itemsSet;
719 size_t contentSizedTracksCount = sizingData.contentSizedTracksIndex.size(); 738 size_t contentSizedTracksCount = sizingData.contentSizedTracksIndex.size();
720 for (size_t i = 0; i < contentSizedTracksCount; ++i) { 739 for (size_t i = 0; i < contentSizedTracksCount; ++i) {
721 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn dex[i]); 740 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn dex[i]);
722 while (RenderBox* gridItem = iterator.nextGridItem()) { 741 while (RenderBox* gridItem = iterator.nextGridItem()) {
723 if (itemsSet.add(gridItem).isNewEntry) 742 if (itemsSet.add(gridItem).isNewEntry) {
724 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(* gridItem, cachedGridCoordinate(*gridItem), direction)); 743 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m);
744 // We should not include items spanning more than one track that span tracks with flexible sizing functions.
745 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction))
746 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction));
747 }
725 } 748 }
726 } 749 }
727 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); 750 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end());
728 751
729 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); 752 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
730 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { 753 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
731 // FIXME: do not consider items with a span > 1 that span a track with a flexible sizing function.
732 GridItemWithSpan itemWithSpan = *it; 754 GridItemWithSpan itemWithSpan = *it;
733 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 755 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
734 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 756 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
735 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth ); 757 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth );
736 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); 758 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
737 } 759 }
738 760
739 for (size_t i = 0; i < contentSizedTracksCount; ++i) { 761 for (size_t i = 0; i < contentSizedTracksCount; ++i) {
740 size_t trackIndex = sizingData.contentSizedTracksIndex[i]; 762 size_t trackIndex = sizingData.contentSizedTracksIndex[i];
741 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 763 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 if (isOutOfFlowPositioned()) 1440 if (isOutOfFlowPositioned())
1419 return "RenderGrid (positioned)"; 1441 return "RenderGrid (positioned)";
1420 if (isAnonymous()) 1442 if (isAnonymous())
1421 return "RenderGrid (generated)"; 1443 return "RenderGrid (generated)";
1422 if (isRelPositioned()) 1444 if (isRelPositioned())
1423 return "RenderGrid (relative positioned)"; 1445 return "RenderGrid (relative positioned)";
1424 return "RenderGrid"; 1446 return "RenderGrid";
1425 } 1447 }
1426 1448
1427 } // namespace blink 1449 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698