summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-08-07 05:02:51 +0000
committerMatthias Clasen <mclasen@redhat.com>2019-08-07 05:02:51 +0000
commit0e126143b10062055ed87362fa0bf8907a437c3b (patch)
tree5b1797abf49d0d51c2dd11b34fbd1fef97bf37b1
parent162eb43d59336656f578d6efc9100c7f390c72b2 (diff)
parent17250eefea571ea2d4ec22accd80fe944a52253d (diff)
downloadpango-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.c122
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;
}