Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 24331003: Cache several vectors to avoid malloc/free churn (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 } 139 }
140 140
141 private: 141 private:
142 const GridRepresentation& m_grid; 142 const GridRepresentation& m_grid;
143 TrackSizingDirection m_direction; 143 TrackSizingDirection m_direction;
144 size_t m_rowIndex; 144 size_t m_rowIndex;
145 size_t m_columnIndex; 145 size_t m_columnIndex;
146 size_t m_childIndex; 146 size_t m_childIndex;
147 }; 147 };
148 148
149 struct RenderGrid::GridSizingData {
150 WTF_MAKE_NONCOPYABLE(GridSizingData);
151 public:
152 GridSizingData(size_t gridColumnCount, size_t gridRowCount)
153 : columnTracks(gridColumnCount)
154 , rowTracks(gridRowCount)
155 {
156 }
157
158 Vector<GridTrack> columnTracks;
159 Vector<GridTrack> rowTracks;
160 Vector<size_t> contentSizedTracksIndex;
161
162 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
163 Vector<LayoutUnit> distributeTrackVector;
164 Vector<GridTrack*> filteredTracks;
165 };
166
149 RenderGrid::RenderGrid(Element* element) 167 RenderGrid::RenderGrid(Element* element)
150 : RenderBlock(element) 168 : RenderBlock(element)
151 , m_gridIsDirty(true) 169 , m_gridIsDirty(true)
152 , m_orderIterator(this) 170 , m_orderIterator(this)
153 { 171 {
154 // All of our children must be block level. 172 // All of our children must be block level.
155 setChildrenInline(false); 173 setChildrenInline(false);
156 } 174 }
157 175
158 RenderGrid::~RenderGrid() 176 RenderGrid::~RenderGrid()
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 maxContentSize = std::max(maxContentSize, gridItem->maxPreferredLogi calWidth() + marginIntrinsicLogicalWidthForChild(gridItem)); 364 maxContentSize = std::max(maxContentSize, gridItem->maxPreferredLogi calWidth() + marginIntrinsicLogicalWidthForChild(gridItem));
347 365
348 return maxContentSize; 366 return maxContentSize;
349 } 367 }
350 368
351 // FIXME: css3-sizing mentions that we should resolve "definite sizes" 369 // FIXME: css3-sizing mentions that we should resolve "definite sizes"
352 // (including <percentage> and calc()) but we don't do it elsewhere. 370 // (including <percentage> and calc()) but we don't do it elsewhere.
353 return 0; 371 return 0;
354 } 372 }
355 373
356 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) 374 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, GridSizingData& sizingData)
357 { 375 {
358 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); 376 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi calWidth() : availableLogicalHeight(IncludeMarginBorderPadding);
359 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr acks; 377 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks;
360 Vector<size_t> contentSizedTracks; 378 sizingData.contentSizedTracksIndex.shrink(0);
361 for (size_t i = 0; i < tracks.size(); ++i) { 379 for (size_t i = 0; i < tracks.size(); ++i) {
362 GridTrack& track = tracks[i]; 380 GridTrack& track = tracks[i];
363 const GridTrackSize& trackSize = gridTrackSize(direction, i); 381 const GridTrackSize& trackSize = gridTrackSize(direction, i);
364 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); 382 const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
365 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); 383 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
366 384
367 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB readth); 385 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB readth);
368 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr eadth, track.m_usedBreadth); 386 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr eadth, track.m_usedBreadth);
369 387
370 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); 388 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth);
371 389
372 if (trackSize.isContentSized()) 390 if (trackSize.isContentSized())
373 contentSizedTracks.append(i); 391 sizingData.contentSizedTracksIndex.append(i);
374 } 392 }
375 393
376 if (!contentSizedTracks.isEmpty()) 394 if (!sizingData.contentSizedTracksIndex.isEmpty())
377 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTrac ks, contentSizedTracks, availableLogicalSpace); 395 resolveContentBasedTrackSizingFunctions(direction, sizingData, available LogicalSpace);
378 396
379 for (size_t i = 0; i < tracks.size(); ++i) { 397 for (size_t i = 0; i < tracks.size(); ++i) {
380 ASSERT(tracks[i].m_maxBreadth != infinity); 398 ASSERT(tracks[i].m_maxBreadth != infinity);
381 availableLogicalSpace -= tracks[i].m_usedBreadth; 399 availableLogicalSpace -= tracks[i].m_usedBreadth;
382 } 400 }
383 401
384 if (availableLogicalSpace <= 0) 402 if (availableLogicalSpace <= 0)
385 return; 403 return;
386 404
387 const size_t tracksSize = tracks.size(); 405 const size_t tracksSize = tracks.size();
388 Vector<GridTrack*> tracksForDistribution(tracksSize); 406 Vector<GridTrack*> tracksForDistribution(tracksSize);
389 for (size_t i = 0; i < tracksSize; ++i) 407 for (size_t i = 0; i < tracksSize; ++i)
390 tracksForDistribution[i] = tracks.data() + i; 408 tracksForDistribution[i] = tracks.data() + i;
391 409
392 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, & GridTrack::growUsedBreadth, availableLogicalSpace); 410 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, & GridTrack::growUsedBreadth, sizingData, availableLogicalSpace);
393 411
394 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. 412 // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction.
395 413
396 // FIXME: Handle the case where RemainingSpace is not defined. 414 // FIXME: Handle the case where RemainingSpace is not defined.
397 double normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks, direction, availableLogicalSpace); 415 double normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks, direction, availableLogicalSpace);
398 for (size_t i = 0; i < tracksSize; ++i) { 416 for (size_t i = 0; i < tracksSize; ++i) {
399 const GridTrackSize& trackSize = gridTrackSize(direction, i); 417 const GridTrackSize& trackSize = gridTrackSize(direction, i);
400 if (!trackSize.maxTrackBreadth().isFlex()) 418 if (!trackSize.maxTrackBreadth().isFlex())
401 continue; 419 continue;
402 420
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 574
557 if (direction == ForColumns) { 575 if (direction == ForColumns) {
558 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width. 576 // FIXME: It's unclear if we should return the intrinsic width or the pr eferred width.
559 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html 577 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
560 return child->maxPreferredLogicalWidth(); 578 return child->maxPreferredLogicalWidth();
561 } 579 }
562 580
563 return logicalContentHeightForChild(child, columnTracks); 581 return logicalContentHeightForChild(child, columnTracks);
564 } 582 }
565 583
566 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, const Ve ctor<size_t>& contentSizedTracks, LayoutUnit& availableLogicalSpace) 584 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di rection, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
567 { 585 {
568 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id track (crbug.com/235258). 586 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr id track (crbug.com/235258).
569 587
570 // FIXME: Per step 2 of the specification, we should order the grid items by increasing span. 588 // FIXME: Per step 2 of the specification, we should order the grid items by increasing span.
571 589
572 for (size_t i = 0; i < contentSizedTracks.size(); ++i) { 590 for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) {
573 GridIterator iterator(m_grid, direction, contentSizedTracks[i]); 591 GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIn dex[i]);
574 while (RenderBox* gridItem = iterator.nextGridItem()) { 592 while (RenderBox* gridItem = iterator.nextGridItem()) {
575 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &Re nderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBread th); 593 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
576 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderG rid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); 594 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth);
577 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &Re nderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::g rowMaxBreadth); 595 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth );
578 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderG rid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMa xBreadth); 596 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingDat a, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
579 } 597 }
580 598
581 GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTrac ks[i]; 599 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[i ] : sizingData.rowTracks[i];
582 if (track.m_maxBreadth == infinity) 600 if (track.m_maxBreadth == infinity)
583 track.m_maxBreadth = track.m_usedBreadth; 601 track.m_maxBreadth = track.m_usedBreadth;
584 } 602 }
585 } 603 }
586 604
587 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) 605 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire ction direction, GridSizingData& sizingData, RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, A ccumulatorGrowFunction trackGrowthFunction)
588 { 606 {
589 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); 607 const GridCoordinate coordinate = cachedGridCoordinate(gridItem);
590 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu mns.initialPositionIndex : coordinate.rows.initialPositionIndex; 608 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu mns.initialPositionIndex : coordinate.rows.initialPositionIndex;
591 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column s.finalPositionIndex : coordinate.rows.finalPositionIndex; 609 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column s.finalPositionIndex : coordinate.rows.finalPositionIndex;
592 610
593 Vector<GridTrack*> tracks; 611 sizingData.filteredTracks.shrink(0);
594 for (size_t trackIndex = initialTrackIndex; trackIndex <= finalTrackIndex; + +trackIndex) { 612 for (size_t trackIndex = initialTrackIndex; trackIndex <= finalTrackIndex; + +trackIndex) {
595 const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex); 613 const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex);
596 if (!(trackSize.*filterFunction)()) 614 if (!(trackSize.*filterFunction)())
597 continue; 615 continue;
598 616
599 GridTrack& track = (direction == ForColumns) ? columnTracks[trackIndex] : rowTracks[trackIndex]; 617 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
600 tracks.append(&track); 618 sizingData.filteredTracks.append(&track);
601 } 619 }
602 620
603 if (tracks.isEmpty()) 621 if (sizingData.filteredTracks.isEmpty())
604 return; 622 return;
605 623
606 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct ion, columnTracks); 624 LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direct ion, sizingData.columnTracks);
607 for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace <= fi nalTrackIndex; ++trackIndexForSpace) { 625 for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace <= fi nalTrackIndex; ++trackIndexForSpace) {
608 GridTrack& track = (direction == ForColumns) ? columnTracks[trackIndexFo rSpace] : rowTracks[trackIndexForSpace]; 626 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndexForSpace] : sizingData.rowTracks[trackIndexForSpace];
609 additionalBreadthSpace -= (track.*trackGetter)(); 627 additionalBreadthSpace -= (track.*trackGetter)();
610 } 628 }
611 629
612 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|. 630 // FIXME: We should pass different values for |tracksForGrowthAboveMaxBreadt h|.
613 distributeSpaceToTracks(tracks, &tracks, trackGetter, trackGrowthFunction, a dditionalBreadthSpace); 631 distributeSpaceToTracks(sizingData.filteredTracks, &sizingData.filteredTrack s, trackGetter, trackGrowthFunction, sizingData, additionalBreadthSpace);
614 } 632 }
615 633
616 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2) 634 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2)
617 { 635 {
618 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt h - track2->m_usedBreadth); 636 return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadt h - track2->m_usedBreadth);
619 } 637 }
620 638
621 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid Track*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, Accumula torGrowFunction trackGrowthFunction, LayoutUnit& availableLogicalSpace) 639 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid Track*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter trackGetter, Accumula torGrowFunction trackGrowthFunction, GridSizingData& sizingData, LayoutUnit& ava ilableLogicalSpace)
622 { 640 {
623 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); 641 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
624 642
625 size_t tracksSize = tracks.size(); 643 size_t tracksSize = tracks.size();
626 Vector<LayoutUnit> updatedTrackBreadths(tracksSize); 644 sizingData.distributeTrackVector.resize(tracksSize);
627 645
628 for (size_t i = 0; i < tracksSize; ++i) { 646 for (size_t i = 0; i < tracksSize; ++i) {
629 GridTrack& track = *tracks[i]; 647 GridTrack& track = *tracks[i];
630 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS ize - i); 648 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksS ize - i);
631 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)(); 649 LayoutUnit trackBreadth = (tracks[i]->*trackGetter)();
632 LayoutUnit growthShare = std::max(LayoutUnit(), std::min(availableLogica lSpaceShare, track.m_maxBreadth - trackBreadth)); 650 LayoutUnit growthShare = std::max(LayoutUnit(), std::min(availableLogica lSpaceShare, track.m_maxBreadth - trackBreadth));
633 // We should never shrink any grid track or else we can't guarantee we a bide by our min-sizing function. 651 // We should never shrink any grid track or else we can't guarantee we a bide by our min-sizing function.
634 updatedTrackBreadths[i] = trackBreadth + growthShare; 652 sizingData.distributeTrackVector[i] = trackBreadth + growthShare;
635 availableLogicalSpace -= growthShare; 653 availableLogicalSpace -= growthShare;
636 } 654 }
637 655
638 if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) { 656 if (availableLogicalSpace > 0 && tracksForGrowthAboveMaxBreadth) {
639 tracksSize = tracksForGrowthAboveMaxBreadth->size(); 657 tracksSize = tracksForGrowthAboveMaxBreadth->size();
640 for (size_t i = 0; i < tracksSize; ++i) { 658 for (size_t i = 0; i < tracksSize; ++i) {
641 LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i); 659 LayoutUnit growthShare = availableLogicalSpace / (tracksSize - i);
642 updatedTrackBreadths[i] += growthShare; 660 sizingData.distributeTrackVector[i] += growthShare;
643 availableLogicalSpace -= growthShare; 661 availableLogicalSpace -= growthShare;
644 } 662 }
645 } 663 }
646 664
647 for (size_t i = 0; i < tracksSize; ++i) { 665 for (size_t i = 0; i < tracksSize; ++i) {
648 LayoutUnit growth = updatedTrackBreadths[i] - (tracks[i]->*trackGetter)( ); 666 LayoutUnit growth = sizingData.distributeTrackVector[i] - (tracks[i]->*t rackGetter)();
649 if (growth >= 0) 667 if (growth >= 0)
650 (tracks[i]->*trackGrowthFunction)(growth); 668 (tracks[i]->*trackGrowthFunction)(growth);
651 } 669 }
652 } 670 }
653 671
654 #ifndef NDEBUG 672 #ifndef NDEBUG
655 bool RenderGrid::tracksAreWiderThanMinTrackBreadth(TrackSizingDirection directio n, const Vector<GridTrack>& tracks) 673 bool RenderGrid::tracksAreWiderThanMinTrackBreadth(TrackSizingDirection directio n, const Vector<GridTrack>& tracks)
656 { 674 {
657 for (size_t i = 0; i < tracks.size(); ++i) { 675 for (size_t i = 0; i < tracks.size(); ++i) {
658 const GridTrackSize& trackSize = gridTrackSize(direction, i); 676 const GridTrackSize& trackSize = gridTrackSize(direction, i);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 { 858 {
841 m_grid.resize(0); 859 m_grid.resize(0);
842 m_gridItemCoordinate.clear(); 860 m_gridItemCoordinate.clear();
843 m_gridIsDirty = true; 861 m_gridIsDirty = true;
844 } 862 }
845 863
846 void RenderGrid::layoutGridItems() 864 void RenderGrid::layoutGridItems()
847 { 865 {
848 placeItemsOnGrid(); 866 placeItemsOnGrid();
849 867
850 Vector<GridTrack> columnTracks(gridColumnCount()); 868 GridSizingData sizingData(gridColumnCount(), gridRowCount());
851 Vector<GridTrack> rowTracks(gridRowCount()); 869 computedUsedBreadthOfGridTracks(ForColumns, sizingData);
852 computedUsedBreadthOfGridTracks(ForColumns, columnTracks, rowTracks); 870 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks ));
853 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, columnTracks)); 871 computedUsedBreadthOfGridTracks(ForRows, sizingData);
854 computedUsedBreadthOfGridTracks(ForRows, columnTracks, rowTracks); 872 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks));
855 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, rowTracks));
856 873
857 populateGridPositions(columnTracks, rowTracks); 874 populateGridPositions(sizingData);
858 875
859 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) { 876 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) {
860 // Because the grid area cannot be styled, we don't need to adjust 877 // Because the grid area cannot be styled, we don't need to adjust
861 // the grid breadth to account for 'box-sizing'. 878 // the grid breadth to account for 'box-sizing'.
862 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit(); 879 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit();
863 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit(); 880 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit();
864 881
865 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChild(child, ForColumns, columnTracks); 882 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChild(child, ForColumns, sizingData.columnTracks);
866 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChild(child, ForRows, rowTracks); 883 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChild(child, ForRows, sizingData.rowTracks);
867 884
868 SubtreeLayoutScope layoutScope(child); 885 SubtreeLayoutScope layoutScope(child);
869 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (child->hasRelativeLogicalHeight() && oldOverrideCont ainingBlockContentLogicalHeight != overrideContainingBlockContentLogicalHeight)) 886 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (child->hasRelativeLogicalHeight() && oldOverrideCont ainingBlockContentLogicalHeight != overrideContainingBlockContentLogicalHeight))
870 layoutScope.setNeedsLayout(child); 887 layoutScope.setNeedsLayout(child);
871 888
872 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth); 889 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth);
873 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight); 890 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight);
874 891
875 LayoutRect oldChildRect = child->frameRect(); 892 LayoutRect oldChildRect = child->frameRect();
876 893
877 // FIXME: Grid items should stretch to fill their cells. Once we 894 // FIXME: Grid items should stretch to fill their cells. Once we
878 // implement grid-{column,row}-align, we can also shrink to fit. For 895 // implement grid-{column,row}-align, we can also shrink to fit. For
879 // now, just size as if we were a regular child. 896 // now, just size as if we were a regular child.
880 child->layoutIfNeeded(); 897 child->layoutIfNeeded();
881 898
882 child->setLogicalLocation(findChildLogicalPosition(child, columnTracks, rowTracks)); 899 child->setLogicalLocation(findChildLogicalPosition(child, sizingData));
883 900
884 // If the child moved, we have to repaint it as well as any floating/pos itioned 901 // If the child moved, we have to repaint it as well as any floating/pos itioned
885 // descendants. An exception is if we need a layout. In this case, we kn ow we're going to 902 // descendants. An exception is if we need a layout. In this case, we kn ow we're going to
886 // repaint ourselves (and the child) anyway. 903 // repaint ourselves (and the child) anyway.
887 if (!selfNeedsLayout() && child->checkForRepaintDuringLayout()) 904 if (!selfNeedsLayout() && child->checkForRepaintDuringLayout())
888 child->repaintDuringLayoutIfMoved(oldChildRect); 905 child->repaintDuringLayoutIfMoved(oldChildRect);
889 } 906 }
890 907
891 for (size_t i = 0; i < rowTracks.size(); ++i) 908 for (size_t i = 0; i < sizingData.rowTracks.size(); ++i)
892 setLogicalHeight(logicalHeight() + rowTracks[i].m_usedBreadth); 909 setLogicalHeight(logicalHeight() + sizingData.rowTracks[i].m_usedBreadth );
893 910
894 // FIXME: We should handle min / max logical height. 911 // FIXME: We should handle min / max logical height.
895 912
896 setLogicalHeight(logicalHeight() + borderAndPaddingLogicalHeight()); 913 setLogicalHeight(logicalHeight() + borderAndPaddingLogicalHeight());
897 } 914 }
898 915
899 GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox* gridItem) const 916 GridCoordinate RenderGrid::cachedGridCoordinate(const RenderBox* gridItem) const
900 { 917 {
901 ASSERT(m_gridItemCoordinate.contains(gridItem)); 918 ASSERT(m_gridItemCoordinate.contains(gridItem));
902 return m_gridItemCoordinate.get(gridItem); 919 return m_gridItemCoordinate.get(gridItem);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizi ngDirection direction, const Vector<GridTrack>& tracks) const 1128 LayoutUnit RenderGrid::gridAreaBreadthForChild(const RenderBox* child, TrackSizi ngDirection direction, const Vector<GridTrack>& tracks) const
1112 { 1129 {
1113 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1130 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1114 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows; 1131 const GridSpan& span = (direction == ForColumns) ? coordinate.columns : coor dinate.rows;
1115 LayoutUnit gridAreaBreadth = 0; 1132 LayoutUnit gridAreaBreadth = 0;
1116 for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.final PositionIndex; ++trackIndex) 1133 for (size_t trackIndex = span.initialPositionIndex; trackIndex <= span.final PositionIndex; ++trackIndex)
1117 gridAreaBreadth += tracks[trackIndex].m_usedBreadth; 1134 gridAreaBreadth += tracks[trackIndex].m_usedBreadth;
1118 return gridAreaBreadth; 1135 return gridAreaBreadth;
1119 } 1136 }
1120 1137
1121 void RenderGrid::populateGridPositions(const Vector<GridTrack>& columnTracks, co nst Vector<GridTrack>& rowTracks) 1138 void RenderGrid::populateGridPositions(const GridSizingData& sizingData)
1122 { 1139 {
1123 m_columnPositions.resize(columnTracks.size() + 1); 1140 m_columnPositions.resize(sizingData.columnTracks.size() + 1);
1124 m_columnPositions[0] = borderAndPaddingStart(); 1141 m_columnPositions[0] = borderAndPaddingStart();
1125 for (size_t i = 0; i < m_columnPositions.size() - 1; ++i) 1142 for (size_t i = 0; i < m_columnPositions.size() - 1; ++i)
1126 m_columnPositions[i + 1] = m_columnPositions[i] + columnTracks[i].m_used Breadth; 1143 m_columnPositions[i + 1] = m_columnPositions[i] + sizingData.columnTrack s[i].m_usedBreadth;
1127 1144
1128 m_rowPositions.resize(rowTracks.size() + 1); 1145 m_rowPositions.resize(sizingData.rowTracks.size() + 1);
1129 m_rowPositions[0] = borderAndPaddingBefore(); 1146 m_rowPositions[0] = borderAndPaddingBefore();
1130 for (size_t i = 0; i < m_rowPositions.size() - 1; ++i) 1147 for (size_t i = 0; i < m_rowPositions.size() - 1; ++i)
1131 m_rowPositions[i + 1] = m_rowPositions[i] + rowTracks[i].m_usedBreadth; 1148 m_rowPositions[i + 1] = m_rowPositions[i] + sizingData.rowTracks[i].m_us edBreadth;
1132 } 1149 }
1133 1150
1134 LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const Vector< GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks) 1151 LayoutPoint RenderGrid::findChildLogicalPosition(RenderBox* child, const GridSiz ingData& sizingData)
1135 { 1152 {
1136 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1153 const GridCoordinate& coordinate = cachedGridCoordinate(child);
1137 ASSERT(coordinate.columns.initialPositionIndex < columnTracks.size()); 1154 ASSERT(coordinate.columns.initialPositionIndex < sizingData.columnTracks.siz e());
1138 ASSERT(coordinate.rows.initialPositionIndex < rowTracks.size()); 1155 ASSERT(coordinate.rows.initialPositionIndex < sizingData.rowTracks.size());
1139 1156
1140 // The grid items should be inside the grid container's border box, that's w hy they need to be shifted. 1157 // The grid items should be inside the grid container's border box, that's w hy they need to be shifted.
1141 return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex ] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIn dex] + marginBeforeForChild(child)); 1158 return LayoutPoint(m_columnPositions[coordinate.columns.initialPositionIndex ] + marginStartForChild(child), m_rowPositions[coordinate.rows.initialPositionIn dex] + marginBeforeForChild(child));
1142 } 1159 }
1143 1160
1144 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn it start, LayoutUnit end) 1161 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn it start, LayoutUnit end)
1145 { 1162 {
1146 // This function does a binary search over the coordinates. 1163 // This function does a binary search over the coordinates.
1147 // FIXME: This doesn't work with grid items overflowing their grid areas and should be tested & fixed. 1164 // FIXME: This doesn't work with grid items overflowing their grid areas and should be tested & fixed.
1148 1165
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 if (isOutOfFlowPositioned()) 1207 if (isOutOfFlowPositioned())
1191 return "RenderGrid (positioned)"; 1208 return "RenderGrid (positioned)";
1192 if (isAnonymous()) 1209 if (isAnonymous())
1193 return "RenderGrid (generated)"; 1210 return "RenderGrid (generated)";
1194 if (isRelPositioned()) 1211 if (isRelPositioned())
1195 return "RenderGrid (relative positioned)"; 1212 return "RenderGrid (relative positioned)";
1196 return "RenderGrid"; 1213 return "RenderGrid";
1197 } 1214 }
1198 1215
1199 } // namespace WebCore 1216 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698