Title: [246105] trunk/Source/WebCore
Revision
246105
Author
[email protected]
Date
2019-06-05 07:47:20 -0700 (Wed, 05 Jun 2019)

Log Message

[LFC][IFC] Move inline item height computation to a dedicated function
https://bugs.webkit.org/show_bug.cgi?id=198550
<rdar://problem/51424223>

Reviewed by Antti Koivisto.

The inlineItem height value is not available during preferred width computation (hence optional).

* layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
(WebCore::Layout::UncommittedContent::add):
(WebCore::Layout::inlineItemWidth):
(WebCore::Layout::inlineItemHeight):
(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
* layout/inlineformatting/InlineLine.cpp:
(WebCore::Layout::Line::appendInlineContainerStart):
(WebCore::Layout::Line::appendInlineContainerEnd):
(WebCore::Layout::Line::appendTextContent):
(WebCore::Layout::Line::appendNonReplacedInlineBox):
(WebCore::Layout::Line::appendReplacedInlineBox):
* layout/inlineformatting/InlineLine.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246104 => 246105)


--- trunk/Source/WebCore/ChangeLog	2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/ChangeLog	2019-06-05 14:47:20 UTC (rev 246105)
@@ -1,3 +1,26 @@
+2019-06-05  Zalan Bujtas  <[email protected]>
+
+        [LFC][IFC] Move inline item height computation to a dedicated function
+        https://bugs.webkit.org/show_bug.cgi?id=198550
+        <rdar://problem/51424223>
+
+        Reviewed by Antti Koivisto.
+
+        The inlineItem height value is not available during preferred width computation (hence optional). 
+
+        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+        (WebCore::Layout::UncommittedContent::add):
+        (WebCore::Layout::inlineItemWidth):
+        (WebCore::Layout::inlineItemHeight):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+        * layout/inlineformatting/InlineLine.cpp:
+        (WebCore::Layout::Line::appendInlineContainerStart):
+        (WebCore::Layout::Line::appendInlineContainerEnd):
+        (WebCore::Layout::Line::appendTextContent):
+        (WebCore::Layout::Line::appendNonReplacedInlineBox):
+        (WebCore::Layout::Line::appendReplacedInlineBox):
+        * layout/inlineformatting/InlineLine.h:
+
 2019-06-01  Antoine Quint  <[email protected]>
 
         [Pointer Events] Add support for chorded button interactions

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246104 => 246105)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-05 14:47:20 UTC (rev 246105)
@@ -44,10 +44,10 @@
 struct UncommittedContent {
     struct Run {
         const InlineItem& inlineItem;
-        LayoutUnit logicalWidth;
+        Line::InlineItemSize size;
         // FIXME: add optional breaking context (start and end position) for split text content.
     };
-    void add(const InlineItem&, LayoutUnit logicalWidth);
+    void add(const InlineItem&, const Line::InlineItemSize&);
     void reset();
 
     Vector<Run> runs() { return m_uncommittedRuns; }
@@ -60,10 +60,10 @@
     LayoutUnit m_width;
 };
 
-void UncommittedContent::add(const InlineItem& inlineItem, LayoutUnit logicalWidth)
+void UncommittedContent::add(const InlineItem& inlineItem, const Line::InlineItemSize& size)
 {
-    m_uncommittedRuns.append({ inlineItem, logicalWidth });
-    m_width += logicalWidth;
+    m_uncommittedRuns.append({ inlineItem, size });
+    m_width += size.logicalWidth;
 }
 
 void UncommittedContent::reset()
@@ -103,6 +103,12 @@
     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);
 
@@ -109,13 +115,33 @@
     if (inlineItem.isContainerEnd())
         return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
 
-    if (inlineItem.isFloat())
-        return displayBox.marginBoxWidth();
-
+    // Non-replaced inline box (e.g. inline-block)
     return displayBox.width();
 }
 
