Changeset 249437 in webkit


Ignore:
Timestamp:
Sep 3, 2019 12:21:48 PM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][Floats] Do not pass FloatingState to FloatAvoider/FloatBox
https://bugs.webkit.org/show_bug.cgi?id=201405
<rdar://problem/54956381>

Reviewed by Antti Koivisto.

This is in preparation for transitioning the floating codebase to use the formatting context for
retrieving display boxes. Now FloatAvoiders/FloatBoxes don't need the FloatingState to compute absolute display boxes.

  • layout/floats/FloatAvoider.cpp:

(WebCore::Layout::FloatAvoider::FloatAvoider):
(WebCore::Layout::FloatAvoider::setHorizontalConstraints):
(WebCore::Layout::FloatAvoider::initialHorizontalPosition const):
(WebCore::Layout::FloatAvoider::overflowsContainingBlock const):
(WebCore::Layout::FloatAvoider::rectInContainingBlock const):

  • layout/floats/FloatAvoider.h:

(WebCore::Layout::FloatAvoider::floatingState const): Deleted.

  • layout/floats/FloatBox.cpp:

(WebCore::Layout::FloatBox::FloatBox):
(WebCore::Layout::FloatBox::initialVerticalPosition const):

  • layout/floats/FloatBox.h:
  • layout/floats/FloatingContext.cpp:

(WebCore::Layout::mapToFormattingContextRoot):
(WebCore::Layout::FloatingContext::positionForFloat const):
(WebCore::Layout::FloatingContext::positionForFormattingContextRoot const):

  • platform/graphics/LayoutPoint.h:

(WebCore::LayoutPoint::isZero const):

