Title: [287287] trunk/Source/WebCore
Revision
287287
Author
za...@apple.com
Date
2021-12-20 16:33:19 -0800 (Mon, 20 Dec 2021)

Log Message

[LFC][IFC] Decouple LineBox and InlineDisplay:Line construction
https://bugs.webkit.org/show_bug.cgi?id=234519

Reviewed by Antti Koivisto.

Layout::LineBox has logical geometry while InlineDisplay::Line is all physical.
This is also in preparation for supporting RTL lines.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):
* layout/formattingContexts/inline/InlineLevelBox.h:
* layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
(WebCore::Layout::LineBoxBuilder::build):
* layout/formattingContexts/inline/InlineLineBoxBuilder.h:
* layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp: Added.
(WebCore::Layout::InlineDisplayLineBuilder::InlineDisplayLineBuilder):
(WebCore::Layout::InlineDisplayLineBuilder::build):
* layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h: Copied from Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h.
(WebCore::Layout::InlineDisplayLineBuilder::formattingContext const):
(WebCore::Layout::InlineDisplayLineBuilder::root const):
(WebCore::Layout::InlineDisplayLineBuilder::layoutState const):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287286 => 287287)


--- trunk/Source/WebCore/ChangeLog	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/ChangeLog	2021-12-21 00:33:19 UTC (rev 287287)
@@ -1,3 +1,29 @@
+2021-12-20  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Decouple LineBox and InlineDisplay:Line construction
+        https://bugs.webkit.org/show_bug.cgi?id=234519
+
+        Reviewed by Antti Koivisto.
+
+        Layout::LineBox has logical geometry while InlineDisplay::Line is all physical.
+        This is also in preparation for supporting RTL lines.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):
+        * layout/formattingContexts/inline/InlineLevelBox.h:
+        * layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
+        (WebCore::Layout::LineBoxBuilder::build):
+        * layout/formattingContexts/inline/InlineLineBoxBuilder.h:
+        * layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp: Added.
+        (WebCore::Layout::InlineDisplayLineBuilder::InlineDisplayLineBuilder):
+        (WebCore::Layout::InlineDisplayLineBuilder::build):
+        * layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h: Copied from Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h.
+        (WebCore::Layout::InlineDisplayLineBuilder::formattingContext const):
+        (WebCore::Layout::InlineDisplayLineBuilder::root const):
+        (WebCore::Layout::InlineDisplayLineBuilder::layoutState const):
+
 2021-12-20  Matt Woodrow  <mattwood...@apple.com>
 
         Don't include SVGImageForContainers in allCachedSVGImages

Modified: trunk/Source/WebCore/Sources.txt (287286 => 287287)


--- trunk/Source/WebCore/Sources.txt	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/Sources.txt	2021-12-21 00:33:19 UTC (rev 287287)
@@ -1568,6 +1568,7 @@
 layout/formattingContexts/inline/InlineLineBoxVerticalAligner.cpp
 layout/formattingContexts/inline/InlineTextItem.cpp
 layout/formattingContexts/inline/display/InlineDisplayContentBuilder.cpp
+layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp
 layout/formattingContexts/inline/invalidation/InlineInvalidation.cpp
 layout/formattingContexts/inline/text/TextUtil.cpp
 layout/integration/InlineIteratorBox.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (287286 => 287287)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-12-21 00:33:19 UTC (rev 287287)
