Log Message
Cherry-pick r247562. rdar://problem/53279086
[LFC][IFC] InlineFormattingContext::LineLayout::placeInlineItems is getting too complex. https://bugs.webkit.org/show_bug.cgi?id=199898 <rdar://problem/53235958> Reviewed by Antti Koivisto. It's time to restructure LineLayout::placeInlineItems to be able to expand it further. Introduce the LineLayout class. This class is responsible to place the inline items on the current line. (Rename InlineFormattingContext::lineLayout -> InlineFormattingContext::InlineLayout and use Line::InitialConstraints in LineInput) * layout/inlineformatting/InlineFormattingContext.cpp: (WebCore::Layout::InlineFormattingContext::layout const): (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const): * layout/inlineformatting/InlineFormattingContext.h: (WebCore::Layout::InlineFormattingContext::LineLayout::layoutState const): Deleted. * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: (WebCore::Layout::inlineItemWidth): (WebCore::Layout::LineLayout::layoutState const): (WebCore::Layout::LineLayout::UncommittedContent::runs): (WebCore::Layout::LineLayout::UncommittedContent::isEmpty const): (WebCore::Layout::LineLayout::UncommittedContent::size const): (WebCore::Layout::LineLayout::UncommittedContent::width const): (WebCore::Layout::LineLayout::UncommittedContent::add): (WebCore::Layout::LineLayout::UncommittedContent::reset): (WebCore::Layout::LineLayout::LineLayout): (WebCore::Layout::LineLayout::commitPendingContent): (WebCore::Layout::LineLayout::close): (WebCore::Layout::LineLayout::layout): (WebCore::Layout::LineInput::LineInput): (WebCore::Layout::InlineFormattingContext::InlineLayout::InlineLayout): (WebCore::Layout::InlineFormattingContext::InlineLayout::layout const): (WebCore::Layout::InlineFormattingContext::InlineLayout::computedIntrinsicWidth const): (WebCore::Layout::InlineFormattingContext::InlineLayout::createDisplayRuns const): (WebCore::Layout::InlineFormattingContext::InlineLayout::alignRuns const): (WebCore::Layout::UncommittedContent::runs): Deleted. (WebCore::Layout::UncommittedContent::isEmpty const): Deleted. (WebCore::Layout::UncommittedContent::size const): Deleted. (WebCore::Layout::UncommittedContent::width const): Deleted. (WebCore::Layout::UncommittedContent::add): Deleted. (WebCore::Layout::UncommittedContent::reset): Deleted. (WebCore::Layout::LineInput::HorizontalConstraint::HorizontalConstraint): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::LineLayout): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::createDisplayRuns const): Deleted. (WebCore::Layout::InlineFormattingContext::LineLayout::alignRuns const): Deleted. * layout/inlineformatting/InlineLine.cpp: (WebCore::Layout::Line::Line): * layout/inlineformatting/InlineLine.h: git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247562 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Modified Paths
- branches/safari-608-branch/Source/WebCore/ChangeLog
- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.cpp
- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.h
Diff
Modified: branches/safari-608-branch/Source/WebCore/ChangeLog (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/ChangeLog 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/ChangeLog 2019-07-19 01:39:52 UTC (rev 247630)
@@ -1,5 +1,118 @@
2019-07-18 Alan Coon <alanc...@apple.com>
+ Cherry-pick r247562. rdar://problem/53279086
+
+ [LFC][IFC] InlineFormattingContext::LineLayout::placeInlineItems is getting too complex.
+ https://bugs.webkit.org/show_bug.cgi?id=199898
+ <rdar://problem/53235958>
+
+ Reviewed by Antti Koivisto.
+
+ It's time to restructure LineLayout::placeInlineItems to be able to expand it further.
+ Introduce the LineLayout class. This class is responsible to place the inline items on the current line.
+ (Rename InlineFormattingContext::lineLayout -> InlineFormattingContext::InlineLayout and
+ use Line::InitialConstraints in LineInput)
+
+ * layout/inlineformatting/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::layout const):
+ (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const):
+ * layout/inlineformatting/InlineFormattingContext.h:
+ (WebCore::Layout::InlineFormattingContext::LineLayout::layoutState const): Deleted.
+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+ (WebCore::Layout::inlineItemWidth):
+ (WebCore::Layout::LineLayout::layoutState const):
+ (WebCore::Layout::LineLayout::UncommittedContent::runs):
+ (WebCore::Layout::LineLayout::UncommittedContent::isEmpty const):
+ (WebCore::Layout::LineLayout::UncommittedContent::size const):
+ (WebCore::Layout::LineLayout::UncommittedContent::width const):
+ (WebCore::Layout::LineLayout::UncommittedContent::add):
+ (WebCore::Layout::LineLayout::UncommittedContent::reset):
+ (WebCore::Layout::LineLayout::LineLayout):
+ (WebCore::Layout::LineLayout::commitPendingContent):
+ (WebCore::Layout::LineLayout::close):
+ (WebCore::Layout::LineLayout::layout):
+ (WebCore::Layout::LineInput::LineInput):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::InlineLayout):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::layout const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::computedIntrinsicWidth const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::createDisplayRuns const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::alignRuns const):
+ (WebCore::Layout::UncommittedContent::runs): Deleted.
+ (WebCore::Layout::UncommittedContent::isEmpty const): Deleted.
+ (WebCore::Layout::UncommittedContent::size const): Deleted.
+ (WebCore::Layout::UncommittedContent::width const): Deleted.
+ (WebCore::Layout::UncommittedContent::add): Deleted.
+ (WebCore::Layout::UncommittedContent::reset): Deleted.
+ (WebCore::Layout::LineInput::HorizontalConstraint::HorizontalConstraint): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::LineLayout): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::createDisplayRuns const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::alignRuns const): Deleted.
+ * layout/inlineformatting/InlineLine.cpp:
+ (WebCore::Layout::Line::Line):
+ * layout/inlineformatting/InlineLine.h:
+
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247562 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2019-07-18 Zalan Bujtas <za...@apple.com>
+
+ [LFC][IFC] InlineFormattingContext::LineLayout::placeInlineItems is getting too complex.
+ https://bugs.webkit.org/show_bug.cgi?id=199898
+ <rdar://problem/53235958>
+
+ Reviewed by Antti Koivisto.
+
+ It's time to restructure LineLayout::placeInlineItems to be able to expand it further.
+ Introduce the LineLayout class. This class is responsible to place the inline items on the current line.
+ (Rename InlineFormattingContext::lineLayout -> InlineFormattingContext::InlineLayout and
+ use Line::InitialConstraints in LineInput)
+
+ * layout/inlineformatting/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::layout const):
+ (WebCore::Layout::InlineFormattingContext::computeIntrinsicWidthConstraints const):
+ * layout/inlineformatting/InlineFormattingContext.h:
+ (WebCore::Layout::InlineFormattingContext::LineLayout::layoutState const): Deleted.
+ * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+ (WebCore::Layout::inlineItemWidth):
+ (WebCore::Layout::LineLayout::layoutState const):
+ (WebCore::Layout::LineLayout::UncommittedContent::runs):
+ (WebCore::Layout::LineLayout::UncommittedContent::isEmpty const):
+ (WebCore::Layout::LineLayout::UncommittedContent::size const):
+ (WebCore::Layout::LineLayout::UncommittedContent::width const):
+ (WebCore::Layout::LineLayout::UncommittedContent::add):
+ (WebCore::Layout::LineLayout::UncommittedContent::reset):
+ (WebCore::Layout::LineLayout::LineLayout):
+ (WebCore::Layout::LineLayout::commitPendingContent):
+ (WebCore::Layout::LineLayout::close):
+ (WebCore::Layout::LineLayout::layout):
+ (WebCore::Layout::LineInput::LineInput):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::InlineLayout):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::layout const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::computedIntrinsicWidth const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::createDisplayRuns const):
+ (WebCore::Layout::InlineFormattingContext::InlineLayout::alignRuns const):
+ (WebCore::Layout::UncommittedContent::runs): Deleted.
+ (WebCore::Layout::UncommittedContent::isEmpty const): Deleted.
+ (WebCore::Layout::UncommittedContent::size const): Deleted.
+ (WebCore::Layout::UncommittedContent::width const): Deleted.
+ (WebCore::Layout::UncommittedContent::add): Deleted.
+ (WebCore::Layout::UncommittedContent::reset): Deleted.
+ (WebCore::Layout::LineInput::HorizontalConstraint::HorizontalConstraint): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::LineLayout): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::createDisplayRuns const): Deleted.
+ (WebCore::Layout::InlineFormattingContext::LineLayout::alignRuns const): Deleted.
+ * layout/inlineformatting/InlineLine.cpp:
+ (WebCore::Layout::Line::Line):
+ * layout/inlineformatting/InlineLine.h:
+
+2019-07-18 Alan Coon <alanc...@apple.com>
+
Revert r247531. rdar://problem/53229712
2019-07-18 Kocsen Chung <kocsen_ch...@apple.com>
Modified: branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp 2019-07-19 01:39:52 UTC (rev 247630)
@@ -94,7 +94,7 @@
formattingState().inlineRuns().clear();
collectInlineContent();
- LineLayout(*this).layout(formattingState().inlineItems(), availableWidth);
+ InlineLayout(*this).layout(formattingState().inlineItems(), availableWidth);
LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root << ")");
}
@@ -140,7 +140,7 @@
auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraints(*formattingRoot);
layoutState.displayBoxForLayoutBox(*formattingRoot).setContentBoxWidth(availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum);
}
- return LineLayout(*this).computedIntrinsicWidth(formattingState().inlineItems(), availableWidth);
+ return InlineLayout(*this).computedIntrinsicWidth(formattingState().inlineItems(), availableWidth);
};
auto intrinsicWidthConstraints = Geometry::constrainByMinMaxWidth(root, { maximumLineWidth(0), maximumLineWidth(LayoutUnit::max()) });
Modified: branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h 2019-07-19 01:39:52 UTC (rev 247630)
@@ -52,9 +52,9 @@
private:
void computeIntrinsicWidthConstraints() const override;
- class LineLayout {
+ class InlineLayout {
public:
- LineLayout(const InlineFormattingContext&);
+ InlineLayout(const InlineFormattingContext&);
void layout(const InlineItems&, LayoutUnit widthConstraint) const;
LayoutUnit computedIntrinsicWidth(const InlineItems&, LayoutUnit widthConstraint) const;
Modified: branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp 2019-07-19 01:39:52 UTC (rev 247630)
@@ -41,6 +41,37 @@
namespace WebCore {
namespace Layout {
+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 (layoutBox.isFloatingPositioned())
+ return displayBox.marginBoxWidth();
+
+ if (layoutBox.isReplaced())
+ return displayBox.width();
+
+ if (inlineItem.isContainerStart())
+ return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
+
+ if (inlineItem.isContainerEnd())
+ return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
+
+ // Non-replaced inline box (e.g. inline-block)
+ return displayBox.width();
+}
+
struct InlineIndexAndSplitPosition {
unsigned index { 0 };
Optional<unsigned> splitPosition;
@@ -47,14 +78,9 @@
};
struct LineInput {
- LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment, InlineIndexAndSplitPosition firstToProcess, const InlineItems&);
- struct HorizontalConstraint {
- HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth);
+ LineInput(const Line::InitialConstraints& initialLineConstraints, Line::SkipVerticalAligment, InlineIndexAndSplitPosition firstToProcess, const InlineItems&);
- LayoutPoint logicalTopLeft;
- LayoutUnit availableLogicalWidth;
- };
- HorizontalConstraint horizontalConstraint;
+ Line::InitialConstraints initialConstraints;
// FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out)
Line::SkipVerticalAligment skipVerticalAligment;
InlineIndexAndSplitPosition firstInlineItem;
@@ -68,136 +94,104 @@
std::unique_ptr<Line::Content> runs;
};
-struct UncommittedContent {
- struct Run {
- const InlineItem& inlineItem;
- LayoutUnit logicalWidth;
- // FIXME: add optional breaking context (start and end position) for split text content.
- };
- void add(const InlineItem&, LayoutUnit logicalWidth);
- void reset();
+class LineLayout {
+public:
+ LineLayout(const LayoutState&, const LineInput&);
- Vector<Run> runs() { return m_uncommittedRuns; }
- bool isEmpty() const { return m_uncommittedRuns.isEmpty(); }
- unsigned size() const { return m_uncommittedRuns.size(); }
- LayoutUnit width() const { return m_width; }
+ LineContent layout();
private:
- Vector<Run> m_uncommittedRuns;
- LayoutUnit m_width;
+ const LayoutState& layoutState() const { return m_layoutState; }
+ void commitPendingContent();
+ LineContent close();
+
+ struct UncommittedContent {
+ struct Run {
+ const InlineItem& inlineItem;
+ LayoutUnit logicalWidth;
+ // FIXME: add optional breaking context (start and end position) for split text content.
+ };
+ void add(const InlineItem&, LayoutUnit logicalWidth);
+ void reset();
+
+ Vector<Run> runs() { return m_uncommittedRuns; }
+ bool isEmpty() const { return m_uncommittedRuns.isEmpty(); }
+ unsigned size() const { return m_uncommittedRuns.size(); }
+ LayoutUnit width() const { return m_width; }
+
+ private:
+ Vector<Run> m_uncommittedRuns;
+ LayoutUnit m_width;
+ };
+
+ const LayoutState& m_layoutState;
+ const LineInput& m_lineInput;
+ Line m_line;
+ LineBreaker m_lineBreaker;
+ bool m_lineHasFloatBox { false };
+ UncommittedContent m_uncommittedContent;
+ unsigned m_committedInlineItemCount { 0 };
+ Vector<WeakPtr<InlineItem>> m_floats;
+ Optional<unsigned> m_splitPosition;
};
-void UncommittedContent::add(const InlineItem& inlineItem, LayoutUnit logicalWidth)
+void LineLayout::UncommittedContent::add(const InlineItem& inlineItem, LayoutUnit logicalWidth)
{
m_uncommittedRuns.append({ inlineItem, logicalWidth });
m_width += logicalWidth;
}
-void UncommittedContent::reset()
+void LineLayout::UncommittedContent::reset()
{
m_uncommittedRuns.clear();
m_width = 0;
}
-LineInput::HorizontalConstraint::HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth)
- : logicalTopLeft(logicalTopLeft)
- , availableLogicalWidth(availableLogicalWidth)
+LineLayout::LineLayout(const LayoutState& layoutState, const LineInput& lineInput)
+ : m_layoutState(layoutState)
+ , m_lineInput(lineInput)
+ , m_line(layoutState, lineInput.initialConstraints, lineInput.skipVerticalAligment)
+ , m_lineHasFloatBox(lineInput.floatMinimumLogicalBottom.hasValue())
{
}
-LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment skipVerticalAligment, InlineIndexAndSplitPosition firstToProcess, const InlineItems& inlineItems)
- : horizontalConstraint(logicalTopLeft, availableLogicalWidth)
- , skipVerticalAligment(skipVerticalAligment)
- , firstInlineItem(firstToProcess)
- , inlineItems(inlineItems)
+void LineLayout::commitPendingContent()
{
+ if (m_uncommittedContent.isEmpty())
+ return;
+ m_committedInlineItemCount += m_uncommittedContent.size();
+ for (auto& uncommittedRun : m_uncommittedContent.runs())
+ m_line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
+ m_uncommittedContent.reset();
}
-InlineFormattingContext::LineLayout::LineLayout(const InlineFormattingContext& inlineFormattingContext)
- : m_layoutState(inlineFormattingContext.layoutState())
- , m_formattingRoot(downcast<Container>(inlineFormattingContext.root()))
+LineContent LineLayout::close()
{
+ ASSERT(m_committedInlineItemCount || m_lineHasFloatBox);
+ if (!m_committedInlineItemCount)
+ return LineContent { WTF::nullopt, WTFMove(m_floats), m_line.close() };
+ auto lastCommitedItem = InlineIndexAndSplitPosition { m_lineInput.firstInlineItem.index + (m_committedInlineItemCount - 1), m_splitPosition };
+ return LineContent { lastCommitedItem, WTFMove(m_floats), m_line.close() };
}
-static LayoutUnit inlineItemWidth(const LayoutState& layoutState, const InlineItem& inlineItem, LayoutUnit contentLogicalLeft)
+LineContent LineLayout::layout()
{
- 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 (layoutBox.isFloatingPositioned())
- return displayBox.marginBoxWidth();
-
- if (layoutBox.isReplaced())
- return displayBox.width();
-
- if (inlineItem.isContainerStart())
- return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
-
- if (inlineItem.isContainerEnd())
- return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
-
- // Non-replaced inline box (e.g. inline-block)
- return displayBox.width();
-}
-
-LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
-{
- auto initialLineConstraints = Line::InitialConstraints {
- lineInput.horizontalConstraint.logicalTopLeft,
- lineInput.horizontalConstraint.availableLogicalWidth,
- Quirks::lineHeightConstraints(layoutState(), m_formattingRoot)
- };
- auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
-
- Vector<WeakPtr<InlineItem>> floats;
- unsigned committedInlineItemCount = 0;
- Optional<unsigned> splitPosition;
-
- UncommittedContent uncommittedContent;
- auto commitPendingContent = [&] {
- if (uncommittedContent.isEmpty())
- return;
- committedInlineItemCount += uncommittedContent.size();
- for (auto& uncommittedRun : uncommittedContent.runs())
- line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);
- uncommittedContent.reset();
- };
-
- auto lineHasFloatBox = lineInput.floatMinimumLogicalBottom.hasValue();
- auto closeLine = [&] {
- ASSERT(committedInlineItemCount || lineHasFloatBox);
- if (!committedInlineItemCount)
- return LineContent { WTF::nullopt, WTFMove(floats), line.close() };
- auto lastCommitedItem = InlineIndexAndSplitPosition { lineInput.firstInlineItem.index + (committedInlineItemCount - 1), splitPosition };
- return LineContent { lastCommitedItem, WTFMove(floats), line.close() };
- };
- LineBreaker lineBreaker;
// Iterate through the inline content and place the inline boxes on the current line.
- for (auto inlineItemIndex = lineInput.firstInlineItem.index; inlineItemIndex < lineInput.inlineItems.size(); ++inlineItemIndex) {
- auto availableWidth = line.availableWidth() - uncommittedContent.width();
- auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width();
- auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
+ for (auto inlineItemIndex = m_lineInput.firstInlineItem.index; inlineItemIndex < m_lineInput.inlineItems.size(); ++inlineItemIndex) {
+ auto availableWidth = m_line.availableWidth() - m_uncommittedContent.width();
+ auto currentLogicalRight = m_line.contentLogicalRight() + m_uncommittedContent.width();
+ auto& inlineItem = m_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 = !m_line.hasContent() && !m_lineHasFloatBox;
+ auto breakingContext = m_lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, m_line.trailingTrimmableWidth(), lineIsConsideredEmpty });
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
// Content does not fit the current line.
if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap)
- return closeLine();
+ return close();
// Partial content stays on the current line.
if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Split) {
@@ -204,7 +198,7 @@
ASSERT(inlineItem->isText());
ASSERT_NOT_IMPLEMENTED_YET();
- return closeLine();
+ return close();
}
ASSERT(breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Keep);
@@ -213,26 +207,40 @@
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);
- floats.append(makeWeakPtr(*inlineItem));
- ++committedInlineItemCount;
- lineHasFloatBox = true;
+ floatBox.isLeftFloatingPositioned() ? m_line.moveLogicalLeft(floatBoxWidth) : m_line.moveLogicalRight(floatBoxWidth);
+ m_floats.append(makeWeakPtr(*inlineItem));
+ ++m_committedInlineItemCount;
+ m_lineHasFloatBox = true;
continue;
}
- uncommittedContent.add(*inlineItem, itemLogicalWidth);
+ m_uncommittedContent.add(*inlineItem, itemLogicalWidth);
if (breakingContext.isAtBreakingOpportunity)
commitPendingContent();
if (inlineItem->isHardLineBreak())
- return closeLine();
+ return close();
}
commitPendingContent();
- return closeLine();
+ return close();
}
-void InlineFormattingContext::LineLayout::layout(const InlineItems& inlineItems, LayoutUnit widthConstraint) const
+LineInput::LineInput(const Line::InitialConstraints& initialLineConstraints, Line::SkipVerticalAligment skipVerticalAligment, InlineIndexAndSplitPosition firstToProcess, const InlineItems& inlineItems)
+ : initialConstraints(initialLineConstraints)
+ , skipVerticalAligment(skipVerticalAligment)
+ , firstInlineItem(firstToProcess)
+ , inlineItems(inlineItems)
{
+}
+
+InlineFormattingContext::InlineLayout::InlineLayout(const InlineFormattingContext& inlineFormattingContext)
+ : m_layoutState(inlineFormattingContext.layoutState())
+ , m_formattingRoot(downcast<Container>(inlineFormattingContext.root()))
+{
+}
+
+void InlineFormattingContext::InlineLayout::layout(const InlineItems& inlineItems, LayoutUnit widthConstraint) const
+{
ASSERT(!inlineItems.isEmpty());
auto& formattingRootDisplayBox = layoutState().displayBoxForLayoutBox(m_formattingRoot);
@@ -245,8 +253,8 @@
// Check for intruding floats and adjust logical left/available width for this line accordingly.
if (floatingState.isEmpty())
return;
- auto availableWidth = lineInput.horizontalConstraint.availableLogicalWidth;
- auto lineLogicalLeft = lineInput.horizontalConstraint.logicalTopLeft.x();
+ auto availableWidth = lineInput.initialConstraints.availableLogicalWidth;
+ auto lineLogicalLeft = lineInput.initialConstraints.logicalTopLeft.x();
auto floatConstraints = floatingState.constraints({ lineLogicalTop }, m_formattingRoot);
// Check if these constraints actually put limitation on the line.
if (floatConstraints.left && floatConstraints.left->x <= formattingRootDisplayBox.contentBoxLeft())
@@ -273,15 +281,15 @@
ASSERT(floatConstraints.right->x >= lineLogicalLeft);
availableWidth = floatConstraints.right->x - lineLogicalLeft;
}
- lineInput.horizontalConstraint.availableLogicalWidth = availableWidth;
- lineInput.horizontalConstraint.logicalTopLeft.setX(lineLogicalLeft);
+ lineInput.initialConstraints.availableLogicalWidth = availableWidth;
+ lineInput.initialConstraints.logicalTopLeft.setX(lineLogicalLeft);
};
InlineIndexAndSplitPosition currentInlineItem;
while (currentInlineItem.index < inlineItems.size()) {
- auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line::SkipVerticalAligment::No, currentInlineItem, inlineItems };
+ auto lineInput = LineInput { { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Quirks::lineHeightConstraints(layoutState(), m_formattingRoot) }, Line::SkipVerticalAligment::No, currentInlineItem, inlineItems };
applyFloatConstraint(lineInput);
- auto lineContent = placeInlineItems(lineInput);
+ auto lineContent = LineLayout(layoutState(), lineInput).layout();
createDisplayRuns(*lineContent.runs, lineContent.floats, widthConstraint);
if (!lineContent.lastCommitted) {
// Floats prevented us putting any content on the line.
@@ -295,12 +303,12 @@
}
}
-LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(const InlineItems& inlineItems, LayoutUnit widthConstraint) const
+LayoutUnit InlineFormattingContext::InlineLayout::computedIntrinsicWidth(const InlineItems& inlineItems, LayoutUnit widthConstraint) const
{
LayoutUnit maximumLineWidth;
InlineIndexAndSplitPosition currentInlineItem;
while (currentInlineItem.index < inlineItems.size()) {
- auto lineContent = placeInlineItems({ { }, widthConstraint, Line::SkipVerticalAligment::Yes, currentInlineItem, inlineItems });
+ auto lineContent = LineLayout(layoutState(), { { { }, widthConstraint, Quirks::lineHeightConstraints(layoutState(), m_formattingRoot) }, Line::SkipVerticalAligment::Yes, currentInlineItem, inlineItems }).layout();
currentInlineItem = { lineContent.lastCommitted->index + 1, WTF::nullopt };
LayoutUnit floatsWidth;
for (auto& floatItem : lineContent.floats)
@@ -310,7 +318,7 @@
return maximumLineWidth;
}
-void InlineFormattingContext::LineLayout::createDisplayRuns(const Line::Content& lineContent, const Vector<WeakPtr<InlineItem>>& floats, LayoutUnit widthConstraint) const
+void InlineFormattingContext::InlineLayout::createDisplayRuns(const Line::Content& lineContent, const Vector<WeakPtr<InlineItem>>& floats, LayoutUnit widthConstraint) const
{
auto& formattingState = downcast<InlineFormattingState>(layoutState().establishedFormattingState(m_formattingRoot));
auto& floatingState = formattingState.floatingState();
@@ -445,7 +453,7 @@
return { };
}
-void InlineFormattingContext::LineLayout::alignRuns(TextAlignMode textAlign, InlineRuns& inlineDisplayRuns, unsigned firstRunIndex, LayoutUnit availableWidth) const
+void InlineFormattingContext::InlineLayout::alignRuns(TextAlignMode textAlign, InlineRuns& inlineDisplayRuns, unsigned firstRunIndex, LayoutUnit availableWidth) const
{
auto adjustment = horizontalAdjustmentForAlignment(textAlign, availableWidth);
if (!adjustment)
Modified: branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.cpp (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.cpp 2019-07-19 01:39:52 UTC (rev 247630)
@@ -53,11 +53,11 @@
Line::Line(const LayoutState& layoutState, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment)
: m_layoutState(layoutState)
, m_content(std::make_unique<Line::Content>())
- , m_logicalTopLeft(initialConstraints.topLeft)
+ , m_logicalTopLeft(initialConstraints.logicalTopLeft)
, m_baseline({ initialConstraints.heightAndBaseline.baselineOffset, initialConstraints.heightAndBaseline.height - initialConstraints.heightAndBaseline.baselineOffset })
, m_initialStrut(initialConstraints.heightAndBaseline.strut)
, m_lineLogicalHeight(initialConstraints.heightAndBaseline.height)
- , m_lineLogicalWidth(initialConstraints.availableWidth)
+ , m_lineLogicalWidth(initialConstraints.availableLogicalWidth)
, m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
{
}
Modified: branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.h (247629 => 247630)
--- branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-07-19 01:39:46 UTC (rev 247629)
+++ branches/safari-608-branch/Source/WebCore/layout/inlineformatting/InlineLine.h 2019-07-19 01:39:52 UTC (rev 247630)
@@ -39,8 +39,8 @@
WTF_MAKE_ISO_ALLOCATED(Line);
public:
struct InitialConstraints {
- LayoutPoint topLeft;
- LayoutUnit availableWidth;
+ LayoutPoint logicalTopLeft;
+ LayoutUnit availableLogicalWidth;
struct HeightAndBaseline {
LayoutUnit height;
LayoutUnit baselineOffset;
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes