Title: [289191] trunk/Source/WebCore
Revision
289191
Author
[email protected]
Date
2022-02-06 17:50:37 -0800 (Sun, 06 Feb 2022)

Log Message

[LFC][IFC] Logical rect for text run does not require the parent inline box's FontMetrics:ascent
https://bugs.webkit.org/show_bug.cgi?id=236195

Reviewed by Antti Koivisto.

Let's compute the text run's logical top using the parent inline box geometry only.
This patch also renames InlineLevelBox::baseline to ascent to indicate that it's an ascent value.

* layout/formattingContexts/inline/InlineLevelBox.h:
(WebCore::Layout::InlineLevelBox::ascent const):
(WebCore::Layout::InlineLevelBox::setAscent):
(WebCore::Layout::InlineLevelBox::baseline const): Deleted.
(WebCore::Layout::InlineLevelBox::setBaseline): Deleted.
* layout/formattingContexts/inline/InlineLineBox.cpp:
(WebCore::Layout::LineBox::logicalRectForTextRun const):
* layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
(WebCore::Layout::LineBoxBuilder::setBaselineAndLayoutBounds const):
(WebCore::Layout::LineBoxBuilder::constructInlineLevelBoxes):
* layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp:
(WebCore::Layout::LineBoxVerticalAligner::computeLogicalHeightAndAlign const):
(WebCore::Layout::LineBoxVerticalAligner::simplifiedVerticalAlignment const):
(WebCore::Layout::LineBoxVerticalAligner::computeLineBoxLogicalHeight const):
(WebCore::Layout::LineBoxVerticalAligner::computeRootInlineBoxVerticalPosition const):
(WebCore::Layout::LineBoxVerticalAligner::alignInlineLevelBoxes const):
* layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp:
(WebCore::Layout::InlineDisplayLineBuilder::build const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (289190 => 289191)


--- trunk/Source/WebCore/ChangeLog	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/ChangeLog	2022-02-07 01:50:37 UTC (rev 289191)
@@ -1,5 +1,34 @@
 2022-02-06  Alan Bujtas  <[email protected]>
 
+        [LFC][IFC] Logical rect for text run does not require the parent inline box's FontMetrics:ascent
+        https://bugs.webkit.org/show_bug.cgi?id=236195
+
+        Reviewed by Antti Koivisto.
+
+        Let's compute the text run's logical top using the parent inline box geometry only.
+        This patch also renames InlineLevelBox::baseline to ascent to indicate that it's an ascent value.
+
+        * layout/formattingContexts/inline/InlineLevelBox.h:
+        (WebCore::Layout::InlineLevelBox::ascent const):
+        (WebCore::Layout::InlineLevelBox::setAscent):
+        (WebCore::Layout::InlineLevelBox::baseline const): Deleted.
+        (WebCore::Layout::InlineLevelBox::setBaseline): Deleted.
+        * layout/formattingContexts/inline/InlineLineBox.cpp:
+        (WebCore::Layout::LineBox::logicalRectForTextRun const):
+        * layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
+        (WebCore::Layout::LineBoxBuilder::setBaselineAndLayoutBounds const):
+        (WebCore::Layout::LineBoxBuilder::constructInlineLevelBoxes):
+        * layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp:
+        (WebCore::Layout::LineBoxVerticalAligner::computeLogicalHeightAndAlign const):
+        (WebCore::Layout::LineBoxVerticalAligner::simplifiedVerticalAlignment const):
+        (WebCore::Layout::LineBoxVerticalAligner::computeLineBoxLogicalHeight const):
+        (WebCore::Layout::LineBoxVerticalAligner::computeRootInlineBoxVerticalPosition const):
+        (WebCore::Layout::LineBoxVerticalAligner::alignInlineLevelBoxes const):
+        * layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp:
+        (WebCore::Layout::InlineDisplayLineBuilder::build const):
+
+2022-02-06  Alan Bujtas  <[email protected]>
+
         [LFC][IFC] Check if fallback font glyphs initiate ideographic baseline
         https://bugs.webkit.org/show_bug.cgi?id=236182
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h (289190 => 289191)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h	2022-02-07 01:50:37 UTC (rev 289191)
@@ -48,7 +48,7 @@
     static InlineLevelBox createLineBreakBox(const Box&, const RenderStyle&, InlineLayoutUnit logicalLeft);
     static InlineLevelBox createGenericInlineLevelBox(const Box&, const RenderStyle&, InlineLayoutUnit logicalLeft);
 
-    InlineLayoutUnit baseline() const { return m_baseline; }
+    InlineLayoutUnit ascent() const { return m_ascent; }
     std::optional<InlineLayoutUnit> descent() const { return m_descent; }
     // See https://www.w3.org/TR/css-inline-3/#layout-bounds
     struct LayoutBounds {
@@ -118,7 +118,7 @@
     void setLogicalWidth(InlineLayoutUnit logicalWidth) { m_logicalRect.setWidth(logicalWidth); }
     void setLogicalHeight(InlineLayoutUnit logicalHeight) { m_logicalRect.setHeight(roundToInt(logicalHeight)); }
     void setLogicalTop(InlineLayoutUnit logicalTop) { m_logicalRect.setTop(roundToInt(logicalTop)); }
-    void setBaseline(InlineLayoutUnit baseline) { m_baseline = roundToInt(baseline); }
+    void setAscent(InlineLayoutUnit ascent) { m_ascent = roundToInt(ascent); }
     void setDescent(InlineLayoutUnit descent) { m_descent = roundToInt(descent); }
     void setLayoutBounds(const LayoutBounds& layoutBounds) { m_layoutBounds = { InlineLayoutUnit(roundToInt(layoutBounds.ascent)), InlineLayoutUnit(roundToInt(layoutBounds.descent)) }; }
 
@@ -130,7 +130,7 @@
     // This is the combination of margin and border boxes. Inline level boxes are vertically aligned using their margin boxes.
     InlineRect m_logicalRect;
     LayoutBounds m_layoutBounds;
-    InlineLayoutUnit m_baseline { 0 };
+    InlineLayoutUnit m_ascent { 0 };
     std::optional<InlineLayoutUnit> m_descent;
     bool m_hasContent { false };
     // These bits are about whether this inline level box is the first/last generated box of the associated Layout::Box

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBox.cpp (289190 => 289191)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBox.cpp	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBox.cpp	2022-02-07 01:50:37 UTC (rev 289191)
@@ -54,8 +54,8 @@
     ASSERT(run.isText() || run.isSoftLineBreak());
     auto* parentInlineBox = &inlineLevelBoxForLayoutBox(run.layoutBox().parent());
     ASSERT(parentInlineBox->isInlineBox());
-    auto& fontMetrics = parentInlineBox->primarymetricsOfPrimaryFont();
-    auto runlogicalTop = parentInlineBox->logicalTop() + parentInlineBox->baseline() - fontMetrics.ascent();
+    auto runlogicalTop = parentInlineBox->logicalTop();
+    InlineLayoutUnit logicalHeight = parentInlineBox->primarymetricsOfPrimaryFont().height();
 
     while (parentInlineBox != &m_rootInlineBox && !parentInlineBox->hasLineBoxRelativeAlignment()) {
         parentInlineBox = &inlineLevelBoxForLayoutBox(parentInlineBox->layoutBox().parent());
@@ -62,7 +62,6 @@
         ASSERT(parentInlineBox->isInlineBox());
         runlogicalTop += parentInlineBox->logicalTop();
     }
-    InlineLayoutUnit logicalHeight = fontMetrics.height();
     return { runlogicalTop, run.logicalLeft(), run.logicalWidth(), logicalHeight };
 }
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp (289190 => 289191)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2022-02-07 01:50:37 UTC (rev 289191)
@@ -191,7 +191,7 @@
         halfLeading = (layoutBoundsMetrics.lineSpacing - logicalHeight) / 2;
     }
     // We need floor/ceil to match legacy layout integral positioning.
