Title: [282725] trunk/Source/WebCore
Revision
282725
Author
[email protected]
Date
2021-09-18 06:29:40 -0700 (Sat, 18 Sep 2021)

Log Message

[LFC][IFC] Add skeleton implementation for fallback font support
https://bugs.webkit.org/show_bug.cgi?id=230433

Reviewed by Antti Koivisto.

This is in preparation for supporting inline box stretching glyphs coming from fallback fonts.

* layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
(WebCore::Layout::LineBoxBuilder::adjustVerticalGeometryForInlineBoxWithFallbackFonts const):
(WebCore::Layout::LineBoxBuilder::setInitialVerticalGeometryForInlineBox const):
(WebCore::Layout::LineBoxBuilder::constructAndAlignInlineLevelBoxes):
(WebCore::Layout::LineBoxBuilder::setVerticalGeometryForInlineBox const): Deleted.
* layout/formattingContexts/inline/InlineLineBoxBuilder.h:
* layout/formattingContexts/inline/text/TextUtil.cpp:
(WebCore::Layout::TextUtil::fallbackFontsForRun):
* layout/formattingContexts/inline/text/TextUtil.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (282724 => 282725)


--- trunk/Source/WebCore/ChangeLog	2021-09-18 13:29:11 UTC (rev 282724)
+++ trunk/Source/WebCore/ChangeLog	2021-09-18 13:29:40 UTC (rev 282725)
@@ -1,5 +1,24 @@
 2021-09-18  Alan Bujtas  <[email protected]>
 
+        [LFC][IFC] Add skeleton implementation for fallback font support
+        https://bugs.webkit.org/show_bug.cgi?id=230433
+
+        Reviewed by Antti Koivisto.
+
+        This is in preparation for supporting inline box stretching glyphs coming from fallback fonts.
+
+        * layout/formattingContexts/inline/InlineLineBoxBuilder.cpp:
+        (WebCore::Layout::LineBoxBuilder::adjustVerticalGeometryForInlineBoxWithFallbackFonts const):
+        (WebCore::Layout::LineBoxBuilder::setInitialVerticalGeometryForInlineBox const):
+        (WebCore::Layout::LineBoxBuilder::constructAndAlignInlineLevelBoxes):
+        (WebCore::Layout::LineBoxBuilder::setVerticalGeometryForInlineBox const): Deleted.
+        * layout/formattingContexts/inline/InlineLineBoxBuilder.h:
+        * layout/formattingContexts/inline/text/TextUtil.cpp:
+        (WebCore::Layout::TextUtil::fallbackFontsForRun):
+        * layout/formattingContexts/inline/text/TextUtil.h:
+
+2021-09-18  Alan Bujtas  <[email protected]>
+
         [IFC][Integration] Enable surrogate pairs
         https://bugs.webkit.org/show_bug.cgi?id=229434
 

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2021-09-18 13:29:11 UTC (rev 282724)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.cpp	2021-09-18 13:29:40 UTC (rev 282725)
@@ -158,8 +158,15 @@
     return { lineBox, lineGeometry() };
 }
 
