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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 | 349 |
350 // FIXME: css3-sizing mentions that we should resolve "definite sizes" | 350 // FIXME: css3-sizing mentions that we should resolve "definite sizes" |
351 // (including <percentage> and calc()) but we don't do it elsewhere. | 351 // (including <percentage> and calc()) but we don't do it elsewhere. |
352 return 0; | 352 return 0; |
353 } | 353 } |
354 | 354 |
355 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) | 355 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) |
356 { | 356 { |
357 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); | 357 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); |
358 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; | 358 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; |
| 359 Vector<size_t> contentSizedTracks; |
359 for (size_t i = 0; i < tracks.size(); ++i) { | 360 for (size_t i = 0; i < tracks.size(); ++i) { |
360 GridTrack& track = tracks[i]; | 361 GridTrack& track = tracks[i]; |
361 const GridTrackSize& trackSize = gridTrackSize(direction, i); | 362 const GridTrackSize& trackSize = gridTrackSize(direction, i); |
362 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 363 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
363 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); | 364 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); |
364 | 365 |
365 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); | 366 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); |
366 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); | 367 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); |
367 | 368 |
368 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); | 369 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); |
| 370 |
| 371 if (trackSize.isContentSized()) |
| 372 contentSizedTracks.append(i); |
369 } | 373 } |
370 | 374 |
371 // FIXME: We shouldn't call resolveContentBasedTrackSizingFunctions if we ha
ve no min-content / max-content tracks. | 375 if (!contentSizedTracks.isEmpty()) |
372 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTracks,
availableLogicalSpace); | 376 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTrac
ks, contentSizedTracks, availableLogicalSpace); |
| 377 |
| 378 for (size_t i = 0; i < tracks.size(); ++i) { |
| 379 ASSERT(tracks[i].m_maxBreadth != infinity); |
| 380 availableLogicalSpace -= tracks[i].m_usedBreadth; |
| 381 } |
373 | 382 |
374 if (availableLogicalSpace <= 0) | 383 if (availableLogicalSpace <= 0) |
375 return; | 384 return; |
376 | 385 |
377 const size_t tracksSize = tracks.size(); | 386 const size_t tracksSize = tracks.size(); |
378 Vector<GridTrack*> tracksForDistribution(tracksSize); | 387 Vector<GridTrack*> tracksForDistribution(tracksSize); |
379 for (size_t i = 0; i < tracksSize; ++i) | 388 for (size_t i = 0; i < tracksSize; ++i) |
380 tracksForDistribution[i] = tracks.data() + i; | 389 tracksForDistribution[i] = tracks.data() + i; |
381 | 390 |
382 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, availableLogicalSpace); | 391 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, availableLogicalSpace); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 558 |
550 if (direction == ForColumns) { | 559 if (direction == ForColumns) { |
551 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. | 560 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. |
552 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 561 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
553 return child->maxPreferredLogicalWidth(); | 562 return child->maxPreferredLogicalWidth(); |
554 } | 563 } |
555 | 564 |
556 return logicalContentHeightForChild(child, columnTracks); | 565 return logicalContentHeightForChild(child, columnTracks); |
557 } | 566 } |
558 | 567 |
559 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, LayoutUn
it& availableLogicalSpace) | 568 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, Vector<s
ize_t> contentSizedTracks, LayoutUnit& availableLogicalSpace) |
560 { | 569 { |
561 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). | 570 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). |
562 | 571 |
563 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; | 572 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. |
564 | 573 |
565 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. | 574 for (size_t i = 0; i < contentSizedTracks.size(); ++i) { |
566 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 575 GridIterator iterator(m_grid, direction, contentSizedTracks[i]); |
567 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGri
d::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 576 while (RenderBox* gridItem = iterator.nextGridItem()) { |
568 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::ma
xContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 577 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBread
th); |
569 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGri
d::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxB
readth); | 578 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
570 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::ma
xContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadt
h); | 579 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::g
rowMaxBreadth); |
571 } | 580 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMa
xBreadth); |
| 581 } |
572 | 582 |
573 for (size_t i = 0; i < tracks.size(); ++i) { | 583 GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTrac
ks[i]; |
574 GridTrack& track = tracks[i]; | |
575 if (track.m_maxBreadth == infinity) | 584 if (track.m_maxBreadth == infinity) |
576 track.m_maxBreadth = track.m_usedBreadth; | 585 track.m_maxBreadth = track.m_usedBreadth; |
577 | |
578 availableLogicalSpace -= track.m_usedBreadth; | |
579 } | 586 } |
580 } | 587 } |
581 | 588 |
582 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks,
RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio
n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) | 589 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks,
RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio
n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
583 { | 590 { |
584 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 591 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
585 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; | 592 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; |
586 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; | 593 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; |
587 | 594 |
588 Vector<GridTrack*> tracks; | 595 Vector<GridTrack*> tracks; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 m_grid[row].grow(oldColumnSize + 1); | 674 m_grid[row].grow(oldColumnSize + 1); |
668 } else { | 675 } else { |
669 const size_t oldRowSize = m_grid.size(); | 676 const size_t oldRowSize = m_grid.size(); |
670 m_grid.grow(oldRowSize + 1); | 677 m_grid.grow(oldRowSize + 1); |
671 m_grid[oldRowSize].grow(m_grid[0].size()); | 678 m_grid[oldRowSize].grow(m_grid[0].size()); |
672 } | 679 } |
673 } | 680 } |
674 | 681 |
675 void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coor
dinate) | 682 void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coor
dinate) |
676 { | 683 { |
677 m_grid[coordinate.rows.initialPositionIndex][coordinate.columns.initialPosit
ionIndex].append(child); | 684 for (size_t row = coordinate.rows.initialPositionIndex; row <= coordinate.ro
ws.finalPositionIndex; ++row) { |
| 685 for (size_t column = coordinate.columns.initialPositionIndex; column <=
coordinate.columns.finalPositionIndex; ++column) |
| 686 m_grid[row][column].append(child); |
| 687 } |
| 688 |
678 m_gridItemCoordinate.set(child, coordinate); | 689 m_gridItemCoordinate.set(child, coordinate); |
679 } | 690 } |
680 | 691 |
681 void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t co
lumnTrack) | 692 void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t co
lumnTrack) |
682 { | 693 { |
683 const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(chil
d, ForRows, rowTrack); | 694 const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(chil
d, ForRows, rowTrack); |
684 const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(c
hild, ForColumns, columnTrack); | 695 const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(c
hild, ForColumns, columnTrack); |
685 insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan)); | 696 insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan)); |
686 } | 697 } |
687 | 698 |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1139 if (isOutOfFlowPositioned()) | 1150 if (isOutOfFlowPositioned()) |
1140 return "RenderGrid (positioned)"; | 1151 return "RenderGrid (positioned)"; |
1141 if (isAnonymous()) | 1152 if (isAnonymous()) |
1142 return "RenderGrid (generated)"; | 1153 return "RenderGrid (generated)"; |
1143 if (isRelPositioned()) | 1154 if (isRelPositioned()) |
1144 return "RenderGrid (relative positioned)"; | 1155 return "RenderGrid (relative positioned)"; |
1145 return "RenderGrid"; | 1156 return "RenderGrid"; |
1146 } | 1157 } |
1147 | 1158 |
1148 } // namespace WebCore | 1159 } // namespace WebCore |
OLD | NEW |