-    inlineBox.setBaseline(floorf(layoutBoundsMetrics.ascent));
+    inlineBox.setAscent(floorf(layoutBoundsMetrics.ascent));
     inlineBox.setDescent(ceilf(layoutBoundsMetrics.descent));
     inlineBox.setLogicalHeight(logicalHeight);
     inlineBox.setLayoutBounds({ floorf(layoutBoundsMetrics.ascent + halfLeading), ceilf(layoutBoundsMetrics.descent + halfLeading) });
@@ -255,7 +255,7 @@
                 ascent = marginBoxHeight;
             logicalLeft += std::max(0_lu, inlineLevelBoxGeometry.marginStart());
             auto atomicInlineLevelBox = InlineLevelBox::createAtomicInlineLevelBox(layoutBox, style, logicalLeft, { inlineLevelBoxGeometry.borderBoxWidth(), marginBoxHeight });
-            atomicInlineLevelBox.setBaseline(ascent);
+            atomicInlineLevelBox.setAscent(ascent);
             atomicInlineLevelBox.setLayoutBounds(InlineLevelBox::LayoutBounds { ascent, marginBoxHeight - ascent });
             lineBox.addInlineLevelBox(WTFMove(atomicInlineLevelBox));
             continue;

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp (289190 => 289191)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp	2022-02-07 01:50:37 UTC (rev 289191)
@@ -58,11 +58,11 @@
                     shouldUseSimplifiedAlignment = false;
                 else {
                     auto& inlineLevelBoxGeometry = formattingContext().geometryForBox(layoutBox);
-                    shouldUseSimplifiedAlignment = !inlineLevelBoxGeometry.marginBefore() && !inlineLevelBoxGeometry.marginAfter() && inlineLevelBoxGeometry.marginBoxHeight() <= rootInlineBox.baseline();
+                    shouldUseSimplifiedAlignment = !inlineLevelBoxGeometry.marginBefore() && !inlineLevelBoxGeometry.marginAfter() && inlineLevelBoxGeometry.marginBoxHeight() <= rootInlineBox.ascent();
                 }
             } else if (inlineLevelBox.isLineBreakBox()) {
                 // Baseline aligned, non-stretchy line breaks e.g. <div><span><br></span></div> but not <div><span style="font-size: 100px;"><br></span></div>.
-                shouldUseSimplifiedAlignment = inlineLevelBox.verticalAlign().type == VerticalAlign::Baseline && inlineLevelBox.baseline() <= rootInlineBox.baseline();
+                shouldUseSimplifiedAlignment = inlineLevelBox.verticalAlign().type == VerticalAlign::Baseline && inlineLevelBox.ascent() <= rootInlineBox.ascent();
             } else if (inlineLevelBox.isInlineBox()) {
                 // Baseline aligned, non-stretchy inline boxes e.g. <div><span></span></div> but not <div><span style="font-size: 100px;"></span></div>.
                 shouldUseSimplifiedAlignment = inlineLevelBox.verticalAlign().type == VerticalAlign::Baseline && inlineLevelBox.layoutBounds() == rootInlineBox.layoutBounds();
@@ -91,10 +91,10 @@
 InlineLayoutUnit LineBoxVerticalAligner::simplifiedVerticalAlignment(LineBox& lineBox) const
 {
     auto& rootInlineBox = lineBox.rootInlineBox();
-    auto rootInlineBoxBaseline = rootInlineBox.baseline();
+    auto rootInlineBoxAscent = rootInlineBox.ascent();
 
     if (!lineBox.hasContent()) {
-        rootInlineBox.setLogicalTop(-rootInlineBoxBaseline);
+        rootInlineBox.setLogicalTop(-rootInlineBoxAscent);
         return { };
     }
 
@@ -102,16 +102,16 @@
 
     auto lineBoxLogicalTop = InlineLayoutUnit { 0 };
     auto lineBoxLogicalBottom = rootInlineBoxLayoutBounds.height();
-    auto rootInlineBoxLogicalTop = rootInlineBoxLayoutBounds.ascent - rootInlineBoxBaseline;
+    auto rootInlineBoxLogicalTop = rootInlineBoxLayoutBounds.ascent - rootInlineBoxAscent;
     for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
         // Only baseline alignment for now.
-        inlineLevelBox.setLogicalTop(rootInlineBoxBaseline - inlineLevelBox.baseline());
+        inlineLevelBox.setLogicalTop(rootInlineBoxAscent - inlineLevelBox.ascent());
         auto layoutBounds = inlineLevelBox.layoutBounds();
 
         auto layoutBoundsLogicalTop = rootInlineBoxLayoutBounds.ascent - layoutBounds.ascent;
         lineBoxLogicalTop = std::min(lineBoxLogicalTop, layoutBoundsLogicalTop);
         lineBoxLogicalBottom = std::max(lineBoxLogicalBottom, layoutBoundsLogicalTop + layoutBounds.height());
-        rootInlineBoxLogicalTop = std::max(rootInlineBoxLogicalTop, layoutBounds.ascent - rootInlineBoxBaseline);
+        rootInlineBoxLogicalTop = std::max(rootInlineBoxLogicalTop, layoutBounds.ascent - rootInlineBoxAscent);
     }
     rootInlineBox.setLogicalTop(rootInlineBoxLogicalTop);
     return lineBoxLogicalBottom - lineBoxLogicalTop;
@@ -180,7 +180,7 @@
         }
         case VerticalAlign::TextTop: {
             // Note that text-top aligns with the inline box's font metrics top (ascent) and not the layout bounds top.
-            logicalTop = parentInlineBox.layoutBounds().ascent - parentInlineBox.baseline();
+            logicalTop = parentInlineBox.layoutBounds().ascent - parentInlineBox.ascent();
             break;
         }
         case VerticalAlign::TextBottom: {
@@ -261,12 +261,12 @@
                 break;
             }
             case VerticalAlign::Length: {
-                auto logicalTopOffsetFromParentBaseline = *verticalAlign.baselineOffset + inlineLevelBox.baseline();
-                baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox.baseline();
+                auto logicalTopOffsetFromParentBaseline = *verticalAlign.baselineOffset + inlineLevelBox.ascent();
+                baselineOffsetFromParentBaseline = logicalTopOffsetFromParentBaseline - inlineLevelBox.ascent();
                 break;
             }
             case VerticalAlign::TextTop:
