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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 const GridTrack* m_track; | 87 const GridTrack* m_track; |
88 double m_flex; | 88 double m_flex; |
89 LayoutUnit m_normalizedFlexValue; | 89 LayoutUnit m_normalizedFlexValue; |
90 }; | 90 }; |
91 | 91 |
92 class RenderGrid::GridIterator { | 92 class RenderGrid::GridIterator { |
93 WTF_MAKE_NONCOPYABLE(GridIterator); | 93 WTF_MAKE_NONCOPYABLE(GridIterator); |
94 public: | 94 public: |
95 // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g | 95 // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g |
96 // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd co
lumn. | 96 // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd co
lumn. |
97 GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direct
ion, size_t fixedTrackIndex) | 97 GridIterator(const GridRepresentation& grid, GridTrackSizingDirection direct
ion, size_t fixedTrackIndex, size_t varyingTrackIndex = 0) |
98 : m_grid(grid) | 98 : m_grid(grid) |
99 , m_direction(direction) | 99 , m_direction(direction) |
100 , m_rowIndex((direction == ForColumns) ? 0 : fixedTrackIndex) | 100 , m_rowIndex((direction == ForColumns) ? varyingTrackIndex : fixedTrackI
ndex) |
101 , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : 0) | 101 , m_columnIndex((direction == ForColumns) ? fixedTrackIndex : varyingTra
ckIndex) |
102 , m_childIndex(0) | 102 , m_childIndex(0) |
103 { | 103 { |
104 ASSERT(m_rowIndex < m_grid.size()); | 104 ASSERT(m_rowIndex < m_grid.size()); |
105 ASSERT(m_columnIndex < m_grid[0].size()); | 105 ASSERT(m_columnIndex < m_grid[0].size()); |
106 } | 106 } |
107 | 107 |
108 RenderBox* nextGridItem() | 108 RenderBox* nextGridItem() |
109 { | 109 { |
110 ASSERT(!m_grid.isEmpty()); | 110 ASSERT(!m_grid.isEmpty()); |
111 | 111 |
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt()); | 882 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt()); |
883 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); | 883 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); |
884 if (!emptyGridArea) | 884 if (!emptyGridArea) |
885 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(a
utoGridItems[i], autoPlacementMajorAxisDirection(), *majorAxisPositions); | 885 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(a
utoGridItems[i], autoPlacementMajorAxisDirection(), *majorAxisPositions); |
886 insertItemIntoGrid(autoGridItems[i], *emptyGridArea); | 886 insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
887 } | 887 } |
888 } | 888 } |
889 | 889 |
890 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) | 890 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) |
891 { | 891 { |
892 for (size_t i = 0; i < autoGridItems.size(); ++i) | 892 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
893 placeAutoMajorAxisItemOnGrid(autoGridItems[i]); | 893 |
| 894 for (size_t i = 0; i < autoGridItems.size(); ++i) { |
| 895 placeAutoMajorAxisItemOnGrid(autoGridItems[i], autoPlacementCursor); |
| 896 |
| 897 // If grid-auto-flow is dense, reset auto-placement cursor. |
| 898 if (style()->isGridAutoFlowAlgorithmDense()) { |
| 899 autoPlacementCursor.first = 0; |
| 900 autoPlacementCursor.second = 0; |
| 901 } |
| 902 } |
894 } | 903 } |
895 | 904 |
896 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) | 905 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
897 { | 906 { |
898 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit
ionsFromStyle(*style(), *gridItem, autoPlacementMinorAxisDirection()); | 907 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit
ionsFromStyle(*style(), *gridItem, autoPlacementMinorAxisDirection()); |
899 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *gridI
tem, autoPlacementMajorAxisDirection())); | 908 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *gridI
tem, autoPlacementMajorAxisDirection())); |
900 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(*style(), *gridItem, autoPlacementMajorAxisDirection(), Gr
idResolvedPosition(0)); | 909 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(*style(), *gridItem, autoPlacementMajorAxisDirection(), Gr
idResolvedPosition(0)); |
| 910 |
| 911 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
| 912 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
| 913 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
| 914 |
901 OwnPtr<GridCoordinate> emptyGridArea; | 915 OwnPtr<GridCoordinate> emptyGridArea; |
902 if (minorAxisPositions) { | 916 if (minorAxisPositions) { |
903 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAx
isPositions->resolvedInitialPosition.toInt()); | 917 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
904 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integerSp
an(), majorAxisPositions.integerSpan()); | 918 if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoP
lacementCursor) |
| 919 majorAxisAutoPlacementCursor++; |
| 920 |
| 921 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
| 922 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); |
| 923 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integ
erSpan(), majorAxisPositions.integerSpan()); |
| 924 } |
| 925 |
905 if (!emptyGridArea) | 926 if (!emptyGridArea) |
906 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); | 927 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); |
907 } else { | 928 } else { |
908 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *gridItem, autoPlacementMinorAxisDirection()
, GridResolvedPosition(0)); | 929 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *gridItem, autoPlacementMinorAxisDirection()
, GridResolvedPosition(0)); |
909 | 930 |
910 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForC
olumns) ? gridColumnCount() : gridRowCount(); | 931 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { |
911 for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++major
AxisIndex) { | 932 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); |
912 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex); | |
913 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); | 933 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); |
914 | 934 |
915 if (emptyGridArea) { | 935 if (emptyGridArea) { |
916 // Check that it fits in the minor axis direction, as we shouldn
't grow in that direction here (it was already managed in populateExplicitGridAn
dOrderIterator()). | 936 // Check that it fits in the minor axis direction, as we shouldn
't grow in that direction here (it was already managed in populateExplicitGridAn
dOrderIterator()). |
917 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; | 937 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; |
918 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); | 938 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); |
919 if (minorAxisFinalPositionIndex.toInt() < endOfMinorAxis) | 939 if (minorAxisFinalPositionIndex.toInt() < endOfMinorAxis) |
920 break; | 940 break; |
921 | 941 |
922 // Discard empty grid area as it does not fit in the minor axis
direction. | 942 // Discard empty grid area as it does not fit in the minor axis
direction. |
923 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. | 943 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. |
924 emptyGridArea = nullptr; | 944 emptyGridArea = nullptr; |
925 } | 945 } |
| 946 |
| 947 // As we're moving to the next track in the major axis we should res
et the auto-placement cursor in the minor axis. |
| 948 minorAxisAutoPlacementCursor = 0; |
926 } | 949 } |
927 | 950 |
928 if (!emptyGridArea) | 951 if (!emptyGridArea) |
929 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); | 952 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
930 } | 953 } |
931 | 954 |
932 insertItemIntoGrid(gridItem, *emptyGridArea); | 955 insertItemIntoGrid(gridItem, *emptyGridArea); |
| 956 // Move auto-placement cursor to the new position. |
| 957 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition.toIn
t(); |
| 958 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition.
toInt(); |
933 } | 959 } |
934 | 960 |
935 GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const | 961 GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const |
936 { | 962 { |
937 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; | 963 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; |
938 } | 964 } |
939 | 965 |
940 GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const | 966 GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const |
941 { | 967 { |
942 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; | 968 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 if (isOutOfFlowPositioned()) | 1261 if (isOutOfFlowPositioned()) |
1236 return "RenderGrid (positioned)"; | 1262 return "RenderGrid (positioned)"; |
1237 if (isAnonymous()) | 1263 if (isAnonymous()) |
1238 return "RenderGrid (generated)"; | 1264 return "RenderGrid (generated)"; |
1239 if (isRelPositioned()) | 1265 if (isRelPositioned()) |
1240 return "RenderGrid (relative positioned)"; | 1266 return "RenderGrid (relative positioned)"; |
1241 return "RenderGrid"; | 1267 return "RenderGrid"; |
1242 } | 1268 } |
1243 | 1269 |
1244 } // namespace WebCore | 1270 } // namespace WebCore |
OLD | NEW |