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

Changeset 283485 in webkit


Ignore:
Timestamp:
Oct 3, 2021, 6:07:25 PM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] HangingTrailingContent should cache width/length
https://bugs.webkit.org/show_bug.cgi?id=231128

Reviewed by Antti Koivisto.

Compute the length of the hanging trailing whitespace sequence.
This is in preparation for fixing imported/w3c/web-platform-tests/css/css-text/white-space/textarea-pre-wrap-014.html

  • layout/formattingContexts/inline/InlineLine.cpp:

(WebCore::Layout::Line::Line):
(WebCore::Layout::Line::initialize):
(WebCore::Layout::Line::resetTrailingContent):
(WebCore::Layout::Line::appendTextContent):
(WebCore::Layout::Line::appendNonReplacedInlineLevelBox):
(WebCore::Layout::Line::HangingTrailingContent::add):
(WebCore::Layout::Line::HangingTrailingContent::HangingTrailingContent): Deleted.
(WebCore::Layout::Line::HangingTrailingContent::width const): Deleted.

  • layout/formattingContexts/inline/InlineLine.h:

(WebCore::Layout::Line::HangingTrailingContent::length const):
(WebCore::Layout::Line::HangingTrailingContent::width const):
(WebCore::Layout::Line::HangingTrailingContent::reset):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r283484 r283485  
     12021-10-03  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] HangingTrailingContent should cache width/length
     4        https://bugs.webkit.org/show_bug.cgi?id=231128
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Compute the length of the hanging trailing whitespace sequence.
     9        This is in preparation for fixing imported/w3c/web-platform-tests/css/css-text/white-space/textarea-pre-wrap-014.html
     10
     11        * layout/formattingContexts/inline/InlineLine.cpp:
     12        (WebCore::Layout::Line::Line):
     13        (WebCore::Layout::Line::initialize):
     14        (WebCore::Layout::Line::resetTrailingContent):
     15        (WebCore::Layout::Line::appendTextContent):
     16        (WebCore::Layout::Line::appendNonReplacedInlineLevelBox):
     17        (WebCore::Layout::Line::HangingTrailingContent::add):
     18        (WebCore::Layout::Line::HangingTrailingContent::HangingTrailingContent): Deleted.
     19        (WebCore::Layout::Line::HangingTrailingContent::width const): Deleted.
     20        * layout/formattingContexts/inline/InlineLine.h:
     21        (WebCore::Layout::Line::HangingTrailingContent::length const):
     22        (WebCore::Layout::Line::HangingTrailingContent::width const):
     23        (WebCore::Layout::Line::HangingTrailingContent::reset):
     24
    1252021-10-03  Sam Weinig  <weinig@apple.com>
    226
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.cpp

    r283477 r283485  
    4444    : m_inlineFormattingContext(inlineFormattingContext)
    4545    , m_trimmableTrailingContent(m_runs)
    46     , m_hangingTrailingContent(m_runs)
    4746{
    4847}
     
    5756    m_contentLogicalWidth = { };
    5857    m_runs.clear();
     58    resetTrailingContent();
     59}
     60
     61void Line::resetTrailingContent()
     62{
     63    m_trimmableTrailingContent.reset();
     64    m_hangingTrailingContent.reset();
    5965    m_trailingSoftHyphenWidth = { };
    60     m_trimmableTrailingContent.reset();
    6166}
    6267
     
    198203            break;
    199204    }
     205    // FIXME: Add support for incremental reset, where the hanging whitespace partially overflows.
     206    m_hangingTrailingContent.reset();
    200207    m_contentLogicalWidth -= trimmedContentWidth;
    201208}
     
    304311        m_contentLogicalWidth += std::max(0.0f, logicalWidth);
    305312    }
    306     // Set the trailing trimmable content.
    307     if (inlineTextItem.isWhitespace() && !InlineTextItem::shouldPreserveSpacesAndTabs(inlineTextItem)) {
    308         m_trimmableTrailingContent.addFullyTrimmableContent(m_runs.size() - 1, contentLogicalWidth() - oldContentLogicalWidth);
    309         return;
    310     }
    311     // Any non-whitespace, no-trimmable content resets the existing trimmable.
    312     m_trimmableTrailingContent.reset();
    313     if (!formattingContext().layoutState().shouldIgnoreTrailingLetterSpacing() && !inlineTextItem.isWhitespace() && style.letterSpacing() > 0)
    314         m_trimmableTrailingContent.addPartiallyTrimmableContent(m_runs.size() - 1, style.letterSpacing());
    315     m_trailingSoftHyphenWidth = inlineTextItem.hasTrailingSoftHyphen() ? std::make_optional(style.fontCascade().width(TextRun { StringView { style.hyphenString() } })) : std::nullopt;
     313
     314    // Handle trailing content, specifically whitespace and letter spacing.
     315    auto lastRunIndex = m_runs.size() - 1;
     316    if (inlineTextItem.isWhitespace()) {
     317        if (InlineTextItem::shouldPreserveSpacesAndTabs(inlineTextItem)) {
     318            m_trimmableTrailingContent.reset();
     319            if (m_runs[lastRunIndex].shouldTrailingWhitespaceHang())
     320                m_hangingTrailingContent.add(inlineTextItem, logicalWidth);
     321        } else  {
     322            m_hangingTrailingContent.reset();
     323            m_trimmableTrailingContent.addFullyTrimmableContent(lastRunIndex, contentLogicalWidth() - oldContentLogicalWidth);
     324        }
     325        m_trailingSoftHyphenWidth = { };
     326    } else {
     327        resetTrailingContent();
     328        if (style.letterSpacing() > 0 && !formattingContext().layoutState().shouldIgnoreTrailingLetterSpacing())
     329            m_trimmableTrailingContent.addPartiallyTrimmableContent(lastRunIndex, style.letterSpacing());
     330        if (inlineTextItem.hasTrailingSoftHyphen())
     331            m_trailingSoftHyphenWidth = style.fontCascade().width(TextRun { StringView { style.hyphenString() } });
     332    }
    316333}
    317334
    318335void Line::appendNonReplacedInlineLevelBox(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit marginBoxLogicalWidth)
    319336{
    320     m_trimmableTrailingContent.reset();
    321     m_trailingSoftHyphenWidth = { };
     337    resetTrailingContent();
    322338    m_contentLogicalWidth += marginBoxLogicalWidth;
    323339    ++m_nonSpanningInlineLevelBoxCount;
     
    444460}
    445461
    446 Line::HangingTrailingContent::HangingTrailingContent(const RunList& runs)
    447     : m_runs(runs)
    448 {
    449 }
    450 
    451 InlineLayoutUnit Line::HangingTrailingContent::width() const
     462void Line::HangingTrailingContent::add(const InlineTextItem& trailingWhitespace, InlineLayoutUnit logicalWidth)
    452463{
    453464    // When a glyph at the start or end edge of a line hangs, it is not considered when measuring the line’s contents for fit, alignment, or justification.
    454465    // Depending on the line’s alignment/justification, this can result in the mark being placed outside the line box.
    455466    // https://drafts.csswg.org/css-text-3/#hanging
    456     auto hangingWidth = InlineLayoutUnit { };
    457     for (auto& run : WTF::makeReversedRange(m_runs)) {
    458         if (run.isBox() || run.isLineBreak())
    459             break;
    460         if (run.isInlineBoxStart() || run.isInlineBoxEnd())
    461             continue;
    462         if (!run.hasTrailingWhitespace() || !run.shouldTrailingWhitespaceHang())
    463             break;
    464         hangingWidth += run.trailingWhitespaceWidth();
    465     }
    466     return hangingWidth;
     467    ASSERT(trailingWhitespace.isWhitespace());
     468    m_width += logicalWidth;
     469    m_length += trailingWhitespace.length();
    467470}
    468471
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.h

    r283477 r283485  
    157157    void visuallyCollapseHangingOverflow(InlineLayoutUnit horizontalAvailableSpace);
    158158
     159    void resetTrailingContent();
     160
    159161    const InlineFormattingContext& formattingContext() const;
    160162
     
    183185
    184186    struct HangingTrailingContent {
    185         HangingTrailingContent(const RunList&);
    186 
    187         InlineLayoutUnit width() const;
     187        void add(const InlineTextItem& trailingWhitespace, InlineLayoutUnit logicalWidth);
     188        void reset();
     189
     190        size_t length() const { return m_length; }
     191        InlineLayoutUnit width() const { return m_width; }
    188192
    189193    private:
    190         const RunList& m_runs;
     194        size_t m_length { 0 };
     195        InlineLayoutUnit m_width { 0 };
    191196    };
    192197
     
    208213}
    209214
     215inline void Line::HangingTrailingContent::reset()
     216{
     217    m_width = { };
     218    m_length = { };
     219}
     220
    210221inline Line::Run::TrailingWhitespace Line::Run::trailingWhitespaceType(const InlineTextItem& inlineTextItem) const
    211222{
Note: See TracChangeset for help on using the changeset viewer.