-void LineBoxBuilder::setVerticalGeometryForInlineBox(InlineLevelBox& inlineLevelBox) const
+void LineBoxBuilder::adjustVerticalGeometryForInlineBoxWithFallbackFonts(InlineLevelBox& parentInlineBox, const Line::Run& textRun, const TextUtil::FallbackFontList& fallbackFonts) const
 {
+    UNUSED_PARAM(parentInlineBox);
+    UNUSED_PARAM(textRun);
+    UNUSED_PARAM(fallbackFonts);
+}
+
+void LineBoxBuilder::setInitialVerticalGeometryForInlineBox(InlineLevelBox& inlineLevelBox) const
+{
     ASSERT(inlineLevelBox.isInlineBox() || inlineLevelBox.isLineBreakBox());
     auto& fontMetrics = inlineLevelBox.style().fontMetrics();
     InlineLayoutUnit ascent = fontMetrics.ascent();
@@ -195,7 +202,7 @@
 InlineLayoutUnit LineBoxBuilder::constructAndAlignInlineLevelBoxes(LineBox& lineBox, const Line::RunList& runs)
 {
     auto& rootInlineBox = lineBox.rootInlineBox();
-    setVerticalGeometryForInlineBox(rootInlineBox);
+    setInitialVerticalGeometryForInlineBox(rootInlineBox);
 
     // FIXME: Add fast path support for line-height content.
     // FIXME: We should always be able to exercise the fast path when the line has no content at all, even in non-standards mode or with line-height set.
@@ -236,7 +243,7 @@
         // Construct the missing LineBox::InlineBoxes starting with the topmost layout box.
         for (auto* layoutBox : WTF::makeReversedRange(layoutBoxesWithoutInlineBoxes)) {
             auto inlineBox = InlineLevelBox::createInlineBox(*layoutBox, rootInlineBox.logicalLeft(), rootInlineBox.logicalWidth(), InlineLevelBox::LineSpanningInlineBox::Yes);
-            setVerticalGeometryForInlineBox(inlineBox);
+            setInitialVerticalGeometryForInlineBox(inlineBox);
             updateCanUseSimplifiedAlignment(inlineBox);
             lineBox.addInlineLevelBox(WTFMove(inlineBox));
         }
@@ -303,7 +310,7 @@
             auto initialLogicalWidth = rootInlineBox.logicalWidth() - (run.logicalLeft() + marginStart);
             ASSERT(initialLogicalWidth >= 0);
             auto inlineBox = InlineLevelBox::createInlineBox(layoutBox, logicalLeft + marginStart, initialLogicalWidth);
-            setVerticalGeometryForInlineBox(inlineBox);
+            setInitialVerticalGeometryForInlineBox(inlineBox);
             updateCanUseSimplifiedAlignment(inlineBox);
             lineBox.addInlineLevelBox(WTFMove(inlineBox));
             continue;
@@ -324,14 +331,24 @@
             updateCanUseSimplifiedAlignment(inlineBox);
             continue;
         }
-        if (run.isText() || run.isSoftLineBreak()) {
-            // FIXME: Adjust non-empty inline box height when glyphs from the non-primary font stretch the box.
+        if (run.isText()) {
+            auto& parentInlineBox = lineBox.inlineLevelBoxForLayoutBox(layoutBox.parent());
+            parentInlineBox.setHasContent();
+            auto fallbackFonts = TextUtil::fallbackFontsForRun(run);
+            if (!fallbackFonts.isEmpty()) {
+                // Adjust non-empty inline box height when glyphs from the non-primary font stretch the box.
+                adjustVerticalGeometryForInlineBoxWithFallbackFonts(parentInlineBox, run, fallbackFonts);
+                updateCanUseSimplifiedAlignment(parentInlineBox);
+            }
+            continue;
+        }
+        if (run.isSoftLineBreak()) {
             lineBox.inlineLevelBoxForLayoutBox(layoutBox.parent()).setHasContent();
             continue;
         }
         if (run.isHardLineBreak()) {
             auto lineBreakBox = InlineLevelBox::createLineBreakBox(layoutBox, logicalLeft);
-            setVerticalGeometryForInlineBox(lineBreakBox);
+            setInitialVerticalGeometryForInlineBox(lineBreakBox);
             updateCanUseSimplifiedAlignment(lineBreakBox);
             lineBox.addInlineLevelBox(WTFMove(lineBreakBox));
             continue;

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h	2021-09-18 13:29:11 UTC (rev 282724)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBoxBuilder.h	2021-09-18 13:29:40 UTC (rev 282725)
@@ -31,6 +31,7 @@
 #include "InlineLineBox.h"
 #include "InlineLineBuilder.h"
 #include "InlineLineGeometry.h"
+#include "TextUtil.h"
 
 namespace WebCore {
 namespace Layout {
@@ -50,7 +51,8 @@
     LineBoxAndGeometry build(const LineBuilder::LineContent&);
 
 private:
-    void setVerticalGeometryForInlineBox(InlineLevelBox&) const;
+    void setInitialVerticalGeometryForInlineBox(InlineLevelBox&) const;
+    void adjustVerticalGeometryForInlineBoxWithFallbackFonts(InlineLevelBox&, const Line::Run&, const TextUtil::FallbackFontList&) const;
     InlineLayoutUnit constructAndAlignInlineLevelBoxes(LineBox&, const Line::RunList&);
 
     const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp (282724 => 282725)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2021-09-18 13:29:11 UTC (rev 282724)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2021-09-18 13:29:40 UTC (rev 282725)
@@ -84,6 +84,13 @@
     return std::isnan(width) ? 0.0f : std::isinf(width) ? maxInlineLayoutUnit() : width;
 }
 
+TextUtil::FallbackFontList TextUtil::fallbackFontsForRun(const Line::Run& run)
+{
+    UNUSED_PARAM(run);
+
+    return { };
+}
+
 TextUtil::MidWordBreak TextUtil::midWordBreak(const InlineTextItem& inlineTextItem, InlineLayoutUnit textWidth, InlineLayoutUnit availableWidth, InlineLayoutUnit contentLogicalLeft)
 {
     ASSERT(availableWidth >= 0);

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h (282724 => 282725)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2021-09-18 13:29:11 UTC (rev 282724)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2021-09-18 13:29:40 UTC (rev 282725)
@@ -27,7 +27,9 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
+#include "Font.h"
 #include "InlineItem.h"
+#include "InlineLine.h"
 #include "LayoutUnits.h"
 #include <wtf/text/TextBreakIterator.h>
 
@@ -46,6 +48,9 @@
     static InlineLayoutUnit width(const InlineTextItem&, unsigned from, unsigned to, InlineLayoutUnit contentLogicalLeft);
     static InlineLayoutUnit width(const InlineTextBox&, unsigned from, unsigned to, InlineLayoutUnit contentLogicalLeft);
 
+    using FallbackFontList = HashSet<const Font*>;
+    static FallbackFontList fallbackFontsForRun(const Line::Run&);
+
     struct MidWordBreak {
         size_t start { 0 };
         size_t length { 0 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to