Changeset 287824 in webkit
- Timestamp:
- Jan 9, 2022, 10:22:51 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineLine.cpp (modified) (6 diffs)
-
layout/formattingContexts/inline/InlineLine.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r287822 r287824 1 2022-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 1 22 2022-01-09 Antoine Quint <graouts@webkit.org> 2 23 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.cpp
r287819 r287824 536 536 } 537 537 538 std::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 538 549 Line::Run::Run(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit logicalLeft, InlineLayoutUnit logicalWidth) 539 550 : m_type(toLineRunType(inlineItem.type())) … … 571 582 , m_style(style) 572 583 , m_logicalLeft(logicalLeft) 584 , m_bidiLevel(softLineBreakItem.bidiLevel()) 573 585 , m_textContent({ softLineBreakItem.position(), 1 }) 574 , m_bidiLevel(softLineBreakItem.bidiLevel())575 586 { 576 587 } … … 582 593 , m_logicalLeft(logicalLeft) 583 594 , 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() })587 595 , m_bidiLevel(inlineTextItem.bidiLevel()) 588 596 { 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 }; 589 605 } 590 606 … … 597 613 598 614 m_logicalWidth += logicalWidth; 599 m_trailingWhitespaceType = trailingWhitespaceType(inlineTextItem);600 601 if ( m_trailingWhitespaceType == TrailingWhitespace::None) {602 m_trailingWhitespace Width= { };615 auto whitespaceType = trailingWhitespaceType(inlineTextItem); 616 617 if (!whitespaceType) { 618 m_trailingWhitespace = { }; 603 619 m_textContent->length += inlineTextItem.length(); 604 620 return; 605 621 } 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(); 608 625 } 609 626 … … 629 646 void Line::Run::removeTrailingWhitespace() 630 647 { 648 ASSERT(m_trailingWhitespace); 631 649 // According to https://www.w3.org/TR/css-text-3/#white-space-property matrix 632 650 // Trimmable whitespace is always collapsible so the length of the trailing trimmable whitespace is always 1 (or non-existent). … … 634 652 constexpr size_t trailingTrimmableContentLength = 1; 635 653 m_textContent->length -= trailingTrimmableContentLength; 636 shrinkHorizontally(m_trailingWhitespaceWidth); 637 m_trailingWhitespaceWidth = { }; 638 m_trailingWhitespaceType = TrailingWhitespace::None; 654 shrinkHorizontally(m_trailingWhitespace->width); 655 m_trailingWhitespace = { }; 639 656 } 640 657 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.h
r287819 r287824 107 107 const InlineDisplay::Box::Expansion& expansion() const { return m_expansion; } 108 108 109 bool hasTrailingWhitespace() const { return m_trailingWhitespace Type != TrailingWhitespace::None; }110 InlineLayoutUnit trailingWhitespaceWidth() const { return m_trailingWhitespace Width; }109 bool hasTrailingWhitespace() const { return m_trailingWhitespace.has_value(); } 110 InlineLayoutUnit trailingWhitespaceWidth() const { return m_trailingWhitespace ? m_trailingWhitespace->width : 0.f; } 111 111 112 112 bool shouldTrailingWhitespaceHang() const; … … 132 132 void setNeedsHyphen(InlineLayoutUnit hyphenLogicalWidth); 133 133 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 }; 139 142 }; 140 bool hasCollapsibleTrailingWhitespace() const { return m_trailingWhitespace Type == TrailingWhitespace::Collapsible || hasCollapsedTrailingWhitespace(); }141 bool hasCollapsedTrailingWhitespace() const { return m_trailingWhitespace Type == 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&); 143 146 void removeTrailingWhitespace(); 144 147 … … 152 155 InlineLayoutUnit m_logicalLeft { 0 }; 153 156 InlineLayoutUnit m_logicalWidth { 0 }; 154 TrailingWhitespace m_trailingWhitespaceType { TrailingWhitespace::None };155 InlineLayoutUnit m_trailingWhitespaceWidth { 0 };156 std::optional<Text> m_textContent;157 157 InlineDisplay::Box::Expansion m_expansion; 158 158 UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR }; 159 std::optional<TrailingWhitespace> m_trailingWhitespace { }; 160 std::optional<Text> m_textContent; 159 161 }; 160 162 using RunList = Vector<Run, 10>; … … 252 254 } 253 255 254 inline Line::Run::TrailingWhitespace Line::Run::trailingWhitespaceType(const InlineTextItem& inlineTextItem) const255 {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 265 256 inline void Line::Run::setNeedsHyphen(InlineLayoutUnit hyphenLogicalWidth) 266 257 {
Note:
See TracChangeset
for help on using the changeset viewer.