Title: [246063] trunk/Source/WebCore
Revision
246063
Author
[email protected]
Date
2019-06-04 08:26:04 -0700 (Tue, 04 Jun 2019)

Log Message

[LFC][IFC] Move run width measuring out of LineBreaker
https://bugs.webkit.org/show_bug.cgi?id=198491
<rdar://problem/51363554>

Reviewed by Antti Koivisto.

LineBreaker should not need to deal with measuring runs.
This is also in preparation for removing InlineItem::width().

* layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
(WebCore::Layout::inlineItemWidth):
(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
(WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
* layout/inlineformatting/InlineLineBreaker.cpp:
(WebCore::Layout::LineBreaker::breakingContext):
(WebCore::Layout::LineBreaker::LineBreaker): Deleted.
(WebCore::Layout::LineBreaker::runWidth const): Deleted.
(WebCore::Layout::LineBreaker::textWidth const): Deleted.
* layout/inlineformatting/InlineLineBreaker.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246062 => 246063)


--- trunk/Source/WebCore/ChangeLog	2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/ChangeLog	2019-06-04 15:26:04 UTC (rev 246063)
@@ -1,5 +1,27 @@
 2019-06-04  Zalan Bujtas  <[email protected]>
 
+        [LFC][IFC] Move run width measuring out of LineBreaker
+        https://bugs.webkit.org/show_bug.cgi?id=198491
+        <rdar://problem/51363554>
+
+        Reviewed by Antti Koivisto.
+
+        LineBreaker should not need to deal with measuring runs.
+        This is also in preparation for removing InlineItem::width().
+
+        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+        (WebCore::Layout::inlineItemWidth):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+        (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const):
+        * layout/inlineformatting/InlineLineBreaker.cpp:
+        (WebCore::Layout::LineBreaker::breakingContext):
+        (WebCore::Layout::LineBreaker::LineBreaker): Deleted.
+        (WebCore::Layout::LineBreaker::runWidth const): Deleted.
+        (WebCore::Layout::LineBreaker::textWidth const): Deleted.
+        * layout/inlineformatting/InlineLineBreaker.h:
+
+2019-06-04  Zalan Bujtas  <[email protected]>
+
         [LFC][IFC] Remove redundant InlineItem::width() calls.
         https://bugs.webkit.org/show_bug.cgi?id=198489
         <rdar://problem/51360390>

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246062 => 246063)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-04 15:26:04 UTC (rev 246063)
@@ -83,6 +83,34 @@
 {
 }
 
+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 (inlineItem.isContainerStart())
+        return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
+
+    if (inlineItem.isContainerEnd())
+        return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
+
+    if (inlineItem.isFloat())
+        return displayBox.marginBoxWidth();
+
+    return displayBox.width();
+}
+
+
 static std::unique_ptr<Line> constructLine(const LayoutState& layoutState, const FloatingState& floatingState, const Box& formattingRoot,
     LayoutUnit lineLogicalTop, LayoutUnit availableWidth)
 {
@@ -140,7 +168,7 @@
         ASSERT(committedInlineItemCount);
         return LineContent { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1), line->close() };
     };
-    LineBreaker lineBreaker(layoutState());
+    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& inlineItem = lineInput.inlineItems[inlineItemIndex];
@@ -151,8 +179,9 @@
         }
         auto availableWidth = line->availableWidth() - uncommittedContent.width();
         auto currentLogicalRight = line->contentLogicalRight() + uncommittedContent.width();
+        inlineItem->setWidth(inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight));
         // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
-        auto breakingContext = lineBreaker.breakingContext(*inlineItem, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
+        auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItem->width(), { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
         if (breakingContext.isAtBreakingOpportunity)
             commitPendingContent();
 
@@ -206,10 +235,12 @@
     LayoutUnit lineLogicalRight;
     LayoutUnit trimmableTrailingWidth;
 
-    LineBreaker lineBreaker(layoutState());
+    LineBreaker lineBreaker;
     auto& inlineContent = m_formattingState.inlineItems();
     for (auto& inlineItem : inlineContent) {
-        auto breakingContext = lineBreaker.breakingContext(*inlineItem, { widthConstraint, lineLogicalRight, !lineLogicalRight });
+        auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight);
+        inlineItem->setWidth(logicalWidth);
+        auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight });
         if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) {
             maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
             trimmableTrailingWidth = { };
@@ -219,10 +250,10 @@
             // Skip leading whitespace.
             if (!lineLogicalRight)
                 continue;
-            trimmableTrailingWidth += inlineItem->width();
+            trimmableTrailingWidth += logicalWidth;
         } else
             trimmableTrailingWidth = { };
