Title: [246154] trunk/Source/WebCore
Revision
246154
Author
[email protected]
Date
2019-06-06 07:50:54 -0700 (Thu, 06 Jun 2019)

Log Message

[LFC][IFC] Layout and preferred width computation should both call placeInlineItems().
https://bugs.webkit.org/show_bug.cgi?id=198587
<rdar://problem/51460340>

Reviewed by Antti Koivisto.

This patch enables inline placement logic sharing between layout and preferred width computation.

* layout/inlineformatting/InlineFormattingContext.h:
* layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
(WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput):
(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
(WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
(WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246153 => 246154)


--- trunk/Source/WebCore/ChangeLog	2019-06-06 14:12:15 UTC (rev 246153)
+++ trunk/Source/WebCore/ChangeLog	2019-06-06 14:50:54 UTC (rev 246154)
@@ -1,3 +1,20 @@
+2019-06-06  Zalan Bujtas  <[email protected]>
+
+        [LFC][IFC] Layout and preferred width computation should both call placeInlineItems().
+        https://bugs.webkit.org/show_bug.cgi?id=198587
+        <rdar://problem/51460340>
+
+        Reviewed by Antti Koivisto.
+
+        This patch enables inline placement logic sharing between layout and preferred width computation.
+
+        * layout/inlineformatting/InlineFormattingContext.h:
+        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+        (WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::layout const):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
+
 2019-06-05  Takashi Komori  <[email protected]>
 
         [Curl] Report all request headers to web inspector.

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (246153 => 246154)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-06 14:12:15 UTC (rev 246153)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-06 14:50:54 UTC (rev 246154)
@@ -66,7 +66,8 @@
         };
 
         struct LineInput {
-            LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems&);
+            enum class SkipVerticalAligment { No, Yes };
+            LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&);
             struct HorizontalConstraint {
                 HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth);
 
@@ -74,6 +75,8 @@
                 LayoutUnit availableLogicalWidth;
             };
             HorizontalConstraint horizontalConstraint;
+            // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out) 
+            SkipVerticalAligment skipVerticalAligment;
             unsigned firstInlineItemIndex { 0 };
             const InlineItems& inlineItems;
         };

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246153 => 246154)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-06 14:12:15 UTC (rev 246153)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-06 14:50:54 UTC (rev 246154)
@@ -78,8 +78,9 @@
 {
 }
 
-InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
+InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)
     : horizontalConstraint(logicalTopLeft, availableLogicalWidth)
+    , skipVerticalAligment(skipVerticalAligment)
     , firstInlineItemIndex(firstInlineItemIndex)
     , inlineItems(inlineItems)
 {
@@ -220,15 +221,17 @@
             ++committedInlineItemCount;
             continue;
         }
-        if (inlineItem->isHardLineBreak()) {
-            uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
-            commitPendingContent();
-            return closeLine();
-        }
 
-        uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
+        Optional<LayoutUnit> itemLogicalHeight;
+        if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No)
+            itemLogicalHeight = inlineItemHeight(layoutState(), *inlineItem);
+        uncommittedContent.add(*inlineItem, { itemLogicalWidth, itemLogicalHeight });
+
         if (breakingContext.isAtBreakingOpportunity)
             commitPendingContent();
+
+        if (inlineItem->isHardLineBreak())
+            return closeLine();
     }
     commitPendingContent();
     return closeLine();
@@ -275,7 +278,7 @@
     auto& inlineItems = m_formattingState.inlineItems();
     unsigned currentInlineItemIndex = 0;
     while (currentInlineItemIndex < inlineItems.size()) {
-        auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, currentInlineItemIndex, inlineItems };
+        auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };
         applyFloatConstraint(lineInput.horizontalConstraint);
         auto lineContent = placeInlineItems(lineInput);
         createDisplayRuns(*lineContent.runs, lineContent.floats, widthConstraint);
@@ -288,31 +291,18 @@
 
 LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const
 {
-    // FIXME: Consider running it through layout().
     LayoutUnit maximumLineWidth;
-    LayoutUnit lineLogicalRight;
-    LayoutUnit trimmableTrailingWidth;
-
-    LineBreaker lineBreaker;
-    auto& inlineContent = m_formattingState.inlineItems();
-    for (auto& inlineItem : inlineContent) {
-        auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight);
-        auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight });
-        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) {
-            maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
-            trimmableTrailingWidth = { };
-            lineLogicalRight = { };
-        }
-        if (TextUtil::isTrimmableContent(*inlineItem)) {
-            // Skip leading whitespace.
-            if (!lineLogicalRight)
-                continue;
-            trimmableTrailingWidth += logicalWidth;
-        } else
-            trimmableTrailingWidth = { };
-        lineLogicalRight += logicalWidth;
+    auto& inlineItems = m_formattingState.inlineItems();
+    unsigned currentInlineItemIndex = 0;
+    while (currentInlineItemIndex < inlineItems.size()) {
+        auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });
+        currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1;
+        LayoutUnit floatsWidth;
+        for (auto& floatItem : lineContent.floats)
+            floatsWidth += layoutState().displayBoxForLayoutBox(floatItem->layoutBox()).marginBoxWidth();
+        maximumLineWidth = std::max(maximumLineWidth, floatsWidth + lineContent.runs->logicalWidth());
     }
-    return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
+    return maximumLineWidth;
 }
 
 void InlineFormattingContext::LineLayout::createDisplayRuns(const Line::Content& lineContent, const Vector<WeakPtr<InlineItem>>& floats, LayoutUnit widthConstraint) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to