Просмотр исходного кода

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.
Andreas Kling 3 лет назад
Родитель
Сommit
751b605690
1 измененных файлов с 15 добавлено и 1 удалено
  1. 15 1
      Userland/Libraries/LibWeb/CSS/StyleComputer.cpp

+ 15 - 1
Userland/Libraries/LibWeb/CSS/StyleComputer.cpp

@@ -68,7 +68,19 @@ public:
     {
     {
         if (!m_vector_font)
         if (!m_vector_font)
             return nullptr;
             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:
 private:
@@ -92,6 +104,8 @@ private:
     StyleComputer& m_style_computer;
     StyleComputer& m_style_computer;
     FlyString m_family_name;
     FlyString m_family_name;
     RefPtr<Gfx::VectorFont> m_vector_font;
     RefPtr<Gfx::VectorFont> m_vector_font;
+
+    HashMap<float, NonnullRefPtr<Gfx::ScaledFont>> mutable m_cached_fonts;
 };
 };
 
 
 static StyleSheet& default_stylesheet()
 static StyleSheet& default_stylesheet()