Title: [266125] trunk/Source/WebCore
Revision
266125
Author
[email protected]
Date
2020-08-25 09:39:10 -0700 (Tue, 25 Aug 2020)

Log Message

[LFC][IFC] The initial alignment baseline is always set by the strut
https://bugs.webkit.org/show_bug.cgi?id=214785

Reviewed by Antti Koivisto.

Let's just use the strut ascent as the initial alignment baseline.

* layout/FormattingContext.h:
(WebCore::Layout::FormattingContext::root const):
* layout/inlineformatting/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
(WebCore::Layout::InlineFormattingContext::constraintsForLine):
* layout/inlineformatting/InlineFormattingContext.h:
* layout/inlineformatting/InlineFormattingContextQuirks.cpp:
(WebCore::Layout::InlineFormattingContext::Quirks::initialLineHeight const):
(WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints const): Deleted.
* layout/inlineformatting/InlineLineBox.h:
(WebCore::Layout::LineBox::LineBox):
* layout/inlineformatting/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::initialize):
(WebCore::Layout::LineBuilder::root const):
* layout/inlineformatting/InlineLineBuilder.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (266124 => 266125)


--- trunk/Source/WebCore/ChangeLog	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/ChangeLog	2020-08-25 16:39:10 UTC (rev 266125)
@@ -1,3 +1,28 @@
+2020-08-25  Zalan Bujtas  <[email protected]>
+
+        [LFC][IFC] The initial alignment baseline is always set by the strut
+        https://bugs.webkit.org/show_bug.cgi?id=214785
+
+        Reviewed by Antti Koivisto.
+
+        Let's just use the strut ascent as the initial alignment baseline.
+
+        * layout/FormattingContext.h:
+        (WebCore::Layout::FormattingContext::root const):
+        * layout/inlineformatting/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
+        (WebCore::Layout::InlineFormattingContext::constraintsForLine):
+        * layout/inlineformatting/InlineFormattingContext.h:
+        * layout/inlineformatting/InlineFormattingContextQuirks.cpp:
+        (WebCore::Layout::InlineFormattingContext::Quirks::initialLineHeight const):
+        (WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints const): Deleted.
+        * layout/inlineformatting/InlineLineBox.h:
+        (WebCore::Layout::LineBox::LineBox):
+        * layout/inlineformatting/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::initialize):
+        (WebCore::Layout::LineBuilder::root const):
+        * layout/inlineformatting/InlineLineBuilder.h:
+
 2020-08-25  Darin Adler  <[email protected]>
 
         REGRESSION (r266028): platform/ios/ios/fast/coordinates/range-client-rects.html

Modified: trunk/Source/WebCore/layout/FormattingContext.h (266124 => 266125)


--- trunk/Source/WebCore/layout/FormattingContext.h	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/FormattingContext.h	2020-08-25 16:39:10 UTC (rev 266125)
@@ -107,11 +107,11 @@
         TableNeedsAccessToTableWrapper
     };
     const Display::Box& geometryForBox(const Box&, Optional<EscapeReason> = WTF::nullopt) const;
+    const ContainerBox& root() const { return *m_root; }
 
 protected:
     using LayoutQueue = Vector<const Box*>;
 
-    const ContainerBox& root() const { return *m_root; }
     LayoutState& layoutState() const;
     const FormattingState& formattingState() const { return m_formattingState; }
     FormattingState& formattingState() { return m_formattingState; }

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp	2020-08-25 16:39:10 UTC (rev 266125)
@@ -256,7 +256,7 @@
     auto layoutRange = LineLayoutContext::InlineItemRange { 0 , inlineItems.size() };
     while (!layoutRange.isEmpty()) {
         // Only the horiztonal available width is constrained when computing intrinsic width.
-        lineBuilder.initialize(LineBuilder::Constraints { { }, availableWidth, false, { } });
+        lineBuilder.initialize(LineBuilder::Constraints { { }, availableWidth, { }, false });
         auto lineContent = lineLayoutContext.layoutLine(lineBuilder, layoutRange, { });
         layoutRange.start = *lineContent.trailingInlineItemIndex + 1;
         // FIXME: Use line logical left and right to take floats into account.
@@ -398,7 +398,7 @@
 {
     auto lineLogicalLeft = horizontalConstraints.logicalLeft;
     auto lineLogicalRight = lineLogicalLeft + horizontalConstraints.logicalWidth;
-    auto lineHeightAndBaseline = quirks().lineHeightConstraints(root());
+    auto initialLineHeight = quirks().initialLineHeight(root());
     auto lineIsConstrainedByFloat = false;
 
     auto floatingContext = FloatingContext { root(), *this, formattingState().floatingState() };
@@ -405,7 +405,7 @@
     // Check for intruding floats and adjust logical left/available width for this line accordingly.
     if (!floatingContext.isEmpty()) {
         // FIXME: Add support for variable line height, where the intrusive floats should be probed as the line height grows.
-        auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + lineHeightAndBaseline.height));
+        auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + initialLineHeight));
         // Check if these constraints actually put limitation on the line.
         if (floatConstraints.left && floatConstraints.left->x <= lineLogicalLeft)
             floatConstraints.left = { };
