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

Changeset 287824 in webkit


Ignore:
Timestamp:
Jan 9, 2022, 10:22:51 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Introduce a dedicated structure for Line::Run's trailing whitespace information
https://bugs.webkit.org/show_bug.cgi?id=235010

Reviewed by Antti Koivisto.

  • layout/formattingContexts/inline/InlineLine.cpp:

(WebCore::Layout::Line::Run::trailingWhitespaceType):
(WebCore::Layout::Line::Run::Run):
(WebCore::Layout::Line::Run::expand):
(WebCore::Layout::Line::Run::removeTrailingWhitespace):
(WebCore::Layout::m_bidiLevel): Deleted.
(WebCore::Layout::m_textContent): Deleted.

  • layout/formattingContexts/inline/InlineLine.h:

(WebCore::Layout::Line::Run::hasTrailingWhitespace const):
(WebCore::Layout::Line::Run::trailingWhitespaceWidth const):
(WebCore::Layout::Line::Run::hasCollapsibleTrailingWhitespace const):
(WebCore::Layout::Line::Run::hasCollapsedTrailingWhitespace const):
(WebCore::Layout::Line::Run::trailingWhitespaceType const): Deleted.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r287822 r287824  
     12022-01-09  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Introduce a dedicated structure for Line::Run's trailing whitespace information
     4        https://bugs.webkit.org/show_bug.cgi?id=235010
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * layout/formattingContexts/inline/InlineLine.cpp:
     9        (WebCore::Layout::Line::Run::trailingWhitespaceType):
     10        (WebCore::Layout::Line::Run::Run):
     11        (WebCore::Layout::Line::Run::expand):
     12        (WebCore::Layout::Line::Run::removeTrailingWhitespace):
     13        (WebCore::Layout::m_bidiLevel): Deleted.
     14        (WebCore::Layout::m_textContent): Deleted.
     15        * layout/formattingContexts/inline/InlineLine.h:
     16        (WebCore::Layout::Line::Run::hasTrailingWhitespace const):
     17        (WebCore::Layout::Line::Run::trailingWhitespaceWidth const):
     18        (WebCore::Layout::Line::Run::hasCollapsibleTrailingWhitespace const):
     19        (WebCore::Layout::Line::Run::hasCollapsedTrailingWhitespace const):
     20        (WebCore::Layout::Line::Run::trailingWhitespaceType const): Deleted.
     21
    1222022-01-09  Antoine Quint  <graouts@webkit.org>
    223
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.cpp

    r287819 r287824  
    536536}
    537537
     538std::optional<Line::Run::TrailingWhitespace::Type> Line::Run::trailingWhitespaceType(const InlineTextItem& inlineTextItem)
     539{
     540    if (!inlineTextItem.isWhitespace())
     541        return { };
     542    if (InlineTextItem::shouldPreserveSpacesAndTabs(inlineTextItem))
     543        return { TrailingWhitespace::Type::NotCollapsible };
     544    if (inlineTextItem.length() == 1)
     545        return { TrailingWhitespace::Type::Collapsible };
     546    return { TrailingWhitespace::Type::Collapsed };
     547}
     548
    538549Line::Run::Run(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth)
    539550    : m_type(toLineRunType(inlineItem.type()))
     
    571582    , m_style(style)
    572583    , m_logicalLeft(logicalLeft)
     584    , m_bidiLevel(softLineBreakItem.bidiLevel())
    573585    , m_textContent({ softLineBreakItem.position(), 1 })
    574     , m_bidiLevel(softLineBreakItem.bidiLevel())
    575586{
    576587}
     
    582593    , m_logicalLeft(logicalLeft)
    583594    , m_logicalWidth(logicalWidth)
    584     , m_trailingWhitespaceType(trailingWhitespaceType(inlineTextItem))
    585     , m_trailingWhitespaceWidth(m_trailingWhitespaceType != TrailingWhitespace::None ? logicalWidth : InlineLayoutUnit { })
    586     , m_textContent({ inlineTextItem.start(), m_trailingWhitespaceType == TrailingWhitespace::Collapsed ? 1 : inlineTextItem.length() })
    587595    , m_bidiLevel(inlineTextItem.bidiLevel())
    588596{
     597    auto length = inlineTextItem.length();
     598    auto whitespaceType = trailingWhitespaceType(inlineTextItem);
     599    if (whitespaceType) {
     600        m_trailingWhitespace = { *whitespaceType, logicalWidth };
     601        if (*whitespaceType == TrailingWhitespace::Type::Collapsed)
     602            length =  1;
     603    }
     604    m_textContent = { inlineTextItem.start(), length };
    589605}
    590606
     
    597613
    598614    m_logicalWidth += logicalWidth;
    599     m_trailingWhitespaceType = trailingWhitespaceType(inlineTextItem);
    600 
    601     if (m_trailingWhitespaceType == TrailingWhitespace::None) {
    602         m_trailingWhitespaceWidth = { };
     615    auto whitespaceType = trailingWhitespaceType(inlineTextItem);
     616
     617    if (!whitespaceType) {
     618        m_trailingWhitespace = { };
    603619        m_textContent->length += inlineTextItem.length();
    604620        return;
    605621    }
    606     m_trailingWhitespaceWidth += logicalWidth;
    607     m_textContent->length += m_trailingWhitespaceType == TrailingWhitespace::Collapsed ? 1 : inlineTextItem.length();
     622    auto whitespaceWidth = !m_trailingWhitespace ? logicalWidth : m_trailingWhitespace->width + logicalWidth;
     623    m_trailingWhitespace = TrailingWhitespace { *whitespaceType, whitespaceWidth };
     624    m_textContent->length += *whitespaceType == TrailingWhitespace::Type::Collapsed ? 1 : inlineTextItem.length();
    608625}
    609626
     
    629646void Line::Run::removeTrailingWhitespace()
    630647{
     648    ASSERT(m_trailingWhitespace);
    631649    // According to https://www.w3.org/TR/css-text-3/#white-space-property matrix
    632650    // Trimmable whitespace is always collapsible so the length of the trailing trimmable whitespace is always 1 (or non-existent).
     
    634652    constexpr size_t trailingTrimmableContentLength = 1;
    635653    m_textContent->length -= trailingTrimmableContentLength;
    636     shrinkHorizontally(m_trailingWhitespaceWidth);
    637     m_trailingWhitespaceWidth = { };
    638     m_trailingWhitespaceType = TrailingWhitespace::None;
     654    shrinkHorizontally(m_trailingWhitespace->width);
     655    m_trailingWhitespace = { };
    639656}
    640657
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.h

    r287819 r287824  
    107107        const InlineDisplay::Box::Expansion& expansion() const { return m_expansion; }
    108108
    109         bool hasTrailingWhitespace() const { return m_trailingWhitespaceType != TrailingWhitespace::None; }
    110         InlineLayoutUnit trailingWhitespaceWidth() const { return m_trailingWhitespaceWidth; }
     109        bool hasTrailingWhitespace() const { return m_trailingWhitespace.has_value(); }
     110        InlineLayoutUnit trailingWhitespaceWidth() const { return m_trailingWhitespace ? m_trailingWhitespace->width : 0.f; }
    111111
    112112        bool shouldTrailingWhitespaceHang() const;
     
    132132        void setNeedsHyphen(InlineLayoutUnit hyphenLogicalWidth);
    133133
    134         enum class TrailingWhitespace {
    135             None,
    136             NotCollapsible,
    137             Collapsible,
    138             Collapsed
     134        struct TrailingWhitespace {
     135            enum class Type {
     136                NotCollapsible,
     137                Collapsible,
     138                Collapsed
     139            };
     140            Type type { Type::NotCollapsible };
     141            InlineLayoutUnit width { 0 };
    139142        };
    140         bool hasCollapsibleTrailingWhitespace() const { return m_trailingWhitespaceType == TrailingWhitespace::Collapsible || hasCollapsedTrailingWhitespace(); }
    141         bool hasCollapsedTrailingWhitespace() const { return m_trailingWhitespaceType == TrailingWhitespace::Collapsed; }
    142         TrailingWhitespace trailingWhitespaceType(const InlineTextItem&) const;
     143        bool hasCollapsibleTrailingWhitespace() const { return m_trailingWhitespace && (m_trailingWhitespace->type == TrailingWhitespace::Type::Collapsible || hasCollapsedTrailingWhitespace()); }
     144        bool hasCollapsedTrailingWhitespace() const { return m_trailingWhitespace && m_trailingWhitespace->type == TrailingWhitespace::Type::Collapsed; }
     145        static std::optional<TrailingWhitespace::Type> trailingWhitespaceType(const InlineTextItem&);
    143146        void removeTrailingWhitespace();
    144147
     
    152155        InlineLayoutUnit m_logicalLeft { 0 };
    153156        InlineLayoutUnit m_logicalWidth { 0 };
    154         TrailingWhitespace m_trailingWhitespaceType { TrailingWhitespace::None };
    155         InlineLayoutUnit m_trailingWhitespaceWidth { 0 };
    156         std::optional<Text> m_textContent;
    157157        InlineDisplay::Box::Expansion m_expansion;
    158158        UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR };
     159        std::optional<TrailingWhitespace> m_trailingWhitespace { };
     160        std::optional<Text> m_textContent;
    159161    };
    160162    using RunList = Vector<Run, 10>;
     
    252254}
    253255
    254 inline Line::Run::TrailingWhitespace Line::Run::trailingWhitespaceType(const InlineTextItem& inlineTextItem) const
    255 {
    256     if (!inlineTextItem.isWhitespace())
    257         return TrailingWhitespace::None;
    258     if (InlineTextItem::shouldPreserveSpacesAndTabs(inlineTextItem))
    259         return TrailingWhitespace::NotCollapsible;
    260     if (inlineTextItem.length() == 1)
    261         return TrailingWhitespace::Collapsible;
    262     return TrailingWhitespace::Collapsed;
    263 }
    264 
    265256inline void Line::Run::setNeedsHyphen(InlineLayoutUnit hyphenLogicalWidth)
    266257{
Note: See TracChangeset for help on using the changeset viewer.