Changeset 245811 in webkit
- Timestamp:
- May 28, 2019, 7:51:16 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
layout/inlineformatting/InlineFormattingContext.cpp (modified) (3 diffs)
-
layout/inlineformatting/InlineFormattingContext.h (modified) (1 diff)
-
layout/inlineformatting/InlineFormattingContextLineLayout.cpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r245810 r245811 1 2019-05-28 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Move intrinsic width computation from InlineFormattingContext to LineLayout 4 https://bugs.webkit.org/show_bug.cgi?id=198258 5 6 Reviewed by Antti Koivisto. 7 8 This is in preparation for sharing even more code between line layout and preferred width computation. 9 10 * layout/inlineformatting/InlineFormattingContext.cpp: 11 (WebCore::Layout::InlineFormattingContext::layout const): 12 (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const): 13 * layout/inlineformatting/InlineFormattingContext.h: 14 * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: 15 (WebCore::Layout::InlineFormattingContext::LineLayout::initializeLine const): 16 (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): 17 (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): 18 (WebCore::Layout::InlineFormattingContext::LineLayout::closeLine const): 19 1 20 2019-05-28 Zalan Bujtas <zalan@apple.com> 2 21 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r245776 r245811 72 72 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")"); 73 73 auto& root = downcast<Container>(this->root()); 74 auto usedValues = UsedHorizontalValues { layoutState().displayBoxForLayoutBox(root).contentBoxWidth() }; 74 auto availableWidth = layoutState().displayBoxForLayoutBox(root).contentBoxWidth(); 75 auto usedValues = UsedHorizontalValues { availableWidth }; 75 76 auto* layoutBox = root.firstInFlowOrFloatingChild(); 76 77 // Compute width/height for non-text content and margin/border/padding for inline containers. … … 94 95 95 96 collectInlineContent(); 96 LineLayout(*this).layout( );97 LineLayout(*this).layout(availableWidth); 97 98 LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root << ")"); 98 99 } … … 140 141 layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum); 141 142 } 142 LayoutUnit maxContentLogicalRight; 143 LayoutUnit lineLogicalRight; 144 145 LineBreaker lineBreaker(layoutState); 146 auto& inlineContent = formattingState().inlineItems(); 147 for (auto& inlineItem : inlineContent) { 148 auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, lineLogicalRight, !lineLogicalRight }); 149 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) 150 lineLogicalRight = 0; 151 lineLogicalRight += inlineItem->width(); 152 153 maxContentLogicalRight = std::max(maxContentLogicalRight, lineLogicalRight); 154 } 155 return maxContentLogicalRight; 143 return LineLayout(*this).computedIntrinsicWidth(availableWidth); 156 144 }; 157 145 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r245776 r245811 54 54 public: 55 55 LineLayout(const InlineFormattingContext&); 56 void layout() const; 56 void layout(LayoutUnit widthConstraint) const; 57 LayoutUnit computedIntrinsicWidth(LayoutUnit widthConstraint) const; 57 58 58 59 private: 59 60 LayoutState& layoutState() const { return m_formattingContext.layoutState(); } 60 void initializeLine(Line&, LayoutUnit lineLogicalTop ) const;61 void initializeLine(Line&, LayoutUnit lineLogicalTop, LayoutUnit widthConstraint) const; 61 62 void closeLine(Line&) const; 62 63 void commitInlineItemToLine(Line&, const InlineItem&) const; -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r245810 r245811 364 364 } 365 365 366 void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop ) const366 void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop, LayoutUnit availableWidth) const 367 367 { 368 368 auto& formattingRootDisplayBox = layoutState().displayBoxForLayoutBox(m_formattingRoot); 369 369 auto lineLogicalLeft = formattingRootDisplayBox.contentBoxLeft(); 370 auto availableWidth = formattingRootDisplayBox.contentBoxWidth();371 370 372 371 // Check for intruding floats and adjust logical left/available width for this line accordingly. … … 400 399 } 401 400 402 void InlineFormattingContext::LineLayout::layout( ) const401 void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) const 403 402 { 404 403 auto floatingContext = FloatingContext { m_floatingState }; 405 404 Line line(layoutState()); 406 initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop() );405 initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop(), widthConstraint); 407 406 408 407 UncommittedContent uncommittedContent; … … 413 412 }; 414 413 414 auto closeCurrentAndInitializeNewLine = [&] { 415 closeLine(line); 416 initializeLine(line, line.logicalBottom(), widthConstraint); 417 }; 418 415 419 LineBreaker lineBreaker(layoutState()); 416 420 auto& inlineContent = m_formattingState.inlineItems(); … … 418 422 // Iterate through the inline content and try to put the inline boxes on the current line. 419 423 if (inlineItem->isHardLineBreak()) { 420 // Close the current line then create and immediately close another one.421 424 commitPendingContent(); 422 425 commitInlineItemToLine(line, *inlineItem); 423 close Line(line);426 closeCurrentAndInitializeNewLine(); 424 427 } else { 425 428 auto availableWidth = line.availableWidth() - uncommittedContent.width(); … … 436 439 437 440 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) 438 close Line(line);441 closeCurrentAndInitializeNewLine(); 439 442 440 443 if (inlineItem->isFloat()) … … 451 454 if (!uncommittedContent.isEmpty()) { 452 455 if (line.availableWidth() < uncommittedContent.width()) 453 close Line(line);456 closeCurrentAndInitializeNewLine(); 454 457 commitPendingContent(); 455 458 } 456 459 closeLine(line); 460 } 461 462 LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const 463 { 464 // FIXME: Consider running it through layout(). 465 LayoutUnit maximumLineWidth; 466 LayoutUnit lineLogicalRight; 467 LayoutUnit trimmableTrailingWidth; 468 469 LineBreaker lineBreaker(layoutState()); 470 auto& inlineContent = m_formattingState.inlineItems(); 471 for (auto& inlineItem : inlineContent) { 472 auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight }); 473 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) { 474 maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); 475 trimmableTrailingWidth = { }; 476 lineLogicalRight = { }; 477 } 478 if (isTrimmableContent(*inlineItem)) { 479 // Skip leading whitespace. 480 if (!lineLogicalRight) 481 continue; 482 trimmableTrailingWidth += inlineItem->width(); 483 } else 484 trimmableTrailingWidth = { }; 485 lineLogicalRight += inlineItem->width(); 486 } 487 return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); 457 488 } 458 489 … … 557 588 if (line.hasContent()) 558 589 alignRuns(m_formattingRoot.style().textAlign(), previousLineLastRunIndex.valueOr(-1) + 1, line.availableWidth()); 559 initializeLine(line, line.logicalBottom());560 590 } 561 591
Note:
See TracChangeset
for help on using the changeset viewer.