Changeset 295001 in webkit


Ignore:
Timestamp:
May 28, 2022, 9:31:20 AM (3 years ago)
Author:
Alan Bujtas
Message:

Introduce FlexFormattingContext::computeLogicalHeightForFlexItems
https://bugs.webkit.org/show_bug.cgi?id=241056

Reviewed by Antti Koivisto.

This is just a very basic "let's stretch the flex items in the cross axis direction" change.

  • Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp:

(WebCore::Layout::availableLogicalVerticalSpace):
(WebCore::Layout::availableLogicalHorizontalSpace):
(WebCore::Layout::FlexFormattingContext::setFlexItemsGeometry):
(WebCore::Layout::FlexFormattingContext::computeLogicalWidthForFlexItems):
(WebCore::Layout::FlexFormattingContext::computeLogicalHeightForFlexItems):
(WebCore::Layout::FlexFormattingContext::layoutInFlowContentForIntegration):

  • Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.h:

Canonical link: https://commits.webkit.org/251099@main

Location:
trunk/Source/WebCore/layout/formattingContexts/flex
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp

    r295000 r295001  
    120120}
    121121
     122static inline std::optional<LayoutUnit> availableLogicalVerticalSpace(const ContainerBox& root, const ConstraintsForFlexContent& flexConstraints)
     123{
     124    auto flexDirection = root.style().flexDirection();
     125    auto flexDirectionIsInlineAxis = flexDirection == FlexDirection::Row || flexDirection == FlexDirection::RowReverse;
     126    return { flexDirectionIsInlineAxis ? flexConstraints.availableVerticalSpace() : std::make_optional(flexConstraints.horizontal().logicalWidth) };
     127}
     128
     129static inline std::optional<LayoutUnit> availableLogicalHorizontalSpace(const ContainerBox& root, const ConstraintsForFlexContent& flexConstraints)
     130{
     131    auto flexDirection = root.style().flexDirection();
     132    auto flexDirectionIsInlineAxis = flexDirection == FlexDirection::Row || flexDirection == FlexDirection::RowReverse;
     133    return { flexDirectionIsInlineAxis ? std::make_optional(flexConstraints.horizontal().logicalWidth) : flexConstraints.availableVerticalSpace() };
     134}
     135
    122136FlexFormattingContext::LogicalFlexItems FlexFormattingContext::convertFlexItemsToLogicalSpace()
    123137{
     
    198212        }
    199213        flexItemGeometry.setLogicalTopLeft(topLeft);
    200         if (direction == FlexDirection::Row || direction == FlexDirection::RowReverse)
     214        if (direction == FlexDirection::Row || direction == FlexDirection::RowReverse) {
    201215            flexItemGeometry.setContentBoxWidth(logicalFlexItem.rect.width() - flexItemGeometry.horizontalMarginBorderAndPadding());
    202         else
     216            flexItemGeometry.setContentBoxHeight(logicalFlexItem.rect.height() - flexItemGeometry.verticalMarginBorderAndPadding());
     217        } else {
     218            flexItemGeometry.setContentBoxWidth(logicalFlexItem.rect.height() - flexItemGeometry.horizontalMarginBorderAndPadding());
    203219            flexItemGeometry.setContentBoxHeight(logicalFlexItem.rect.width() - flexItemGeometry.verticalMarginBorderAndPadding());
     220        }
    204221    }
    205222}
     
    346363void FlexFormattingContext::computeLogicalWidthForFlexItems(LogicalFlexItems& logicalFlexItemList, const ConstraintsForFlexContent& flexConstraints)
    347364{
    348     auto flexDirection = root().style().flexDirection();
    349     auto flexDirectionIsInlineAxis = flexDirection == FlexDirection::Row || flexDirection == FlexDirection::RowReverse;
    350     auto availableSpace = std::optional<LayoutUnit> { flexDirectionIsInlineAxis ? std::make_optional(flexConstraints.horizontal().logicalWidth) : flexConstraints.availableVerticalSpace() };
     365    auto availableSpace = availableLogicalHorizontalSpace(root(), flexConstraints);
    351366    auto contentLogicalWidth = [&] {
    352367        auto logicalWidth = LayoutUnit { };
     
    364379}
    365380
     381void FlexFormattingContext::computeLogicalHeightForFlexItems(LogicalFlexItems& logicalFlexItemList, const ConstraintsForFlexContent& flexConstraints)
     382{
     383    auto availableSpace = availableLogicalVerticalSpace(root(), flexConstraints);
     384    auto alignItems = root().style().alignItems();
     385    for (auto& logicalFlexItem : logicalFlexItemList) {
     386        auto& height = logicalFlexItem.layoutBox->style().height();
     387        if (!height.isAuto())
     388            continue;
     389        switch (alignItems.position()) {
     390        case ItemPosition::Normal:
     391        case ItemPosition::Stretch:
     392            logicalFlexItem.rect.setHeight(*availableSpace);
     393            break;
     394        default:
     395            ASSERT_NOT_IMPLEMENTED_YET();
     396            break;
     397        }
     398    }
     399}
     400
    366401void FlexFormattingContext::layoutInFlowContentForIntegration(const ConstraintsForInFlowContent& constraints)
    367402{
     
    373408
    374409    computeLogicalWidthForFlexItems(logicalFlexItemList, flexConstraints);
     410    computeLogicalHeightForFlexItems(logicalFlexItemList, flexConstraints);
    375411
    376412    for (auto& logicalFlexItem : logicalFlexItemList) {
  • trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.h

    r294904 r295001  
    6969    void computeLogicalWidthForStretchingFlexItems(LogicalFlexItems&, LayoutUnit availableSpace);
    7070    void computeLogicalWidthForShrinkingFlexItems(LogicalFlexItems&, LayoutUnit availableSpace);
     71    void computeLogicalHeightForFlexItems(LogicalFlexItems&, const ConstraintsForFlexContent&);
    7172
    7273    const FlexFormattingState& formattingState() const { return downcast<FlexFormattingState>(FormattingContext::formattingState()); }
Note: See TracChangeset for help on using the changeset viewer.