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