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 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt()); | 891 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions->resolvedInitialPosition.toInt()); |
892 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); | 892 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions->integerSpan(), minorAxisPositions.integerSpan()); |
893 if (!emptyGridArea) | 893 if (!emptyGridArea) |
894 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(a
utoGridItems[i], autoPlacementMajorAxisDirection(), *majorAxisPositions); | 894 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(a
utoGridItems[i], autoPlacementMajorAxisDirection(), *majorAxisPositions); |
895 insertItemIntoGrid(autoGridItems[i], *emptyGridArea); | 895 insertItemIntoGrid(autoGridItems[i], *emptyGridArea); |
896 } | 896 } |
897 } | 897 } |
898 | 898 |
899 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) | 899 void RenderGrid::placeAutoMajorAxisItemsOnGrid(const Vector<RenderBox*>& autoGri
dItems) |
900 { | 900 { |
901 for (size_t i = 0; i < autoGridItems.size(); ++i) | 901 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
902 placeAutoMajorAxisItemOnGrid(autoGridItems[i]); | 902 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
| 903 |
| 904 for (size_t i = 0; i < autoGridItems.size(); ++i) { |
| 905 placeAutoMajorAxisItemOnGrid(autoGridItems[i], autoPlacementCursor); |
| 906 |
| 907 // If grid-auto-flow is dense, reset auto-placement cursor. |
| 908 if (isGridAutoFlowDense) { |
| 909 autoPlacementCursor.first = 0; |
| 910 autoPlacementCursor.second = 0; |
| 911 } |
| 912 } |
903 } | 913 } |
904 | 914 |
905 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem) | 915 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox* gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
906 { | 916 { |
907 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit
ionsFromStyle(*style(), *gridItem, autoPlacementMinorAxisDirection()); | 917 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit
ionsFromStyle(*style(), *gridItem, autoPlacementMinorAxisDirection()); |
908 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *gridI
tem, autoPlacementMajorAxisDirection())); | 918 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *gridI
tem, autoPlacementMajorAxisDirection())); |
909 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(*style(), *gridItem, autoPlacementMajorAxisDirection(), Gr
idResolvedPosition(0)); | 919 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom
AutoPlacementPosition(*style(), *gridItem, autoPlacementMajorAxisDirection(), Gr
idResolvedPosition(0)); |
| 920 |
| 921 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
| 922 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
| 923 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
| 924 |
910 OwnPtr<GridCoordinate> emptyGridArea; | 925 OwnPtr<GridCoordinate> emptyGridArea; |
911 if (minorAxisPositions) { | 926 if (minorAxisPositions) { |
912 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAx
isPositions->resolvedInitialPosition.toInt()); | 927 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
913 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integerSp
an(), majorAxisPositions.integerSpan()); | 928 if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoP
lacementCursor) |
| 929 majorAxisAutoPlacementCursor++; |
| 930 |
| 931 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
| 932 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); |
| 933 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integ
erSpan(), majorAxisPositions.integerSpan()); |
| 934 } |
| 935 |
914 if (!emptyGridArea) | 936 if (!emptyGridArea) |
915 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); | 937 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); |
916 } else { | 938 } else { |
917 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *gridItem, autoPlacementMinorAxisDirection()
, GridResolvedPosition(0)); | 939 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions
FromAutoPlacementPosition(*style(), *gridItem, autoPlacementMinorAxisDirection()
, GridResolvedPosition(0)); |
918 | 940 |
919 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForC
olumns) ? gridColumnCount() : gridRowCount(); | 941 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { |
920 for (size_t majorAxisIndex = 0; majorAxisIndex < endOfMajorAxis; ++major
AxisIndex) { | 942 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); |
921 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex); | |
922 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); | 943 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege
rSpan(), minorAxisPositions.integerSpan()); |
923 | 944 |
924 if (emptyGridArea) { | 945 if (emptyGridArea) { |
925 // 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()). | 946 // 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()). |
926 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; | 947 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement
MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio
n : emptyGridArea->rows.resolvedFinalPosition; |
927 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); | 948 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); |
928 if (minorAxisFinalPositionIndex.toInt() < endOfMinorAxis) | 949 if (minorAxisFinalPositionIndex.toInt() < endOfMinorAxis) |
929 break; | 950 break; |
930 | 951 |
931 // Discard empty grid area as it does not fit in the minor axis
direction. | 952 // Discard empty grid area as it does not fit in the minor axis
direction. |
932 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. | 953 // We don't need to create a new empty grid area yet as we might
find a valid one in the next iteration. |
933 emptyGridArea = nullptr; | 954 emptyGridArea = nullptr; |
934 } | 955 } |
| 956 |
| 957 // As we're moving to the next track in the major axis we should res
et the auto-placement cursor in the minor axis. |
| 958 minorAxisAutoPlacementCursor = 0; |
935 } | 959 } |
936 | 960 |
937 if (!emptyGridArea) | 961 if (!emptyGridArea) |
938 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); | 962 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
939 } | 963 } |
940 | 964 |
941 insertItemIntoGrid(gridItem, *emptyGridArea); | 965 insertItemIntoGrid(gridItem, *emptyGridArea); |
| 966 // Move auto-placement cursor to the new position. |
| 967 autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition.toIn
t(); |
| 968 autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition.
toInt(); |
942 } | 969 } |
943 | 970 |
944 GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const | 971 GridTrackSizingDirection RenderGrid::autoPlacementMajorAxisDirection() const |
945 { | 972 { |
946 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; | 973 return style()->isGridAutoFlowDirectionColumn() ? ForColumns : ForRows; |
947 } | 974 } |
948 | 975 |
949 GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const | 976 GridTrackSizingDirection RenderGrid::autoPlacementMinorAxisDirection() const |
950 { | 977 { |
951 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; | 978 return style()->isGridAutoFlowDirectionColumn() ? ForRows : ForColumns; |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 if (isOutOfFlowPositioned()) | 1379 if (isOutOfFlowPositioned()) |
1353 return "RenderGrid (positioned)"; | 1380 return "RenderGrid (positioned)"; |
1354 if (isAnonymous()) | 1381 if (isAnonymous()) |
1355 return "RenderGrid (generated)"; | 1382 return "RenderGrid (generated)"; |
1356 if (isRelPositioned()) | 1383 if (isRelPositioned()) |
1357 return "RenderGrid (relative positioned)"; | 1384 return "RenderGrid (relative positioned)"; |
1358 return "RenderGrid"; | 1385 return "RenderGrid"; |
1359 } | 1386 } |
1360 | 1387 |
1361 } // namespace WebCore | 1388 } // namespace WebCore |
OLD | NEW |