WebKit Bugzilla
Attachment 371204 Details for
Bug 198491
: [LFC][IFC] Move run width measuring out of LineBreaker
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198491-20190603123953.patch (text/plain), 10.90 KB, created by
zalan
on 2019-06-03 12:39:54 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-03 12:39:54 PDT
Size:
10.90 KB
patch
obsolete
>Subversion Revision: 246027 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 60c9a73dc433c8da554b7d3dd326849b796572f8..8d1cbdd3b973e77bbf73a66b4db559dae11b37ca 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,25 @@ >+2019-06-03 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Move run width measuring out of LineBreaker >+ https://bugs.webkit.org/show_bug.cgi?id=198491 >+ <rdar://problem/51363554> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ LineBreaker should not need to deal with measuring runs. >+ This is also in preparation for removing InlineItem::width(). >+ >+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: >+ (WebCore::Layout::inlineItemWidth): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): >+ * layout/inlineformatting/InlineLineBreaker.cpp: >+ (WebCore::Layout::LineBreaker::breakingContext): >+ (WebCore::Layout::LineBreaker::LineBreaker): Deleted. >+ (WebCore::Layout::LineBreaker::runWidth const): Deleted. >+ (WebCore::Layout::LineBreaker::textWidth const): Deleted. >+ * layout/inlineformatting/InlineLineBreaker.h: >+ > 2019-06-03 Zalan Bujtas <zalan@apple.com> > > [LFC][IFC] Remove redundant InlineItem::width() calls. >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index 8f78cafeedd375fc2db310e399e9cc77c9f275ec..77d2a44763b0b81f1c58f427cbb1ec4219a3b21c 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -83,6 +83,34 @@ InlineFormattingContext::LineLayout::LineLayout(const InlineFormattingContext& i > { > } > >+static LayoutUnit inlineItemWidth(const LayoutState& layoutState, const InlineItem& inlineItem, LayoutUnit contentLogicalLeft) >+{ >+ if (inlineItem.isLineBreak()) >+ return 0; >+ >+ if (is<InlineTextItem>(inlineItem)) { >+ auto& inlineTextItem = downcast<InlineTextItem>(inlineItem); >+ auto end = inlineTextItem.isCollapsed() ? inlineTextItem.start() + 1 : inlineTextItem.end(); >+ return TextUtil::width(downcast<InlineBox>(inlineTextItem.layoutBox()), inlineTextItem.start(), end, contentLogicalLeft); >+ } >+ >+ auto& layoutBox = inlineItem.layoutBox(); >+ ASSERT(layoutState.hasDisplayBox(layoutBox)); >+ auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox); >+ >+ if (inlineItem.isContainerStart()) >+ return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0); >+ >+ if (inlineItem.isContainerEnd()) >+ return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0); >+ >+ if (inlineItem.isFloat()) >+ return displayBox.marginBoxWidth(); >+ >+ return displayBox.width(); >+} >+ >+ > static std::unique_ptr<Line> constructLine(const LayoutState& layoutState, const FloatingState& floatingState, const Box& formattingRoot, > LayoutUnit lineLogicalTop, LayoutUnit availableWidth) > { >@@ -140,7 +168,7 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > ASSERT(committedInlineItemCount); > return LineContent { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1), line->close() }; > }; >- LineBreaker lineBreaker(layoutState()); >+ LineBreaker lineBreaker; > // Iterate through the inline content and place the inline boxes on the current line. > for (auto inlineItemIndex = lineInput.firstInlineItemIndex; inlineItemIndex < lineInput.inlineItems.size(); ++inlineItemIndex) { > auto& inlineItem = lineInput.inlineItems[inlineItemIndex]; >@@ -151,8 +179,9 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > } > auto availableWidth = line->availableWidth() - uncommittedContent.width(); > auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width(); >+ inlineItem->setWidth(inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight)); > // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed. >- auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() }); >+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItem->width(), { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() }); > if (breakingContext.isAtBreakingOpportunity) > commitPendingContent(); > >@@ -206,10 +235,12 @@ LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUni > LayoutUnit lineLogicalRight; > LayoutUnit trimmableTrailingWidth; > >- LineBreaker lineBreaker(layoutState()); >+ LineBreaker lineBreaker; > auto& inlineContent = m_formattingState.inlineItems(); > for (auto& inlineItem : inlineContent) { >- auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight }); >+ auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight); >+ inlineItem->setWidth(logicalWidth); >+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight }); > if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) { > maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); > trimmableTrailingWidth = { }; >@@ -219,10 +250,10 @@ LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUni > // Skip leading whitespace. > if (!lineLogicalRight) > continue; >- trimmableTrailingWidth += inlineItem->width(); >+ trimmableTrailingWidth += logicalWidth; > } else > trimmableTrailingWidth = { }; >- lineLogicalRight += inlineItem->width(); >+ lineLogicalRight += logicalWidth; > } > return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); > } >diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp >index 61646b8a154bae969d895f0768a8b67197a458d0..2364f6b73a0f429c40fb89c0dd877748b0b5a343 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp >@@ -34,16 +34,10 @@ > namespace WebCore { > namespace Layout { > >-LineBreaker::LineBreaker(const LayoutState& layoutState) >- : m_layoutState(layoutState) >+LineBreaker::BreakingContext LineBreaker::breakingContext(const InlineItem& inlineItem, LayoutUnit logicalWidth, const LineContext& lineContext) > { >-} >- >-LineBreaker::BreakingContext LineBreaker::breakingContext(InlineItem& inlineItem, LineContext lineContext) >-{ >- inlineItem.setWidth(runWidth(inlineItem, lineContext.logicalLeft)); > // First content always stays on line. >- if (lineContext.isEmpty || inlineItem.width() <= lineContext.availableWidth) >+ if (lineContext.isEmpty || logicalWidth <= lineContext.availableWidth) > return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) }; > > if (is<InlineTextItem>(inlineItem)) >@@ -51,7 +45,7 @@ LineBreaker::BreakingContext LineBreaker::breakingContext(InlineItem& inlineItem > > // Wrap non-text boxes to the next line unless we can trim trailing whitespace. > auto availableWidth = lineContext.availableWidth + lineContext.trimmableWidth; >- if (inlineItem.width() <= availableWidth) >+ if (logicalWidth <= availableWidth) > return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) }; > return { BreakingBehavior::Wrap, isAtBreakingOpportunity(inlineItem) }; > } >@@ -88,30 +82,6 @@ LineBreaker::BreakingBehavior LineBreaker::wordBreakingBehavior(const InlineText > return lineIsEmpty ? BreakingBehavior::Keep : BreakingBehavior::Wrap; > } > >-LayoutUnit LineBreaker::runWidth(const InlineItem& inlineItem, LayoutUnit contentLogicalLeft) const >-{ >- if (inlineItem.isLineBreak()) >- return 0; >- >- if (is<InlineTextItem>(inlineItem)) >- return textWidth(downcast<InlineTextItem>(inlineItem), contentLogicalLeft); >- >- auto& layoutBox = inlineItem.layoutBox(); >- ASSERT(m_layoutState.hasDisplayBox(layoutBox)); >- auto& displayBox = m_layoutState.displayBoxForLayoutBox(layoutBox); >- >- if (inlineItem.isContainerStart()) >- return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0); >- >- if (inlineItem.isContainerEnd()) >- return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0); >- >- if (inlineItem.isFloat()) >- return displayBox.marginBoxWidth(); >- >- return displayBox.width(); >-} >- > bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem) > { > if (is<InlineTextItem>(inlineItem)) >@@ -119,11 +89,6 @@ bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem) > return !inlineItem.isFloat() && !inlineItem.isContainerStart() && !inlineItem.isContainerEnd(); > } > >-LayoutUnit LineBreaker::textWidth(const InlineTextItem& inlineTextItem, LayoutUnit contentLogicalLeft) const >-{ >- auto end = inlineTextItem.isCollapsed() ? inlineTextItem.start() + 1 : inlineTextItem.end(); >- return TextUtil::width(downcast<InlineBox>(inlineTextItem.layoutBox()), inlineTextItem.start(), end, contentLogicalLeft); >-} > } > } > #endif >diff --git a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h >index 065330263dd7a4c96b2d943f78c4132bc84c6439..27ec2b8f938959008cda5bb13a6e4af1bb96927b 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h >+++ b/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h >@@ -34,8 +34,6 @@ class InlineTextItem; > > class LineBreaker { > public: >- LineBreaker(const LayoutState&); >- > enum class BreakingBehavior { Keep, Break, Wrap }; > struct BreakingContext { > BreakingBehavior breakingBehavior; >@@ -47,16 +45,13 @@ public: > LayoutUnit trimmableWidth; > bool isEmpty { false }; > }; >- BreakingContext breakingContext(InlineItem&, const LineContext); >+ BreakingContext breakingContext(const InlineItem&, LayoutUnit logicalWidth, const LineContext&); > > private: > > BreakingBehavior wordBreakingBehavior(const InlineTextItem&, bool lineIsEmpty) const; > bool isAtBreakingOpportunity(const InlineItem&); >- LayoutUnit runWidth(const InlineItem&, LayoutUnit contentLogicalLeft) const; >- LayoutUnit textWidth(const InlineTextItem&, LayoutUnit contentLogicalLeft) const; > >- const LayoutState& m_layoutState; > bool m_hyphenationIsDisabled { true }; > }; >
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 198491
: 371204