LibWeb: Skip font if it doesn't contain needed glyph in FontCascadeList

Before this change, we were only checking for actual glyph containment
in a font if unicode ranges were specified. However that is not
sufficient for emoji support, where we want to continue searching for
a font until one containing emojis is found.
This commit is contained in:
Aliaksandr Kalenik 2024-09-05 22:33:36 +02:00 committed by Tim Flynn
commit 67fe8d66b2
Notes: github-actions[bot] 2024-09-06 12:31:52 +00:00
3 changed files with 13 additions and 10 deletions

View file

@ -28,16 +28,16 @@ void FontCascadeList::extend(FontCascadeList const& other)
Gfx::Font const& FontCascadeList::font_for_code_point(u32 code_point) const Gfx::Font const& FontCascadeList::font_for_code_point(u32 code_point) const
{ {
for (auto const& entry : m_fonts) { for (auto const& entry : m_fonts) {
if (!entry.unicode_ranges.has_value()) if (entry.unicode_ranges.has_value()) {
return entry.font;
if (!entry.font->contains_glyph(code_point))
continue;
for (auto const& range : *entry.unicode_ranges) { for (auto const& range : *entry.unicode_ranges) {
if (range.contains(code_point)) if (range.contains(code_point) && entry.font->contains_glyph(code_point))
return entry.font;
}
} else if (entry.font->contains_glyph(code_point)) {
return entry.font; return entry.font;
} }
} }
VERIFY_NOT_REACHED(); return *m_last_resort_font;
} }
bool FontCascadeList::equals(FontCascadeList const& other) const bool FontCascadeList::equals(FontCascadeList const& other) const

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com> * Copyright (c) 2023-2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -19,7 +19,7 @@ public:
} }
size_t size() const { return m_fonts.size(); } size_t size() const { return m_fonts.size(); }
bool is_empty() const { return m_fonts.is_empty(); } bool is_empty() const { return m_fonts.is_empty() && !m_last_resort_font; }
Font const& first() const { return *m_fonts.first().font; } Font const& first() const { return *m_fonts.first().font; }
template<typename Callback> template<typename Callback>
@ -43,7 +43,10 @@ public:
Optional<Vector<UnicodeRange>> unicode_ranges; Optional<Vector<UnicodeRange>> unicode_ranges;
}; };
void set_last_resort_font(NonnullRefPtr<Font> font) { m_last_resort_font = move(font); }
private: private:
RefPtr<Font const> m_last_resort_font;
Vector<Entry> m_fonts; Vector<Entry> m_fonts;
}; };

View file

@ -2326,7 +2326,7 @@ RefPtr<Gfx::FontCascadeList const> StyleComputer::compute_font_for_style_values(
} }
auto found_font = StyleProperties::font_fallback(monospace, bold); auto found_font = StyleProperties::font_fallback(monospace, bold);
font_list->add(found_font->with_size(font_size_in_pt)); font_list->set_last_resort_font(found_font->with_size(font_size_in_pt));
return font_list; return font_list;
} }