Changeset 246633 in webkit


Ignore:
Timestamp:
Jun 20, 2019 6:59:12 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Introduce Line::InitialConstraints
https://bugs.webkit.org/show_bug.cgi?id=199056
<rdar://problem/51927597>

Reviewed by Antti Koivisto.

Line::InitialConstraints, as the name suggests, holds the initial constraint values for the new line.

  • layout/inlineformatting/InlineFormattingContext.h:
  • layout/inlineformatting/InlineFormattingContextLineLayout.cpp:

(WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput):
(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
(WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
(WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):

  • layout/inlineformatting/InlineLine.cpp:

(WebCore::Layout::Line::Line):
(WebCore::Layout::m_skipVerticalAligment):
(WebCore::Layout::m_lineLogicalWidth): Deleted.

  • layout/inlineformatting/InlineLine.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246632 r246633  
     12019-06-20  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Introduce Line::InitialConstraints
     4        https://bugs.webkit.org/show_bug.cgi?id=199056
     5        <rdar://problem/51927597>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        Line::InitialConstraints, as the name suggests, holds the initial constraint values for the new line.
     10
     11        * layout/inlineformatting/InlineFormattingContext.h:
     12        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
     13        (WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput):
     14        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
     15        (WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
     16        (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
     17        * layout/inlineformatting/InlineLine.cpp:
     18        (WebCore::Layout::Line::Line):
     19        (WebCore::Layout::m_skipVerticalAligment):
     20        (WebCore::Layout::m_lineLogicalWidth): Deleted.
     21        * layout/inlineformatting/InlineLine.h:
     22
    1232019-06-20  Carlos Garcia Campos  <cgarcia@igalia.com>
    224
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r246540 r246633  
    6767
    6868        struct LineInput {
    69             enum class SkipVerticalAligment { No, Yes };
    70             LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
     69            LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
    7170            struct HorizontalConstraint {
    7271                HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth);
     
    7776            HorizontalConstraint horizontalConstraint;
    7877            // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out)
    79             SkipVerticalAligment skipVerticalAligment;
     78            Line::SkipVerticalAligment skipVerticalAligment;
    8079            unsigned firstInlineItemIndex { 0 };
    8180            const InlineItems& inlineItems;
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp

    r246540 r246633  
    7979}
    8080
    81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
     81InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
    8282    : horizontalConstraint(logicalTopLeft, availableLogicalWidth)
    8383    , skipVerticalAligment(skipVerticalAligment)
     
    128128InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
    129129{
    130     std::unique_ptr<Line> line;
    131     if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) {
    132         auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
    133         auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
    134         line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft, lineInput.horizontalConstraint.availableLogicalWidth, mimimumLineHeight, initialBaselineOffset);
    135     } else
    136         line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft.x(), lineInput.horizontalConstraint.availableLogicalWidth);
     130    auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
     131    auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
     132    auto initialLineConstraints = Line::InitialConstraints {
     133        lineInput.horizontalConstraint.logicalTopLeft,
     134        lineInput.horizontalConstraint.availableLogicalWidth,
     135        mimimumLineHeight,
     136        initialBaselineOffset
     137    };
     138    auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
    137139
    138140    Vector<WeakPtr<InlineItem>> floats;
     
    145147        committedInlineItemCount += uncommittedContent.size();
    146148        for (auto& uncommittedRun : uncommittedContent.runs())
    147             line->append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
     149            line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
    148150        uncommittedContent.reset();
    149151    };
     
    153155        ASSERT(committedInlineItemCount || lineHasFloatBox);
    154156        auto lastCommittedIndex = committedInlineItemCount ? Optional<unsigned> { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1) } : WTF::nullopt;
    155         return LineContent { lastCommittedIndex, WTFMove(floats), line->close() };
     157        return LineContent { lastCommittedIndex, WTFMove(floats), line.close() };
    156158    };
    157159    LineBreaker lineBreaker;
    158160    // Iterate through the inline content and place the inline boxes on the current line.
    159161    for (auto inlineItemIndex = lineInput.firstInlineItemIndex; inlineItemIndex < lineInput.inlineItems.size(); ++inlineItemIndex) {
    160         auto availableWidth = line->availableWidth() - uncommittedContent.width();
    161         auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
     162        auto availableWidth = line.availableWidth() - uncommittedContent.width();
     163        auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width();
    162164        auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
    163165        auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
    164166
    165167        // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
    166         auto lineIsConsideredEmpty = !line->hasContent() && !lineHasFloatBox;
    167         auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), lineIsConsideredEmpty });
     168        auto lineIsConsideredEmpty = !line.hasContent() && !lineHasFloatBox;
     169        auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line.trailingTrimmableWidth(), lineIsConsideredEmpty });
    168170        if (breakingContext.isAtBreakingOpportunity)
    169171            commitPendingContent();
     
    187189            // Shrink availble space for current line and move existing inline runs.
    188190            auto floatBoxWidth = layoutState().displayBoxForLayoutBox(floatBox).marginBoxWidth();
    189             floatBox.isLeftFloatingPositioned() ? line->moveLogicalLeft(floatBoxWidth) : line->moveLogicalRight(floatBoxWidth);
     191            floatBox.isLeftFloatingPositioned() ? line.moveLogicalLeft(floatBoxWidth) : line.moveLogicalRight(floatBoxWidth);
    190192            floats.append(makeWeakPtr(*inlineItem));
    191193            ++committedInlineItemCount;
     
    252254    unsigned currentInlineItemIndex = 0;
    253255    while (currentInlineItemIndex < inlineItems.size()) {
    254         auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
     256        auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
    255257        applyFloatConstraint(lineInput);
    256258        auto lineContent = placeInlineItems(lineInput);
     
    274276    unsigned currentInlineItemIndex = 0;
    275277    while (currentInlineItemIndex < inlineItems.size()) {
    276         auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
     278        auto lineContent = placeInlineItems({ { }, widthConstraint, Line::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
    277279        currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1;
    278280        LayoutUnit floatsWidth;
  • trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp

    r246540 r246633  
    4545}
    4646
    47 Line::Line(const LayoutState& layoutState, LayoutUnit logicalLeft, LayoutUnit availableWidth)
     47Line::Line(const LayoutState& layoutState, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment)
    4848    : m_layoutState(layoutState)
    4949    , m_content(std::make_unique<Line::Content>())
    50     , m_logicalTopLeft(logicalLeft, 0)
    51     , m_lineLogicalWidth(availableWidth)
    52     , m_skipVerticalAligment(true)
    53 {
    54 }
    55 
    56 Line::Line(const LayoutState& layoutState, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumHeight, LayoutUnit baselineOffset)
    57     : m_layoutState(layoutState)
    58     , m_content(std::make_unique<Line::Content>())
    59     , m_logicalTopLeft(topLeft)
    60     , m_baseline({ baselineOffset, minimumHeight - baselineOffset })
    61     , m_contentLogicalHeight(minimumHeight)
    62     , m_lineLogicalWidth(availableWidth)
     50    , m_logicalTopLeft(initialConstraints.topLeft)
     51    , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset })
     52    , m_contentLogicalHeight(initialConstraints.height)
     53    , m_lineLogicalWidth(initialConstraints.availableWidth)
     54    , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
    6355{
    6456}
  • trunk/Source/WebCore/layout/inlineformatting/InlineLine.h

    r246539 r246633  
    3939    WTF_MAKE_ISO_ALLOCATED(Line);
    4040public:
    41     Line(const LayoutState&, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumLineHeight, LayoutUnit baselineOffset);
    42     Line(const LayoutState&, LayoutUnit logicalLeft, LayoutUnit availableWidth);
     41    struct InitialConstraints {
     42        LayoutPoint topLeft;
     43        LayoutUnit availableWidth;
     44        LayoutUnit height;
     45        LayoutUnit baselineOffset;
     46    };
     47    enum class SkipVerticalAligment { No, Yes };
     48    Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment);
    4349
    4450    class Content {
Note: See TracChangeset for help on using the changeset viewer.