WebKit Bugzilla
Attachment 370653 Details for
Bug 198258
: [LFC][IFC] Move intrinsic width computation from InlineFormattingContext to LineLayout
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198258-20190526115745.patch (text/plain), 10.65 KB, created by
zalan
on 2019-05-26 11:57:48 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-05-26 11:57:48 PDT
Size:
10.65 KB
patch
obsolete
>Subversion Revision: 245776 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 2267d67451e7172a3fe9685352db1c442e130910..46c9f03c8fcba8f6ab4ed91096d67fe8b91c2f62 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2019-05-26 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Move intrinsic width computation from InlineFormattingContext to LineLayout >+ https://bugs.webkit.org/show_bug.cgi?id=198258 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This is in preparation for sharing even more code between line layout and preferred width computation. >+ >+ * layout/inlineformatting/InlineFormattingContext.cpp: >+ (WebCore::Layout::InlineFormattingContext::layout const): >+ (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const): >+ * layout/inlineformatting/InlineFormattingContext.h: >+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: >+ (WebCore::Layout::InlineFormattingContext::LineLayout::initializeLine const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::closeLine const): >+ > 2019-05-25 Zalan Bujtas <zalan@apple.com> > > [LFC][Verification] Add additional inline and block checks >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >index 483b37dfce695bee3cbe320dc7685e9470d0fb4e..a778e9b7224a6c32c105016147543db9cb14f241 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp >@@ -71,7 +71,8 @@ void InlineFormattingContext::layout() const > > LOG_WITH_STREAM(FormattingContextLayout, stream << "[Start] -> inline formatting context -> formatting root(" << &root() << ")"); > auto& root = downcast<Container>(this->root()); >- auto usedValues = UsedHorizontalValues { layoutState().displayBoxForLayoutBox(root).contentBoxWidth() }; >+ auto availableWidth = layoutState().displayBoxForLayoutBox(root).contentBoxWidth(); >+ auto usedValues = UsedHorizontalValues { availableWidth }; > auto* layoutBox = root.firstInFlowOrFloatingChild(); > // Compute width/height for non-text content and margin/border/padding for inline containers. > while (layoutBox) { >@@ -93,7 +94,7 @@ void InlineFormattingContext::layout() const > formattingState().inlineRuns().clear(); > > collectInlineContent(); >- LineLayout(*this).layout(); >+ LineLayout(*this).layout(availableWidth); > LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root << ")"); > } > >@@ -139,20 +140,7 @@ void InlineFormattingContext::computeIntrinsicWidthConstraints() const > auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraints(*formattingRoot); > layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum); > } >- LayoutUnit maxContentLogicalRight; >- LayoutUnit lineLogicalRight; >- >- LineBreaker lineBreaker(layoutState); >- auto& inlineContent = formattingState().inlineItems(); >- for (auto& inlineItem : inlineContent) { >- auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, lineLogicalRight, !lineLogicalRight }); >- if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) >- lineLogicalRight = 0; >- lineLogicalRight += inlineItem->width(); >- >- maxContentLogicalRight = std::max(maxContentLogicalRight, lineLogicalRight); >- } >- return maxContentLogicalRight; >+ return LineLayout(*this).computedIntrinsicWidth(availableWidth); > }; > > auto intrinsicWidthConstraints = Geometry::constrainByMinMaxWidth(root, { maximumLineWidth(0), maximumLineWidth(LayoutUnit::max()) }); >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >index 9b0d6226b53acc4e1bfae255fddf95810655e0da..0ea4de3d07a9d532c0120559e3b3ea1b20da836d 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >@@ -53,11 +53,12 @@ private: > class LineLayout { > public: > LineLayout(const InlineFormattingContext&); >- void layout() const; >+ void layout(LayoutUnit widthConstraint) const; >+ LayoutUnit computedIntrinsicWidth(LayoutUnit widthConstraint) const; > > private: > LayoutState& layoutState() const { return m_formattingContext.layoutState(); } >- void initializeLine(Line&, LayoutUnit lineLogicalTop) const; >+ void initializeLine(Line&, LayoutUnit lineLogicalTop, LayoutUnit widthConstraint) const; > void closeLine(Line&) const; > void commitInlineItemToLine(Line&, const InlineItem&) const; > void handleFloat(Line&, const FloatingContext&, const InlineItem& floatBox) const; >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index ea7bd66cd2405d154a67f56e214fd64ba1411c0a..2689631bc8532ae0b84c53d65b013e64462a8f80 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -363,11 +363,10 @@ InlineFormattingContext::LineLayout::LineLayout(const InlineFormattingContext& i > { > } > >-void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop) const >+void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit lineLogicalTop, LayoutUnit availableWidth) const > { > auto& formattingRootDisplayBox = layoutState().displayBoxForLayoutBox(m_formattingRoot); > auto lineLogicalLeft = formattingRootDisplayBox.contentBoxLeft(); >- auto availableWidth = formattingRootDisplayBox.contentBoxWidth(); > > // Check for intruding floats and adjust logical left/available width for this line accordingly. > if (!m_floatingState.isEmpty()) { >@@ -399,11 +398,11 @@ void InlineFormattingContext::LineLayout::initializeLine(Line& line, LayoutUnit > line.reset({ lineLogicalLeft, lineLogicalTop }, availableWidth, mimimumLineHeight, baselineOffset); > } > >-void InlineFormattingContext::LineLayout::layout() const >+void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) const > { > auto floatingContext = FloatingContext { m_floatingState }; > Line line(layoutState()); >- initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop()); >+ initializeLine(line, layoutState().displayBoxForLayoutBox(m_formattingRoot).contentBoxTop(), widthConstraint); > > UncommittedContent uncommittedContent; > auto commitPendingContent = [&] { >@@ -412,15 +411,19 @@ void InlineFormattingContext::LineLayout::layout() const > uncommittedContent.reset(); > }; > >+ auto closeCurrentAndInitializeNewLine = [&] { >+ closeLine(line); >+ initializeLine(line, line.logicalBottom(), widthConstraint); >+ }; >+ > LineBreaker lineBreaker(layoutState()); > auto& inlineContent = m_formattingState.inlineItems(); > for (auto& inlineItem : inlineContent) { > // Iterate through the inline content and try to put the inline boxes on the current line. > if (inlineItem->isHardLineBreak()) { >- // Close the current line then create and immediately close another one. > commitPendingContent(); > commitInlineItemToLine(line, *inlineItem); >- closeLine(line); >+ closeCurrentAndInitializeNewLine(); > } else { > auto availableWidth = line.availableWidth() - uncommittedContent.width(); > auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width(); >@@ -435,7 +438,7 @@ void InlineFormattingContext::LineLayout::layout() const > } > > if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) >- closeLine(line); >+ closeCurrentAndInitializeNewLine(); > > if (inlineItem->isFloat()) > handleFloat(line, floatingContext, *inlineItem); >@@ -450,12 +453,40 @@ void InlineFormattingContext::LineLayout::layout() const > // Process remaining uncommitted content. > if (!uncommittedContent.isEmpty()) { > if (line.availableWidth() < uncommittedContent.width()) >- closeLine(line); >+ closeCurrentAndInitializeNewLine(); > commitPendingContent(); > } > closeLine(line); > } > >+LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const >+{ >+ // FIXME: Consider running it through layout(). >+ LayoutUnit maximumLineWidth; >+ LayoutUnit lineLogicalRight; >+ LayoutUnit trimmableTrailingWidth; >+ >+ LineBreaker lineBreaker(layoutState()); >+ auto& inlineContent = m_formattingState.inlineItems(); >+ for (auto& inlineItem : inlineContent) { >+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight }); >+ if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) { >+ maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); >+ trimmableTrailingWidth = { }; >+ lineLogicalRight = { }; >+ } >+ if (isTrimmableContent(*inlineItem)) { >+ // Skip leading whitespace. >+ if (!lineLogicalRight) >+ continue; >+ trimmableTrailingWidth += inlineItem->width(); >+ } else >+ trimmableTrailingWidth = { }; >+ lineLogicalRight += inlineItem->width(); >+ } >+ return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); >+} >+ > void InlineFormattingContext::LineLayout::closeLine(Line& line) const > { > auto& lineItems = line.close(); >@@ -554,7 +585,6 @@ void InlineFormattingContext::LineLayout::closeLine(Line& line) const > m_formattingState.addLineBox({ lineBox }); > if (line.hasContent()) > alignRuns(m_formattingRoot.style().textAlign(), previousLineLastRunIndex.valueOr(-1) + 1, line.availableWidth()); >- initializeLine(line, line.logicalBottom()); > } > > void InlineFormattingContext::LineLayout::handleFloat(Line& line, const FloatingContext& floatingContext, const InlineItem& floatItem) const
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198258
: 370653