Changeset 107310 in webkit
- Timestamp:
- Feb 9, 2012 4:42:46 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r107304 r107310 1 2012-02-09 Tony Chang <tony@chromium.org> 2 3 more refactoring of RenderFlexibleBox in preparation for multiline 4 https://bugs.webkit.org/show_bug.cgi?id=78281 5 6 Reviewed by Ojan Vafai. 7 8 Previously, we were creating Vector of each flex item's preferred size in document order, 9 but for multiline, we need to break the lines in the flex order. I just removed this code 10 since it was the wrong order. 11 12 Instead, have 2 funtions, computeMainAxisPreferredSizes which only does the necessary 13 layouts and margin computations to compute preferred sizes and computeFlexOrder which 14 does the work of computing the flex order, preferred sizes, positive/negative flex. 15 16 For multiline, we will have computeFlexOrder drive a while loop and it will return the 17 flex items, preferred size, and positive/negative flex values for each line. 18 19 No new tests, just refactoring. 20 21 * rendering/RenderFlexibleBox.cpp: 22 (WebCore::RenderFlexibleBox::layoutFlexItems): 23 (WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): Only layout auto sized children and set margins. 24 (WebCore::RenderFlexibleBox::computeFlexOrder): Compute flex order, preferred size, positive/negative flex. 25 (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithm): Use the precomputed flex order. 26 (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): Use the precomputed flex order. 27 (WebCore::RenderFlexibleBox::layoutColumnReverse): Use the precomputed flex order. 28 (WebCore::RenderFlexibleBox::alignChildren): Use the precomputed flex order. 29 * rendering/RenderFlexibleBox.h: 30 (RenderFlexibleBox): 31 1 32 2012-02-09 Kentaro Hara <haraken@chromium.org> 2 33 -
trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp
r107179 r107310 466 466 void RenderFlexibleBox::layoutFlexItems(bool relayoutChildren) 467 467 { 468 TreeOrderIterator treeIterator(this); 469 computeMainAxisPreferredSizes(relayoutChildren, treeIterator); 470 471 OrderedFlexItemList orderedChildren; 472 LayoutUnit preferredMainAxisExtent; 468 473 float totalPositiveFlexibility; 469 474 float totalNegativeFlexibility; 470 TreeOrderIterator treeIterator(this); 471 472 WTF::Vector<LayoutUnit> preferredSizes; 473 computeMainAxisPreferredSizes(relayoutChildren, treeIterator, preferredSizes, totalPositiveFlexibility, totalNegativeFlexibility); 474 LayoutUnit preferredMainAxisExtent = 0; 475 for (size_t i = 0; i < preferredSizes.size(); ++i) 476 preferredMainAxisExtent += preferredSizes[i]; 475 FlexOrderIterator flexIterator(this, treeIterator.flexOrderValues()); 476 computeFlexOrder(flexIterator, orderedChildren, preferredMainAxisExtent, totalPositiveFlexibility, totalNegativeFlexibility); 477 477 478 LayoutUnit availableFreeSpace = mainAxisContentExtent() - preferredMainAxisExtent; 478 479 FlexOrderIterator flexIterator(this, treeIterator.flexOrderValues());480 479 InflexibleFlexItemSize inflexibleItems; 481 480 WTF::Vector<LayoutUnit> childSizes; 482 while (!runFreeSpaceAllocationAlgorithm( flexIterator, availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) {481 while (!runFreeSpaceAllocationAlgorithm(orderedChildren, availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) { 483 482 ASSERT(totalPositiveFlexibility >= 0 && totalNegativeFlexibility >= 0); 484 483 ASSERT(inflexibleItems.size() > 0); 485 484 } 486 485 487 layoutAndPlaceChildren( flexIterator, childSizes, availableFreeSpace, totalPositiveFlexibility);486 layoutAndPlaceChildren(orderedChildren, childSizes, availableFreeSpace, totalPositiveFlexibility); 488 487 } 489 488 … … 513 512 } 514 513 515 void RenderFlexibleBox::computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator& iterator, WTF::Vector<LayoutUnit>& preferredSizes, float& totalPositiveFlexibility, float& totalNegativeFlexibility) 516 { 517 totalPositiveFlexibility = totalNegativeFlexibility = 0; 518 514 void RenderFlexibleBox::computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator& iterator) 515 { 519 516 LayoutUnit flexboxAvailableContentExtent = mainAxisContentExtent(); 520 517 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { 521 if (child->isPositioned()) { 522 preferredSizes.append(0); 518 if (child->isPositioned()) 523 519 continue; 524 }525 520 526 521 child->clearOverrideSize(); … … 530 525 child->layoutIfNeeded(); 531 526 } 532 533 LayoutUnit preferredSize = mainAxisBorderAndPaddingExtentForChild(child) + preferredMainAxisContentExtentForChild(child);534 527 535 528 // We set the margins because we want to make sure 'auto' has a margin … … 539 532 child->setMarginLeft(child->style()->marginLeft().calcMinValue(flexboxAvailableContentExtent)); 540 533 child->setMarginRight(child->style()->marginRight().calcMinValue(flexboxAvailableContentExtent)); 541 preferredSize += child->marginLeft() + child->marginRight();542 534 } else { 543 535 child->setMarginTop(child->style()->marginTop().calcMinValue(flexboxAvailableContentExtent)); 544 536 child->setMarginBottom(child->style()->marginBottom().calcMinValue(flexboxAvailableContentExtent)); 545 preferredSize += child->marginTop() + child->marginBottom(); 546 } 547 548 preferredSizes.append(preferredSize); 549 537 } 538 } 539 } 540 541 void RenderFlexibleBox::computeFlexOrder(FlexOrderIterator& iterator, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility) 542 { 543 orderedChildren.clear(); 544 preferredMainAxisExtent = 0; 545 totalPositiveFlexibility = totalNegativeFlexibility = 0; 546 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { 547 orderedChildren.append(child); 548 if (child->isPositioned()) 549 continue; 550 551 LayoutUnit childMainAxisExtent = mainAxisBorderAndPaddingExtentForChild(child) + preferredMainAxisContentExtentForChild(child); 552 if (isHorizontalFlow()) 553 childMainAxisExtent += child->marginLeft() + child->marginRight(); 554 else 555 childMainAxisExtent += child->marginTop() + child->marginBottom(); 556 557 // FIXME: When implementing multiline, we would return here if adding 558 // the child's main axis extent would cause us to overflow. 559 preferredMainAxisExtent += childMainAxisExtent; 550 560 totalPositiveFlexibility += positiveFlexForChild(child); 551 561 totalNegativeFlexibility += negativeFlexForChild(child); … … 554 564 555 565 // Returns true if we successfully ran the algorithm and sized the flex items. 556 bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithm( FlexOrderIterator& iterator, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)566 bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithm(const OrderedFlexItemList& children, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes) 557 567 { 558 568 childSizes.clear(); 559 569 560 570 LayoutUnit flexboxAvailableContentExtent = mainAxisContentExtent(); 561 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { 571 for (size_t i = 0; i < children.size(); ++i) { 572 RenderBox* child = children[i]; 562 573 if (child->isPositioned()) { 563 574 childSizes.append(0); … … 665 676 } 666 677 667 void RenderFlexibleBox::layoutAndPlaceChildren( FlexOrderIterator& iterator, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)678 void RenderFlexibleBox::layoutAndPlaceChildren(const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility) 668 679 { 669 680 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart(); … … 676 687 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when flex-align: baseline. 677 688 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 678 size_t i = 0;679 for (RenderBox* child = iterator.first(); child; child = iterator.next(), ++i) {689 for (size_t i = 0; i < children.size(); ++i) { 690 RenderBox* child = children[i]; 680 691 if (child->isPositioned()) { 681 692 prepareChildForPositionedLayout(child, mainAxisOffset, crossAxisOffset); … … 720 731 // on the height of the flexbox, which we only know after we've positioned all the flex items. 721 732 computeLogicalHeight(); 722 layoutColumnReverse( iterator, childSizes, availableFreeSpace, totalPositiveFlexibility);723 } 724 725 alignChildren( iterator, maxAscent);726 } 727 728 void RenderFlexibleBox::layoutColumnReverse( FlexOrderIterator& iterator, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility)733 layoutColumnReverse(children, childSizes, availableFreeSpace, totalPositiveFlexibility); 734 } 735 736 alignChildren(children, maxAscent); 737 } 738 739 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility) 729 740 { 730 741 // This is similar to the logic in layoutAndPlaceChildren, except we place the children … … 736 747 737 748 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); 738 size_t i = 0;739 for (RenderBox* child = iterator.first(); child; child = iterator.next(), ++i) {749 for (size_t i = 0; i < children.size(); ++i) { 750 RenderBox* child = children[i]; 740 751 if (child->isPositioned()) { 741 752 child->layer()->setStaticBlockPosition(mainAxisOffset); … … 768 779 } 769 780 770 void RenderFlexibleBox::alignChildren( FlexOrderIterator& iterator, LayoutUnit maxAscent)781 void RenderFlexibleBox::alignChildren(const OrderedFlexItemList& children, LayoutUnit maxAscent) 771 782 { 772 783 LayoutUnit crossExtent = crossAxisExtent(); 773 784 774 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { 785 for (size_t i = 0; i < children.size(); ++i) { 786 RenderBox* child = children[i]; 775 787 // direction:rtl + flex-direction:column means the cross-axis direction is flipped. 776 788 if (!style()->isLeftToRightDirection() && isColumnFlow()) { -
trunk/Source/WebCore/rendering/RenderFlexibleBox.h
r107179 r107310 53 53 class FlexOrderIterator; 54 54 typedef WTF::HashMap<const RenderBox*, LayoutUnit> InflexibleFlexItemSize; 55 typedef WTF::Vector<RenderBox*> OrderedFlexItemList; 55 56 56 57 bool hasOrthogonalFlow(RenderBox* child) const; … … 96 97 LayoutUnit marginBoxAscent(RenderBox*); 97 98 98 void computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator&, WTF::Vector<LayoutUnit>&, float& totalPositiveFlexibility, float& totalNegativeFlexibility); 99 bool runFreeSpaceAllocationAlgorithm(FlexOrderIterator&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes); 99 void computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator&); 100 void computeFlexOrder(FlexOrderIterator&, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility); 101 bool runFreeSpaceAllocationAlgorithm(const OrderedFlexItemList&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes); 100 102 void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize); 101 103 void prepareChildForPositionedLayout(RenderBox* child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset); 102 void layoutAndPlaceChildren( FlexOrderIterator&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);103 void layoutColumnReverse( FlexOrderIterator&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility);104 void alignChildren( FlexOrderIterator&, LayoutUnit maxAscent);104 void layoutAndPlaceChildren(const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility); 105 void layoutColumnReverse(const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility); 106 void alignChildren(const OrderedFlexItemList&, LayoutUnit maxAscent); 105 107 }; 106 108
Note: See TracChangeset
for help on using the changeset viewer.