From: tony@chromium.org Date: Thu, 9 Feb 2012 05:57:14 +0000 (+0000) Subject: refactor RenderFlexibleBox to return preferred sizes of all children X-Git-Tag: 070512121124~13370 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bf697cdbaf1974eec2eec479f43cedd131dff367;p=profile%2Fivi%2Fwebkit-efl.git refactor RenderFlexibleBox to return preferred sizes of all children https://bugs.webkit.org/show_bug.cgi?id=78169 Reviewed by Ojan Vafai. This is in preparation for multi-line flexbox. We need the preferred size of each child so we can compute where the multi-line breaks happen. No new tests, just refactoring. * rendering/RenderFlexibleBox.cpp: (WebCore::RenderFlexibleBox::preferredMainAxisContentExtentForChild): Renamed from preferredMainAxisContentExtentForFlexItem because other methods are ForChild rather than ForFlexItem. (WebCore::RenderFlexibleBox::layoutFlexItems): (WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithm): * rendering/RenderFlexibleBox.h: (RenderFlexibleBox): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107179 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 23de86a..81ddcb7 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,24 @@ +2012-02-08 Tony Chang + + refactor RenderFlexibleBox to return preferred sizes of all children + https://bugs.webkit.org/show_bug.cgi?id=78169 + + Reviewed by Ojan Vafai. + + This is in preparation for multi-line flexbox. We need the preferred + size of each child so we can compute where the multi-line breaks happen. + + No new tests, just refactoring. + + * rendering/RenderFlexibleBox.cpp: + (WebCore::RenderFlexibleBox::preferredMainAxisContentExtentForChild): Renamed from preferredMainAxisContentExtentForFlexItem because + other methods are ForChild rather than ForFlexItem. + (WebCore::RenderFlexibleBox::layoutFlexItems): + (WebCore::RenderFlexibleBox::computeMainAxisPreferredSizes): + (WebCore::RenderFlexibleBox::runFreeSpaceAllocationAlgorithm): + * rendering/RenderFlexibleBox.h: + (RenderFlexibleBox): + 2012-02-08 Shinya Kawanaka Stop calling Element::ensureShadowRoot() if it is used in construction phase. diff --git a/Source/WebCore/rendering/RenderFlexibleBox.cpp b/Source/WebCore/rendering/RenderFlexibleBox.cpp index 601d8a8..b025cd3 100644 --- a/Source/WebCore/rendering/RenderFlexibleBox.cpp +++ b/Source/WebCore/rendering/RenderFlexibleBox.cpp @@ -453,7 +453,7 @@ LayoutUnit RenderFlexibleBox::mainAxisScrollbarExtentForChild(RenderBox* child) return isHorizontalFlow() ? child->verticalScrollbarWidth() : child->horizontalScrollbarHeight(); } -LayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForFlexItem(RenderBox* child) const +LayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForChild(RenderBox* child) const { Length mainAxisLength = mainAxisLengthForChild(child); if (mainAxisLength.isAuto()) { @@ -465,12 +465,15 @@ LayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForFlexItem(RenderBo void RenderFlexibleBox::layoutFlexItems(bool relayoutChildren) { - LayoutUnit preferredMainAxisExtent; float totalPositiveFlexibility; float totalNegativeFlexibility; TreeOrderIterator treeIterator(this); - computePreferredMainAxisExtent(relayoutChildren, treeIterator, preferredMainAxisExtent, totalPositiveFlexibility, totalNegativeFlexibility); + WTF::Vector preferredSizes; + computeMainAxisPreferredSizes(relayoutChildren, treeIterator, preferredSizes, totalPositiveFlexibility, totalNegativeFlexibility); + LayoutUnit preferredMainAxisExtent = 0; + for (size_t i = 0; i < preferredSizes.size(); ++i) + preferredMainAxisExtent += preferredSizes[i]; LayoutUnit availableFreeSpace = mainAxisContentExtent() - preferredMainAxisExtent; FlexOrderIterator flexIterator(this, treeIterator.flexOrderValues()); @@ -509,15 +512,16 @@ LayoutUnit RenderFlexibleBox::marginBoxAscent(RenderBox* child) return ascent + flowAwareMarginBeforeForChild(child); } -void RenderFlexibleBox::computePreferredMainAxisExtent(bool relayoutChildren, TreeOrderIterator& iterator, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility) +void RenderFlexibleBox::computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator& iterator, WTF::Vector& preferredSizes, float& totalPositiveFlexibility, float& totalNegativeFlexibility) { - preferredMainAxisExtent = 0; totalPositiveFlexibility = totalNegativeFlexibility = 0; LayoutUnit flexboxAvailableContentExtent = mainAxisContentExtent(); for (RenderBox* child = iterator.first(); child; child = iterator.next()) { - if (child->isPositioned()) + if (child->isPositioned()) { + preferredSizes.append(0); continue; + } child->clearOverrideSize(); if (mainAxisLengthForChild(child).isAuto()) { @@ -526,21 +530,22 @@ void RenderFlexibleBox::computePreferredMainAxisExtent(bool relayoutChildren, Tr child->layoutIfNeeded(); } + LayoutUnit preferredSize = mainAxisBorderAndPaddingExtentForChild(child) + preferredMainAxisContentExtentForChild(child); + // We set the margins because we want to make sure 'auto' has a margin // of 0 and because if we're not auto sizing, we don't do a layout that // computes the start/end margins. if (isHorizontalFlow()) { child->setMarginLeft(child->style()->marginLeft().calcMinValue(flexboxAvailableContentExtent)); child->setMarginRight(child->style()->marginRight().calcMinValue(flexboxAvailableContentExtent)); - preferredMainAxisExtent += child->marginLeft() + child->marginRight(); + preferredSize += child->marginLeft() + child->marginRight(); } else { child->setMarginTop(child->style()->marginTop().calcMinValue(flexboxAvailableContentExtent)); child->setMarginBottom(child->style()->marginBottom().calcMinValue(flexboxAvailableContentExtent)); - preferredMainAxisExtent += child->marginTop() + child->marginBottom(); + preferredSize += child->marginTop() + child->marginBottom(); } - preferredMainAxisExtent += mainAxisBorderAndPaddingExtentForChild(child); - preferredMainAxisExtent += preferredMainAxisContentExtentForFlexItem(child); + preferredSizes.append(preferredSize); totalPositiveFlexibility += positiveFlexForChild(child); totalNegativeFlexibility += negativeFlexForChild(child); @@ -563,14 +568,14 @@ bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithm(FlexOrderIterator& itera if (inflexibleItems.contains(child)) childPreferredSize = inflexibleItems.get(child); else { - childPreferredSize = preferredMainAxisContentExtentForFlexItem(child); + childPreferredSize = preferredMainAxisContentExtentForChild(child); if (availableFreeSpace > 0 && totalPositiveFlexibility > 0) { childPreferredSize += lroundf(availableFreeSpace * positiveFlexForChild(child) / totalPositiveFlexibility); Length childLogicalMaxWidth = isHorizontalFlow() ? child->style()->maxWidth() : child->style()->maxHeight(); if (!childLogicalMaxWidth.isUndefined() && childLogicalMaxWidth.isSpecified() && childPreferredSize > childLogicalMaxWidth.calcValue(flexboxAvailableContentExtent)) { childPreferredSize = childLogicalMaxWidth.calcValue(flexboxAvailableContentExtent); - availableFreeSpace -= childPreferredSize - preferredMainAxisContentExtentForFlexItem(child); + availableFreeSpace -= childPreferredSize - preferredMainAxisContentExtentForChild(child); totalPositiveFlexibility -= positiveFlexForChild(child); inflexibleItems.set(child, childPreferredSize); @@ -582,7 +587,7 @@ bool RenderFlexibleBox::runFreeSpaceAllocationAlgorithm(FlexOrderIterator& itera Length childLogicalMinWidth = isHorizontalFlow() ? child->style()->minWidth() : child->style()->minHeight(); if (!childLogicalMinWidth.isUndefined() && childLogicalMinWidth.isSpecified() && childPreferredSize < childLogicalMinWidth.calcValue(flexboxAvailableContentExtent)) { childPreferredSize = childLogicalMinWidth.calcValue(flexboxAvailableContentExtent); - availableFreeSpace += preferredMainAxisContentExtentForFlexItem(child) - childPreferredSize; + availableFreeSpace += preferredMainAxisContentExtentForChild(child) - childPreferredSize; totalNegativeFlexibility -= negativeFlexForChild(child); inflexibleItems.set(child, childPreferredSize); diff --git a/Source/WebCore/rendering/RenderFlexibleBox.h b/Source/WebCore/rendering/RenderFlexibleBox.h index 3ec4c2a..0833217 100644 --- a/Source/WebCore/rendering/RenderFlexibleBox.h +++ b/Source/WebCore/rendering/RenderFlexibleBox.h @@ -85,7 +85,7 @@ private: void adjustAlignmentForChild(RenderBox* child, LayoutUnit); LayoutUnit mainAxisBorderAndPaddingExtentForChild(RenderBox* child) const; LayoutUnit mainAxisScrollbarExtentForChild(RenderBox* child) const; - LayoutUnit preferredMainAxisContentExtentForFlexItem(RenderBox* child) const; + LayoutUnit preferredMainAxisContentExtentForChild(RenderBox* child) const; void layoutFlexItems(bool relayoutChildren); @@ -95,7 +95,7 @@ private: LayoutUnit availableAlignmentSpaceForChild(RenderBox*); LayoutUnit marginBoxAscent(RenderBox*); - void computePreferredMainAxisExtent(bool relayoutChildren, TreeOrderIterator&, LayoutUnit&, float& totalPositiveFlexibility, float& totalNegativeFlexibility); + void computeMainAxisPreferredSizes(bool relayoutChildren, TreeOrderIterator&, WTF::Vector&, float& totalPositiveFlexibility, float& totalNegativeFlexibility); bool runFreeSpaceAllocationAlgorithm(FlexOrderIterator&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector& childSizes); void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize); void prepareChildForPositionedLayout(RenderBox* child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset);