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 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 PassOwnPtr<GridCoordinate> RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const RenderBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const | 971 PassOwnPtr<GridCoordinate> RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const RenderBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const |
972 { | 972 { |
973 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 973 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
974 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 974 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
975 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition
sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit
ion(endOfCrossDirection)); | 975 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition
sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit
ion(endOfCrossDirection)); |
976 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); | 976 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); |
977 } | 977 } |
978 | 978 |
979 void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& au
toGridItems) | 979 void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<RenderBox*>& au
toGridItems) |
980 { | 980 { |
| 981 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
| 982 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
| 983 |
| 984 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
| 985 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
| 986 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
| 987 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
| 988 |
981 for (const auto& autoGridItem : autoGridItems) { | 989 for (const auto& autoGridItem : autoGridItems) { |
982 OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridP
ositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); | 990 OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridP
ositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); |
983 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti
on(), GridResolvedPosition(0)); | 991 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti
on(), GridResolvedPosition(0)); |
| 992 unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialP
osition.toInt(); |
984 | 993 |
985 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt()); | 994 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxi
sCursors.get(majorAxisInitialPosition)); |
986 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); | 995 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); |
987 if (!emptyGridArea) | 996 if (!emptyGridArea) |
988 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); | 997 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); |
989 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 998 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
| 999 |
| 1000 if (!isGridAutoFlowDense) |
| 1001 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI
nitialPosition.toInt()); |
990 } | 1002 } |
991 } | 1003 } |
992 | 1004 |
993 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) | 1005 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) |
994 { | 1006 { |
995 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); | 1007 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
996 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1008 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
997 | 1009 |
998 for (const auto& autoGridItem : autoGridItems) { | 1010 for (const auto& autoGridItem : autoGridItems) { |
999 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); | 1011 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); |
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1735 if (isOutOfFlowPositioned()) | 1747 if (isOutOfFlowPositioned()) |
1736 return "RenderGrid (positioned)"; | 1748 return "RenderGrid (positioned)"; |
1737 if (isAnonymous()) | 1749 if (isAnonymous()) |
1738 return "RenderGrid (generated)"; | 1750 return "RenderGrid (generated)"; |
1739 if (isRelPositioned()) | 1751 if (isRelPositioned()) |
1740 return "RenderGrid (relative positioned)"; | 1752 return "RenderGrid (relative positioned)"; |
1741 return "RenderGrid"; | 1753 return "RenderGrid"; |
1742 } | 1754 } |
1743 | 1755 |
1744 } // namespace blink | 1756 } // namespace blink |
OLD | NEW |