Changeset 118600 in webkit
- Timestamp:
- May 25, 2012 7:07:18 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r118599 r118600 1 2012-05-25 Tony Chang <tony@chromium.org> 2 3 implement new negative flexing algorithm 4 https://bugs.webkit.org/show_bug.cgi?id=86528 5 6 Reviewed by Ojan Vafai. 7 8 * css3/flexbox/flex-algorithm-expected.txt: 9 * css3/flexbox/flex-algorithm.html: 10 1 11 2012-05-25 Mihai Parparita <mihaip@chromium.org> 2 12 -
trunk/LayoutTests/css3/flexbox/flex-algorithm-expected.txt
r110253 r118600 1 PASS 2 PASS 3 PASS 4 PASS 5 PASS 6 PASS 1 7 PASS 2 8 PASS -
trunk/LayoutTests/css3/flexbox/flex-algorithm.html
r117385 r118600 87 87 </div> 88 88 89 <div style="display: -webkit-flex" class="flexbox"> 90 <div data-expected-width="50" style="-webkit-flex: 1 1 100px"></div> 91 <div data-expected-width="250" style="-webkit-flex: 1 1 500px"></div> 92 <div data-expected-width="300" style="width: 300px"></div> 93 </div> 94 95 <div style="display: -webkit-flex" class="flexbox"> 96 <div data-expected-width="50" style="-webkit-flex: 1 1 100px"></div> 97 <div data-expected-width="250" style="-webkit-flex: 1 1 500px; margin-right: 300px;"></div> 98 </div> 99 100 <div style="display: -webkit-flex" class="flexbox"> 101 <div data-expected-width="50" style="-webkit-flex: 1 1 100px"></div> 102 <div data-expected-width="550" style="-webkit-flex: 1 1 500px; padding-left: 300px;"></div> 103 </div> 104 105 <div style="display: -webkit-flex" class="flexbox"> 106 <div data-expected-width="50" style="-webkit-flex: 1 1 100px"></div> 107 <div data-expected-width="550" style="-webkit-flex: 1 1 500px; border-left: 200px dashed orange; border-right: 100px dashed orange;"></div> 108 </div> 109 110 <!-- Test some overflow cases. --> 111 <div style="display: -webkit-flex" class="flexbox"> 112 <div data-expected-width="600" style="-webkit-flex: 0 100000000000000000000000000000000000000 600px"></div> 113 <div data-expected-width="600" style="-webkit-flex: 0 100000000000000000000000000000000000000 600px"></div> 114 </div> 115 116 <div style="display: -webkit-flex" class="flexbox"> 117 <div data-expected-width="600" style="-webkit-flex: 100000000000000000000000000000000000000 0 600px"></div> 118 <div data-expected-width="600" style="-webkit-flex: 0 100000000000000000000000000000000000000 600px"></div> 119 <div data-expected-width="0" style="-webkit-flex: 1 1 100000000000000000000000000000000000000px"></div> 120 </div> 121 89 122 <!-- Test flexitem borders. --> 90 123 <div style="display: -webkit-flex" class="flexbox"> -
trunk/Source/WebCore/ChangeLog
r118599 r118600 1 2012-05-25 Tony Chang <tony@chromium.org> 2 3 implement new negative flexing algorithm 4 https://bugs.webkit.org/show_bug.cgi?id=86528 5 6 Reviewed by Ojan Vafai. 7 8 Rather than just scale by the negative flexibility, we also take the 9 flex-basis (preferred size) into consideration. That means items with 10 a larger preferred size will shrink faster. 11 12 Test: css3/flexbox/flex-algorithm.html (new test cases added) 13 14 * rendering/RenderFlexibleBox.cpp: 15 (WebCore::RenderFlexibleBox::preferredMainAxisContentExtentForChild): Handle overflow. 16 (WebCore::RenderFlexibleBox::layoutFlexItems): 17 (WebCore::RenderFlexibleBox::computeNextFlexLine): Sum weighted negative flex. 18 (WebCore::RenderFlexibleBox::freezeViolations): 19 (WebCore::RenderFlexibleBox::resolveFlexibleLengths): Shrink by weighted amount. 20 Also handle large values by making sure the flex values are finite. 21 * rendering/RenderFlexibleBox.h: 22 1 23 2012-05-25 Mihai Parparita <mihaip@chromium.org> 2 24 -
trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp
r118279 r118600 36 36 #include "RenderView.h" 37 37 #include <limits> 38 #include <wtf/MathExtras.h> 38 39 39 40 namespace WebCore { … … 594 595 return mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child); 595 596 } 596 return minimumValueForLength(mainAxisLength, mainAxisContentExtent(), view());597 return std::max(LayoutUnit(0), minimumValueForLength(mainAxisLength, mainAxisContentExtent(), view())); 597 598 } 598 599 … … 625 626 LayoutUnit preferredMainAxisExtent; 626 627 float totalPositiveFlexibility; 627 float total NegativeFlexibility;628 float totalWeightedNegativeFlexibility; 628 629 LayoutUnit minMaxAppliedMainAxisExtent; 629 630 630 631 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); 631 while (computeNextFlexLine(iterator, orderedChildren, preferredMainAxisExtent, totalPositiveFlexibility, total NegativeFlexibility, minMaxAppliedMainAxisExtent)) {632 while (computeNextFlexLine(iterator, orderedChildren, preferredMainAxisExtent, totalPositiveFlexibility, totalWeightedNegativeFlexibility, minMaxAppliedMainAxisExtent)) { 632 633 LayoutUnit availableFreeSpace = computeAvailableFreeSpace(preferredMainAxisExtent); 633 634 FlexSign flexSign = (minMaxAppliedMainAxisExtent < preferredMainAxisExtent + availableFreeSpace) ? PositiveFlexibility : NegativeFlexibility; 634 635 InflexibleFlexItemSize inflexibleItems; 635 636 WTF::Vector<LayoutUnit> childSizes; 636 while (!resolveFlexibleLengths(flexSign, orderedChildren, availableFreeSpace, totalPositiveFlexibility, total NegativeFlexibility, inflexibleItems, childSizes)) {637 ASSERT(totalPositiveFlexibility >= 0 && total NegativeFlexibility >= 0);637 while (!resolveFlexibleLengths(flexSign, orderedChildren, availableFreeSpace, totalPositiveFlexibility, totalWeightedNegativeFlexibility, inflexibleItems, childSizes)) { 638 ASSERT(totalPositiveFlexibility >= 0 && totalWeightedNegativeFlexibility >= 0); 638 639 ASSERT(inflexibleItems.size() > 0); 639 640 } … … 801 802 } 802 803 803 bool RenderFlexibleBox::computeNextFlexLine(FlexOrderIterator& iterator, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& total NegativeFlexibility, LayoutUnit& minMaxAppliedMainAxisExtent)804 bool RenderFlexibleBox::computeNextFlexLine(FlexOrderIterator& iterator, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, LayoutUnit& minMaxAppliedMainAxisExtent) 804 805 { 805 806 orderedChildren.clear(); 806 807 preferredMainAxisExtent = 0; 807 totalPositiveFlexibility = total NegativeFlexibility = 0;808 totalPositiveFlexibility = totalWeightedNegativeFlexibility = 0; 808 809 minMaxAppliedMainAxisExtent = 0; 809 810 … … 829 830 preferredMainAxisExtent += childMainAxisMarginBoxExtent; 830 831 totalPositiveFlexibility += child->style()->positiveFlex(); 831 total NegativeFlexibility += child->style()->negativeFlex();832 totalWeightedNegativeFlexibility += child->style()->negativeFlex() * childMainAxisExtent; 832 833 833 834 LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(child, childMainAxisExtent, flexboxAvailableContentExtent); … … 837 838 } 838 839 839 void RenderFlexibleBox::freezeViolations(const WTF::Vector<Violation>& violations, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& total NegativeFlexibility, InflexibleFlexItemSize& inflexibleItems)840 void RenderFlexibleBox::freezeViolations(const WTF::Vector<Violation>& violations, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems) 840 841 { 841 842 for (size_t i = 0; i < violations.size(); ++i) { 842 843 RenderBox* child = violations[i].child; 843 844 LayoutUnit childSize = violations[i].childSize; 844 availableFreeSpace -= childSize - preferredMainAxisContentExtentForChild(child); 845 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(child); 846 availableFreeSpace -= childSize - preferredChildSize; 845 847 totalPositiveFlexibility -= child->style()->positiveFlex(); 846 total NegativeFlexibility -= child->style()->negativeFlex();848 totalWeightedNegativeFlexibility -= child->style()->negativeFlex() * preferredChildSize; 847 849 inflexibleItems.set(child, childSize); 848 850 } … … 850 852 851 853 // Returns true if we successfully ran the algorithm and sized the flex items. 852 bool RenderFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedFlexItemList& children, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& total NegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes)854 bool RenderFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedFlexItemList& children, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, InflexibleFlexItemSize& inflexibleItems, WTF::Vector<LayoutUnit>& childSizes) 853 855 { 854 856 childSizes.clear(); … … 870 872 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(child); 871 873 LayoutUnit childSize = preferredChildSize; 872 if (availableFreeSpace > 0 && totalPositiveFlexibility > 0 && flexSign == PositiveFlexibility )874 if (availableFreeSpace > 0 && totalPositiveFlexibility > 0 && flexSign == PositiveFlexibility && isfinite(totalPositiveFlexibility)) 873 875 childSize += lroundf(availableFreeSpace * child->style()->positiveFlex() / totalPositiveFlexibility); 874 else if (availableFreeSpace < 0 && total NegativeFlexibility > 0 && flexSign == NegativeFlexibility)875 childSize += lroundf(availableFreeSpace * child->style()->negativeFlex() / totalNegativeFlexibility);876 else if (availableFreeSpace < 0 && totalWeightedNegativeFlexibility > 0 && flexSign == NegativeFlexibility && isfinite(totalWeightedNegativeFlexibility)) 877 childSize += lroundf(availableFreeSpace * child->style()->negativeFlex() * preferredChildSize / totalWeightedNegativeFlexibility); 876 878 877 879 LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(child, childSize, flexboxAvailableContentExtent); … … 889 891 890 892 if (totalViolation) 891 freezeViolations(totalViolation < 0 ? maxViolations : minViolations, availableFreeSpace, totalPositiveFlexibility, total NegativeFlexibility, inflexibleItems);893 freezeViolations(totalViolation < 0 ? maxViolations : minViolations, availableFreeSpace, totalPositiveFlexibility, totalWeightedNegativeFlexibility, inflexibleItems); 892 894 else 893 895 availableFreeSpace -= usedFreeSpace; -
trunk/Source/WebCore/rendering/RenderFlexibleBox.h
r118279 r118600 114 114 LayoutUnit lineBreakLength(); 115 115 LayoutUnit adjustChildSizeForMinAndMax(RenderBox*, LayoutUnit childSize, LayoutUnit flexboxAvailableContentExtent); 116 bool computeNextFlexLine(FlexOrderIterator&, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& total NegativeFlexibility, LayoutUnit& minMaxAppliedMainAxisExtent);116 bool computeNextFlexLine(FlexOrderIterator&, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, LayoutUnit& minMaxAppliedMainAxisExtent); 117 117 LayoutUnit computeAvailableFreeSpace(LayoutUnit preferredMainAxisExtent); 118 118 119 bool resolveFlexibleLengths(FlexSign, const OrderedFlexItemList&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& total NegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes);120 void freezeViolations(const WTF::Vector<Violation>&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& total NegativeFlexibility, InflexibleFlexItemSize&);119 bool resolveFlexibleLengths(FlexSign, const OrderedFlexItemList&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes); 120 void freezeViolations(const WTF::Vector<Violation>&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalWeightedNegativeFlexibility, InflexibleFlexItemSize&); 121 121 122 122 void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize);
Note: See TracChangeset
for help on using the changeset viewer.