Title: [270448] trunk/Source/WebCore
Revision
270448
Author
za...@apple.com
Date
2020-12-04 12:05:59 -0800 (Fri, 04 Dec 2020)

Log Message

[LFC][IFC] Move float constraint logic from initialConstraintsForLine to a dedicated function
https://bugs.webkit.org/show_bug.cgi?id=219526

Reviewed by Antti Koivisto.

We are going to call this new function whenever the line stretches vertically and not just once at the very beginning.

* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::floatConstraints const):
(WebCore::Layout::LineBuilder::initialConstraintsForLine const):
(WebCore::Layout::LineBuilder::initialConstraintsForLine): Deleted.
* layout/inlineformatting/InlineLineBuilder.h:
(WebCore::Layout::LineBuilder::floatingState const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (270447 => 270448)


--- trunk/Source/WebCore/ChangeLog	2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/ChangeLog	2020-12-04 20:05:59 UTC (rev 270448)
@@ -1,3 +1,19 @@
+2020-12-04  Zalan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Move float constraint logic from initialConstraintsForLine to a dedicated function
+        https://bugs.webkit.org/show_bug.cgi?id=219526
+
+        Reviewed by Antti Koivisto.
+
+        We are going to call this new function whenever the line stretches vertically and not just once at the very beginning.
+
+        * layout/inlineformatting/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::floatConstraints const):
+        (WebCore::Layout::LineBuilder::initialConstraintsForLine const):
+        (WebCore::Layout::LineBuilder::initialConstraintsForLine): Deleted.
+        * layout/inlineformatting/InlineLineBuilder.h:
+        (WebCore::Layout::LineBuilder::floatingState const):
+
 2020-12-04  Kate Cheney  <katherine_che...@apple.com>
 
         Create API to enable/disable text interaction gestures in WKWebView

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp (270447 => 270448)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-12-04 20:05:59 UTC (rev 270448)
@@ -360,42 +360,53 @@
     return lineRange;
 }
 
-LineBuilder::UsedConstraints LineBuilder::initialConstraintsForLine(const InlineRect& lineLogicalConstraints, bool isFirstLine)
+Optional<HorizontalConstraints> LineBuilder::floatConstraints(const InlineRect& lineLogicalRect) const
 {
-    auto lineLogicalLeft = lineLogicalConstraints.left();
-    auto lineLogicalTop = lineLogicalConstraints.top();
-    auto lineLogicalRight = lineLogicalLeft + lineLogicalConstraints.width();
-    auto lineIsConstrainedByFloat = false;
+    auto* floatingState = this->floatingState();
+    if (!floatingState || floatingState->floats().isEmpty())
+        return { };
 
     // Check for intruding floats and adjust logical left/available width for this line accordingly.
-    if (auto* floatingState = this->floatingState()) {
-        auto floatingContext = FloatingContext { formattingContext(), *floatingState };
-        if (!floatingContext.isEmpty()) {
-            // FIXME: Add support for variable line height, where the floats should be probed as the line height grows.
-            auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + lineLogicalConstraints.height()));
-            // Check if these values actually constrain the line.
-            if (floatConstraints.left && floatConstraints.left->x <= lineLogicalLeft)
-                floatConstraints.left = { };
+    auto floatingContext = FloatingContext { formattingContext(), *floatingState };
+    auto constraints = floatingContext.constraints(toLayoutUnit(lineLogicalRect.top()), toLayoutUnit(lineLogicalRect.bottom()));
+    // Check if these values actually constrain the line.
+    if (constraints.left && constraints.left->x <= lineLogicalRect.left())
+        constraints.left = { };
 
-            if (floatConstraints.right && floatConstraints.right->x >= lineLogicalRight)
-                floatConstraints.right = { };
+    if (constraints.right && constraints.right->x >= lineLogicalRect.right())
+        constraints.right = { };
 
-            lineIsConstrainedByFloat = floatConstraints.left || floatConstraints.right;
+    if (!constraints.left && !constraints.right)
+        return { };
 
-            if (floatConstraints.left && floatConstraints.right) {
-                ASSERT(floatConstraints.left->x <= floatConstraints.right->x);
-                lineLogicalRight = floatConstraints.right->x;
-                lineLogicalLeft = floatConstraints.left->x;
-            } else if (floatConstraints.left) {
-                ASSERT(floatConstraints.left->x >= lineLogicalLeft);
-                lineLogicalLeft = floatConstraints.left->x;
-            } else if (floatConstraints.right) {
-                // Right float boxes may overflow the containing block on the left.
-                lineLogicalRight = std::max<InlineLayoutUnit>(lineLogicalLeft, floatConstraints.right->x);
-            }
-        }
+    auto lineLogicalLeft = lineLogicalRect.left();
+    auto lineLogicalRight = lineLogicalRect.right();
+    if (constraints.left && constraints.right) {
+        ASSERT(constraints.left->x <= constraints.right->x);
+        lineLogicalRight = constraints.right->x;
+        lineLogicalLeft = constraints.left->x;
+    } else if (constraints.left) {
+        ASSERT(constraints.left->x >= lineLogicalLeft);
+        lineLogicalLeft = constraints.left->x;
+    } else if (constraints.right) {
+        // Right float boxes may overflow the containing block on the left.
+        lineLogicalRight = std::max<InlineLayoutUnit>(lineLogicalLeft, constraints.right->x);
     }