-                baselineOffsetFromParentBaseline = parentInlineBox.baseline() - inlineLevelBox.layoutBounds().ascent;
+                baselineOffsetFromParentBaseline = parentInlineBox.ascent() - inlineLevelBox.layoutBounds().ascent;
                 break;
             case VerticalAlign::TextBottom:
                 baselineOffsetFromParentBaseline = inlineLevelBox.layoutBounds().descent - *parentInlineBox.descent();
@@ -300,7 +300,7 @@
         inlineLevelBoxAbsoluteBaselineOffsetMap.add(&inlineLevelBox, absoluteBaselineOffset);
 
         auto inlineLevelBoxStrechesLineBox = formattingGeometry.inlineLevelBoxAffectsLineBox(inlineLevelBox, lineBox);
-        auto affectsRootInlineBoxVerticalPosition = inlineLevelBoxStrechesLineBox || (inlineLevelBox.isAtomicInlineLevelBox() && inlineLevelBox.baseline());
+        auto affectsRootInlineBoxVerticalPosition = inlineLevelBoxStrechesLineBox || (inlineLevelBox.isAtomicInlineLevelBox() && inlineLevelBox.ascent());
         if (affectsRootInlineBoxVerticalPosition) {
             auto topOffsetFromRootInlineBoxBaseline = absoluteBaselineOffset + inlineLevelBox.layoutBounds().ascent;
             if (maximumTopOffsetFromRootInlineBoxBaseline)
@@ -314,7 +314,7 @@
             }
         }
     }