+static LayoutUnit inlineItemHeight(const LayoutState& layoutState, const InlineItem& inlineItem)
+{
+    auto& fontMetrics = inlineItem.style().fontMetrics();
+    if (inlineItem.isLineBreak() || is<InlineTextItem>(inlineItem))
+        return fontMetrics.height();
 
+    auto& layoutBox = inlineItem.layoutBox();
+    ASSERT(layoutState.hasDisplayBox(layoutBox));
+    auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
+
+    if (layoutBox.isFloatingPositioned())
+        return displayBox.marginBox().height();
+
+    if (layoutBox.isReplaced())
+        return displayBox.height();
+
+    if (inlineItem.isContainerStart() || inlineItem.isContainerEnd())
+        return fontMetrics.height() + displayBox.verticalBorder() + displayBox.verticalPadding().valueOr(0);
+
+    // Non-replaced inline box (e.g. inline-block)
+    return displayBox.height();
+}
+
 static std::unique_ptr<Line> constructLine(const LayoutState& layoutState, const FloatingState& floatingState, const Box& formattingRoot,
     LayoutUnit lineLogicalTop, LayoutUnit availableWidth)
 {
@@ -165,38 +191,18 @@
         committedInlineItemCount += uncommittedContent.size();
         for (auto& uncommittedRun : uncommittedContent.runs()) {
             auto& inlineItem = uncommittedRun.inlineItem;
-            if (inlineItem.isHardLineBreak()) {
+            if (inlineItem.isHardLineBreak())
                 line->appendHardLineBreak(inlineItem);
-                continue;
-            }
-
-            auto width = uncommittedRun.logicalWidth;
-            auto& fontMetrics = inlineItem.style().fontMetrics();
-            if (is<InlineTextItem>(inlineItem)) {
-                line->appendTextContent(downcast<InlineTextItem>(inlineItem), { width, fontMetrics.height() });
-                continue;
-            }
-
-            auto& layoutBox = inlineItem.layoutBox();
-            auto& displayBox = layoutState().displayBoxForLayoutBox(layoutBox);
-
-            if (inlineItem.isContainerStart()) {
-                auto containerHeight = fontMetrics.height() + displayBox.verticalBorder() + displayBox.verticalPadding().valueOr(0);
-                line->appendInlineContainerStart(inlineItem, { width, containerHeight });
-                continue;
-            }
-
-            if (inlineItem.isContainerEnd()) {
-                line->appendInlineContainerEnd(inlineItem, { width, 0 });
-                continue;
-            }
-
-            if (layoutBox.isReplaced()) {
-                line->appendReplacedInlineBox(inlineItem, { width, displayBox.height() });
-                continue;
-            }
-
-            line->appendNonReplacedInlineBox(inlineItem, { width, displayBox.height() });
+            else if (is<InlineTextItem>(inlineItem))
+                line->appendTextContent(downcast<InlineTextItem>(inlineItem), uncommittedRun.size);
+            else if (inlineItem.isContainerStart())
+                line->appendInlineContainerStart(inlineItem, uncommittedRun.size);
+            else if (inlineItem.isContainerEnd())
+                line->appendInlineContainerEnd(inlineItem, uncommittedRun.size);
+            else if (inlineItem.layoutBox().isReplaced())
+                line->appendReplacedInlineBox(inlineItem, uncommittedRun.size);
+            else
+                line->appendNonReplacedInlineBox(inlineItem, uncommittedRun.size);
         }
         uncommittedContent.reset();
     };
@@ -212,10 +218,10 @@
         auto availableWidth = line->availableWidth() - uncommittedContent.width();
         auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
         auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
-        auto inlineItemWidth = WebCore::Layout::inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
+        auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
 
         // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
-        auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
+        auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
         if (breakingContext.isAtBreakingOpportunity)
             commitPendingContent();
 
@@ -243,12 +249,12 @@
             continue;
         }
         if (inlineItem->isHardLineBreak()) {
-            uncommittedContent.add(*inlineItem, inlineItemWidth);
+            uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
             commitPendingContent();
             return closeLine();
         }
 
-        uncommittedContent.add(*inlineItem, inlineItemWidth);
+        uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) });
         if (breakingContext.isAtBreakingOpportunity)
             commitPendingContent();
     }

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246104 => 246105)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-05 14:47:20 UTC (rev 246105)
@@ -119,7 +119,7 @@
     m_contentLogicalWidth += logicalRect.width();
 }
 
