Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 362733002: [CSS Grid Layout] Support sparse in auto-placement algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« LayoutTests/fast/css-grid-layout/resources/grid.css ('K') | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698