summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-08-16 08:17:50 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-02-22 08:27:16 -0500
commit95022977ef9ac94d0d38a3ff72e327da0b46950b (patch)
tree9403a96317187dff8f5543078c6e89037153569e
parente9d04daa515609d91b30666b88b0d41bc8b74d2c (diff)
downloadpango-95022977ef9ac94d0d38a3ff72e327da0b46950b.tar.gz
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.
-rw-r--r--pango/pangofc-fontmap.c81
1 files 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)