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

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: Patch for landing + FIXME for rename the style 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
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698