summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-08-03 17:48:50 -0400
committerMatthias Clasen <mclasen@redhat.com>2019-08-03 20:55:57 -0400
commitbc9160fa29d3c59841bbd3e3f049bc5093ac89f4 (patch)
tree60bafc40340d8b4032625747684d5f125371d368
parentadb199cb29dccb1913b9a1b9c25a2043a492457c (diff)
downloadpango-bc9160fa29d3c59841bbd3e3f049bc5093ac89f4.tar.gz
fc: Don't return fonts with unsupported formats
Make pango_fontset_foreach skip fonts that in formats that harfbuzz doesn't support. Some reshuffling was necessary since previously the code was assuming that the first NULL indicates the end of available fonts.
-rw-r--r--pango/pangofc-fontmap.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 43ab7dbc..bddd5410 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -896,18 +896,24 @@ pango_fc_fontset_get_key (PangoFcFontset *fontset)
}
static PangoFont *
-pango_fc_fontset_load_next_font (PangoFcFontset *fontset)
+pango_fc_fontset_load_next_font (PangoFcFontset *fontset,
+ gboolean *has_more)
{
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))
- return NULL;
+ {
+ *has_more = FALSE;
+ return NULL;
+ }
if (prepare)
{
@@ -917,26 +923,35 @@ pango_fc_fontset_load_next_font (PangoFcFontset *fontset)
return NULL;
}
- font = pango_fc_font_map_new_font (fontset->key->fontmap,
- fontset->key,
- font_pattern);
+ res = FcPatternGetString (font_pattern, FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s);
+ g_assert (res == FcResultMatch);
+ /* harfbuzz does not support these */
+ if (strcmp (s, "Type 1") == 0 || strcmp (s, "PCF") == 0)
+ font = NULL;
+ else
+ 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)
+ unsigned int i,
+ gboolean *has_more)
{
while (i >= fontset->fonts->len)
{
- PangoFont *font = pango_fc_fontset_load_next_font (fontset);
+ PangoFont *font = pango_fc_fontset_load_next_font (fontset, has_more);
g_ptr_array_add (fontset->fonts, font);
g_ptr_array_add (fontset->coverages, NULL);
- if (!font)
+ if (!*has_more)
return NULL;
}
@@ -1013,11 +1028,20 @@ pango_fc_fontset_get_font (PangoFontset *fontset,
PangoCoverage *coverage;
int result = -1;
unsigned int i;
+ gboolean has_more;
- for (i = 0;
- pango_fc_fontset_get_font_at (fcfontset, i);
- i++)
+ for (i = 0; TRUE; 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)
@@ -1042,7 +1066,7 @@ pango_fc_fontset_get_font (PangoFontset *fontset,
if (G_UNLIKELY (result == -1))
return NULL;
- font = g_ptr_array_index(fcfontset->fonts, result);
+ font = g_ptr_array_index (fcfontset->fonts, result);
return g_object_ref (font);
}
@@ -1053,12 +1077,21 @@ pango_fc_fontset_foreach (PangoFontset *fontset,
{
PangoFcFontset *fcfontset = PANGO_FC_FONTSET (fontset);
PangoFont *font;
+ gboolean has_more;
unsigned int i;
- for (i = 0;
- (font = pango_fc_fontset_get_font_at (fcfontset, i));
- i++)
+ for (i = 0; TRUE; 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;
}
@@ -1360,6 +1393,7 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap,
PangoFcFamily *temp_family;
res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s);
+ g_assert (res == FcResultMatch);
if (strcmp (s, "Type 1") == 0 || strcmp (s, "PCF") == 0)
continue; /* harfbuzz does not support these */