Title: [246633] trunk/Source/WebCore
Revision
246633
Author
za...@apple.com
Date
2019-06-20 06:59:12 -0700 (Thu, 20 Jun 2019)

Log Message

[LFC][IFC] Introduce Line::InitialConstraints
https://bugs.webkit.org/show_bug.cgi?id=199056
<rdar://problem/51927597>

Reviewed by Antti Koivisto.

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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246632 => 246633)


--- trunk/Source/WebCore/ChangeLog	2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/ChangeLog	2019-06-20 13:59:12 UTC (rev 246633)
@@ -1,3 +1,25 @@
+2019-06-20  Zalan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Introduce Line::InitialConstraints
+        https://bugs.webkit.org/show_bug.cgi?id=199056
+        <rdar://problem/51927597>
+
+        Reviewed by Antti Koivisto.
+
+        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-20  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Remove support for GTK2 plugins

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (246632 => 246633)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-20 13:59:12 UTC (rev 246633)
@@ -66,8 +66,7 @@
         };
 
         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 @@
             };
             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;

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246632 => 246633)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-20 13:59:12 UTC (rev 246633)
@@ -78,7 +78,7 @@
 {
 }
 
-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 @@
 
 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 @@
             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 @@
     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 @@
             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 @@
     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 @@
     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)

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246632 => 246633)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-20 13:59:12 UTC (rev 246633)
@@ -44,25 +44,17 @@
 {
 }
 
-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)
+    , 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)
 {
 }
 
-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)
-{
-}
-
 bool Line::isVisuallyEmpty() const
 {
     // FIXME: This should be cached instead -as the inline items are being added.

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246632 => 246633)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-20 11:08:29 UTC (rev 246632)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-20 13:59:12 UTC (rev 246633)
@@ -38,8 +38,14 @@
 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:
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to