Changeset 246066 in webkit
- Timestamp:
- Jun 4, 2019 8:49:56 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r246065 r246066 1 2019-06-04 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Add hard line break handling to LineBreaker 4 https://bugs.webkit.org/show_bug.cgi?id=198503 5 <rdar://problem/51373482> 6 7 Reviewed by Antti Koivisto. 8 9 LineBreaker should simply return BreakingContext::Keep with the breaking opportunity of yes. 10 11 * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: 12 (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): 13 * layout/inlineformatting/InlineLineBreaker.cpp: 14 (WebCore::Layout::LineBreaker::breakingContext): 15 (WebCore::Layout::LineBreaker::wordBreakingBehavior const): 16 (WebCore::Layout::LineBreaker::isAtBreakingOpportunity): 17 * layout/inlineformatting/InlineLineBreaker.h: 18 1 19 2019-06-04 Zalan Bujtas <zalan@apple.com> 2 20 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r246065 r246066 215 215 auto inlineItemWidth = WebCore::Layout::inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight); 216 216 217 // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed. 218 auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() }); 219 if (breakingContext.isAtBreakingOpportunity) 220 commitPendingContent(); 221 222 // Content does not fit the current line. 223 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) 224 return closeLine(); 225 226 // Partial content stays on the current line. 227 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Split) { 228 ASSERT(inlineItem->isText()); 229 230 ASSERT_NOT_IMPLEMENTED_YET(); 231 return closeLine(); 232 } 233 234 ASSERT(breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Keep); 235 if (inlineItem->isFloat()) { 236 handleFloat(*line, floatingContext, *inlineItem); 237 ++committedInlineItemCount; 238 continue; 239 } 217 240 if (inlineItem->isHardLineBreak()) { 218 241 uncommittedContent.add(*inlineItem, inlineItemWidth); 219 242 commitPendingContent(); 220 243 return closeLine(); 221 }222 // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.223 auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });224 if (breakingContext.isAtBreakingOpportunity)225 commitPendingContent();226 227 // Content does not fit the current line.228 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)229 return closeLine();230 231 // Partial content stays on the current line.232 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Break) {233 ASSERT(inlineItem->isText());234 235 ASSERT_NOT_IMPLEMENTED_YET();236 return closeLine();237 }238 239 if (inlineItem->isFloat()) {240 handleFloat(*line, floatingContext, *inlineItem);241 ++committedInlineItemCount;242 continue;243 244 } 244 245 -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp
r246063 r246066 41 41 return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) }; 42 42 43 if (inlineItem.isHardLineBreak()) 44 return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) }; 45 43 46 if (is<InlineTextItem>(inlineItem)) 44 47 return { wordBreakingBehavior(downcast<InlineTextItem>(inlineItem), lineContext.isEmpty), isAtBreakingOpportunity(inlineItem) }; … … 63 66 64 67 if (inlineItem.isWhitespace()) 65 return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior:: Break;68 return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior::Split; 66 69 67 70 auto shouldHypenate = !m_hyphenationIsDisabled && style.hyphens() == Hyphens::Auto && canHyphenate(style.locale()); 68 71 if (shouldHypenate) 69 return BreakingBehavior:: Break;72 return BreakingBehavior::Split; 70 73 71 74 if (style.autoWrap()) { 72 75 // Break any word 73 76 if (style.wordBreak() == WordBreak::BreakAll) 74 return BreakingBehavior:: Break;77 return BreakingBehavior::Split; 75 78 76 79 // Break first run on line. 77 80 if (lineIsEmpty && style.breakWords() && style.preserveNewline()) 78 return BreakingBehavior:: Break;81 return BreakingBehavior::Split; 79 82 } 80 83 … … 85 88 bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem) 86 89 { 90 if (inlineItem.isHardLineBreak()) 91 return true; 92 87 93 if (is<InlineTextItem>(inlineItem)) 88 94 return downcast<InlineTextItem>(inlineItem).isWhitespace(); -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h
r246063 r246066 35 35 class LineBreaker { 36 36 public: 37 enum class BreakingBehavior { Keep, Break, Wrap };37 enum class BreakingBehavior { Keep, Split, Wrap }; 38 38 struct BreakingContext { 39 39 BreakingBehavior breakingBehavior;
Note: See TracChangeset
for help on using the changeset viewer.