-        lineLogicalRight += inlineItem->width();
+        lineLogicalRight += logicalWidth;
     }
     return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth);
 }

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp (246062 => 246063)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp	2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp	2019-06-04 15:26:04 UTC (rev 246063)
@@ -34,16 +34,10 @@
 namespace WebCore {
 namespace Layout {
 
-LineBreaker::LineBreaker(const LayoutState& layoutState)
-    : m_layoutState(layoutState)
+LineBreaker::BreakingContext LineBreaker::breakingContext(const InlineItem& inlineItem, LayoutUnit logicalWidth, const LineContext& lineContext)
 {
-}
-
-LineBreaker::BreakingContext LineBreaker::breakingContext(InlineItem& inlineItem, LineContext lineContext)
-{
-    inlineItem.setWidth(runWidth(inlineItem, lineContext.logicalLeft));
     // First content always stays on line.
-    if (lineContext.isEmpty || inlineItem.width() <= lineContext.availableWidth)
+    if (lineContext.isEmpty || logicalWidth <= lineContext.availableWidth)
         return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
 
     if (is<InlineTextItem>(inlineItem))
@@ -51,7 +45,7 @@
 
     // Wrap non-text boxes to the next line unless we can trim trailing whitespace.
     auto availableWidth = lineContext.availableWidth + lineContext.trimmableWidth;
-    if (inlineItem.width() <= availableWidth)
+    if (logicalWidth <= availableWidth)
         return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
     return { BreakingBehavior::Wrap, isAtBreakingOpportunity(inlineItem) };
 }
@@ -88,30 +82,6 @@
     return lineIsEmpty ? BreakingBehavior::Keep : BreakingBehavior::Wrap;
 }
 
-LayoutUnit LineBreaker::runWidth(const InlineItem& inlineItem, LayoutUnit contentLogicalLeft) const
-{
-    if (inlineItem.isLineBreak())
-        return 0;
-
-    if (is<InlineTextItem>(inlineItem))
-        return textWidth(downcast<InlineTextItem>(inlineItem), contentLogicalLeft);
-
-    auto& layoutBox = inlineItem.layoutBox();
-    ASSERT(m_layoutState.hasDisplayBox(layoutBox));
-    auto& displayBox = m_layoutState.displayBoxForLayoutBox(layoutBox);
-
-    if (inlineItem.isContainerStart())
-        return displayBox.marginStart() + displayBox.borderLeft() + displayBox.paddingLeft().valueOr(0);
-
-    if (inlineItem.isContainerEnd())
-        return displayBox.marginEnd() + displayBox.borderRight() + displayBox.paddingRight().valueOr(0);
-
-    if (inlineItem.isFloat())
-        return displayBox.marginBoxWidth();
-
-    return displayBox.width();
-}
-
 bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem)
 {
     if (is<InlineTextItem>(inlineItem))
@@ -119,11 +89,6 @@
     return !inlineItem.isFloat() && !inlineItem.isContainerStart() && !inlineItem.isContainerEnd();
 }
 
-LayoutUnit LineBreaker::textWidth(const InlineTextItem& inlineTextItem, LayoutUnit contentLogicalLeft) const
-{
-    auto end = inlineTextItem.isCollapsed() ? inlineTextItem.start() + 1 : inlineTextItem.end();
-    return TextUtil::width(downcast<InlineBox>(inlineTextItem.layoutBox()), inlineTextItem.start(), end, contentLogicalLeft);
 }
 }
-}
 #endif

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h (246062 => 246063)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h	2019-06-04 14:54:52 UTC (rev 246062)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h	2019-06-04 15:26:04 UTC (rev 246063)
@@ -34,8 +34,6 @@
 
 class LineBreaker {
 public:
-    LineBreaker(const LayoutState&);
-
     enum class BreakingBehavior { Keep, Break, Wrap };
     struct BreakingContext {
         BreakingBehavior breakingBehavior;
@@ -47,16 +45,13 @@
         LayoutUnit trimmableWidth;
         bool isEmpty { false };
     };
-    BreakingContext breakingContext(InlineItem&, const LineContext);
+    BreakingContext breakingContext(const InlineItem&, LayoutUnit logicalWidth, const LineContext&);
 
 private:
 
     BreakingBehavior wordBreakingBehavior(const InlineTextItem&, bool lineIsEmpty) const;
     bool isAtBreakingOpportunity(const InlineItem&);
-    LayoutUnit runWidth(const InlineItem&, LayoutUnit contentLogicalLeft) const;
-    LayoutUnit textWidth(const InlineTextItem&, LayoutUnit contentLogicalLeft) const;
 
-    const LayoutState& m_layoutState;
     bool m_hyphenationIsDisabled { true };
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to