Chromium Code Reviews| 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 |