@@ -461,7 +461,7 @@
         return geometry().computedTextIndent(root, horizontalConstraints).valueOr(InlineLayoutUnit { });
     };
     lineLogicalLeft += computedTextIndent();
-    return LineBuilder::Constraints { { lineLogicalLeft, lineLogicalTop }, lineLogicalRight - lineLogicalLeft, lineIsConstrainedByFloat, lineHeightAndBaseline };
+    return LineBuilder::Constraints { { lineLogicalLeft, lineLogicalTop }, lineLogicalRight - lineLogicalLeft, initialLineHeight, lineIsConstrainedByFloat };
 }
 
 void InlineFormattingContext::setDisplayBoxesForLine(const LineLayoutContext::LineContent& lineContent, const HorizontalConstraints& horizontalConstraints)

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2020-08-25 16:39:10 UTC (rev 266125)
@@ -51,7 +51,7 @@
     class Quirks : public FormattingContext::Quirks {
     public:
         bool lineDescentNeedsCollapsing(const LineBuilder::RunList&) const;
-        LineBuilder::Constraints::HeightAndBaseline lineHeightConstraints(const ContainerBox& formattingRoot) const;
+        InlineLayoutUnit initialLineHeight(const ContainerBox& formattingRoot) const;
 
     private:
         friend class InlineFormattingContext;

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp	2020-08-25 16:39:10 UTC (rev 266125)
@@ -28,9 +28,6 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
-#include "InlineLineBuilder.h"
-#include "LayoutState.h"
-
 namespace WebCore {
 namespace Layout {
 
@@ -71,24 +68,13 @@
     return true;
 }
 
-LineBuilder::Constraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const ContainerBox& formattingRoot) const
+InlineLayoutUnit InlineFormattingContext::Quirks::initialLineHeight(const ContainerBox& formattingRoot) const
 {
-    // computedLineHeight takes font-size into account when line-height is not set.
-    // Strut is the imaginary box that we put on every line. It sets the initial vertical constraints for each new line.
-    InlineLayoutUnit strutHeight = formattingRoot.style().computedLineHeight();
-    auto strutBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent;
-    if (layoutState().inNoQuirksMode())
-        return { strutHeight, strutBaseline, { } };
-
-    auto lineHeight = formattingRoot.style().lineHeight();
-    if (lineHeight.isPercentOrCalculated()) {
-        auto initialBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), 0_lu).ascent;
-        return { initialBaseline, initialBaseline, AscentAndDescent { strutBaseline, strutHeight - strutBaseline } };
-    }
-    // FIXME: The only reason why we use intValue() here is to match current inline tree (integral)behavior.
-    InlineLayoutUnit initialLineHeight = lineHeight.intValue();
-    auto initialBaseline = LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent;
-    return { initialLineHeight, initialBaseline, AscentAndDescent { strutBaseline, strutHeight - strutBaseline } };
+    InlineLayoutUnit computedLineHeight = formattingRoot.style().computedLineHeight();
+    // Negative lineHeight value means the line-height is not set
+    if (layoutState().inNoQuirksMode() || !formattingRoot.style().lineHeight().isNegative())
+        return computedLineHeight;
+    return LineBuilder::halfLeadingMetrics(formattingRoot.style().fontMetrics(), computedLineHeight).height();
 }
 
 }

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h	2020-08-25 16:39:10 UTC (rev 266125)
@@ -50,7 +50,7 @@
         AscentAndDescent ascentAndDescent;
     };
 
