Title: [247630] branches/safari-608-branch/Source/WebCore
Revision
247630
Author
alanc...@apple.com
Date
2019-07-18 18:39:52 -0700 (Thu, 18 Jul 2019)

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

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

Reply via email to