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 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
649 | 649 |
650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t | 650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t |
651 { | 651 { |
652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth(); | 652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth(); |
653 } | 653 } |
654 | 654 |
655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const | 655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const |
656 { | 656 { |
657 bool isForColumns = direction == ForColumns; | 657 bool isForColumns = direction == ForColumns; |
658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows(); | 658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows(); |
659 const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; | 659 const GridTrackSize& autoTrackSize = isForColumns ? style()->gridAutoColumns () : style()->gridAutoRows(); |
660 int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallest RowStart); | |
661 const GridTrackSize& trackSize = (translatedIndex < 0 || translatedIndex >= static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIn dex]; | |
660 | 662 |
661 GridLength minTrackBreadth = trackSize.minTrackBreadth(); | 663 GridLength minTrackBreadth = trackSize.minTrackBreadth(); |
662 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); | 664 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); |
663 | 665 |
664 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto> | 666 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto> |
665 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { | 667 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { |
666 if (!hasDefiniteLogicalSize(direction)) { | 668 if (!hasDefiniteLogicalSize(direction)) { |
667 if (minTrackBreadth.hasPercentage()) | 669 if (minTrackBreadth.hasPercentage()) |
668 minTrackBreadth = Length(Auto); | 670 minTrackBreadth = Length(Auto); |
669 if (maxTrackBreadth.hasPercentage()) | 671 if (maxTrackBreadth.hasPercentage()) |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1125 // We clear the dirty bit here as the grid sizes have been updated. | 1127 // We clear the dirty bit here as the grid sizes have been updated. |
1126 m_gridIsDirty = false; | 1128 m_gridIsDirty = false; |
1127 | 1129 |
1128 Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 1130 Vector<LayoutBox*> autoMajorAxisAutoGridItems; |
1129 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 1131 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; |
1130 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { | 1132 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { |
1131 if (child->isOutOfFlowPositioned()) | 1133 if (child->isOutOfFlowPositioned()) |
1132 continue; | 1134 continue; |
1133 | 1135 |
1134 GridCoordinate coordinate = cachedGridCoordinate(*child); | 1136 GridCoordinate coordinate = cachedGridCoordinate(*child); |
1135 if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) { | 1137 if (!coordinate.rows.isIndefinite()) |
1138 coordinate.rows.translate(abs(m_smallestRowStart)); | |
1139 if (!coordinate.columns.isIndefinite()) | |
1140 coordinate.columns.translate(abs(m_smallestColumnStart)); | |
1141 m_gridItemCoordinate.set(child, coordinate); | |
1142 | |
1143 if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) { | |
1136 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows; | 1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows; |
1137 if (!majorAxisPositions.isDefinite()) | 1145 if (majorAxisPositions.isIndefinite()) |
svillar
2015/12/18 13:08:30
See my comments in GridPosition.h about why !isDef
| |
1138 autoMajorAxisAutoGridItems.append(child); | 1146 autoMajorAxisAutoGridItems.append(child); |
1139 else | 1147 else |
1140 specifiedMajorAxisAutoGridItems.append(child); | 1148 specifiedMajorAxisAutoGridItems.append(child); |
1141 continue; | 1149 continue; |
1142 } | 1150 } |
1143 insertItemIntoGrid(*child, coordinate); | 1151 insertItemIntoGrid(*child, coordinate); |
1144 } | 1152 } |
1145 | 1153 |
1146 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); | 1154 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); |
1147 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); | 1155 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); |
(...skipping 11 matching lines...) Expand all Loading... | |
1159 GridCoordinate coordinate = cachedGridCoordinate(*child); | 1167 GridCoordinate coordinate = cachedGridCoordinate(*child); |
1160 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); | 1168 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); |
1161 } | 1169 } |
1162 #endif | 1170 #endif |
1163 } | 1171 } |
1164 | 1172 |
1165 void LayoutGrid::populateExplicitGridAndOrderIterator() | 1173 void LayoutGrid::populateExplicitGridAndOrderIterator() |
1166 { | 1174 { |
1167 OrderIteratorPopulator populator(m_orderIterator); | 1175 OrderIteratorPopulator populator(m_orderIterator); |
1168 | 1176 |
1177 m_smallestRowStart = 0; | |
1178 m_smallestColumnStart = 0; | |
svillar
2015/12/18 13:08:30
Using a single line is allowed in this case.
Manuel Rego
2015/12/18 22:42:30
Acknowledged.
| |
1179 | |
1169 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); | 1180 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); |
1170 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); | 1181 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); |
1171 | 1182 |
1172 ASSERT(m_gridItemsIndexesMap.isEmpty()); | 1183 ASSERT(m_gridItemsIndexesMap.isEmpty()); |
1173 size_t childIndex = 0; | 1184 size_t childIndex = 0; |
1174 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { | 1185 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { |
1175 if (child->isOutOfFlowPositioned()) | 1186 if (child->isOutOfFlowPositioned()) |
1176 continue; | 1187 continue; |
1177 | 1188 |
1178 populator.collectChild(child); | 1189 populator.collectChild(child); |
1179 m_gridItemsIndexesMap.set(child, childIndex++); | 1190 m_gridItemsIndexesMap.set(child, childIndex++); |
1180 | 1191 |
1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. | 1192 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. |
1182 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows); | 1193 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows); |
1183 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns); | 1194 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns); |
1184 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions)); | 1195 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions)); |
1185 | 1196 |
1186 // |positions| is 0 if we need to run the auto-placement algorithm. | 1197 // |positions| is 0 if we need to run the auto-placement algorithm. |
1187 if (rowPositions.isDefinite()) { | 1198 if (!rowPositions.isIndefinite()) { |
1188 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.res olvedFinalPosition()); | 1199 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedResolvedInitialPosition()); |
1200 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedResolvedFinalPosition()); | |
1189 } else { | 1201 } else { |
1190 // Grow the grid for items with a definite row span, getting the lar gest such span. | 1202 // Grow the grid for items with a definite row span, getting the lar gest such span. |
1191 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForRows); | 1203 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForRows); |
1192 maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize); | 1204 maximumRowIndex = std::max(maximumRowIndex, spanSize); |
1193 } | 1205 } |
1194 | 1206 |
1195 if (columnPositions.isDefinite()) { | 1207 if (!columnPositions.isIndefinite()) { |
1196 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions.resolvedFinalPosition()); | 1208 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedResolvedInitialPosition()); |
svillar
2015/12/18 13:08:30
Same comments about !isDefinite and isIndefinite
| |
1209 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedResolvedFinalPosition()); | |
1197 } else { | 1210 } else { |
1198 // Grow the grid for items with a definite column span, getting the largest such span. | 1211 // Grow the grid for items with a definite column span, getting the largest such span. |
1199 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForColumns); | 1212 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForColumns); |
1200 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize); | 1213 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
1201 } | 1214 } |
1202 } | 1215 } |
1203 | 1216 |
1204 m_grid.grow(maximumRowIndex); | 1217 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
1205 for (auto& column : m_grid) | 1218 for (auto& column : m_grid) |
1206 column.grow(maximumColumnIndex); | 1219 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
1207 } | 1220 } |
1208 | 1221 |
1209 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const | 1222 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const |
1210 { | 1223 { |
1211 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; | 1224 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; |
1212 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); | 1225 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); |
1213 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI tem(*style(), gridItem, crossDirection); | 1226 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI tem(*style(), gridItem, crossDirection); |
1214 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire ction, endOfCrossDirection + crossDirectionSpanSize); | 1227 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire ction, endOfCrossDirection + crossDirectionSpanSize); |
1215 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); | 1228 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); |
1216 } | 1229 } |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1469 } | 1482 } |
1470 | 1483 |
1471 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); | 1484 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); |
1472 } | 1485 } |
1473 | 1486 |
1474 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) | 1487 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
1475 { | 1488 { |
1476 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); | 1489 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
1477 | 1490 |
1478 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st yle(), child, direction); | 1491 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st yle(), child, direction); |
1479 if (!positions.isDefinite()) { | 1492 if (positions.isIndefinite()) { |
1480 offset = LayoutUnit(); | 1493 offset = LayoutUnit(); |
1481 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); | 1494 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); |
1482 return; | 1495 return; |
1483 } | 1496 } |
1497 positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smal lestRowStart); | |
svillar
2015/12/18 13:08:30
Not sure why we need this here...
Manuel Rego
2015/12/18 22:42:30
Basically positioned objects are skipped in
popula
| |
1484 | 1498 |
1485 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart(); | 1499 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart(); |
1486 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd(); | 1500 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd(); |
1487 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1; | 1501 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1; |
1488 | 1502 |
1489 bool startIsAuto = startPosition.isAuto() | 1503 bool startIsAuto = startPosition.isAuto() |
1490 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction))) | 1504 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction))) |
1491 || (positions.resolvedInitialPosition() > lastTrackIndex); | 1505 || (positions.resolvedInitialPosition() > lastTrackIndex); |
1492 bool endIsAuto = endPosition.isAuto() | 1506 bool endIsAuto = endPosition.isAuto() |
1493 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction))) | 1507 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction))) |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2057 | 2071 |
2058 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2072 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
2059 } | 2073 } |
2060 | 2074 |
2061 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const | 2075 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const |
2062 { | 2076 { |
2063 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2077 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2064 } | 2078 } |
2065 | 2079 |
2066 } // namespace blink | 2080 } // namespace blink |
OLD | NEW |