@@ -2206,6 +2206,7 @@
 		6F40DA822513033A00EC04B7 /* InlineRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F40DA812513033A00EC04B7 /* InlineRect.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6F49C3E726479B3C0051953D /* TableFormattingQuirks.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F49C3E626479B3B0051953D /* TableFormattingQuirks.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6F56B44726479E6200AAE257 /* FormattingQuirks.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F56B44626479E6100AAE257 /* FormattingQuirks.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		6F60E5AA27710F39005C15B9 /* InlineDisplayLineBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F60E5A927710F39005C15B9 /* InlineDisplayLineBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6F6383F62427AF4A00DABA53 /* LayoutInitialContainingBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F6383F42427AF4900DABA53 /* LayoutInitialContainingBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6F6DF36F264722EA0093E834 /* BlockMarginCollapse.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F6DF36E264722EA0093E834 /* BlockMarginCollapse.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		6F6EE74326D44EE300374CDA /* InlineLineBoxVerticalAligner.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F6EE74126D44EE200374CDA /* InlineLineBoxVerticalAligner.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -10884,6 +10885,8 @@
 		6F4A5BD522F9F16B00A80F25 /* LayoutPhase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutPhase.cpp; sourceTree = "<group>"; };
 		6F56B44626479E6100AAE257 /* FormattingQuirks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormattingQuirks.h; sourceTree = "<group>"; };
 		6F5B7EAA2300A79E0067D9C3 /* TableGrid.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TableGrid.cpp; sourceTree = "<group>"; };
+		6F60E5A727710F2F005C15B9 /* InlineDisplayLineBuilder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InlineDisplayLineBuilder.cpp; sourceTree = "<group>"; };
+		6F60E5A927710F39005C15B9 /* InlineDisplayLineBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineDisplayLineBuilder.h; sourceTree = "<group>"; };
 		6F6383F42427AF4900DABA53 /* LayoutInitialContainingBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayoutInitialContainingBlock.h; sourceTree = "<group>"; };
 		6F6638D4249E268B001925FC /* TableWrapperBlockFormattingQuirks.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TableWrapperBlockFormattingQuirks.cpp; sourceTree = "<group>"; };
 		6F69A79924D6FAB800E6B85D /* InlineLineBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InlineLineBox.cpp; sourceTree = "<group>"; };
@@ -19254,6 +19257,8 @@
 		11A1E6FB26FBB6CE00435D36 /* display */ = {
 			isa = PBXGroup;
 			children = (
+				6F60E5A927710F39005C15B9 /* InlineDisplayLineBuilder.h */,
+				6F60E5A727710F2F005C15B9 /* InlineDisplayLineBuilder.cpp */,
 				6FC3F9452516756600A49BEA /* InlineDisplayBox.h */,
 				11513D0026D981DD004D3FAA /* InlineDisplayContentBuilder.cpp */,
 				11513D0226D981E7004D3FAA /* InlineDisplayContentBuilder.h */,
@@ -20750,8 +20755,8 @@
 				510E2F2C276BE0C300809333 /* NotificationEvent.cpp */,
 				510E2F24276BB4EC00809333 /* NotificationEvent.h */,
 				510E2F22276BA9E800809333 /* NotificationEvent.idl */,
+				510E2F26276BC19F00809333 /* NotificationOptions.h */,
 				51E3AF0A276B05B7009B429D /* NotificationOptions.idl */,
-				510E2F26276BC19F00809333 /* NotificationOptions.h */,
 				7CC2DDF81EC9415A0027B774 /* NotificationPermission.h */,
 				7CC2DDFA1EC9415A0027B774 /* NotificationPermission.idl */,
 				31EC1DAC14FF26EA00C94662 /* NotificationPermissionCallback.h */,
@@ -33592,7 +33597,6 @@
 				CD8D306F23AD4FA8006C3975 /* CDMLogging.h in Headers */,
 				CD3CE0FE2401AAD9004BA01D /* CDMMediaCapability.h in Headers */,
 				CD3CE0FF2401AADA004BA01D /* CDMMessageType.h in Headers */,
-				510E2F33276BF68500809333 /* JSNotificationDirection.h in Headers */,
 				CD3CE1002401AADA004BA01D /* CDMPrivate.h in Headers */,
 				CD318623199F1E2A0030A0F7 /* CDMPrivateMediaSourceAVFObjC.h in Headers */,
 				CD3CE1012401AADA004BA01D /* CDMProxy.h in Headers */,
@@ -34537,7 +34541,6 @@
 				CDA595932146DEC300A84185 /* HEVCUtilities.h in Headers */,
 				CDA595982146DF7800A84185 /* HEVCUtilitiesCocoa.h in Headers */,
 				F55B3DC01251F12D003EF269 /* HiddenInputType.h in Headers */,
-				510E2F27276BC19F00809333 /* NotificationOptions.h in Headers */,
 				510A91EB24D004C800BFD89C /* HIDDevice.h in Headers */,
 				510A91EA24D004C300BFD89C /* HIDElement.h in Headers */,
 				515BE19C1D54F6C100DD7C68 /* HIDGamepad.h in Headers */,
@@ -34613,7 +34616,6 @@
 				A81369CC097374F600D74463 /* HTMLInputElement.h in Headers */,
 				835D2D781F5F1FBD00141DED /* HTMLInputElementEntriesAPI.h in Headers */,
 				97BC849B12370A4B000C6161 /* HTMLInputStream.h in Headers */,
-				510E2F25276BB4EC00809333 /* NotificationEvent.h in Headers */,
 				93309DE6099E64920056E581 /* HTMLInterchange.h in Headers */,
 				A81369E4097374F600D74463 /* HTMLKeygenElement.h in Headers */,
 				A81369E2097374F600D74463 /* HTMLLabelElement.h in Headers */,
@@ -35240,7 +35242,6 @@
 				1C24EEA91C72A7B40080F8FC /* JSFontFaceSet.h in Headers */,
 				FDA15EAC12B03EE1003A583A /* JSGainNode.h in Headers */,
 				518F5002194CAC3A0081BAAE /* JSGamepad.h in Headers */,
-				510E2F35276BF68500809333 /* JSNotificationOptions.h in Headers */,
 				518F5004194CAC3A0081BAAE /* JSGamepadButton.h in Headers */,
 				FE80DA640E9C4703000D6F75 /* JSGeolocation.h in Headers */,
 				FE80DA660E9C4703000D6F75 /* JSGeoposition.h in Headers */,
@@ -35412,6 +35413,9 @@
 				BCD9C2C30C17B69E005C90A2 /* JSNodeList.h in Headers */,
 				AD20B18D18E9D237005A8083 /* JSNodeListCustom.h in Headers */,
 				33503CA410179AD7003B47E1 /* JSNotification.h in Headers */,
+				510E2F33276BF68500809333 /* JSNotificationDirection.h in Headers */,
+				510E2F2B276BCFE800809333 /* JSNotificationEvent.h in Headers */,
+				510E2F35276BF68500809333 /* JSNotificationOptions.h in Headers */,
 				7CC2DE011EC95A440027B774 /* JSNotificationPermission.h in Headers */,
 				31EC1E2914FF60EE00C94662 /* JSNotificationPermissionCallback.h in Headers */,
 				7E46F6FB1627A2CA00062223 /* JSOESElementIndexUint.h in Headers */,
@@ -36180,7 +36184,6 @@
 				E596DD29251903D200C275A7 /* NavigatorContacts.h in Headers */,
 				F4034FAE275EAD76003A81F8 /* NavigatorCookieConsent.h in Headers */,
 				372D3E57216578AE00C5E021 /* NavigatorCredentials.h in Headers */,
-				510E2F2B276BCFE800809333 /* JSNotificationEvent.h in Headers */,
 				9711460414EF009A00674FD9 /* NavigatorGeolocation.h in Headers */,
 				6B507A24234BF34100BE7C62 /* NavigatorIsLoggedIn.h in Headers */,
 				5EA725D61ACABD5700EAD17B /* NavigatorMediaDevices.h in Headers */,
@@ -36217,6 +36220,8 @@
 				3128CA6B147331630074C72A /* NotificationController.h in Headers */,
 				51123E2F276940CA00F9D41B /* NotificationData.h in Headers */,
 				7CC2DE031ECA04A50027B774 /* NotificationDirection.h in Headers */,
+				510E2F25276BB4EC00809333 /* NotificationEvent.h in Headers */,
+				510E2F27276BC19F00809333 /* NotificationOptions.h in Headers */,
 				7CC2DDFB1EC9415A0027B774 /* NotificationPermission.h in Headers */,
 				31FE6DFA15004C2A0004EBC4 /* NotificationPermissionCallback.h in Headers */,
 				98EB1F951313FE0500D0E1EA /* NotImplemented.h in Headers */,
@@ -37661,6 +37666,7 @@
 				BEF29EEC1715DD0900C4B4C9 /* VideoTrackPrivate.h in Headers */,
 				CD336F6417FA0A4D00DDDCD0 /* VideoTrackPrivateAVF.h in Headers */,
 				CD336F6817FA0AC600DDDCD0 /* VideoTrackPrivateAVFObjC.h in Headers */,
+				6F60E5AA27710F39005C15B9 /* InlineDisplayLineBuilder.h in Headers */,
 				CD1F9B14270235F700617EB6 /* VideoTrackPrivateClient.h in Headers */,
 				CD8B5A43180D149A008B8E65 /* VideoTrackPrivateMediaSourceAVFObjC.h in Headers */,
 				070E81D11BF27656001FDA48 /* VideoTrackPrivateMediaStream.h in Headers */,

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp (287286 => 287287)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-12-21 00:33:19 UTC (rev 287287)
@@ -33,6 +33,7 @@
 #include "InlineDamage.h"
 #include "InlineDisplayBox.h"
 #include "InlineDisplayContentBuilder.h"
+#include "InlineDisplayLineBuilder.h"
 #include "InlineFormattingState.h"
 #include "InlineItemsBuilder.h"
 #include "InlineLineBox.h"
@@ -551,15 +552,17 @@
     auto& formattingState = this->formattingState();
     auto currentLineIndex = formattingState.lines().size();
 
-    auto lineAndLineBox = LineBoxBuilder(*this).build(lineContent, currentLineIndex);
-    auto lineBoxLogicalRect = lineAndLineBox.line.lineBoxRect();
+    auto lineBoxAndHeight = LineBoxBuilder(*this).build(lineContent, currentLineIndex);
 
+    auto displayLine = InlineDisplayLineBuilder(*this).build(lineContent, lineBoxAndHeight.lineBox, lineBoxAndHeight.lineBoxLogicalHeight, currentLineIndex);
+    auto displayLineBoxRect = displayLine.lineBoxRect();
+
     auto inlineContentBuilder = InlineDisplayContentBuilder { root(), formattingState };
-    formattingState.addBoxes(inlineContentBuilder.build(lineContent, lineAndLineBox.lineBox, lineBoxLogicalRect, currentLineIndex));
-    formattingState.addLineBox(WTFMove(lineAndLineBox.lineBox));
-    formattingState.addLine(lineAndLineBox.line);
+    formattingState.addBoxes(inlineContentBuilder.build(lineContent, lineBoxAndHeight.lineBox, displayLineBoxRect, currentLineIndex));
+    formattingState.addLineBox(WTFMove(lineBoxAndHeight.lineBox));
+    formattingState.addLine(displayLine);
 
-    return lineBoxLogicalRect;
+    return displayLineBoxRect;
 }
 
 void InlineFormattingContext::invalidateFormattingState()

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLevelBox.h	2021-12-21 00:33:19 UTC (rev 287287)
@@ -102,6 +102,7 @@
     };
     InlineLevelBox(const Box&, const RenderStyle&, InlineLayoutUnit logicalLeft, InlineLayoutSize, Type, OptionSet<PositionWithinLayoutBox> = { PositionWithinLayoutBox::First, PositionWithinLayoutBox::Last });
 
