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 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() ==
ForColumns) ? coordinate.columns : coordinate.rows; | 1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() ==
ForColumns) ? coordinate.columns : coordinate.rows; |
1145 if (majorAxisPositions.isIndefinite()) | 1145 if (majorAxisPositions.isIndefinite()) |
1146 autoMajorAxisAutoGridItems.append(child); | 1146 autoMajorAxisAutoGridItems.append(child); |
1147 else | 1147 else |
1148 specifiedMajorAxisAutoGridItems.append(child); | 1148 specifiedMajorAxisAutoGridItems.append(child); |
1149 continue; | 1149 continue; |
1150 } | 1150 } |
1151 insertItemIntoGrid(*child, coordinate); | 1151 insertItemIntoGrid(*child, coordinate); |
1152 } | 1152 } |
1153 | 1153 |
1154 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style()
)); | 1154 ASSERT(gridRowCount() >= GridPositionsResolver::explicitGridRowCount(*style(
))); |
1155 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s
tyle())); | 1155 ASSERT(gridColumnCount() >= GridPositionsResolver::explicitGridColumnCount(*
style())); |
1156 | 1156 |
1157 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); | 1157 placeSpecifiedMajorAxisItemsOnGrid(specifiedMajorAxisAutoGridItems); |
1158 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); | 1158 placeAutoMajorAxisItemsOnGrid(autoMajorAxisAutoGridItems); |
1159 | 1159 |
1160 m_grid.shrinkToFit(); | 1160 m_grid.shrinkToFit(); |
1161 | 1161 |
1162 #if ENABLE(ASSERT) | 1162 #if ENABLE(ASSERT) |
1163 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { | 1163 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera
tor.next()) { |
1164 if (child->isOutOfFlowPositioned()) | 1164 if (child->isOutOfFlowPositioned()) |
1165 continue; | 1165 continue; |
1166 | 1166 |
1167 GridCoordinate coordinate = cachedGridCoordinate(*child); | 1167 GridCoordinate coordinate = cachedGridCoordinate(*child); |
1168 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTr
anslatedDefinite()); | 1168 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTr
anslatedDefinite()); |
1169 } | 1169 } |
1170 #endif | 1170 #endif |
1171 } | 1171 } |
1172 | 1172 |
1173 void LayoutGrid::populateExplicitGridAndOrderIterator() | 1173 void LayoutGrid::populateExplicitGridAndOrderIterator() |
1174 { | 1174 { |
1175 OrderIteratorPopulator populator(m_orderIterator); | 1175 OrderIteratorPopulator populator(m_orderIterator); |
1176 | 1176 |
1177 m_smallestRowStart = m_smallestColumnStart = 0; | 1177 m_smallestRowStart = m_smallestColumnStart = 0; |
1178 | 1178 |
1179 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG
ridRowCount(*style())); | 1179 size_t maximumRowIndex = std::max<size_t>(1, GridPositionsResolver::explicit
GridRowCount(*style())); |
1180 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic
itGridColumnCount(*style())); | 1180 size_t maximumColumnIndex = std::max<size_t>(1, GridPositionsResolver::expli
citGridColumnCount(*style())); |
1181 | 1181 |
1182 ASSERT(m_gridItemsIndexesMap.isEmpty()); | 1182 ASSERT(m_gridItemsIndexesMap.isEmpty()); |
1183 size_t childIndex = 0; | 1183 size_t childIndex = 0; |
1184 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { | 1184 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib
lingBox()) { |
1185 if (child->isOutOfFlowPositioned()) | 1185 if (child->isOutOfFlowPositioned()) |
1186 continue; | 1186 continue; |
1187 | 1187 |
1188 populator.collectChild(child); | 1188 populator.collectChild(child); |
1189 m_gridItemsIndexesMap.set(child, childIndex++); | 1189 m_gridItemsIndexesMap.set(child, childIndex++); |
1190 | 1190 |
1191 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. | 1191 // This function bypasses the cache (cachedGridCoordinate()) as it is us
ed to build it. |
1192 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt
yle(*style(), *child, ForRows); | 1192 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromS
tyle(*style(), *child, ForRows); |
1193 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro
mStyle(*style(), *child, ForColumns); | 1193 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFr
omStyle(*style(), *child, ForColumns); |
1194 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit
ions)); | 1194 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit
ions)); |
1195 | 1195 |
1196 // |positions| is 0 if we need to run the auto-placement algorithm. | 1196 // |positions| is 0 if we need to run the auto-placement algorithm. |
1197 if (!rowPositions.isIndefinite()) { | 1197 if (!rowPositions.isIndefinite()) { |
1198 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra
nslatedResolvedInitialPosition()); | 1198 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra
nslatedResolvedInitialPosition()); |
1199 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran
slatedResolvedFinalPosition()); | 1199 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran
slatedResolvedFinalPosition()); |
1200 } else { | 1200 } else { |
1201 // Grow the grid for items with a definite row span, getting the lar
gest such span. | 1201 // Grow the grid for items with a definite row span, getting the lar
gest such span. |
1202 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForRows); | 1202 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForRows); |
1203 maximumRowIndex = std::max(maximumRowIndex, spanSize); | 1203 maximumRowIndex = std::max(maximumRowIndex, spanSize); |
1204 } | 1204 } |
1205 | 1205 |
1206 if (!columnPositions.isIndefinite()) { | 1206 if (!columnPositions.isIndefinite()) { |
1207 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi
ons.untranslatedResolvedInitialPosition()); | 1207 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi
ons.untranslatedResolvedInitialPosition()); |
1208 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio
ns.untranslatedResolvedFinalPosition()); | 1208 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio
ns.untranslatedResolvedFinalPosition()); |
1209 } else { | 1209 } else { |
1210 // Grow the grid for items with a definite column span, getting the
largest such span. | 1210 // Grow the grid for items with a definite column span, getting the
largest such span. |
1211 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s
tyle(), *child, ForColumns); | 1211 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); |
1212 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); | 1212 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
1213 } | 1213 } |
1214 } | 1214 } |
1215 | 1215 |
1216 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); | 1216 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
1217 for (auto& column : m_grid) | 1217 for (auto& column : m_grid) |
1218 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); | 1218 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
1219 } | 1219 } |
1220 | 1220 |
1221 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const | 1221 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu
tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection
, const GridSpan& specifiedPositions) const |
1222 { | 1222 { |
1223 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 1223 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
1224 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 1224 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
1225 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI
tem(*style(), gridItem, crossDirection); | 1225 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced
Item(*style(), gridItem, crossDirection); |
1226 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); | 1226 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
1227 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); | 1227 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD
irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci
fiedPositions : crossDirectionPositions)); |
1228 } | 1228 } |
1229 | 1229 |
1230 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) | 1230 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) |
1231 { | 1231 { |
1232 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1232 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
1233 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1233 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1234 | 1234 |
1235 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1235 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
1236 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1236 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
1237 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1237 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1238 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1238 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
1239 | 1239 |
1240 for (const auto& autoGridItem : autoGridItems) { | 1240 for (const auto& autoGridItem : autoGridItems) { |
1241 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); | 1241 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); |
1242 ASSERT(majorAxisPositions.isTranslatedDefinite()); | 1242 ASSERT(majorAxisPositions.isTranslatedDefinite()); |
1243 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); | 1243 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); |
1244 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedIt
em(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); | 1244 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
1245 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition(); | 1245 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPo
sition(); |
1246 | 1246 |
1247 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor
s.get(majorAxisInitialPosition)); | 1247 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.resolvedInitialPosition(), isGridAutoFlowDense ? 0 : minorAxisCursor
s.get(majorAxisInitialPosition)); |
1248 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions.integerSpan(), minorAxisSpanSize); | 1248 OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorA
xisPositions.integerSpan(), minorAxisSpanSize); |
1249 if (!emptyGridArea) | 1249 if (!emptyGridArea) |
1250 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); | 1250 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1251 | 1251 |
1252 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); | 1252 m_gridItemCoordinate.set(autoGridItem, *emptyGridArea); |
1253 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1253 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
1254 | 1254 |
(...skipping 15 matching lines...) Expand all Loading... |
1270 autoPlacementCursor.first = 0; | 1270 autoPlacementCursor.first = 0; |
1271 autoPlacementCursor.second = 0; | 1271 autoPlacementCursor.second = 0; |
1272 } | 1272 } |
1273 } | 1273 } |
1274 } | 1274 } |
1275 | 1275 |
1276 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) | 1276 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
1277 { | 1277 { |
1278 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); | 1278 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); |
1279 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); | 1279 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); |
1280 size_t majorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*
style(), gridItem, autoPlacementMajorAxisDirection()); | 1280 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); |
1281 | 1281 |
1282 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1282 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
1283 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1283 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1284 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1284 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1285 | 1285 |
1286 OwnPtr<GridCoordinate> emptyGridArea; | 1286 OwnPtr<GridCoordinate> emptyGridArea; |
1287 if (minorAxisPositions.isTranslatedDefinite()) { | 1287 if (minorAxisPositions.isTranslatedDefinite()) { |
1288 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1288 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
1289 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen
tCursor) | 1289 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacemen
tCursor) |
1290 majorAxisAutoPlacementCursor++; | 1290 majorAxisAutoPlacementCursor++; |
1291 | 1291 |
1292 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1292 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1293 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); | 1293 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.resolvedInitialPosition(), majorAxisAutoPlacementCursor); |
1294 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); | 1294 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); |
1295 } | 1295 } |
1296 | 1296 |
1297 if (!emptyGridArea) | 1297 if (!emptyGridArea) |
1298 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); | 1298 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(g
ridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
1299 } else { | 1299 } else { |
1300 size_t minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedIt
em(*style(), gridItem, autoPlacementMinorAxisDirection()); | 1300 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), gridItem, autoPlacementMinorAxisDirection()); |
1301 | 1301 |
1302 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { | 1302 for (size_t majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisInde
x < endOfMajorAxis; ++majorAxisIndex) { |
1303 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); | 1303 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), maj
orAxisIndex, minorAxisAutoPlacementCursor); |
1304 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA
xisSpanSize); | 1304 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorA
xisSpanSize); |
1305 | 1305 |
1306 if (emptyGridArea) { | 1306 if (emptyGridArea) { |
1307 // 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()). | 1307 // 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()). |
1308 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec
tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri
dArea->rows.resolvedFinalPosition(); | 1308 size_t minorAxisFinalPositionIndex = autoPlacementMinorAxisDirec
tion() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGri
dArea->rows.resolvedFinalPosition(); |
1309 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); | 1309 const size_t endOfMinorAxis = autoPlacementMinorAxisDirection()
== ForColumns ? gridColumnCount() : gridRowCount(); |
1310 if (minorAxisFinalPositionIndex <= endOfMinorAxis) | 1310 if (minorAxisFinalPositionIndex <= endOfMinorAxis) |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 } | 1481 } |
1482 | 1482 |
1483 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); | 1483 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); |
1484 } | 1484 } |
1485 | 1485 |
1486 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) | 1486 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
1487 { | 1487 { |
1488 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); | 1488 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
1489 bool isForColumns = direction == ForColumns; | 1489 bool isForColumns = direction == ForColumns; |
1490 | 1490 |
1491 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st
yle(), child, direction); | 1491 GridSpan positions = GridPositionsResolver::resolveGridPositionsFromStyle(*s
tyle(), child, direction); |
1492 if (positions.isIndefinite()) { | 1492 if (positions.isIndefinite()) { |
1493 offset = LayoutUnit(); | 1493 offset = LayoutUnit(); |
1494 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); | 1494 breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); |
1495 return; | 1495 return; |
1496 } | 1496 } |
1497 | 1497 |
1498 // For positioned items we cannot use GridSpan::translate(). Because we coul
d end up with negative values, as the positioned items do not create implicit tr
acks per spec. | 1498 // For positioned items we cannot use GridSpan::translate(). Because we coul
d end up with negative values, as the positioned items do not create implicit tr
acks per spec. |
1499 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow
Start); | 1499 int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRow
Start); |
1500 int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition(
) + smallestStart; | 1500 int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition(
) + smallestStart; |
1501 int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() +
smallestStart; | 1501 int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() +
smallestStart; |
1502 | 1502 |
1503 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart()
: child.style()->gridRowStart(); | 1503 GridPosition startPosition = isForColumns ? child.style()->gridColumnStart()
: child.style()->gridRowStart(); |
1504 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c
hild.style()->gridRowEnd(); | 1504 GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : c
hild.style()->gridRowEnd(); |
1505 int firstExplicitLine = smallestStart; | 1505 int firstExplicitLine = smallestStart; |
1506 int lastExplicitLine = (isForColumns ? GridResolvedPosition::explicitGridCol
umnCount(styleRef()) : GridResolvedPosition::explicitGridRowCount(styleRef())) +
smallestStart; | 1506 int lastExplicitLine = (isForColumns ? GridPositionsResolver::explicitGridCo
lumnCount(styleRef()) : GridPositionsResolver::explicitGridRowCount(styleRef()))
+ smallestStart; |
1507 | 1507 |
1508 bool startIsAuto = startPosition.isAuto() | 1508 bool startIsAuto = startPosition.isAuto() |
1509 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam
edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in
itialPositionSide(direction))) | 1509 || (startPosition.isNamedGridArea() && !GridPositionsResolver::isValidNa
medLineOrArea(startPosition.namedGridLine(), styleRef(), GridPositionsResolver::
initialPositionSide(direction))) |
1510 || (resolvedInitialPosition < firstExplicitLine) | 1510 || (resolvedInitialPosition < firstExplicitLine) |
1511 || (resolvedInitialPosition > lastExplicitLine); | 1511 || (resolvedInitialPosition > lastExplicitLine); |
1512 bool endIsAuto = endPosition.isAuto() | 1512 bool endIsAuto = endPosition.isAuto() |
1513 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed
LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP
ositionSide(direction))) | 1513 || (endPosition.isNamedGridArea() && !GridPositionsResolver::isValidName
dLineOrArea(endPosition.namedGridLine(), styleRef(), GridPositionsResolver::fina
lPositionSide(direction))) |
1514 || (resolvedFinalPosition < firstExplicitLine) | 1514 || (resolvedFinalPosition < firstExplicitLine) |
1515 || (resolvedFinalPosition > lastExplicitLine); | 1515 || (resolvedFinalPosition > lastExplicitLine); |
1516 | 1516 |
1517 size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition; | 1517 size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition; |
1518 size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition; | 1518 size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition; |
1519 | 1519 |
1520 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi
tions[initialPosition] : m_rowPositions[initialPosition]; | 1520 LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPosi
tions[initialPosition] : m_rowPositions[initialPosition]; |
1521 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight()
: isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi
on]; | 1521 LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight()
: isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPositi
on]; |
1522 | 1522 |
1523 breadth = end - start; | 1523 breadth = end - start; |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 | 2072 |
2073 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2073 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2074 } | 2074 } |
2075 | 2075 |
2076 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2076 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2077 { | 2077 { |
2078 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2078 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2079 } | 2079 } |
2080 | 2080 |
2081 } // namespace blink | 2081 } // namespace blink |
OLD | NEW |