[pango/speed-up-format-filtering: 165/169] fc: Only do filtering by format once




commit 95022977ef9ac94d0d38a3ff72e327da0b46950b
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Aug 16 08:17:50 2020 -0400

    fc: Only do filtering by format once
    
    The fontconfig configuration changes rarely, so we can avoid
    unnecessary work by only doing the filtering by supported formats
    once, and keeping the result.

 pango/pangofc-fontmap.c | 81 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 58 insertions(+), 23 deletions(-)
---
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 3b12d246..6cecfeac 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -157,6 +157,7 @@ struct _PangoFcFontMapPrivate
   guint closed : 1;
 
   FcConfig *config;
+  FcFontSet *fonts;
 };
 
 struct _PangoFcFontFaceData
@@ -841,18 +842,29 @@ pango_fc_is_supported_font_format (FcPattern* pattern)
   return FALSE;
 }
 
+static FcFontSet *pango_fc_font_map_get_config_fonts (PangoFcFontMap *fcfontmap);
+
 static FcFontSet *
-filter_fontset_by_format (FcFontSet *fontset)
+filter_by_format (FcFontSet **sets, int nsets)
 {
   FcFontSet *result;
-  int i;
+  int set;
 
   result = FcFontSetCreate ();
 
-  for (i = 0; i < fontset->nfont; i++)
+  for (set = 0; set < nsets; set++)
     {
-      if (pango_fc_is_supported_font_format (fontset->fonts[i]))
+      FcFontSet *fontset = sets[set];
+      int i;
+
+      if (!fontset)
+        continue;
+
+      for (i = 0; i < fontset->nfont; i++)
         {
+          if (!pango_fc_is_supported_font_format (fontset->fonts[i]))
+            continue;
+
           FcPatternReference (fontset->fonts[i]);
           FcFontSetAdd (result, fontset->fonts[i]);
         }
@@ -867,34 +879,38 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep
   if (i == 0)
     {
       FcResult result;
+
       if (!pats->match && !pats->fontset)
-       pats->match = FcFontMatch (pats->fontmap->priv->config, pats->pattern, &result);
+        {
+          FcFontSet *fonts;
 
-      if (pats->match && pango_fc_is_supported_font_format (pats->match))
-       {
-         *prepare = FALSE;
-         return pats->match;
-       }
-    }
+          fonts = pango_fc_font_map_get_config_fonts (pats->fontmap);
 
-  if (!pats->fontset)
-    {
-      FcResult result;
-      FcFontSet *filtered[2] = { NULL, };
-      int i, n = 0;
+          pats->match = FcFontSetMatch (pats->fontmap->priv->config,
+                                        &fonts, 1,
+                                        pats->pattern,
+                                        &result);
+        }
 
-      for (i = 0; i < 2; i++)
+      if (pats->match)
         {
-          FcFontSet *fonts = FcConfigGetFonts (pats->fontmap->priv->config, i);
-          if (fonts)
-            filtered[n++] = filter_fontset_by_format (fonts);
+          *prepare = FALSE;
+          return pats->match;
         }
+    }
 
-      pats->fontset = FcFontSetSort (pats->fontmap->priv->config, filtered, n, pats->pattern, FcTrue, NULL, 
&result);
+  if (!pats->fontset)
+    {
+      FcResult result;
+      FcFontSet *fonts;
 
-      for (i = 0; i < n; i++)
-        FcFontSetDestroy (filtered[i]);
+      fonts = pango_fc_font_map_get_config_fonts (pats->fontmap);
 
+      pats->fontset = FcFontSetSort (pats->fontmap->priv->config,
+                                     &fonts, 1,
+                                     pats->pattern,
+                                     FcTrue, NULL,
+                                     &result);
 
       if (pats->match)
         {
@@ -1218,6 +1234,8 @@ pango_fc_font_map_fini (PangoFcFontMap *fcfontmap)
   PangoFcFontMapPrivate *priv = fcfontmap->priv;
   int i;
 
+  g_clear_pointer (&priv->fonts, FcFontSetDestroy);
+
   g_queue_free (priv->fontset_cache);
   priv->fontset_cache = NULL;
 
@@ -2092,6 +2110,8 @@ pango_fc_font_map_set_config (PangoFcFontMap *fcfontmap,
 
   fcfontmap->priv->config = fcconfig;
 
+  g_clear_pointer (&fcfontmap->priv->fonts, FcFontSetDestroy);
+
   if (oldconfig != fcconfig)
     pango_fc_font_map_config_changed (fcfontmap);
 
@@ -2120,6 +2140,21 @@ pango_fc_font_map_get_config (PangoFcFontMap *fcfontmap)
   return fcfontmap->priv->config;
 }
 
+static FcFontSet *
+pango_fc_font_map_get_config_fonts (PangoFcFontMap *fcfontmap)
+{
+  if (fcfontmap->priv->fonts == NULL)
+    {
+      FcFontSet *sets[2];
+
+      sets[0] = FcConfigGetFonts (fcfontmap->priv->config, 0);
+      sets[1] = FcConfigGetFonts (fcfontmap->priv->config, 1);
+      fcfontmap->priv->fonts = filter_by_format (sets, 2);
+    }
+
+  return fcfontmap->priv->fonts;
+}
+
 static PangoFcFontFaceData *
 pango_fc_font_map_get_font_face_data (PangoFcFontMap *fcfontmap,
                                      FcPattern      *font_pattern)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]