+    friend class InlineDisplayLineBuilder;
     friend class LineBox;
     friend class LineBoxBuilder;
     friend class LineBoxVerticalAligner;

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2021-12-21 00:33:19 UTC (rev 287287)
@@ -103,59 +103,13 @@
 {
 }
 
-LineBoxBuilder::LineAndLineBox LineBoxBuilder::build(const LineBuilder::LineContent& lineContent, size_t lineIndex)
+LineBoxBuilder::LineBoxAndHeight LineBoxBuilder::build(const LineBuilder::LineContent& lineContent, size_t lineIndex)
 {
     auto& rootStyle = lineIndex ? rootBox().firstLineStyle() : rootBox().style();
     auto rootInlineBoxAlignmentOffset = Layout::horizontalAlignmentOffset(rootStyle.textAlign(), lineContent, rootStyle.isLeftToRightDirection()).value_or(InlineLayoutUnit { });
     auto lineBox = LineBox { rootBox(), rootInlineBoxAlignmentOffset, lineContent.contentLogicalWidth, lineIndex, lineContent.nonSpanningInlineLevelBoxCount };
-
     auto lineBoxLogicalHeight = constructAndAlignInlineLevelBoxes(lineBox, lineContent.runs, lineIndex);
-
-    auto line = [&] {
-        auto physicalLeft = lineContent.lineLogicalTopLeft.x();
-        if (!rootStyle.isLeftToRightDirection()) {
-            // https://drafts.csswg.org/css-text/#text-indent-property
-            // Since text-indent only initiates margin start, we just need to pull the linebox back to the left.
-            physicalLeft -= lineContent.lineMarginStart;
-        }
-        // FIXME: Use physical geometry here.
-        auto lineBoxRect = InlineRect { lineContent.lineLogicalTopLeft.y(), physicalLeft, lineContent.lineLogicalWidth, lineBoxLogicalHeight };
-        auto scrollableOverflowRect = lineBoxRect;
-        auto& rootInlineBox = lineBox.rootInlineBox();
-        auto enclosingTopAndBottom = InlineDisplay::Line::EnclosingTopAndBottom { lineBoxRect.top() + rootInlineBox.logicalTop(), lineBoxRect.top() + rootInlineBox.logicalBottom() };
-
-        for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
-            if (!inlineLevelBox.isAtomicInlineLevelBox() && !inlineLevelBox.isInlineBox())
-                continue;
-
-            auto& layoutBox = inlineLevelBox.layoutBox();
-            auto borderBox = InlineRect { };
-
-            if (inlineLevelBox.isAtomicInlineLevelBox()) {
-                borderBox = lineBox.logicalBorderBoxForAtomicInlineLevelBox(layoutBox, formattingContext().geometryForBox(layoutBox));
-                borderBox.moveBy(lineBoxRect.topLeft());
-            } else if (inlineLevelBox.isInlineBox()) {
-                auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
-                borderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
-                borderBox.moveBy(lineBoxRect.topLeft());
-                // Collect scrollable overflow from inline boxes. All other inline level boxes (e.g atomic inline level boxes) stretch the line.
-                auto hasScrollableContent = [&] {
-                    // In standards mode, inline boxes always start with an imaginary strut.
-                    return layoutState().inStandardsMode() || inlineLevelBox.hasContent() || boxGeometry.horizontalBorder() || (boxGeometry.horizontalPadding() && boxGeometry.horizontalPadding().value());
-                };
-                if (lineBox.hasContent() && hasScrollableContent()) {
-                    // Empty lines (e.g. continuation pre/post blocks) don't expect scrollbar overflow.
-                    scrollableOverflowRect.expandToContain(borderBox);
-                }
-            } else
-                ASSERT_NOT_REACHED();
-
-            enclosingTopAndBottom.top = std::min(enclosingTopAndBottom.top, borderBox.top());
-            enclosingTopAndBottom.bottom = std::max(enclosingTopAndBottom.bottom, borderBox.bottom());
-        }
-        return InlineDisplay::Line { lineBoxRect, scrollableOverflowRect, enclosingTopAndBottom, rootInlineBox.logicalTop() + rootInlineBox.baseline(), rootInlineBoxAlignmentOffset + rootInlineBox.logicalLeft(), rootInlineBox.logicalWidth() };
-    };
-    return { line(), lineBox };
+    return { lineBox, lineBoxLogicalHeight };
 }
 
 void LineBoxBuilder::adjustVerticalGeometryForInlineBoxWithFallbackFonts(InlineLevelBox& inlineBox, const TextUtil::FallbackFontList& fallbackFontsForContent) const

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h (287286 => 287287)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h	2021-12-21 00:24:53 UTC (rev 287286)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h	2021-12-21 00:33:19 UTC (rev 287287)
@@ -27,9 +27,7 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
-#include "InlineDisplayLine.h"
 #include "InlineFormattingContext.h"
