Changeset 283485 in webkit
- Timestamp:
- Oct 3, 2021, 6:07:25 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineLine.cpp (modified) (5 diffs)
-
layout/formattingContexts/inline/InlineLine.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r283484 r283485 1 2021-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 1 25 2021-10-03 Sam Weinig <weinig@apple.com> 2 26 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.cpp
r283477 r283485 44 44 : m_inlineFormattingContext(inlineFormattingContext) 45 45 , m_trimmableTrailingContent(m_runs) 46 , m_hangingTrailingContent(m_runs)47 46 { 48 47 } … … 57 56 m_contentLogicalWidth = { }; 58 57 m_runs.clear(); 58 resetTrailingContent(); 59 } 60 61 void Line::resetTrailingContent() 62 { 63 m_trimmableTrailingContent.reset(); 64 m_hangingTrailingContent.reset(); 59 65 m_trailingSoftHyphenWidth = { }; 60 m_trimmableTrailingContent.reset();61 66 } 62 67 … … 198 203 break; 199 204 } 205 // FIXME: Add support for incremental reset, where the hanging whitespace partially overflows. 206 m_hangingTrailingContent.reset(); 200 207 m_contentLogicalWidth -= trimmedContentWidth; 201 208 } … … 304 311 m_contentLogicalWidth += std::max(0.0f, logicalWidth); 305 312 } 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 } 316 333 } 317 334 318 335 void Line::appendNonReplacedInlineLevelBox(const InlineItem& inlineItem, const RenderStyle& style, InlineLayoutUnit marginBoxLogicalWidth) 319 336 { 320 m_trimmableTrailingContent.reset(); 321 m_trailingSoftHyphenWidth = { }; 337 resetTrailingContent(); 322 338 m_contentLogicalWidth += marginBoxLogicalWidth; 323 339 ++m_nonSpanningInlineLevelBoxCount; … … 444 460 } 445 461 446 Line::HangingTrailingContent::HangingTrailingContent(const RunList& runs) 447 : m_runs(runs) 448 { 449 } 450 451 InlineLayoutUnit Line::HangingTrailingContent::width() const 462 void Line::HangingTrailingContent::add(const InlineTextItem& trailingWhitespace, InlineLayoutUnit logicalWidth) 452 463 { 453 464 // 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. 454 465 // Depending on the line’s alignment/justification, this can result in the mark being placed outside the line box. 455 466 // 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(); 467 470 } 468 471 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLine.h
r283477 r283485 157 157 void visuallyCollapseHangingOverflow(InlineLayoutUnit horizontalAvailableSpace); 158 158 159 void resetTrailingContent(); 160 159 161 const InlineFormattingContext& formattingContext() const; 160 162 … … 183 185 184 186 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; } 188 192 189 193 private: 190 const RunList& m_runs; 194 size_t m_length { 0 }; 195 InlineLayoutUnit m_width { 0 }; 191 196 }; 192 197 … … 208 213 } 209 214 215 inline void Line::HangingTrailingContent::reset() 216 { 217 m_width = { }; 218 m_length = { }; 219 } 220 210 221 inline Line::Run::TrailingWhitespace Line::Run::trailingWhitespaceType(const InlineTextItem& inlineTextItem) const 211 222 {
Note:
See TracChangeset
for help on using the changeset viewer.