Changeset 246154 in webkit


Ignore:
Timestamp:
Jun 6, 2019 7:50:54 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Layout and preferred width computation should both call placeInlineItems().
https://bugs.webkit.org/show_bug.cgi?id=198587
<rdar://problem/51460340>

Reviewed by Antti Koivisto.

This patch enables inline placement logic sharing between layout and preferred width computation.

  • 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):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246143 r246154  
     12019-06-06  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Layout and preferred width computation should both call placeInlineItems().
     4        https://bugs.webkit.org/show_bug.cgi?id=198587
     5        <rdar://problem/51460340>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        This patch enables inline placement logic sharing between layout and preferred width computation.
     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
    1182019-06-05  Takashi Komori  <Takashi.Komori@sony.com>
    219
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r246114 r246154  
    6767
    6868        struct LineInput {
    69             LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems&);
     69            enum class SkipVerticalAligment { No, Yes };
     70            LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
    7071            struct HorizontalConstraint {
    7172                HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth);
     
    7576            };
    7677            HorizontalConstraint horizontalConstraint;
     78            // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out)
     79            SkipVerticalAligment skipVerticalAligment;
    7780            unsigned firstInlineItemIndex { 0 };
    7881            const InlineItems& inlineItems;
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp

    r246114 r246154  
    7979}
    8080
    81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
     81InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
    8282    : horizontalConstraint(logicalTopLeft, availableLogicalWidth)
     83    , skipVerticalAligment(skipVerticalAligment)
    8384    , firstInlineItemIndex(firstInlineItemIndex)
    8485    , inlineItems(inlineItems)
     
    221222            continue;
    222223        }
    223         if (inlineItem->isHardLineBreak()) {
    224             uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
    225             commitPendingContent();
    226             return closeLine();
    227         }
    228 
    229         uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
     224
     225        Optional<LayoutUnit> itemLogicalHeight;
     226        if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No)
     227            itemLogicalHeight = inlineItemHeight(layoutState(), *inlineItem);
     228        uncommittedContent.add(*inlineItem, { itemLogicalWidth, itemLogicalHeight });
     229
    230230        if (breakingContext.isAtBreakingOpportunity)
    231231            commitPendingContent();
     232
     233        if (inlineItem->isHardLineBreak())
     234            return closeLine();
    232235    }
    233236    commitPendingContent();
     
    276279    unsigned currentInlineItemIndex = 0;
    277280    while (currentInlineItemIndex < inlineItems.size()) {
    278         auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, currentInlineItemIndex, inlineItems };
     281        auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
    279282        applyFloatConstraint(lineInput.horizontalConstraint);
    280283        auto lineContent = placeInlineItems(lineInput);
     
    289292LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const
    290293{
    291     // FIXME: Consider running it through layout().
    292294    LayoutUnit maximumLineWidth;
    293     LayoutUnit lineLogicalRight;
    294     LayoutUnit trimmableTrailingWidth;
    295 
    296     LineBreaker lineBreaker;
    297     auto& inlineContent = m_formattingState.inlineItems();
    298     for (auto& inlineItem : inlineContent) {
    299         auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight);
    300         auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight });
    301         if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) {
    302             maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
    303             trimmableTrailingWidth = { };
    304             lineLogicalRight = { };
    305         }
    306         if (TextUtil::isTrimmableContent(*inlineItem)) {
    307             // Skip leading whitespace.
    308             if (!lineLogicalRight)
    309                 continue;
    310             trimmableTrailingWidth += logicalWidth;
    311         } else
    312             trimmableTrailingWidth = { };
    313         lineLogicalRight += logicalWidth;
    314     }
    315     return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
     295    auto& inlineItems = m_formattingState.inlineItems();
     296    unsigned currentInlineItemIndex = 0;
     297    while (currentInlineItemIndex < inlineItems.size()) {
     298        auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
     299        currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1;
     300        LayoutUnit floatsWidth;
     301        for (auto& floatItem : lineContent.floats)
     302            floatsWidth += layoutState().displayBoxForLayoutBox(floatItem->layoutBox()).marginBoxWidth();
     303        maximumLineWidth = std::max(maximumLineWidth, floatsWidth + lineContent.runs->logicalWidth());
     304    }
     305    return maximumLineWidth;
    316306}
    317307
Note: See TracChangeset for help on using the changeset viewer.