-    LineBox(const Display::InlineRect&, const AscentAndDescent&, InlineLayoutUnit alignmentBaseline);
+    LineBox(const Display::InlineRect&, const AscentAndDescent&);
     LineBox() = default;
 
     const Display::InlineRect& logicalRect() const { return m_rect; }
@@ -125,9 +125,9 @@
     InlineBox m_rootInlineBox;
 };
 
-inline LineBox::LineBox(const Display::InlineRect& rect, const AscentAndDescent& ascentAndDescent, InlineLayoutUnit alignmentBaseline)
+inline LineBox::LineBox(const Display::InlineRect& rect, const AscentAndDescent& ascentAndDescent)
     : m_rect(rect)
-    , m_alignmentBaseline(alignmentBaseline)
+    , m_alignmentBaseline(ascentAndDescent.ascent)
     , m_rootInlineBox(ascentAndDescent)
 {
 #if ASSERT_ENABLED

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp	2020-08-25 16:39:10 UTC (rev 266125)
@@ -79,22 +79,16 @@
 
 void LineBuilder::initialize(const Constraints& constraints)
 {
-    ASSERT(m_isIntrinsicSizing || constraints.heightAndBaseline);
-
-    InlineLayoutUnit initialLineHeight = 0;
-    InlineLayoutUnit initialBaseline = 0;
-    if (constraints.heightAndBaseline) {
-        m_initialStrut = constraints.heightAndBaseline->strut;
-        initialLineHeight = constraints.heightAndBaseline->height;
-        initialBaseline = constraints.heightAndBaseline->baseline;
-    } else
-        m_initialStrut = { };
-
-    auto lineRect = Display::InlineRect { constraints.logicalTopLeft, 0_lu, initialLineHeight };
-    auto ascentAndDescent = AscentAndDescent { initialBaseline, initialLineHeight - initialBaseline };
-    m_lineBox = LineBox { lineRect, ascentAndDescent, initialBaseline };
     m_lineLogicalWidth = constraints.availableLogicalWidth;
     m_hasIntrusiveFloat = constraints.lineIsConstrainedByFloat;
+    auto initialLineHeight = constraints.lineHeight;
+    auto lineRect = Display::InlineRect { constraints.logicalTopLeft, 0_lu, initialLineHeight };
+    auto ascentAndDescent = LineBuilder::halfLeadingMetrics(root().style().fontMetrics(), initialLineHeight);
+    m_lineBox = LineBox { lineRect, ascentAndDescent };
+    if (!layoutState().inNoQuirksMode())
+        m_initialStrut = AscentAndDescent { ascentAndDescent.ascent, initialLineHeight - ascentAndDescent.ascent };
+    else
+        m_initialStrut = { };
 
     resetContent();
 }
@@ -727,6 +721,11 @@
     return m_inlineFormattingContext;
 }
 
+const ContainerBox& LineBuilder::root() const
+{
+    return formattingContext().root();
+}
+
 LineBuilder::TrimmableTrailingContent::TrimmableTrailingContent(RunList& runs)
     : m_runs(runs)
 {

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h (266124 => 266125)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-08-25 16:36:49 UTC (rev 266124)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h	2020-08-25 16:39:10 UTC (rev 266125)
@@ -46,13 +46,8 @@
     struct Constraints {
         InlineLayoutPoint logicalTopLeft;
         InlineLayoutUnit availableLogicalWidth { 0 };
+        InlineLayoutUnit lineHeight { 0 };
         bool lineIsConstrainedByFloat { false };
-        struct HeightAndBaseline {
-            InlineLayoutUnit height { 0 };
-            InlineLayoutUnit baseline { 0 };
-            Optional<AscentAndDescent> strut;
-        };
-        Optional<HeightAndBaseline> heightAndBaseline;
     };
 
     enum class IntrinsicSizing { No, Yes };
@@ -192,6 +187,7 @@
 
     LayoutState& layoutState() const;
     const InlineFormattingContext& formattingContext() const;
+    const ContainerBox& root() const;
 
     struct TrimmableTrailingContent {
         TrimmableTrailingContent(RunList&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to