Location:
trunk/Source/WebCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r249436 r249437  
     12019-09-03  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][Floats] Do not pass FloatingState to FloatAvoider/FloatBox
     4        https://bugs.webkit.org/show_bug.cgi?id=201405
     5        <rdar://problem/54956381>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        This is in preparation for transitioning the floating codebase to use the formatting context for
     10        retrieving display boxes. Now FloatAvoiders/FloatBoxes don't need the FloatingState to compute absolute display boxes.
     11
     12        * layout/floats/FloatAvoider.cpp:
     13        (WebCore::Layout::FloatAvoider::FloatAvoider):
     14        (WebCore::Layout::FloatAvoider::setHorizontalConstraints):
     15        (WebCore::Layout::FloatAvoider::initialHorizontalPosition const):
     16        (WebCore::Layout::FloatAvoider::overflowsContainingBlock const):
     17        (WebCore::Layout::FloatAvoider::rectInContainingBlock const):
     18        * layout/floats/FloatAvoider.h:
     19        (WebCore::Layout::FloatAvoider::floatingState const): Deleted.
     20        * layout/floats/FloatBox.cpp:
     21        (WebCore::Layout::FloatBox::FloatBox):
     22        (WebCore::Layout::FloatBox::initialVerticalPosition const):
     23        * layout/floats/FloatBox.h:
     24        * layout/floats/FloatingContext.cpp:
     25        (WebCore::Layout::mapToFormattingContextRoot):
     26        (WebCore::Layout::FloatingContext::positionForFloat const):
     27        (WebCore::Layout::FloatingContext::positionForFormattingContextRoot const):
     28        * platform/graphics/LayoutPoint.h:
     29        (WebCore::LayoutPoint::isZero const):
     30
    1312019-09-03  Jiewen Tan  <jiewen_tan@apple.com>
    232
  • trunk/Source/WebCore/layout/floats/FloatAvoider.cpp

    r245776 r249437  
    3939WTF_MAKE_ISO_ALLOCATED_IMPL(FloatAvoider);
    4040
    41 FloatAvoider::FloatAvoider(const Box& layoutBox, const FloatingState& floatingState, const LayoutState& layoutState)
     41FloatAvoider::FloatAvoider(const Box& layoutBox, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox)
    4242    : m_layoutBox(makeWeakPtr(layoutBox))
    43     , m_floatingState(floatingState)
    44     , m_absoluteDisplayBox(FormattingContext::mapBoxToAncestor(layoutState, layoutBox, downcast<Container>(floatingState.root())))
    45     , m_containingBlockAbsoluteDisplayBox(layoutBox.containingBlock() == &floatingState.root() ? Display::Box(layoutState.displayBoxForLayoutBox(*layoutBox.containingBlock())) : FormattingContext::mapBoxToAncestor(layoutState, *layoutBox.containingBlock(), downcast<Container>(floatingState.root())))
     43    , m_absoluteDisplayBox(absoluteDisplayBox)
     44    , m_containingBlockAbsoluteTopLeft(containingBlockAbsoluteTopLeft)
     45    , m_containingBlockAbsoluteContentBox(containingBlockAbsoluteContentBox)
    4646{
    4747    ASSERT(m_layoutBox->establishesBlockFormattingContext());
     
    6060        // Horizontal position is constrained by the containing block's content box.
    6161        // Compute the horizontal position for the new floating by taking both the contining block and the current left/right floats into account.
    62         auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft();
    6362        if (isLeftAligned())
    64             return std::max<PositionInContextRoot>({ containingBlockContentBoxLeft + marginStart() }, left);
     63            return std::max<PositionInContextRoot>({ m_containingBlockAbsoluteContentBox.left + marginStart() }, left);
    6564
    6665        // Make sure it does not overflow the containing block on the right.
    67         auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth();
    68         return std::min<PositionInContextRoot>(left, { containingBlockContentBoxRight - marginBoxWidth() + marginStart() });
     66        return std::min<PositionInContextRoot>(left, { m_containingBlockAbsoluteContentBox.right - marginBoxWidth() + marginStart() });
    6967    };
    7068
     
    9189{
    9290    // Align the box with the containing block's content box.
    93     auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft();
    94     auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth();
    95 
    96     auto left = isLeftAligned() ? containingBlockContentBoxLeft : containingBlockContentBoxRight - marginBoxWidth();
     91    auto left = isLeftAligned() ? m_containingBlockAbsoluteContentBox.left : m_containingBlockAbsoluteContentBox.right - marginBoxWidth();
    9792    left += marginStart();
    98 
    9993    return { left };
    10094}
     
    10296bool FloatAvoider::overflowsContainingBlock() const
    10397{
    104     auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft();
    10598    auto left = displayBox().left() - marginStart();
    106 
    107     if (containingBlockContentBoxLeft > left)
     99    if (m_containingBlockAbsoluteContentBox.left > left)
    108100        return true;
    109101
    110     auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth();
    111102    auto right = displayBox().right() + marginEnd();
    112 
    113     return containingBlockContentBoxRight < right;
     103    return m_containingBlockAbsoluteContentBox.right < right;
    114104}
    115105
     
    117107{
    118108    // From formatting root coordinate system back to containing block's.
    119     if (layoutBox().containingBlock() == &floatingState().root())
     109    if (m_containingBlockAbsoluteTopLeft.isZero())
    120110        return m_absoluteDisplayBox.rect();
    121111
    122112    return {
    123         m_absoluteDisplayBox.top() - m_containingBlockAbsoluteDisplayBox.top(),
    124         m_absoluteDisplayBox.left() - m_containingBlockAbsoluteDisplayBox.left(),
     113        m_absoluteDisplayBox.top() - m_containingBlockAbsoluteTopLeft.y(),
     114        m_absoluteDisplayBox.left() - m_containingBlockAbsoluteTopLeft.x(),
    125115        m_absoluteDisplayBox.width(),
    126116        m_absoluteDisplayBox.height()
  • trunk/Source/WebCore/layout/floats/FloatAvoider.h

    r245776 r249437  
    4444    WTF_MAKE_ISO_ALLOCATED(FloatAvoider);
    4545public:
    46     FloatAvoider(const Box&, const FloatingState&, const LayoutState&);
     46    FloatAvoider(const Box&, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox);
    4747    virtual ~FloatAvoider() = default;
    4848
     
    7676    LayoutUnit marginBoxWidth() const { return marginStart() + displayBox().width() + marginEnd(); }
    7777
    78     const FloatingState& floatingState() const { return m_floatingState; }
    7978    const Box& layoutBox() const { return *m_layoutBox; }
    8079    const Display::Box& displayBox() const { return m_absoluteDisplayBox; }
     
    8382private:
    8483    WeakPtr<const Box> m_layoutBox;
    85     const FloatingState& m_floatingState;
     84    // These coordinate values are relative to the formatting root's border box.
    8685    Display::Box m_absoluteDisplayBox;
    87     Display::Box m_containingBlockAbsoluteDisplayBox;
     86    LayoutPoint m_containingBlockAbsoluteTopLeft;
     87    HorizontalEdges m_containingBlockAbsoluteContentBox;
    8888};
    8989
  • trunk/Source/WebCore/layout/floats/FloatBox.cpp

    r245776 r249437  
    3636WTF_MAKE_ISO_ALLOCATED_IMPL(FloatBox);
    3737
    38 FloatBox::FloatBox(const Box& layoutBox, const FloatingState& floatingState, const LayoutState& layoutState)
    39     : FloatAvoider(layoutBox, floatingState, layoutState)
     38FloatBox::FloatBox(const Box& layoutBox, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox, Optional<LayoutUnit> previousFloatAbsoluteTop)
     39    : FloatAvoider(layoutBox, absoluteDisplayBox, containingBlockAbsoluteTopLeft, containingBlockAbsoluteContentBox)
    4040{
    41     displayBox().setTopLeft({ initialHorizontalPosition(), initialVerticalPosition() });
     41    displayBox().setTopLeft({ initialHorizontalPosition(), initialVerticalPosition(previousFloatAbsoluteTop) });
    4242}
    4343
     
    6161}
    6262
    63 PositionInContextRoot FloatBox::initialVerticalPosition() const
     63PositionInContextRoot FloatBox::initialVerticalPosition(Optional<LayoutUnit> previousFloatAbsoluteTop) const
    6464{
    6565    // Incoming float cannot be placed higher than existing floats (margin box of the last float).
    6666    // Take the static position (where the box would go if it wasn't floating) and adjust it with the last float.
    6767    auto top = displayBox().top() - marginBefore();
    68     if (auto lastFloat = floatingState().last())
    69         top = std::max(top, lastFloat->rectWithMargin().top());
     68    if (previousFloatAbsoluteTop)
     69        top = std::max(top, *previousFloatAbsoluteTop);
    7070    top += marginBefore();
    7171
  • trunk/Source/WebCore/layout/floats/FloatBox.h

    r245776 r249437  
    4242    WTF_MAKE_ISO_ALLOCATED(FloatBox);
    4343public:
    44     FloatBox(const Box&, const FloatingState&, const LayoutState&);
     44    FloatBox(const Box&, Display::Box absoluteDisplayBox, LayoutPoint containingBlockAbsoluteTopLeft, HorizontalEdges containingBlockAbsoluteContentBox, Optional<LayoutUnit> previousFloatAbsoluteTop);
    4545
    4646    Display::Rect rect() const final;
     
    5252    PositionInContextRoot verticalPositionCandidate(PositionInContextRoot) final;
    5353
    54     PositionInContextRoot initialVerticalPosition() const;
     54    PositionInContextRoot initialVerticalPosition(Optional<LayoutUnit> previousFloatAbsoluteTop) const;
    5555};
    5656
  • trunk/Source/WebCore/layout/floats/FloatingContext.cpp

    r249433 r249437  
    151151#endif
    152152
     153struct AbsoluteCoordinateValuesForFloatAvoider {
     154    Display::Box displayBox;
     155    LayoutPoint containingBlockTopLeft;
     156    HorizontalEdges containingBlockContentBox;
     157};
     158static AbsoluteCoordinateValuesForFloatAvoider mapToFormattingContextRoot(const Box& layoutBox, const Container& formattingContextRoot, const LayoutState& layoutState)
     159{
     160    auto& containingBlock = *layoutBox.containingBlock();
     161    auto displayBox = FormattingContext::mapBoxToAncestor(layoutState, layoutBox, formattingContextRoot);
     162
     163    if (&containingBlock == &formattingContextRoot) {
     164        auto containingBlockDisplayBox = layoutState.displayBoxForLayoutBox(containingBlock);
     165        return { displayBox, { }, {  containingBlockDisplayBox.contentBoxLeft(), containingBlockDisplayBox.contentBoxRight() } };
     166    }
     167    auto containingBlockAbsoluteDisplayBox = FormattingContext::mapBoxToAncestor(layoutState, containingBlock, formattingContextRoot);
     168    auto containingBlockLeft = containingBlockAbsoluteDisplayBox.left();
     169    return { displayBox, containingBlockAbsoluteDisplayBox.topLeft(), { containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxLeft(), containingBlockLeft + containingBlockAbsoluteDisplayBox.contentBoxRight() } };
     170}
     171
    153172FloatingContext::FloatingContext(const Container& formattingContextRoot, FloatingState& floatingState)
    154173    : m_root(makeWeakPtr(formattingContextRoot))
     
    180199
    181200    // Find the top most position where the float box fits.
    182     FloatBox floatBox = { layoutBox, m_floatingState, layoutState() };
     201    auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState());
     202
     203    Optional<LayoutUnit> previousFloatAbsoluteTop;
     204    if (!isEmpty())
     205        previousFloatAbsoluteTop = floatingState().floats().last().rectWithMargin().top();
     206    auto floatBox = FloatBox { layoutBox, absoluteDisplayBoxCoordinates.displayBox, absoluteDisplayBoxCoordinates.containingBlockTopLeft, absoluteDisplayBoxCoordinates.containingBlockContentBox, previousFloatAbsoluteTop };
    183207    findPositionForFloatBox(floatBox);
    184208    return floatBox.rectInContainingBlock().topLeft();
     
    195219        return { };
    196220
    197     FloatAvoider floatAvoider = { layoutBox, m_floatingState, layoutState() };
     221    auto absoluteDisplayBoxCoordinates = mapToFormattingContextRoot(layoutBox, downcast<Container>(m_floatingState.root()), layoutState());
     222    auto floatAvoider = FloatAvoider { layoutBox, absoluteDisplayBoxCoordinates.displayBox, absoluteDisplayBoxCoordinates.containingBlockTopLeft, absoluteDisplayBoxCoordinates.containingBlockContentBox };
    198223    findPositionForFormattingContextRoot(floatAvoider);
    199224    return { floatAvoider.rectInContainingBlock().topLeft() };
  • trunk/Source/WebCore/platform/graphics/LayoutPoint.h

    r245543 r249437  
    4545
    4646    static LayoutPoint zero() { return LayoutPoint(); }
     47    bool isZero() const { return !m_x && !m_y; }
    4748
    4849    LayoutUnit x() const { return m_x; }
Note: See TracChangeset for help on using the changeset viewer.