Changeset 246066 in webkit


Ignore:
Timestamp:
Jun 4, 2019 8:49:56 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Add hard line break handling to LineBreaker
https://bugs.webkit.org/show_bug.cgi?id=198503
<rdar://problem/51373482>

Reviewed by Antti Koivisto.

LineBreaker should simply return BreakingContext::Keep with the breaking opportunity of yes.

  • layout/inlineformatting/InlineFormattingContextLineLayout.cpp:

(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):

  • layout/inlineformatting/InlineLineBreaker.cpp:

(WebCore::Layout::LineBreaker::breakingContext):
(WebCore::Layout::LineBreaker::wordBreakingBehavior const):
(WebCore::Layout::LineBreaker::isAtBreakingOpportunity):

  • layout/inlineformatting/InlineLineBreaker.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246065 r246066  
     12019-06-04  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Add hard line break handling to LineBreaker
     4        https://bugs.webkit.org/show_bug.cgi?id=198503
     5        <rdar://problem/51373482>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        LineBreaker should simply return BreakingContext::Keep with the breaking opportunity of yes.
     10
     11        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
     12        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
     13        * layout/inlineformatting/InlineLineBreaker.cpp:
     14        (WebCore::Layout::LineBreaker::breakingContext):
     15        (WebCore::Layout::LineBreaker::wordBreakingBehavior const):
     16        (WebCore::Layout::LineBreaker::isAtBreakingOpportunity):
     17        * layout/inlineformatting/InlineLineBreaker.h:
     18
    1192019-06-04  Zalan Bujtas  <zalan@apple.com>
    220
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp

    r246065 r246066  
    215215        auto inlineItemWidth = WebCore::Layout::inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
    216216
     217        // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
     218        auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
     219        if (breakingContext.isAtBreakingOpportunity)
     220            commitPendingContent();
     221
     222        // Content does not fit the current line.
     223        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)
     224            return closeLine();
     225
     226        // Partial content stays on the current line.
     227        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Split) {
     228            ASSERT(inlineItem->isText());
     229
     230            ASSERT_NOT_IMPLEMENTED_YET();
     231            return closeLine();
     232        }
     233
     234        ASSERT(breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Keep);
     235        if (inlineItem->isFloat()) {
     236            handleFloat(*line, floatingContext, *inlineItem);
     237            ++committedInlineItemCount;
     238            continue;
     239        }
    217240        if (inlineItem->isHardLineBreak()) {
    218241            uncommittedContent.add(*inlineItem, inlineItemWidth);
    219242            commitPendingContent();
    220243            return closeLine();
    221         }
    222         // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
    223         auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
    224         if (breakingContext.isAtBreakingOpportunity)
    225             commitPendingContent();
    226 
    227         // Content does not fit the current line.
    228         if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)
    229             return closeLine();
    230 
    231         // Partial content stays on the current line.
    232         if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Break) {
    233             ASSERT(inlineItem->isText());
    234 
    235             ASSERT_NOT_IMPLEMENTED_YET();
    236             return closeLine();
    237         }
    238 
    239         if (inlineItem->isFloat()) {
    240             handleFloat(*line, floatingContext, *inlineItem);
    241             ++committedInlineItemCount;
    242             continue;
    243244        }
    244245
  • trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp

    r246063 r246066  
    4141        return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
    4242
     43    if (inlineItem.isHardLineBreak())
     44        return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
     45
    4346    if (is<InlineTextItem>(inlineItem))
    4447        return { wordBreakingBehavior(downcast<InlineTextItem>(inlineItem), lineContext.isEmpty), isAtBreakingOpportunity(inlineItem) };
     
    6366
    6467    if (inlineItem.isWhitespace())
    65         return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior::Break;
     68        return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior::Split;
    6669
    6770    auto shouldHypenate = !m_hyphenationIsDisabled && style.hyphens() == Hyphens::Auto && canHyphenate(style.locale());
    6871    if (shouldHypenate)
    69         return BreakingBehavior::Break;
     72        return BreakingBehavior::Split;
    7073
    7174    if (style.autoWrap()) {
    7275        // Break any word
    7376        if (style.wordBreak() == WordBreak::BreakAll)
    74             return BreakingBehavior::Break;
     77            return BreakingBehavior::Split;
    7578
    7679        // Break first run on line.
    7780        if (lineIsEmpty && style.breakWords() && style.preserveNewline())
    78             return BreakingBehavior::Break;
     81            return BreakingBehavior::Split;
    7982    }
    8083
     
    8588bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem)
    8689{
     90    if (inlineItem.isHardLineBreak())
     91        return true;
     92
    8793    if (is<InlineTextItem>(inlineItem))
    8894        return downcast<InlineTextItem>(inlineItem).isWhitespace();
  • trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h

    r246063 r246066  
    3535class LineBreaker {
    3636public:
    37     enum class BreakingBehavior { Keep, Break, Wrap };
     37    enum class BreakingBehavior { Keep, Split, Wrap };
    3838    struct BreakingContext {
    3939        BreakingBehavior breakingBehavior;
Note: See TracChangeset for help on using the changeset viewer.