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 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 |
OLD | NEW |