- 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()
};