Changeset 267494 in webkit
- Timestamp:
- Sep 23, 2020, 12:34:44 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
layout/inlineformatting/InlineLineBreaker.cpp (modified) (8 diffs)
-
layout/inlineformatting/InlineLineBreaker.h (modified) (2 diffs)
-
layout/inlineformatting/InlineLineBuilder.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r267491 r267494 1 2020-09-23 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Precompute the collapsible trailing width for LineBreaker 4 https://bugs.webkit.org/show_bug.cgi?id=216881 5 6 Reviewed by Antti Koivisto. 7 8 Let's just compute the collapsible trailing width while adding inline content to LineCandidate instead of 9 reverse looping through the runs in LineBreaker. 10 This is also in preparation for reducing the number of RuntimeEnabledFeatures::layoutFormattingContextIntegrationEnabled calls. 11 12 * layout/inlineformatting/InlineLineBreaker.cpp: 13 (WebCore::Layout::ContinuousContent::hasTrailingCollapsibleContent const): 14 (WebCore::Layout::ContinuousContent::isFullyCollapsible const): 15 (WebCore::Layout::LineBreaker::shouldKeepEndOfLineWhitespace const): 16 (WebCore::Layout::LineBreaker::shouldWrapInlineContent): 17 (WebCore::Layout::LineBreaker::tryWrappingInlineContent const): 18 (WebCore::Layout::ContinuousContent::ContinuousContent): 19 (WebCore::Layout::ContinuousContent::nonCollapsibleLogicalWidth const): 20 (WebCore::Layout::ContinuousContent::isTrailingContentFullyCollapsible const): Deleted. 21 (WebCore::Layout::ContinuousContent::TrailingCollapsibleContent::reset): Deleted. 22 * layout/inlineformatting/InlineLineBreaker.h: 23 * layout/inlineformatting/InlineLineBuilder.cpp: 24 (WebCore::Layout::LineCandidate::InlineContent::collapsibleTrailingWidth const): 25 (WebCore::Layout::LineCandidate::InlineContent::appendInlineItem): 26 (WebCore::Layout::LineCandidate::InlineContent::reset): 27 (WebCore::Layout::LineBuilder::handleFloatsAndInlineContent): 28 1 29 2020-09-23 Peng Liu <peng.liu6@apple.com> 2 30 -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp
r267404 r267494 33 33 #include "InlineItem.h" 34 34 #include "InlineTextItem.h" 35 #include "RuntimeEnabledFeatures.h"36 35 #include "TextUtil.h" 37 36 … … 73 72 InlineLayoutUnit logicalWidth() const { return m_candidateContent.logicalWidth; } 74 73 InlineLayoutUnit logicalLeft() const { return m_candidateContent.logicalLeft; } 75 InlineLayoutUnit nonCollapsibleLogicalWidth() const { return logicalWidth() - m_trailingCollapsibleContent.width; }76 77 bool hasTrailingCollapsibleContent() const { return !!m_ trailingCollapsibleContent.width; }78 bool is TrailingContentFullyCollapsible() const { return m_trailingCollapsibleContent.isFullyCollapsible; }74 InlineLayoutUnit nonCollapsibleLogicalWidth() const; 75 76 bool hasTrailingCollapsibleContent() const { return !!m_candidateContent.collapsibleTrailingWidth; } 77 bool isFullyCollapsible() const { return !nonCollapsibleLogicalWidth(); } 79 78 80 79 Optional<size_t> firstTextRunIndex() const; … … 83 82 private: 84 83 const LineBreaker::CandidateContent& m_candidateContent; 85 struct TrailingCollapsibleContent {86 void reset();87 88 bool isFullyCollapsible { false };89 InlineLayoutUnit width { 0 };90 };91 TrailingCollapsibleContent m_trailingCollapsibleContent;92 84 }; 93 85 … … 108 100 bool LineBreaker::shouldKeepEndOfLineWhitespace(const ContinuousContent& continuousContent) const 109 101 { 110 // Grab the style and check for white-space property to decide dwhether we should let this whitespace content overflow the current line.111 // Note that the "keep" in th econtext means we let the whitespace content sit on the current line.102 // Grab the style and check for white-space property to decide whether we should let this whitespace content overflow the current line. 103 // Note that the "keep" in this context means we let the whitespace content sit on the current line. 112 104 // It might very well get collapsed when we close the line (normal/nowrap/pre-line). 113 105 // See https://www.w3.org/TR/css-text-3/#white-space-property … … 122 114 return Result { Result::Action::Keep }; 123 115 #if USE_FLOAT_AS_INLINE_LAYOUT_UNIT 124 // Preferred width computation sums up floats while line breaker sub stracts them. This can lead to epsilon-scale differences.116 // Preferred width computation sums up floats while line breaker subtracts them. This can lead to epsilon-scale differences. 125 117 if (WTF::areEssentiallyEqual(candidateContent.logicalWidth, lineStatus.availableWidth)) 126 118 return Result { Result::Action::Keep }; … … 163 155 return { Result::Action::Keep, IsEndOfLine }; 164 156 // Now check if we can trim the line too. 165 if (lineStatus.lineHasFullyCollapsibleTrailingRun && continuousContent.is TrailingContentFullyCollapsible()) {157 if (lineStatus.lineHasFullyCollapsibleTrailingRun && continuousContent.isFullyCollapsible()) { 166 158 // If this new content is fully collapsible, it should surely fit. 167 159 return { Result::Action::Keep, IsEndOfLine }; … … 356 348 : m_candidateContent(candidateContent) 357 349 { 358 // Figure out the trailing collapsible state. 359 for (auto& run : WTF::makeReversedRange(runs())) { 360 auto& inlineItem = run.inlineItem; 361 if (inlineItem.isBox()) { 362 // We did reach a non-collapsible content. We have all the trailing whitespace now. 363 break; 364 } 365 if (inlineItem.isText()) { 366 auto& inlineTextItem = downcast<InlineTextItem>(inlineItem); 367 auto isFullyCollapsible = [&] { 368 return inlineTextItem.isWhitespace() && !TextUtil::shouldPreserveTrailingWhitespace(inlineTextItem.style()); 369 }; 370 if (isFullyCollapsible()) { 371 m_trailingCollapsibleContent.width += run.logicalWidth; 372 m_trailingCollapsibleContent.isFullyCollapsible = true; 373 // Let's see if we've got more trailing whitespace content. 374 continue; 375 } 376 if (!RuntimeEnabledFeatures::sharedFeatures().layoutFormattingContextIntegrationEnabled()) { 377 // A run with trailing letter spacing is partially collapsible. 378 if (auto collapsibleWidth = inlineTextItem.style().letterSpacing()) { 379 m_trailingCollapsibleContent.width += collapsibleWidth; 380 m_trailingCollapsibleContent.isFullyCollapsible = false; 381 } 382 } 383 // End of whitespace content. 384 break; 385 } 386 } 350 } 351 352 InlineLayoutUnit ContinuousContent::nonCollapsibleLogicalWidth() const 353 { 354 ASSERT(logicalWidth() >= m_candidateContent.collapsibleTrailingWidth); 355 return logicalWidth() - m_candidateContent.collapsibleTrailingWidth; 387 356 } 388 357 … … 447 416 } 448 417 449 void ContinuousContent::TrailingCollapsibleContent::reset()450 {451 isFullyCollapsible = false;452 width = 0_lu;453 }454 455 418 } 456 419 } -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h
r267404 r267494 77 77 using RunList = Vector<Run, 3>; 78 78 79 // This struct represents the amount of content committed to line breaking at a time e.g. 80 // <div>text content <span>span1</span>between<span>span2</span></div> 81 // [text][ ][content][ ][container start][span1][container end][between][container start][span2][container end] 82 // candidate content at a time: 83 // 1. [text] 84 // 2. [ ] 85 // 3. [content] 86 // 4. [ ] 87 // 5. [container start][span1][container end][between][container start][span2][container end] 88 // see https://drafts.csswg.org/css-text-3/#line-break-details 79 89 struct CandidateContent { 80 90 const RunList& runs; 81 91 InlineLayoutUnit logicalLeft { 0 }; 82 92 InlineLayoutUnit logicalWidth { 0 }; 93 InlineLayoutUnit collapsibleTrailingWidth { 0 }; 83 94 }; 84 95 struct LineStatus { … … 93 104 94 105 private: 95 // This struct represents the amount of content committed to line breaking at a time e.g.96 // text content <span>span1</span>between<span>span2</span>97 // [text][ ][content][ ][container start][span1][container end][between][container start][span2][container end]98 // -> content chunks ->99 // [text]100 // [ ]101 // [content]102 // [container start][span1][container end][between][container start][span2][container end]103 // see https://drafts.csswg.org/css-text-3/#line-break-details104 106 Optional<WrappedTextContent> wrapTextContent(const ContinuousContent&, const LineStatus&) const; 105 107 Result tryWrappingInlineContent(const CandidateContent&, const LineStatus&) const; -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
r267461 r267494 183 183 const LineBreaker::RunList& runs() const { return m_inlineRuns; } 184 184 InlineLayoutUnit logicalWidth() const { return m_LogicalWidth; } 185 InlineLayoutUnit collapsibleTrailingWidth() const { return m_collapsibleTrailingWidth; } 185 186 const InlineItem* trailingLineBreak() const { return m_trailingLineBreak; } 186 187 … … 193 194 194 195 InlineLayoutUnit m_LogicalWidth { 0 }; 196 InlineLayoutUnit m_collapsibleTrailingWidth { 0 }; 195 197 LineBreaker::RunList m_inlineRuns; 196 198 const InlineItem* m_trailingLineBreak { nullptr }; … … 224 226 m_LogicalWidth += logicalWidth; 225 227 m_inlineRuns.append({ inlineItem, logicalWidth }); 228 229 auto isFullyCollapsible = [&] { 230 if (inlineItem.isBox()) 231 return false; 232 if (inlineItem.isText()) { 233 auto& inlineTextItem = downcast<InlineTextItem>(inlineItem); 234 return inlineTextItem.isWhitespace() && !TextUtil::shouldPreserveTrailingWhitespace(inlineTextItem.style()); 235 } 236 return true; 237 }; 238 if (isFullyCollapsible()) { 239 m_collapsibleTrailingWidth += logicalWidth; 240 return; 241 } 242 243 auto partiallyCollapsibleTrailingWidth = [&]() -> InlineLayoutUnit { 244 if (RuntimeEnabledFeatures::sharedFeatures().layoutFormattingContextIntegrationEnabled()) 245 return { }; 246 if (!inlineItem.isText()) 247 return { }; 248 if (auto letterSpacing = inlineItem.style().letterSpacing(); letterSpacing > 0) 249 return letterSpacing; 250 return { }; 251 }; 252 if (auto collapsibleTrailingWidth = partiallyCollapsibleTrailingWidth()) { 253 m_collapsibleTrailingWidth = collapsibleTrailingWidth; 254 return; 255 } 256 m_collapsibleTrailingWidth = { }; 226 257 } 227 258 … … 229 260 { 230 261 m_LogicalWidth = { }; 262 m_collapsibleTrailingWidth = { }; 231 263 m_inlineRuns.clear(); 232 264 m_trailingLineBreak = { }; … … 554 586 auto isLineConsideredEmpty = m_line.isVisuallyEmpty() && !m_contentIsConstrainedByFloat; 555 587 auto lineStatus = LineBreaker::LineStatus { availableWidth, m_line.trimmableTrailingWidth(), m_line.isTrailingRunFullyTrimmable(), isLineConsideredEmpty }; 556 auto c andidateInlineContentLogicalLeft = m_line.contentLogicalWidth();557 auto result = lineBreaker.shouldWrapInlineContent({ candidateRuns, c andidateInlineContentLogicalLeft, candidateInlineContent.logicalWidth() }, lineStatus);588 auto contentLogicalLeft = m_line.contentLogicalWidth(); 589 auto result = lineBreaker.shouldWrapInlineContent({ candidateRuns, contentLogicalLeft, candidateInlineContent.logicalWidth(), candidateInlineContent.collapsibleTrailingWidth() }, lineStatus); 558 590 if (result.lastWrapOpportunityItem) 559 591 m_lastWrapOpportunityItem = result.lastWrapOpportunityItem;
Note:
See TracChangeset
for help on using the changeset viewer.