1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:18:11 +00:00

LibWeb: Cache scaled web fonts instead of recreating them every time

Previously, we would create a new Gfx::ScaledFont whenever we needed one
for an element's computed style. This worked fine on Acid3 since the use
of web fonts was extremely limited.

In the wild, web fonts obviously get used a lot more, so let's have a
per-point-size font cache for them.
This commit is contained in:
Andreas Kling 2022-04-10 12:32:16 +02:00
parent ae6b09f4dc
commit 751b605690

View file

@ -68,7 +68,19 @@ public:
{
if (!m_vector_font)
return nullptr;
return adopt_ref(*new Gfx::ScaledFont(*m_vector_font, point_size, point_size));
if (auto it = m_cached_fonts.find(point_size); it != m_cached_fonts.end())
return it->value;
// FIXME: It might be nicer to have a global cap on the number of fonts we cache
// instead of doing it at the per-font level like this.
constexpr size_t max_cached_font_size_count = 64;
if (m_cached_fonts.size() > max_cached_font_size_count)
m_cached_fonts.remove(m_cached_fonts.begin());
auto font = adopt_ref(*new Gfx::ScaledFont(*m_vector_font, point_size, point_size));
m_cached_fonts.set(point_size, font);
return font;
}
private:
@ -92,6 +104,8 @@ private:
StyleComputer& m_style_computer;
FlyString m_family_name;
RefPtr<Gfx::VectorFont> m_vector_font;
HashMap<float, NonnullRefPtr<Gfx::ScaledFont>> mutable m_cached_fonts;
};
static StyleSheet& default_stylesheet()