<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[281744] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/281744">281744</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2021-08-29 09:10:25 -0700 (Sun, 29 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[LFC][IFC] Make line runs relative to the formatting root border box.
https://bugs.webkit.org/show_bug.cgi?id=229652

Reviewed by Antti Koivisto.

Let's construct the line runs relative to the border box of the inline formatting context root
(as opposed to relative to the line box), so that the integration runs could just copy their positions.

This is in preparation for merging line runs with the integration runs.

* display/css/DisplayBoxFactory.cpp:
(WebCore::Display::BoxFactory::displayBoxForTextRun const):
* layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent):
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes):
* layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
(WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLineRuns const):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredisplaycssDisplayBoxFactorycpp">trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp</a></li>
<li><a href="#trunkSourceWebCorelayoutformattingContextsinlineInlineDisplayContentBuildercpp">trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp</a></li>
<li><a href="#trunkSourceWebCorelayoutintegrationLayoutIntegrationInlineContentBuildercpp">trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (281743 => 281744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-08-29 15:14:13 UTC (rev 281743)
+++ trunk/Source/WebCore/ChangeLog      2021-08-29 16:10:25 UTC (rev 281744)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2021-08-29  Alan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Make line runs relative to the formatting root border box.
+        https://bugs.webkit.org/show_bug.cgi?id=229652
+
+        Reviewed by Antti Koivisto.
+
+        Let's construct the line runs relative to the border box of the inline formatting context root
+        (as opposed to relative to the line box), so that the integration runs could just copy their positions.
+
+        This is in preparation for merging line runs with the integration runs.
+
+        * display/css/DisplayBoxFactory.cpp:
+        (WebCore::Display::BoxFactory::displayBoxForTextRun const):
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
+        (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent):
+        (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes):
+        * layout/integration/LayoutIntegrationInlineContentBuilder.cpp:
+        (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLineRuns const):
+
</ins><span class="cx"> 2021-08-29  Antti Koivisto  <antti@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [CSS Cascade Layers] Factor RuleSet building into a Builder type
</span></span></pre></div>
<a id="trunkSourceWebCoredisplaycssDisplayBoxFactorycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp (281743 => 281744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp   2021-08-29 15:14:13 UTC (rev 281743)
+++ trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp      2021-08-29 16:10:25 UTC (rev 281744)
</span><span class="lines">@@ -150,7 +150,6 @@
</span><span class="cx">     auto lineLayoutRect = LayoutRect { lineRect.left(), lineRect.top(), lineRect.width(), lineRect.height() };
</span><span class="cx"> 
</span><span class="cx">     auto runRect = LayoutRect { run.logicalLeft(), run.logicalTop(), run.logicalWidth(), run.logicalHeight() };
</span><del>-    runRect.moveBy(lineLayoutRect.location());
</del><span class="cx">     runRect.move(containingBlockContext.offsetFromRoot);
</span><span class="cx"> 
</span><span class="cx">     auto style = Style { run.layoutBox().style() };
</span></span></pre></div>
<a id="trunkSourceWebCorelayoutformattingContextsinlineInlineDisplayContentBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (281743 => 281744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp    2021-08-29 15:14:13 UTC (rev 281743)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp       2021-08-29 16:10:25 UTC (rev 281744)
</span><span class="lines">@@ -45,7 +45,9 @@
</span><span class="cx"> {
</span><span class="cx">     auto& formattingState = this->formattingState();
</span><span class="cx">     // Every line starts with a root run, even the empty ones.
</span><del>-    formattingState.addLineRun({ lineIndex, LineRun::Type::RootInlineBox, root(), lineBox.logicalRectForRootInlineBox(), { }, { },  lineBox.rootInlineBox().hasContent()});
</del><ins>+    auto rootInlineBoxRect = lineBox.logicalRectForRootInlineBox();
+    rootInlineBoxRect.moveBy(lineBoxLogicalTopLeft);
+    formattingState.addLineRun({ lineIndex, LineRun::Type::RootInlineBox, root(), rootInlineBoxRect, { }, { },  lineBox.rootInlineBox().hasContent()});
</ins><span class="cx"> 
</span><span class="cx">     // Spanning inline boxes start at the very beginning of the line.
</span><span class="cx">     auto lineSpanningInlineBoxIndex = formattingState.lineRuns().size();
</span><span class="lines">@@ -60,19 +62,25 @@
</span><span class="cx">     for (auto& lineRun : lineContent.runs) {
</span><span class="cx">         auto& layoutBox = lineRun.layoutBox();
</span><span class="cx">         switch (lineRun.type()) {
</span><del>-        case InlineItem::Type::Text:
-            formattingState.addLineRun({ lineIndex, LineRun::Type::Text, layoutBox, lineBox.logicalRectForTextRun(lineRun), lineRun.expansion(), lineRun.textContent() });
</del><ins>+        case InlineItem::Type::Text: {
+            auto textRunRect = lineBox.logicalRectForTextRun(lineRun);
+            textRunRect.moveBy(lineBoxLogicalTopLeft);
+            formattingState.addLineRun({ lineIndex, LineRun::Type::Text, layoutBox, textRunRect, lineRun.expansion(), lineRun.textContent() });
</ins><span class="cx">             break;
</span><del>-        case InlineItem::Type::SoftLineBreak:
-            formattingState.addLineRun({ lineIndex, LineRun::Type::SoftLineBreak, layoutBox, lineBox.logicalRectForTextRun(lineRun), lineRun.expansion(), lineRun.textContent() });
</del><ins>+        }
+        case InlineItem::Type::SoftLineBreak: {
+            auto softLineBreakRunRect = lineBox.logicalRectForTextRun(lineRun);
+            softLineBreakRunRect.moveBy(lineBoxLogicalTopLeft);
+            formattingState.addLineRun({ lineIndex, LineRun::Type::SoftLineBreak, layoutBox, softLineBreakRunRect, lineRun.expansion(), lineRun.textContent() });
</ins><span class="cx">             break;
</span><ins>+        }
</ins><span class="cx">         case InlineItem::Type::HardLineBreak: {
</span><span class="cx">             // Only hard linebreaks have associated layout boxes.
</span><span class="cx">             auto lineBreakBoxRect = lineBox.logicalRectForLineBreakBox(layoutBox);
</span><ins>+            lineBreakBoxRect.moveBy(lineBoxLogicalTopLeft);
</ins><span class="cx">             formattingState.addLineRun({ lineIndex, LineRun::Type::LineBreakBox, layoutBox, lineBreakBoxRect, lineRun.expansion(), { } });
</span><span class="cx"> 
</span><span class="cx">             auto& boxGeometry = formattingState.boxGeometry(layoutBox);
</span><del>-            lineBreakBoxRect.moveBy(lineBoxLogicalTopLeft);
</del><span class="cx">             boxGeometry.setLogicalTopLeft(toLayoutPoint(lineBreakBoxRect.topLeft()));
</span><span class="cx">             boxGeometry.setContentBoxHeight(toLayoutUnit(lineBreakBoxRect.height()));
</span><span class="cx">             break;
</span><span class="lines">@@ -81,11 +89,11 @@
</span><span class="cx">             ASSERT(layoutBox.isAtomicInlineLevelBox());
</span><span class="cx">             auto& boxGeometry = formattingState.boxGeometry(layoutBox);
</span><span class="cx">             auto logicalBorderBox = lineBox.logicalBorderBoxForAtomicInlineLevelBox(layoutBox, boxGeometry);
</span><ins>+            logicalBorderBox.moveBy(lineBoxLogicalTopLeft);
</ins><span class="cx">             formattingState.addLineRun({ lineIndex, LineRun::Type::AtomicInlineLevelBox, layoutBox, logicalBorderBox, lineRun.expansion(), { } });
</span><span class="cx"> 
</span><span class="cx">             auto borderBoxLogicalTopLeft = logicalBorderBox.topLeft();
</span><span class="cx">             // Note that inline boxes are relative to the line and their top position can be negative.
</span><del>-            borderBoxLogicalTopLeft.moveBy(lineBoxLogicalTopLeft);
</del><span class="cx">             // Atomic inline boxes are all set. Their margin/border/content box geometries are already computed. We just have to position them here.
</span><span class="cx">             boxGeometry.setLogicalTopLeft(toLayoutPoint(borderBoxLogicalTopLeft));
</span><span class="cx">             break;
</span><span class="lines">@@ -94,6 +102,7 @@
</span><span class="cx">             // This inline box showed up first on this line.
</span><span class="cx">             auto& boxGeometry = formattingState.boxGeometry(layoutBox);
</span><span class="cx">             auto inlineBoxBorderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
</span><ins>+            inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft);
</ins><span class="cx">             if (lineBox.hasContent()) {
</span><span class="cx">                 // FIXME: It's expected to not have any runs on empty lines. We should reconsider this.
</span><span class="cx">                 formattingState.addLineRun({ lineIndex, LineRun::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, { }, { }, lineBox.inlineLevelBoxForLayoutBox(layoutBox).hasContent() });
</span><span class="lines">@@ -101,7 +110,6 @@
</span><span class="cx"> 
</span><span class="cx">             auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) };
</span><span class="cx">             auto logicalRect = Rect { LayoutPoint { inlineBoxBorderBox.topLeft() }, inlineBoxSize };
</span><del>-            logicalRect.moveBy(LayoutPoint { lineBoxLogicalTopLeft });
</del><span class="cx">             boxGeometry.setLogicalTopLeft(logicalRect.topLeft());
</span><span class="cx">             auto contentBoxHeight = logicalRect.height() - (boxGeometry.verticalBorder() + boxGeometry.verticalPadding().value_or(0_lu));
</span><span class="cx">             boxGeometry.setContentBoxHeight(contentBoxHeight);
</span><span class="lines">@@ -133,12 +141,12 @@
</span><span class="cx">         auto& boxGeometry = formattingState.boxGeometry(layoutBox);
</span><span class="cx">         // Inline boxes may or may not be wrapped and have runs on multiple lines (e.g. <span>first line<br>second line<br>third line</span>)
</span><span class="cx">         auto inlineBoxBorderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
</span><ins>+        inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft);
</ins><span class="cx"> 
</span><span class="cx">         formattingState.lineRuns().insert(lineSpanningInlineBoxIndex++, { lineIndex, LineRun::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, { }, { }, inlineLevelBox.hasContent(), true });
</span><span class="cx"> 
</span><span class="cx">         auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) };
</span><span class="cx">         auto logicalRect = Rect { LayoutPoint { inlineBoxBorderBox.topLeft() }, inlineBoxSize };
</span><del>-        logicalRect.moveBy(LayoutPoint { lineBoxLogicalTopLeft });
</del><span class="cx">         // Middle or end of the inline box. Let's stretch the box as needed.
</span><span class="cx">         auto enclosingBorderBoxRect = BoxGeometry::borderBoxRect(boxGeometry);
</span><span class="cx">         enclosingBorderBoxRect.expandToContain(logicalRect);
</span></span></pre></div>
<a id="trunkSourceWebCorelayoutintegrationLayoutIntegrationInlineContentBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp (281743 => 281744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp        2021-08-29 15:14:13 UTC (rev 281743)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp   2021-08-29 16:10:25 UTC (rev 281744)
</span><span class="lines">@@ -255,12 +255,10 @@
</span><span class="cx">         }
</span><span class="cx">         auto& layoutBox = lineRun.layoutBox();
</span><span class="cx">         auto lineIndex = lineRun.lineIndex();
</span><del>-        auto& lineBoxLogicalRect = lines[lineIndex].lineBoxLogicalRect();
</del><span class="cx">         // Inline boxes are relative to the line box while final runs need to be relative to the parent box
</span><span class="cx">         // FIXME: Shouldn't we just leave them be relative to the line box?
</span><span class="cx">         auto runRect = FloatRect { lineRun.logicalRect() };
</span><span class="cx">         auto& geometry = m_layoutState.geometryForBox(layoutBox);
</span><del>-        runRect.moveBy({ lineBoxLogicalRect.left(), lineBoxLogicalRect.top() });
</del><span class="cx">         runRect.setSize({ geometry.borderBoxWidth(), geometry.borderBoxHeight() });
</span><span class="cx">         if (lineLevelVisualAdjustmentsForRuns[lineIndex].needsIntegralPosition)
</span><span class="cx">             runRect.setY(roundToInt(runRect.y()));
</span><span class="lines">@@ -268,7 +266,6 @@
</span><span class="cx">         // FIXME: Add support for cases when the run is after ellipsis.
</span><span class="cx">         if (lineRun.isInlineBox()) {
</span><span class="cx">             auto lineRunRect = lineRun.logicalRect();
</span><del>-            lineRunRect.moveBy(lineBoxLogicalRect.topLeft());
</del><span class="cx">             auto hasScrollableContent = [&] {
</span><span class="cx">                 // In standards mode, inline boxes always start with an imaginary strut.
</span><span class="cx">                 return m_layoutState.inStandardsMode() || lineRun.hasContent() || geometry.horizontalBorder() || (geometry.horizontalPadding() && geometry.horizontalPadding().value());
</span><span class="lines">@@ -288,7 +285,6 @@
</span><span class="cx">         auto lineIndex = lineRun.lineIndex();
</span><span class="cx">         auto& lineBoxLogicalRect = lines[lineIndex].lineBoxLogicalRect();
</span><span class="cx">         auto runRect = FloatRect { lineRun.logicalRect() };
</span><del>-        runRect.moveBy({ lineBoxLogicalRect.left(), lineBoxLogicalRect.top() });
</del><span class="cx">         if (lineLevelVisualAdjustmentsForRuns[lineIndex].needsIntegralPosition)
</span><span class="cx">             runRect.setY(roundToInt(runRect.y()));
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>