diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-08-07 05:02:51 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-08-07 05:02:51 +0000 |
commit | 0e126143b10062055ed87362fa0bf8907a437c3b (patch) | |
tree | 5b1797abf49d0d51c2dd11b34fbd1fef97bf37b1 | |
parent | 162eb43d59336656f578d6efc9100c7f390c72b2 (diff) | |
parent | 17250eefea571ea2d4ec22accd80fe944a52253d (diff) | |
download | pango-0e126143b10062055ed87362fa0bf8907a437c3b.tar.gz |
Merge branch 'filter-by-format' into 'master'
Better filtering by font format
See merge request GNOME/pango!126
-rw-r--r-- | pango/pangofc-fontmap.c | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index d0a01115..2bda526e 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -807,6 +807,42 @@ pango_fc_patterns_get_pattern (PangoFcPatterns *pats) return pats->pattern; } +static gboolean +pango_fc_is_supported_font_format (const char *fontformat) +{ + /* harfbuzz supports only SFNT fonts. */ + /* FIXME: "CFF" is used for both CFF in OpenType and bare CFF files, but + * HarfBuzz does not support the later and FontConfig does not seem + * to have a way to tell them apart. + */ + if (g_ascii_strcasecmp (fontformat, "TrueType") == 0 || + g_ascii_strcasecmp (fontformat, "CFF") == 0) + return TRUE; + return FALSE; +} + +static FcFontSet * +filter_fontset_by_format (FcFontSet *fontset) +{ + FcFontSet *result; + int i; + + result = FcFontSetCreate (); + + for (i = 0; i < fontset->nfont; i++) + { + FcResult res; + const char *s; + + res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s); + g_assert (res == FcResultMatch); + if (pango_fc_is_supported_font_format (s)) + FcFontSetAdd (result, FcPatternDuplicate (fontset->fonts[i])); + } + + return result; +} + static FcPattern * pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prepare) { @@ -827,7 +863,17 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep if (!pats->fontset) { FcResult result; - pats->fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcTrue, NULL, &result); + FcFontSet *fontset; + FcFontSet *filtered; + + fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result); + filtered = filter_fontset_by_format (fontset); + FcFontSetDestroy (fontset); + + pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result); + + FcFontSetDestroy (filtered); + if (pats->match) { FcPatternDestroy (pats->match); @@ -895,39 +941,19 @@ pango_fc_fontset_get_key (PangoFcFontset *fontset) return fontset->key; } -static gboolean -pango_fc_is_supported_font_format (const char *fontformat) -{ - /* harfbuzz supports only SFNT fonts. */ - /* FIXME: "CFF" is used for both CFF in OpenType and bare CFF files, but - * HarfBuzz does not support the later and FontConfig does not seem - * to have a way to tell them apart. - */ - if (g_ascii_strcasecmp (fontformat, "TrueType") == 0 || - g_ascii_strcasecmp (fontformat, "CFF") == 0) - return TRUE; - return FALSE; -} - static PangoFont * -pango_fc_fontset_load_next_font (PangoFcFontset *fontset, - gboolean *has_more) +pango_fc_fontset_load_next_font (PangoFcFontset *fontset) { FcPattern *pattern, *font_pattern; PangoFont *font; gboolean prepare; - FcResult res; - const char *s; pattern = pango_fc_patterns_get_pattern (fontset->patterns); font_pattern = pango_fc_patterns_get_font_pattern (fontset->patterns, fontset->patterns_i++, &prepare); if (G_UNLIKELY (!font_pattern)) - { - *has_more = FALSE; - return NULL; - } + return NULL; if (prepare) { @@ -937,34 +963,26 @@ pango_fc_fontset_load_next_font (PangoFcFontset *fontset, return NULL; } - res = FcPatternGetString (font_pattern, FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s); - g_assert (res == FcResultMatch); - if (!pango_fc_is_supported_font_format (s)) - font = NULL; - else - font = pango_fc_font_map_new_font (fontset->key->fontmap, - fontset->key, - font_pattern); + font = pango_fc_font_map_new_font (fontset->key->fontmap, + fontset->key, + font_pattern); if (prepare) FcPatternDestroy (font_pattern); - *has_more = TRUE; - return font; } static PangoFont * pango_fc_fontset_get_font_at (PangoFcFontset *fontset, - unsigned int i, - gboolean *has_more) + unsigned int i) { while (i >= fontset->fonts->len) { - PangoFont *font = pango_fc_fontset_load_next_font (fontset, has_more); + PangoFont *font = pango_fc_fontset_load_next_font (fontset); g_ptr_array_add (fontset->fonts, font); g_ptr_array_add (fontset->coverages, NULL); - if (!*has_more) + if (!font) return NULL; } @@ -1041,20 +1059,11 @@ pango_fc_fontset_get_font (PangoFontset *fontset, PangoCoverage *coverage; int result = -1; unsigned int i; - gboolean has_more; - for (i = 0; TRUE; i++) + for (i = 0; + pango_fc_fontset_get_font_at (fcfontset, i); + i++) { - font = pango_fc_fontset_get_font_at (fcfontset, i, &has_more); - - if (font == NULL) - { - if (has_more) - continue; - else - break; - } - coverage = g_ptr_array_index (fcfontset->coverages, i); if (coverage == NULL) @@ -1090,21 +1099,12 @@ pango_fc_fontset_foreach (PangoFontset *fontset, { PangoFcFontset *fcfontset = PANGO_FC_FONTSET (fontset); PangoFont *font; - gboolean has_more; unsigned int i; - for (i = 0; TRUE; i++) + for (i = 0; + (font = pango_fc_fontset_get_font_at (fcfontset, i)); + i++) { - font = pango_fc_fontset_get_font_at (fcfontset, i, &has_more); - - if (font == NULL) - { - if (has_more) - continue; - else - break; - } - if ((*func) (fontset, font, data)) return; } |