-#include "InlineLineBox.h"
 #include "InlineLineBuilder.h"
 #include "TextUtil.h"
 
@@ -44,11 +42,11 @@
 public:
     LineBoxBuilder(const InlineFormattingContext&);
 
-    struct LineAndLineBox {
-        InlineDisplay::Line line;
+    struct LineBoxAndHeight {
         LineBox lineBox;
+        InlineLayoutUnit lineBoxLogicalHeight;
     };
-    LineAndLineBox build(const LineBuilder::LineContent&, size_t lineIndex);
+    LineBoxAndHeight build(const LineBuilder::LineContent&, size_t lineIndex);
 
 private:
     void setInitialVerticalGeometryForInlineBox(InlineLevelBox&) const;

Added: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp (0 => 287287)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp	                        (rev 0)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.cpp	2021-12-21 00:33:19 UTC (rev 287287)
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "InlineDisplayLineBuilder.h"
+
+#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
+namespace WebCore {
+namespace Layout {
+
+InlineDisplayLineBuilder::InlineDisplayLineBuilder(const InlineFormattingContext& inlineFormattingContext)
+    : m_inlineFormattingContext(inlineFormattingContext)
+{
+}
+
+InlineDisplay::Line InlineDisplayLineBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, InlineLayoutUnit lineBoxLogicalHeight, size_t lineIndex)
+{
+    auto& rootStyle = lineIndex ? root().firstLineStyle() : root().style();
+    auto physicalLeft = lineContent.lineLogicalTopLeft.x();
+    if (!rootStyle.isLeftToRightDirection()) {
+        // https://drafts.csswg.org/css-text/#text-indent-property
+        // Since text-indent only initiates margin start, we just need to pull the linebox back to the left.
+        physicalLeft -= lineContent.lineMarginStart;
+    }
+    // FIXME: Use physical geometry here.
+    auto lineBoxRect = InlineRect { lineContent.lineLogicalTopLeft.y(), physicalLeft, lineContent.lineLogicalWidth, lineBoxLogicalHeight };
+    auto scrollableOverflowRect = lineBoxRect;
+    auto& rootInlineBox = lineBox.rootInlineBox();
+    auto enclosingTopAndBottom = InlineDisplay::Line::EnclosingTopAndBottom { lineBoxRect.top() + rootInlineBox.logicalTop(), lineBoxRect.top() + rootInlineBox.logicalBottom() };
+
+    for (auto& inlineLevelBox : lineBox.nonRootInlineLevelBoxes()) {
+        if (!inlineLevelBox.isAtomicInlineLevelBox() && !inlineLevelBox.isInlineBox())
+            continue;
+
+        auto& layoutBox = inlineLevelBox.layoutBox();
+        auto borderBox = InlineRect { };
+
+        if (inlineLevelBox.isAtomicInlineLevelBox()) {
+            borderBox = lineBox.logicalBorderBoxForAtomicInlineLevelBox(layoutBox, formattingContext().geometryForBox(layoutBox));
+            borderBox.moveBy(lineBoxRect.topLeft());
+        } else if (inlineLevelBox.isInlineBox()) {
+            auto& boxGeometry = formattingContext().geometryForBox(layoutBox);
+            borderBox = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry);
+            borderBox.moveBy(lineBoxRect.topLeft());
+            // Collect scrollable overflow from inline boxes. All other inline level boxes (e.g atomic inline level boxes) stretch the line.
+            auto hasScrollableContent = [&] {
+                // In standards mode, inline boxes always start with an imaginary strut.
+                return layoutState().inStandardsMode() || inlineLevelBox.hasContent() || boxGeometry.horizontalBorder() || (boxGeometry.horizontalPadding() && boxGeometry.horizontalPadding().value());
+            };
+            if (lineBox.hasContent() && hasScrollableContent()) {
+                // Empty lines (e.g. continuation pre/post blocks) don't expect scrollbar overflow.
+                scrollableOverflowRect.expandToContain(borderBox);
+            }
+        } else
+            ASSERT_NOT_REACHED();
+
+        enclosingTopAndBottom.top = std::min(enclosingTopAndBottom.top, borderBox.top());
+        enclosingTopAndBottom.bottom = std::max(enclosingTopAndBottom.bottom, borderBox.bottom());
+    }
+    return InlineDisplay::Line { lineBoxRect, scrollableOverflowRect, enclosingTopAndBottom, rootInlineBox.logicalTop() + rootInlineBox.baseline(), lineBox.rootInlineBoxAlignmentOffset() + rootInlineBox.logicalLeft(), rootInlineBox.logicalWidth() };
+}
+
+}
+}
+
+#endif

Copied: trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h (from rev 287286, trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h) (0 => 287287)


--- trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h	                        (rev 0)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayLineBuilder.h	2021-12-21 00:33:19 UTC (rev 287287)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
+
+#include "InlineDisplayLine.h"
+#include "InlineFormattingContext.h"
+#include "InlineLineBuilder.h"
+
+namespace WebCore {
+namespace Layout {
+
+class LineBox;
+
+class InlineDisplayLineBuilder {
+public:
+    InlineDisplayLineBuilder(const InlineFormattingContext&);
+
+    InlineDisplay::Line build(const LineBuilder::LineContent&, const LineBox&, InlineLayoutUnit lineBoxLogicalHeight, size_t lineIndex);
+
+private:
+    const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
+    const Box& root() const { return formattingContext().root(); }
+    LayoutState& layoutState() const { return formattingContext().layoutState(); }
+
+    const InlineFormattingContext& m_inlineFormattingContext;
+};
+
+}
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to