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 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1071 | 1071 |
1072 // We clear the dirty bit here as the grid sizes have been updated. | 1072 // We clear the dirty bit here as the grid sizes have been updated. |
1073 m_gridIsDirty = false; | 1073 m_gridIsDirty = false; |
1074 | 1074 |
1075 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1075 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1076 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1076 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1077 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { | 1077 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { |
1078 if (child->isOutOfFlowPositioned()) | 1078 if (child->isOutOfFlowPositioned()) |
1079 continue; | 1079 continue; |
1080 | 1080 |
1081 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio nsFromStyle(*style(), *child, ForRows); | 1081 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt yle(styleRef(), *child, ForRows); |
1082 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi tionsFromStyle(*style(), *child, ForColumns); | 1082 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro mStyle(styleRef(), *child, ForColumns); |
1083 if (!rowPositions || !columnPositions) { | 1083 |
1084 GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions.get() : rowPositions.get(); | 1084 if (unresolvedRowPositions.requiresAutoPlacement() || unresolvedColumnPo sitions.requiresAutoPlacement()) { |
1085 if (!majorAxisPositions) | 1085 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirectio n() == ForColumns; |
1086 if ((majorAxisDirectionIsForColumns && unresolvedColumnPositions.req uiresAutoPlacement()) | |
1087 || (!majorAxisDirectionIsForColumns && unresolvedRowPositions.re quiresAutoPlacement())) | |
1086 autoMajorAxisAutoGridItems.append(child); | 1088 autoMajorAxisAutoGridItems.append(child); |
1087 else | 1089 else |
1088 specifiedMajorAxisAutoGridItems.append(child); | 1090 specifiedMajorAxisAutoGridItems.append(child); |
1089 continue; | 1091 continue; |
1090 } | 1092 } |
1091 insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPosition s)); | 1093 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(unresolvedRowPositions, styleRef()); |
1094 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(unresolvedColumnPositions, styleRef()); | |
1095 insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions) ); | |
1092 } | 1096 } |
1093 | 1097 |
1094 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); | 1098 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); |
1095 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); | 1099 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); |
1096 | 1100 |
1097 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); | 1101 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); |
1098 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); | 1102 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); |
1099 | 1103 |
1100 m_grid.shrinkToFit(); | 1104 m_grid.shrinkToFit(); |
1101 } | 1105 } |
1102 | 1106 |
1103 void LayoutGrid::populateExplicitGridAndOrderIterator() | 1107 void LayoutGrid::populateExplicitGridAndOrderIterator() |
1104 { | 1108 { |
1105 OrderIteratorPopulator populator(m_orderIterator); | 1109 OrderIteratorPopulator populator(m_orderIterator); |
1106 | 1110 |
1107 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); | 1111 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); |
1108 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); | 1112 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); |
1109 | 1113 |
1110 ASSERT(m_gridItemsIndexesMap.isEmpty()); | 1114 ASSERT(m_gridItemsIndexesMap.isEmpty()); |
1111 size_t childIndex = 0; | 1115 size_t childIndex = 0; |
1112 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { | 1116 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { |
1113 if (child->isOutOfFlowPositioned()) | 1117 if (child->isOutOfFlowPositioned()) |
1114 continue; | 1118 continue; |
1115 | 1119 |
1116 populator.collectChild(child); | 1120 populator.collectChild(child); |
1117 m_gridItemsIndexesMap.set(child, childIndex++); | 1121 m_gridItemsIndexesMap.set(child, childIndex++); |
1118 | 1122 |
1119 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. | 1123 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. |
1120 OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositio nsFromStyle(*style(), *child, ForRows); | 1124 auto unresolvedRowPositions = GridResolvedPosition::unresolvedSpanFromSt yle(styleRef(), *child, ForRows); |
1121 OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPosi tionsFromStyle(*style(), *child, ForColumns); | 1125 if (!unresolvedRowPositions.requiresAutoPlacement()) { |
1122 | 1126 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFr omStyle(unresolvedRowPositions, styleRef()); |
1123 // |positions| is 0 if we need to run the auto-placement algorithm. | 1127 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFin alPosition.next().toInt()); |
1124 if (rowPositions) { | |
1125 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions->re solvedFinalPosition.next().toInt()); | |
1126 } else { | 1128 } else { |
1127 // Grow the grid for items with a definite row span, getting the lar gest such span. | 1129 // Grow the grid for items with a definite row span, getting the lar gest such span. |
1128 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForRows, GridResolvedPosition(0)); | 1130 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(styleRef(), *child, ForRows, GridResolvedPosition(0)); |
1129 maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolv edFinalPosition.next().toInt()); | 1131 maximumRowIndex = std::max(maximumRowIndex, positions.resolvedFinalP osition.next().toInt()); |
1130 } | 1132 } |
1131 | 1133 |
1132 if (columnPositions) { | 1134 auto unresolvedColumnPositions = GridResolvedPosition::unresolvedSpanFro mStyle(styleRef(), *child, ForColumns); |
1133 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions->resolvedFinalPosition.next().toInt()); | 1135 if (!unresolvedColumnPositions.requiresAutoPlacement()) { |
1136 GridSpan columnPositions = GridResolvedPosition::resolveGridPosition sFromStyle(unresolvedColumnPositions, styleRef()); | |
1137 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.re solvedFinalPosition.next().toInt()); | |
1134 } else { | 1138 } else { |
1135 // Grow the grid for items with a definite column span, getting the largest such span. | 1139 // Grow the grid for items with a definite column span, getting the largest such span. |
1136 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(*style(), *child, ForColumns, GridResolvedPosition(0)); | 1140 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromA utoPlacementPosition(styleRef(), *child, ForColumns, GridResolvedPosition(0)); |
1137 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions. resolvedFinalPosition.next().toInt()); | 1141 maximumColumnIndex = std::max(maximumColumnIndex, positions.resolved FinalPosition.next().toInt()); |
1138 } | 1142 } |
1143 | |
1139 } | 1144 } |
1140 | 1145 |
1141 m_grid.grow(maximumRowIndex); | 1146 m_grid.grow(maximumRowIndex); |
1142 for (auto& column : m_grid) | 1147 for (auto& column : m_grid) |
1143 column.grow(maximumColumnIndex); | 1148 column.grow(maximumColumnIndex); |
1144 } | 1149 } |
1145 | 1150 |
1146 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const | 1151 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const |
1147 { | 1152 { |
1148 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; | 1153 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; |
1149 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); | 1154 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); |
1150 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit ion(endOfCrossDirection)); | 1155 GridSpan crossDirectionPositions = GridResolvedPosition::resolveGridPosition sFromAutoPlacementPosition(*style(), gridItem, crossDirection, GridResolvedPosit ion(endOfCrossDirection)); |
1151 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); | 1156 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); |
1152 } | 1157 } |
1153 | 1158 |
1154 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems) | 1159 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au toGridItems) |
1155 { | 1160 { |
1156 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1161 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
1157 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1162 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1158 | 1163 |
1159 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on | 1164 // Mapping between the major axis tracks (rows or columns) and the last auto -placed item's position inserted on |
1160 // that track. This is needed to implement "sparse" packing for items locked to a given track. | 1165 // that track. This is needed to implement "sparse" packing for items locked to a given track. |
1161 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1166 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1162 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; | 1167 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe roKeyHashTraits<unsigned>> minorAxisCursors; |
1163 | 1168 |
1164 for (const auto& autoGridItem : autoGridItems) { | 1169 for (const auto& autoGridItem : autoGridItems) { |
1165 OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridP ositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); | 1170 auto unresolvedMajorAxisPositions = GridResolvedPosition::unresolvedSpan FromStyle(styleRef(), *autoGridItem, autoPlacementMajorAxisDirection()); |
1171 ASSERT(!unresolvedMajorAxisPositions.requiresAutoPlacement()); | |
1172 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositions FromStyle(unresolvedMajorAxisPositions, styleRef()); | |
1166 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti on(), GridResolvedPosition(0)); | 1173 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirecti on(), GridResolvedPosition(0)); |
1167 unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialP osition.toInt(); | 1174 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo sition.toInt(); |
1168 | 1175 |
1169 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxi sCursors.get(majorAxisInitialPosition)); | 1176 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx isPositions.resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxis Cursors.get(majorAxisInitialPosition)); |
1170 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions->integerSpan(), minorAxisPositions.integerSpan()); | 1177 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA xisPositions.integerSpan(), minorAxisPositions.integerSpan()); |
1171 if (!emptyGridArea) | 1178 if (!emptyGridArea) |
1172 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); | 1179 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(* autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1173 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1180 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
1174 | 1181 |
1175 if (!isGridAutoFlowDense) | 1182 if (!isGridAutoFlowDense) |
1176 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI nitialPosition.toInt()); | 1183 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG ridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedI nitialPosition.toInt()); |
1177 } | 1184 } |
1178 } | 1185 } |
1179 | 1186 |
1180 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems) | 1187 void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri dItems) |
1181 { | 1188 { |
1182 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); | 1189 std::pair<size_t, size_t> autoPlacementCursor = std::make_pair(0, 0); |
1183 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1190 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1184 | 1191 |
1185 for (const auto& autoGridItem : autoGridItems) { | 1192 for (const auto& autoGridItem : autoGridItems) { |
1186 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); | 1193 placeAutoMajorAxisItemOnGrid(*autoGridItem, autoPlacementCursor); |
1187 | 1194 |
1188 // If grid-auto-flow is dense, reset auto-placement cursor. | 1195 // If grid-auto-flow is dense, reset auto-placement cursor. |
1189 if (isGridAutoFlowDense) { | 1196 if (isGridAutoFlowDense) { |
1190 autoPlacementCursor.first = 0; | 1197 autoPlacementCursor.first = 0; |
1191 autoPlacementCursor.second = 0; | 1198 autoPlacementCursor.second = 0; |
1192 } | 1199 } |
1193 } | 1200 } |
1194 } | 1201 } |
1195 | 1202 |
1196 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor) | 1203 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz e_t, size_t>& autoPlacementCursor) |
1197 { | 1204 { |
1198 OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPosit ionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection()); | 1205 ASSERT(GridResolvedPosition::unresolvedSpanFromStyle(styleRef(), gridItem, a utoPlacementMajorAxisDirection()).requiresAutoPlacement()); |
1199 ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridIt em, autoPlacementMajorAxisDirection())); | 1206 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom AutoPlacementPosition(styleRef(), gridItem, autoPlacementMajorAxisDirection(), G ridResolvedPosition(0)); |
1200 GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFrom AutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), Gri dResolvedPosition(0)); | |
1201 | 1207 |
1202 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); | 1208 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum ns) ? gridColumnCount() : gridRowCount(); |
1203 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1209 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1204 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1210 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1205 | 1211 |
1206 OwnPtr<GridCoordinate> emptyGridArea; | 1212 OwnPtr<GridCoordinate> emptyGridArea; |
1207 if (minorAxisPositions) { | 1213 auto unresolvedMinorAxisPositions = GridResolvedPosition::unresolvedSpanFrom Style(styleRef(), gridItem, autoPlacementMinorAxisDirection()); |
1214 if (!unresolvedMinorAxisPositions.requiresAutoPlacement()) { | |
1215 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromStyle(unresolvedMinorAxisPositions, styleRef()); | |
1216 | |
1208 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor. | 1217 // Move to the next track in major axis if initial position in minor axi s is before auto-placement cursor. |
1209 if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoP lacementCursor) | 1218 if (minorAxisPositions.resolvedInitialPosition.toInt() < minorAxisAutoPl acementCursor) |
1210 majorAxisAutoPlacementCursor++; | 1219 majorAxisAutoPlacementCursor++; |
1211 | 1220 |
1212 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1221 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1213 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); | 1222 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min orAxisPositions.resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); |
1214 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integ erSpan(), majorAxisPositions.integerSpan()); | 1223 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege rSpan(), majorAxisPositions.integerSpan()); |
1215 } | 1224 } |
1216 | 1225 |
1217 if (!emptyGridArea) | 1226 if (!emptyGridArea) |
1218 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); | 1227 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
1219 } else { | 1228 } else { |
1220 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); | 1229 GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositions FromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); |
1221 | 1230 |
1222 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) { | 1231 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde x < endOfMajorAxis; ++majorAxisIndex) { |
1223 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor); | 1232 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj orAxisIndex, minorAxisAutoPlacementCursor); |
1224 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege rSpan(), minorAxisPositions.integerSpan()); | 1233 emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.intege rSpan(), minorAxisPositions.integerSpan()); |
1225 | 1234 |
1226 if (emptyGridArea) { | 1235 if (emptyGridArea) { |
1227 // 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()). | 1236 // 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()). |
1228 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio n : emptyGridArea->rows.resolvedFinalPosition; | 1237 GridResolvedPosition minorAxisFinalPositionIndex = autoPlacement MinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPositio n : emptyGridArea->rows.resolvedFinalPosition; |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1429 child->setExtraBlockOffset(rowOffset); | 1438 child->setExtraBlockOffset(rowOffset); |
1430 } | 1439 } |
1431 | 1440 |
1432 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); | 1441 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); |
1433 } | 1442 } |
1434 | 1443 |
1435 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) | 1444 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
1436 { | 1445 { |
1437 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); | 1446 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
1438 | 1447 |
1439 OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromS tyle(*style(), child, direction); | 1448 auto unresolvedPositions = GridResolvedPosition::unresolvedSpanFromStyle(sty leRef(), child, direction); |
1440 if (!positions) { | 1449 if (unresolvedPositions.requiresAutoPlacement()) { |
1441 offset = LayoutUnit(); | 1450 offset = LayoutUnit(0); |
Manuel Rego
2015/11/10 09:08:03
Why LayoutUnit(0)?
We're using LayoutUnit() all ov
svillar
2015/11/10 10:56:37
Yeah LayoutUnit() is more efficient, I thought it
| |
1442 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); | 1451 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); |
1443 return; | 1452 return; |
1444 } | 1453 } |
1445 | 1454 |
1446 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart(); | 1455 bool isForColumns = direction == ForColumns; |
1447 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd(); | 1456 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart(); |
1448 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1; | 1457 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c hild.style()->gridRowEnd(); |
1458 size_t lastTrackIndex = (isForColumns ? gridColumnCount() : gridRowCount()) - 1; | |
1449 | 1459 |
1460 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(unr esolvedPositions, styleRef()); | |
1450 bool startIsAuto = startPosition.isAuto() | 1461 bool startIsAuto = startPosition.isAuto() |
1451 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction))) | 1462 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), isForColumns ? ColumnSta rtSide : RowStartSide)) |
1452 || (positions->resolvedInitialPosition.toInt() > lastTrackIndex); | 1463 || (positions.resolvedInitialPosition.toInt() > lastTrackIndex); |
1453 bool endIsAuto = endPosition.isAuto() | 1464 bool endIsAuto = endPosition.isAuto() |
1454 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction))) | 1465 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), isForColumns ? ColumnEndSide : RowEndSide)) |
1455 || (positions->resolvedFinalPosition.toInt() > lastTrackIndex); | 1466 || (positions.resolvedFinalPosition.toInt() > lastTrackIndex); |
1456 | 1467 |
1457 GridResolvedPosition firstPosition = GridResolvedPosition(0); | 1468 GridResolvedPosition firstPosition = GridResolvedPosition(0); |
1458 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio ns->resolvedInitialPosition; | 1469 GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positio ns.resolvedInitialPosition; |
1459 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); | 1470 GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); |
1460 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions->r esolvedFinalPosition; | 1471 GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.re solvedFinalPosition; |
1461 | 1472 |
1462 // Positioned children do not grow the grid, so we need to clamp the positio ns to avoid ending up outside of it. | 1473 // Positioned children do not grow the grid, so we need to clamp the positio ns to avoid ending up outside of it. |
1463 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi on); | 1474 initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPositi on); |
1464 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); | 1475 finalPosition = std::min<GridResolvedPosition>(finalPosition, lastPosition); |
1465 | 1476 |
1466 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toI nt()]; | 1477 LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition.toInt()] : m_rowPositions[initialPosition.toI nt()]; |
Manuel Rego
2015/11/10 09:08:03
Now that we've isForColumns we can keep using it h
svillar
2015/11/10 10:56:37
Acknowledged.
| |
1467 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : lo gicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.nex t().toInt()] : m_rowPositions[finalPosition.next().toInt()]; | 1478 LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : lo gicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition.nex t().toInt()] : m_rowPositions[finalPosition.next().toInt()]; |
1468 | 1479 |
1469 breadth = end - start; | 1480 breadth = end - start; |
1470 | 1481 |
1471 if (startIsAuto) | 1482 if (startIsAuto) |
1472 breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); | 1483 breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); |
1473 else | 1484 else |
1474 start -= ((direction == ForColumns) ? borderStart() : borderBefore()); | 1485 start -= ((direction == ForColumns) ? borderStart() : borderBefore()); |
1475 | 1486 |
1476 if (endIsAuto) { | 1487 if (endIsAuto) { |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2014 | 2025 |
2015 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2026 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2016 } | 2027 } |
2017 | 2028 |
2018 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const | 2029 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const |
2019 { | 2030 { |
2020 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2031 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2021 } | 2032 } |
2022 | 2033 |
2023 } // namespace blink | 2034 } // namespace blink |
OLD | NEW |