⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 245811 in webkit


Ignore:
Timestamp:
May 28, 2019, 7:51:16 AM (7 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Move intrinsic width computation from InlineFormattingContext to LineLayout
​https://bugs.webkit.org/show_bug.cgi?id=198258

Reviewed by Antti Koivisto.

This is in preparation for sharing even more code between line layout and preferred width computation.

  • layout/inlineformatting/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::layout const):
(WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const):

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

(WebCore::Layout::InlineFormattingContext::LineLayout::initializeLine const):
(WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
(WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
(WebCore::Layout::InlineFormattingContext::LineLayout::closeLine const):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r245810 r245811  
     12019-05-28  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Move intrinsic width computation from InlineFormattingContext to LineLayout
     4        https://bugs.webkit.org/show_bug.cgi?id=198258
     5
     6        Reviewed by Antti Koivisto.
     7
     8        This is in preparation for sharing even more code between line layout and preferred width computation.
     9
     10        * layout/inlineformatting/InlineFormattingContext.cpp:
     11        (WebCore::Layout::InlineFormattingContext::layout const):
     12        (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const):
     13        * layout/inlineformatting/InlineFormattingContext.h:
     14        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
     15        (WebCore::Layout::InlineFormattingContext::LineLayout::initializeLine const):
     16        (WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
     17        (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
     18        (WebCore::Layout::InlineFormattingContext::LineLayout::closeLine const):
     19
    1202019-05-28  Zalan Bujtas  <zalan@apple.com>
    221
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp

    r245776 r245811  
    7272    LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")");
    7373    auto& root = downcast<Container>(this->root());
    74     auto usedValues = UsedHorizontalValues { layoutState().displayBoxForLayoutBox(root).contentBoxWidth() };
     74    auto availableWidth = layoutState().displayBoxForLayoutBox(root).contentBoxWidth();
     75    auto usedValues = UsedHorizontalValues { availableWidth };
    7576    auto* layoutBox = root.firstInFlowOrFloatingChild();
    7677    // Compute width/height for non-text content and margin/border/padding for inline containers.
    … …  
    9495
    9596    collectInlineContent();
    96     LineLayout(*this).layout();
     97    LineLayout(*this).layout(availableWidth);
    9798    LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root << ")");
    9899}
    … …  
    140141            layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum);
    141142        }
    142         LayoutUnit maxContentLogicalRight;
    143         LayoutUnit lineLogicalRight;
    144 
    145         LineBreaker lineBreaker(layoutState);
    146         auto& inlineContent = formattingState().inlineItems();
    147         for (auto& inlineItem : inlineContent) {
    148             auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, lineLogicalRight, !lineLogicalRight });
    149             if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)
    150                 lineLogicalRight = 0;
    151             lineLogicalRight += inlineItem->width();
    152 
    153             maxContentLogicalRight = std::max(maxContentLogicalRight, lineLogicalRight);
    154         }
    155         return maxContentLogicalRight;
     143        return LineLayout(*this).computedIntrinsicWidth(availableWidth);
    156144    };
    157145
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r245776 r245811  
    5454    public:
    5555        LineLayout(const InlineFormattingContext&);
    56         void layout() const;
     56        void layout(LayoutUnit widthConstraint) const;
     57        LayoutUnit computedIntrinsicWidth(LayoutUnit widthConstraint) const;
    5758
    5859    private:
    5960        LayoutState& layoutState() const { return m_formattingContext.layoutState(); }
    60         void initializeLine(Line&, LayoutUnit lineLogicalTop) const;
     61        void initializeLine(Line&, LayoutUnit lineLogicalTop, LayoutUnit widthConstraint) const;
    6162        void closeLine(Line&) const;
    6263        void commitInlineItemToLine(Line&, const InlineItem&) const;
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp

    r245810 r245811  
    364364}
    365365
    366 void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop) const
     366void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop, LayoutUnit availableWidth) const
    367367{
    368368    auto& formattingRootDisplayBox = layoutState().displayBoxForLayoutBox(m_formattingRoot);
    369369    auto lineLogicalLeft = formattingRootDisplayBox.contentBoxLeft();
    370     auto availableWidth = formattingRootDisplayBox.contentBoxWidth();
    371370
    372371    // Check for intruding floats and adjust logical left/available width for this line accordingly.
    … …  
    400399}
    401400
    402 void InlineFormattingContext::LineLayout::layout() const
     401void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) const
    403402{
    404403    auto floatingContext = FloatingContext { m_floatingState };
    405404    Line line(layoutState());
    406     initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop());
     405    initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop(), widthConstraint);
    407406
    408407    UncommittedContent uncommittedContent;
    … …  
    413412    };
    414413
     414    auto closeCurrentAndInitializeNewLine = [&] {
     415        closeLine(line);
     416        initializeLine(line, line.logicalBottom(), widthConstraint);
     417    };
     418
    415419    LineBreaker lineBreaker(layoutState());
    416420    auto& inlineContent = m_formattingState.inlineItems();
    … …  
    418422        // Iterate through the inline content and try to put the inline boxes on the current line.
    419423        if (inlineItem->isHardLineBreak()) {
    420             // Close the current line then create and immediately close another one.
    421424            commitPendingContent();
    422425            commitInlineItemToLine(line, *inlineItem);
    423             closeLine(line);
     426            closeCurrentAndInitializeNewLine();
    424427        } else {
    425428            auto availableWidth = line.availableWidth() - uncommittedContent.width();
    … …  
    436439
    437440            if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)
    438                 closeLine(line);
     441                closeCurrentAndInitializeNewLine();
    439442
    440443            if (inlineItem->isFloat())
    … …  
    451454    if (!uncommittedContent.isEmpty()) {
    452455        if (line.availableWidth() < uncommittedContent.width())
    453             closeLine(line);
     456            closeCurrentAndInitializeNewLine();
    454457        commitPendingContent();
    455458    }
    456459    closeLine(line);
     460}
     461
     462LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const
     463{
     464    // FIXME: Consider running it through layout().
     465    LayoutUnit maximumLineWidth;
     466    LayoutUnit lineLogicalRight;
     467    LayoutUnit trimmableTrailingWidth;
     468
     469    LineBreaker lineBreaker(layoutState());
     470    auto& inlineContent = m_formattingState.inlineItems();
     471    for (auto& inlineItem : inlineContent) {
     472        auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight });
     473        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) {
     474            maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
     475            trimmableTrailingWidth = { };
     476            lineLogicalRight = { };
     477        }
     478        if (isTrimmableContent(*inlineItem)) {
     479            // Skip leading whitespace.
     480            if (!lineLogicalRight)
     481                continue;
     482            trimmableTrailingWidth += inlineItem->width();
     483        } else
     484            trimmableTrailingWidth = { };
     485        lineLogicalRight += inlineItem->width();
     486    }
     487    return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
    457488}
    458489
    … …  
    557588    if (line.hasContent())
    558589        alignRuns(m_formattingRoot.style().textAlign(), previousLineLastRunIndex.valueOr(-1) + 1, line.availableWidth());
    559     initializeLine(line, line.logicalBottom());
    560590}
    561591
Note: See TracChangeset for help on using the changeset viewer.