diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index 9d7441c2b9..ac474a653f 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -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 m_vector_font; + + HashMap> mutable m_cached_fonts; }; static StyleSheet& default_stylesheet()