diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-08-16 08:17:50 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-02-22 08:27:16 -0500 |
commit | 95022977ef9ac94d0d38a3ff72e327da0b46950b (patch) | |
tree | 9403a96317187dff8f5543078c6e89037153569e /pango/pangofc-fontmap.c | |
parent | e9d04daa515609d91b30666b88b0d41bc8b74d2c (diff) | |
download | pango-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.
Diffstat (limited to 'pango/pangofc-fontmap.c')
-rw-r--r-- | pango/pangofc-fontmap.c | 81 |
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) |