+    return HorizontalConstraints { toLayoutUnit(lineLogicalLeft), toLayoutUnit(lineLogicalRight - lineLogicalLeft) };
+}
 
+LineBuilder::UsedConstraints LineBuilder::initialConstraintsForLine(const InlineRect& initialLineLogicalRect, bool isFirstLine) const
+{
+    auto lineLogicalLeft = initialLineLogicalRect.left();
+    auto lineLogicalRight = initialLineLogicalRect.right();
+    auto lineIsConstrainedByFloat = false;
+
+    if (auto lineConstraints = floatConstraints(initialLineLogicalRect)) {
+        lineLogicalLeft = lineConstraints->logicalLeft;
+        lineLogicalRight = lineConstraints->logicalRight();
+        lineIsConstrainedByFloat = true;
+    }
+
     auto computedTextIndent = [&]() -> InlineLayoutUnit {
         // text-indent property specifies the indentation applied to lines of inline content in a block.
         // The indent is treated as a margin applied to the start edge of the line box.
@@ -431,10 +442,10 @@
         auto textIndent = root.style().textIndent();
         if (textIndent == RenderStyle::initialTextIndent())
             return { };
-        return { minimumValueForLength(textIndent, lineLogicalConstraints.width()) };
+        return { minimumValueForLength(textIndent, initialLineLogicalRect.width()) };
     };
     lineLogicalLeft += computedTextIndent();
-    return UsedConstraints { { lineLogicalTop, lineLogicalLeft, lineLogicalRight - lineLogicalLeft, lineLogicalConstraints.height() }, lineIsConstrainedByFloat };
+    return UsedConstraints { { initialLineLogicalRect.top(), lineLogicalLeft, lineLogicalRight - lineLogicalLeft, initialLineLogicalRect.height() }, lineIsConstrainedByFloat };
 }
 
 void LineBuilder::candidateContentForLine(LineCandidate& lineCandidate, size_t currentInlineItemIndex, const InlineItemRange& layoutRange, size_t partialLeadingContentLength, InlineLayoutUnit currentLogicalRight)

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h (270447 => 270448)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-12-04 20:05:59 UTC (rev 270448)
@@ -87,7 +87,9 @@
         InlineRect logicalRect;
         bool isConstrainedByFloat { false };
     };
-    UsedConstraints initialConstraintsForLine(const InlineRect& initialLineConstraints, bool isFirstLine);
+    UsedConstraints initialConstraintsForLine(const InlineRect& initialLineLogicalRect, bool isFirstLine) const;
+    Optional<HorizontalConstraints> floatConstraints(const InlineRect& lineLogicalRect) const;
+
     void handleFloatContent(const InlineItem&);
     Result handleInlineContent(InlineContentBreaker&, const InlineItemRange& needsLayoutRange, const LineCandidate&);
     size_t rebuildLine(const InlineItemRange& needsLayoutRange, const InlineItem& lastInlineItemToAdd);
@@ -107,6 +109,7 @@
     const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
     InlineFormattingState* formattingState() { return m_inlineFormattingState; }
     FloatingState* floatingState() { return m_floatingState; }
+    const FloatingState* floatingState() const { return m_floatingState; }
     const ContainerBox& root() const;
     const LayoutState& layoutState() const;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to