WebKit Bugzilla
Attachment 371446 Details for
Bug 198587
: [LFC][IFC] Layout and preferred width computation should both call placeInlineItems().
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198587-20190605162233.patch (text/plain), 7.76 KB, created by
zalan
on 2019-06-05 16:22:36 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-05 16:22:36 PDT
Size:
7.76 KB
patch
obsolete
>Subversion Revision: 246128 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 37c56b081758e7bf1d8c6c46926408fd39167cf8..c01d4a53c586d2bbc81db9691fd575d0bc5c4234 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2019-06-05 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Layout and preferred width computation should both call placeInlineItems(). >+ https://bugs.webkit.org/show_bug.cgi?id=198587 >+ <rdar://problem/51460340> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch enables inline placement logic sharing between layout and preferred width computation. >+ >+ * layout/inlineformatting/InlineFormattingContext.h: >+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: >+ (WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): >+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): >+ > 2019-06-05 Saam Barati <sbarati@apple.com> > > Unreviewed. Follow up fix after r246115. >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >index 29635f4084875b18951794478408537c0b27f400..561e38ed0e8fde8a7348950ef40e8b6d8ed8b2d9 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >@@ -66,7 +66,8 @@ private: > }; > > struct LineInput { >- LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems&); >+ enum class SkipVerticalAligment { No, Yes }; >+ LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); > struct HorizontalConstraint { > HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth); > >@@ -74,6 +75,8 @@ private: > LayoutUnit availableLogicalWidth; > }; > HorizontalConstraint horizontalConstraint; >+ // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out) >+ SkipVerticalAligment skipVerticalAligment; > unsigned firstInlineItemIndex { 0 }; > const InlineItems& inlineItems; > }; >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index fea11cc564e30e27474f77336b242debea4ff8a6..0b53764256be22a68fa4c65a28666db7f735f481 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -78,8 +78,9 @@ InlineFormattingContext::LineLayout::LineInput::HorizontalConstraint::Horizontal > { > } > >-InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems& inlineItems) >+InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems) > : horizontalConstraint(logicalTopLeft, availableLogicalWidth) >+ , skipVerticalAligment(skipVerticalAligment) > , firstInlineItemIndex(firstInlineItemIndex) > , inlineItems(inlineItems) > { >@@ -220,15 +221,17 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > ++committedInlineItemCount; > continue; > } >- if (inlineItem->isHardLineBreak()) { >- uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) }); >- commitPendingContent(); >- return closeLine(); >- } > >- uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) }); >+ Optional<LayoutUnit> itemLogicalHeight; >+ if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) >+ itemLogicalHeight = inlineItemHeight(layoutState(), *inlineItem); >+ uncommittedContent.add(*inlineItem, { itemLogicalWidth, itemLogicalHeight }); >+ > if (breakingContext.isAtBreakingOpportunity) > commitPendingContent(); >+ >+ if (inlineItem->isHardLineBreak()) >+ return closeLine(); > } > commitPendingContent(); > return closeLine(); >@@ -275,7 +278,7 @@ void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) con > auto& inlineItems = m_formattingState.inlineItems(); > unsigned currentInlineItemIndex = 0; > while (currentInlineItemIndex < inlineItems.size()) { >- auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, currentInlineItemIndex, inlineItems }; >+ auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems }; > applyFloatConstraint(lineInput.horizontalConstraint); > auto lineContent = placeInlineItems(lineInput); > createDisplayRuns(*lineContent.runs, lineContent.floats, widthConstraint); >@@ -288,31 +291,18 @@ void InlineFormattingContext::LineLayout::layout(LayoutUnit widthConstraint) con > > LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const > { >- // FIXME: Consider running it through layout(). > LayoutUnit maximumLineWidth; >- LayoutUnit lineLogicalRight; >- LayoutUnit trimmableTrailingWidth; >- >- LineBreaker lineBreaker; >- auto& inlineContent = m_formattingState.inlineItems(); >- for (auto& inlineItem : inlineContent) { >- auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight); >- auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight }); >- if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) { >- maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); >- trimmableTrailingWidth = { }; >- lineLogicalRight = { }; >- } >- if (TextUtil::isTrimmableContent(*inlineItem)) { >- // Skip leading whitespace. >- if (!lineLogicalRight) >- continue; >- trimmableTrailingWidth += logicalWidth; >- } else >- trimmableTrailingWidth = { }; >- lineLogicalRight += logicalWidth; >+ auto& inlineItems = m_formattingState.inlineItems(); >+ unsigned currentInlineItemIndex = 0; >+ while (currentInlineItemIndex < inlineItems.size()) { >+ auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems }); >+ currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1; >+ LayoutUnit floatsWidth; >+ for (auto& floatItem : lineContent.floats) >+ floatsWidth += layoutState().displayBoxForLayoutBox(floatItem->layoutBox()).marginBoxWidth(); >+ maximumLineWidth = std::max(maximumLineWidth, floatsWidth + lineContent.runs->logicalWidth()); > } >- return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); >+ return maximumLineWidth; > } > > void InlineFormattingContext::LineLayout::createDisplayRuns(const Line::Content& lineContent, const Vector<WeakPtr<InlineItem>>& floats, LayoutUnit widthConstraint) 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 198587
: 371446