-void Line::appendInlineContainerStart(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendInlineContainerStart(const InlineItem& inlineItem, InlineItemSize runSize)
 {
     auto& layoutBox = inlineItem.layoutBox();
     auto& style = layoutBox.style();
@@ -138,18 +138,18 @@
     alignAndAdjustLineHeight();
     auto& displayBox = m_layoutState.displayBoxForLayoutBox(layoutBox);
     auto logicalTop = -fontMetrics.ascent() - displayBox.borderTop() - displayBox.paddingTop().valueOr(0);
-    auto logicalRect = Display::Rect { logicalTop, contentLogicalRight(), runSize.width(), runSize.height() };
+    auto logicalRect = Display::Rect { logicalTop, contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
     appendNonBreakableSpace(inlineItem, logicalRect);
 }
 
-void Line::appendInlineContainerEnd(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendInlineContainerEnd(const InlineItem& inlineItem, InlineItemSize runSize)
 {
     // This is really just a placeholder to mark the end of the inline level container.
-    auto logicalRect = Display::Rect { 0, contentLogicalRight(), runSize.width(), runSize.height() };
+    auto logicalRect = Display::Rect { 0, contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
     appendNonBreakableSpace(inlineItem, logicalRect);
 }
 
-void Line::appendTextContent(const InlineTextItem& inlineItem, LayoutSize runSize)
+void Line::appendTextContent(const InlineTextItem& inlineItem, InlineItemSize runSize)
 {
     auto isTrimmable = TextUtil::isTrimmableContent(inlineItem);
     if (!isTrimmable)
@@ -177,7 +177,7 @@
     // Collapsed line items don't contribute to the line width.
     auto isCompletelyCollapsed = shouldCollapseCompletely();
     auto canBeExtended = !isCompletelyCollapsed && !inlineItem.isCollapsed();
-    auto logicalRect = Display::Rect { -inlineItem.style().fontMetrics().ascent(), contentLogicalRight(), runSize.width(), runSize.height() };
+    auto logicalRect = Display::Rect { -inlineItem.style().fontMetrics().ascent(), contentLogicalRight(), runSize.logicalWidth, runSize.logicalHeight.valueOr(0) };
     auto textContext = Display::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() };
     auto displayRun = Display::Run(logicalRect, textContext);
 
@@ -186,13 +186,13 @@
         m_trimmableContent.add(lineItem.get());
 
     m_content->runs().append(WTFMove(lineItem));
-    m_contentLogicalWidth += isCompletelyCollapsed ? LayoutUnit() : runSize.width();
+    m_contentLogicalWidth += isCompletelyCollapsed ? LayoutUnit() : runSize.logicalWidth;
 }
 
-void Line::appendNonReplacedInlineBox(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendNonReplacedInlineBox(const InlineItem& inlineItem, InlineItemSize runSize)
 {
+    auto inlineBoxHeight = runSize.logicalHeight.valueOr(0);
     auto alignAndAdjustLineHeight = [&] {
-        auto inlineBoxHeight = runSize.height();
         // FIXME: We need to look inside the inline-block's formatting context and check the lineboxes (if any) to be able to baseline align.
         if (inlineItem.layoutBox().establishesInlineFormattingContext()) {
             if (inlineBoxHeight == logicalHeight())
@@ -209,16 +209,16 @@
 
     alignAndAdjustLineHeight();
     auto& displayBox = m_layoutState.displayBoxForLayoutBox(inlineItem.layoutBox());
-    auto logicalTop = -runSize.height();
+    auto logicalTop = -inlineBoxHeight;
     auto horizontalMargin = displayBox.horizontalMargin();
-    auto logicalRect = Display::Rect { logicalTop, contentLogicalRight() + horizontalMargin.start, runSize.width(), runSize.height() };
+    auto logicalRect = Display::Rect { logicalTop, contentLogicalRight() + horizontalMargin.start, runSize.logicalWidth, inlineBoxHeight };
 
     m_content->runs().append(std::make_unique<Content::Run>(Display::Run { logicalRect }, inlineItem, false, false));
-    m_contentLogicalWidth += (runSize.width() + horizontalMargin.start + horizontalMargin.end);
+    m_contentLogicalWidth += (runSize.logicalWidth + horizontalMargin.start + horizontalMargin.end);
     m_trimmableContent.clear();
 }
 
-void Line::appendReplacedInlineBox(const InlineItem& inlineItem, LayoutSize runSize)
+void Line::appendReplacedInlineBox(const InlineItem& inlineItem, InlineItemSize runSize)
 {
     // FIXME Surely replaced boxes behave differently.
     appendNonReplacedInlineBox(inlineItem, runSize);

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246104 => 246105)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-05 13:22:53 UTC (rev 246104)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-05 14:47:20 UTC (rev 246105)
@@ -75,11 +75,15 @@
     };
     std::unique_ptr<Content> close();
 
-    void appendTextContent(const InlineTextItem&, LayoutSize);
-    void appendNonReplacedInlineBox(const InlineItem&, LayoutSize);
-    void appendReplacedInlineBox(const InlineItem&, LayoutSize);
-    void appendInlineContainerStart(const InlineItem&, LayoutSize);
-    void appendInlineContainerEnd(const InlineItem&, LayoutSize);
+    struct InlineItemSize {
+        LayoutUnit logicalWidth;
+        Optional<LayoutUnit> logicalHeight;
+    };
+    void appendTextContent(const InlineTextItem&, InlineItemSize);
+    void appendNonReplacedInlineBox(const InlineItem&, InlineItemSize);
+    void appendReplacedInlineBox(const InlineItem&, InlineItemSize);
+    void appendInlineContainerStart(const InlineItem&, InlineItemSize);
+    void appendInlineContainerEnd(const InlineItem&, InlineItemSize);
     void appendHardLineBreak(const InlineItem&);
 
     bool hasContent() const { return !m_content->isVisuallyEmpty(); }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to