WebKit Bugzilla
Attachment 372526 Details for
Bug 199056
: [LFC][IFC] Introduce Line::InitialConstraints
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-199056-20190619211045.patch (text/plain), 12.82 KB, created by
zalan
on 2019-06-19 21:10:46 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-19 21:10:46 PDT
Size:
12.82 KB
patch
obsolete
>Subversion Revision: 246627 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 4861d5b1ea552c29e068e6e9f00b0a1c1d748bd1..7c96ac054fce8973ced00cb6acc23b98402e4236 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,25 @@ >+2019-06-19 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][IFC] Introduce Line::InitialConstraints >+ https://bugs.webkit.org/show_bug.cgi?id=199056 >+ <rdar://problem/51927597> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Line::InitialConstraints, as the name suggests, holds the initial constraint values for the new line. >+ >+ * 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): >+ * layout/inlineformatting/InlineLine.cpp: >+ (WebCore::Layout::Line::Line): >+ (WebCore::Layout::m_skipVerticalAligment): >+ (WebCore::Layout::m_lineLogicalWidth): Deleted. >+ * layout/inlineformatting/InlineLine.h: >+ > 2019-06-19 Saam Barati <sbarati@apple.com> > > [WHLSL] The checker needs to resolve types for the anonymous variables in ReadModifyWrite expressions >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >index 596e655c48a932d9892cef2d7052c1063ab2adbf..3a8cd394a3cccc8bda87e91f912ab6866f3917ee 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >@@ -66,8 +66,7 @@ private: > }; > > struct LineInput { >- enum class SkipVerticalAligment { No, Yes }; >- LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); >+ LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); > struct HorizontalConstraint { > HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth); > >@@ -76,7 +75,7 @@ private: > }; > HorizontalConstraint horizontalConstraint; > // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out) >- SkipVerticalAligment skipVerticalAligment; >+ Line::SkipVerticalAligment skipVerticalAligment; > unsigned firstInlineItemIndex { 0 }; > const InlineItems& inlineItems; > Optional<LayoutUnit> floatMinimumLogicalBottom; >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index 550bbd64b37df9f5122f09ccbfe7913da0b00030..914ed3011f768c6d0e24690590d0c2fd68a0ea88 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -78,7 +78,7 @@ InlineFormattingContext::LineLayout::LineInput::HorizontalConstraint::Horizontal > { > } > >-InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems) >+InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems) > : horizontalConstraint(logicalTopLeft, availableLogicalWidth) > , skipVerticalAligment(skipVerticalAligment) > , firstInlineItemIndex(firstInlineItemIndex) >@@ -127,13 +127,15 @@ static LayoutUnit inlineItemWidth(const LayoutState& layoutState, const InlineIt > > InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const > { >- std::unique_ptr<Line> line; >- if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) { >- auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight(); >- auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent; >- line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft, lineInput.horizontalConstraint.availableLogicalWidth, mimimumLineHeight, initialBaselineOffset); >- } else >- line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft.x(), lineInput.horizontalConstraint.availableLogicalWidth); >+ auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight(); >+ auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent; >+ auto initialLineConstraints = Line::InitialConstraints { >+ lineInput.horizontalConstraint.logicalTopLeft, >+ lineInput.horizontalConstraint.availableLogicalWidth, >+ mimimumLineHeight, >+ initialBaselineOffset >+ }; >+ auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment }; > > Vector<WeakPtr<InlineItem>> floats; > unsigned committedInlineItemCount = 0; >@@ -144,7 +146,7 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > return; > committedInlineItemCount += uncommittedContent.size(); > for (auto& uncommittedRun : uncommittedContent.runs()) >- line->append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth); >+ line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth); > uncommittedContent.reset(); > }; > >@@ -152,19 +154,19 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > auto closeLine = [&] { > ASSERT(committedInlineItemCount || lineHasFloatBox); > auto lastCommittedIndex = committedInlineItemCount ? Optional<unsigned> { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1) } : WTF::nullopt; >- return LineContent { lastCommittedIndex, WTFMove(floats), line->close() }; >+ return LineContent { lastCommittedIndex, WTFMove(floats), line.close() }; > }; > 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 availableWidth = line->availableWidth() - uncommittedContent.width(); >- auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width(); >+ auto availableWidth = line.availableWidth() - uncommittedContent.width(); >+ auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width(); > auto& inlineItem = lineInput.inlineItems[inlineItemIndex]; > auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight); > > // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed. >- auto lineIsConsideredEmpty = !line->hasContent() && !lineHasFloatBox; >- auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), lineIsConsideredEmpty }); >+ auto lineIsConsideredEmpty = !line.hasContent() && !lineHasFloatBox; >+ auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line.trailingTrimmableWidth(), lineIsConsideredEmpty }); > if (breakingContext.isAtBreakingOpportunity) > commitPendingContent(); > >@@ -186,7 +188,7 @@ InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLa > ASSERT(layoutState().hasDisplayBox(floatBox)); > // Shrink availble space for current line and move existing inline runs. > auto floatBoxWidth = layoutState().displayBoxForLayoutBox(floatBox).marginBoxWidth(); >- floatBox.isLeftFloatingPositioned() ? line->moveLogicalLeft(floatBoxWidth) : line->moveLogicalRight(floatBoxWidth); >+ floatBox.isLeftFloatingPositioned() ? line.moveLogicalLeft(floatBoxWidth) : line.moveLogicalRight(floatBoxWidth); > floats.append(makeWeakPtr(*inlineItem)); > ++committedInlineItemCount; > lineHasFloatBox = true; >@@ -251,7 +253,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, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems }; >+ auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems }; > applyFloatConstraint(lineInput); > auto lineContent = placeInlineItems(lineInput); > createDisplayRuns(*lineContent.runs, lineContent.floats, widthConstraint); >@@ -273,7 +275,7 @@ LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUni > auto& inlineItems = m_formattingState.inlineItems(); > unsigned currentInlineItemIndex = 0; > while (currentInlineItemIndex < inlineItems.size()) { >- auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems }); >+ auto lineContent = placeInlineItems({ { }, widthConstraint, Line::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems }); > currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1; > LayoutUnit floatsWidth; > for (auto& floatItem : lineContent.floats) >diff --git a/Source/WebCore/layout/inlineformatting/InlineLine.cpp b/Source/WebCore/layout/inlineformatting/InlineLine.cpp >index 7198feb48555001b6e0348579e29367bd3fc618b..66fca2f5ba478152b132d6e0ddbb5e45ae3e9361 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLine.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineLine.cpp >@@ -44,22 +44,14 @@ Line::Content::Run::Run(const InlineItem& inlineItem, const Display::Rect& logic > { > } > >-Line::Line(const LayoutState& layoutState, LayoutUnit logicalLeft, LayoutUnit availableWidth) >+Line::Line(const LayoutState& layoutState, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment) > : m_layoutState(layoutState) > , m_content(std::make_unique<Line::Content>()) >- , m_logicalTopLeft(logicalLeft, 0) >- , m_lineLogicalWidth(availableWidth) >- , m_skipVerticalAligment(true) >-{ >-} >- >-Line::Line(const LayoutState& layoutState, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumHeight, LayoutUnit baselineOffset) >- : m_layoutState(layoutState) >- , m_content(std::make_unique<Line::Content>()) >- , m_logicalTopLeft(topLeft) >- , m_baseline({ baselineOffset, minimumHeight - baselineOffset }) >- , m_contentLogicalHeight(minimumHeight) >- , m_lineLogicalWidth(availableWidth) >+ , m_logicalTopLeft(initialConstraints.topLeft) >+ , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset }) >+ , m_contentLogicalHeight(initialConstraints.height) >+ , m_lineLogicalWidth(initialConstraints.availableWidth) >+ , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes) > { > } > >diff --git a/Source/WebCore/layout/inlineformatting/InlineLine.h b/Source/WebCore/layout/inlineformatting/InlineLine.h >index 7b6cb1140f357b9699f11d678cd2b2e9694991c2..c3e601ace6343d3dfcdb150778847e38d5689c0f 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLine.h >+++ b/Source/WebCore/layout/inlineformatting/InlineLine.h >@@ -38,8 +38,14 @@ namespace Layout { > class Line { > WTF_MAKE_ISO_ALLOCATED(Line); > public: >- Line(const LayoutState&, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumLineHeight, LayoutUnit baselineOffset); >- Line(const LayoutState&, LayoutUnit logicalLeft, LayoutUnit availableWidth); >+ struct InitialConstraints { >+ LayoutPoint topLeft; >+ LayoutUnit availableWidth; >+ LayoutUnit height; >+ LayoutUnit baselineOffset; >+ }; >+ enum class SkipVerticalAligment { No, Yes }; >+ Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment); > > class Content { > public:
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 199056
: 372526