| 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 |