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