-    auto rootInlineBoxLogicalTop = maximumTopOffsetFromRootInlineBoxBaseline.value_or(0.f) - rootInlineBox.baseline();
+    auto rootInlineBoxLogicalTop = maximumTopOffsetFromRootInlineBoxBaseline.value_or(0.f) - rootInlineBox.ascent();
     rootInlineBox.setLogicalTop(rootInlineBoxLogicalTop);
 }
 
@@ -327,47 +327,47 @@
         auto verticalAlign = inlineLevelBox.verticalAlign();
         switch (verticalAlign.type) {
         case VerticalAlign::Baseline:
-            logicalTop = parentInlineBox.baseline() - inlineLevelBox.baseline();
+            logicalTop = parentInlineBox.ascent() - inlineLevelBox.ascent();
             break;
         case VerticalAlign::Middle: {
             auto logicalTopOffsetFromParentBaseline = (inlineLevelBox.logicalHeight() / 2 + parentInlineBox.primarymetricsOfPrimaryFont().xHeight() / 2);
-            logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
+            logicalTop = parentInlineBox.ascent() - logicalTopOffsetFromParentBaseline;
             break;
         }
         case VerticalAlign::BaselineMiddle: {
             auto logicalTopOffsetFromParentBaseline = inlineLevelBox.logicalHeight() / 2;
-            logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
+            logicalTop = parentInlineBox.ascent() - logicalTopOffsetFromParentBaseline;
             break;
         }
         case VerticalAlign::Length: {
-            auto logicalTopOffsetFromParentBaseline = *verticalAlign.baselineOffset + inlineLevelBox.baseline();
-            logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
+            auto logicalTopOffsetFromParentBaseline = *verticalAlign.baselineOffset + inlineLevelBox.ascent();
+            logicalTop = parentInlineBox.ascent() - logicalTopOffsetFromParentBaseline;
             break;
         }
         case VerticalAlign::Sub: {
-            auto logicalTopOffsetFromParentBaseline = inlineLevelBox.baseline() - (parentInlineBox.fontSize() / 5 + 1);
-            logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
+            auto logicalTopOffsetFromParentBaseline = inlineLevelBox.ascent() - (parentInlineBox.fontSize() / 5 + 1);
+            logicalTop = parentInlineBox.ascent() - logicalTopOffsetFromParentBaseline;
             break;
         }
         case VerticalAlign::Super: {
-            auto logicalTopOffsetFromParentBaseline = inlineLevelBox.baseline() + parentInlineBox.fontSize() / 3 + 1;
-            logicalTop = parentInlineBox.baseline() - logicalTopOffsetFromParentBaseline;
+            auto logicalTopOffsetFromParentBaseline = inlineLevelBox.ascent() + parentInlineBox.fontSize() / 3 + 1;
+            logicalTop = parentInlineBox.ascent() - logicalTopOffsetFromParentBaseline;
             break;
         }
         // Note that (text)top/bottom align their layout bounds.
         case VerticalAlign::TextTop:
-            logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.baseline();
+            logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.ascent();
             break;
         case VerticalAlign::TextBottom:
-            logicalTop = parentInlineBox.logicalHeight() - inlineLevelBox.layoutBounds().descent - inlineLevelBox.baseline();
+            logicalTop = parentInlineBox.logicalHeight() - inlineLevelBox.layoutBounds().descent - inlineLevelBox.ascent();
             break;
         case VerticalAlign::Top:
             // Note that this logical top is not relative to the parent inline box.
-            logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.baseline();
+            logicalTop = inlineLevelBox.layoutBounds().ascent - inlineLevelBox.ascent();
             break;
         case VerticalAlign::Bottom:
             // Note that this logical top is not relative to the parent inline box.
-            logicalTop = lineBoxLogicalHeight - inlineLevelBox.layoutBounds().descent - inlineLevelBox.baseline();
+            logicalTop = lineBoxLogicalHeight - inlineLevelBox.layoutBounds().descent - inlineLevelBox.ascent();
             break;
         default:
             ASSERT_NOT_IMPLEMENTED_YET();

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp (289190 => 289191)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp	2022-02-07 00:38:37 UTC (rev 289190)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp	2022-02-07 01:50:37 UTC (rev 289191)
@@ -99,7 +99,7 @@
     return InlineDisplay::Line { InlineDisplayContentBuilder::flipLogicalRectToVisualForWritingMode(lineBoxRect, writingMode)
         , InlineDisplayContentBuilder::flipLogicalRectToVisualForWritingMode(enclosingLineGeometry.scrollableOverflowRect, writingMode)
         , enclosingLineGeometry.enclosingTopAndBottom
-        , rootInlineBox.logicalTop() + rootInlineBox.baseline()
+        , rootInlineBox.logicalTop() + rootInlineBox.ascent()
         , contentVisualLeft
         , rootInlineBox.logicalWidth()
     };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to