[pango] Bug 673497 - corefont fallback not always working
- From: Kristian Rietveld <kristian src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango] Bug 673497 - corefont fallback not always working
- Date: Mon, 4 Jun 2012 19:03:55 +0000 (UTC)
commit f5135453d26e68f9f2fbe8f0ddb01e437df41384
Author: Kristian Rietveld <kris loopnest org>
Date: Mon Jun 4 20:27:01 2012 +0200
Bug 673497 - corefont fallback not always working
The fallback failed when a "small caps" font was requested. This commit
improves the fallback support. When the first fallback, trying Sans with
the same style fails, we reset the variant, weight and stretch to
default values and try again. With Sans we should always be able to
adhere to the requested style.
Last but not least, output a sensible error message if all fallbacks
fail instead of simply crashing on a NULL pointer somewhere.
pango/pangocoretext-fontmap.c | 48 +++++++++++++++++++++++++++++++++++-----
1 files changed, 42 insertions(+), 6 deletions(-)
---
diff --git a/pango/pangocoretext-fontmap.c b/pango/pangocoretext-fontmap.c
index e184b6b..026782a 100644
--- a/pango/pangocoretext-fontmap.c
+++ b/pango/pangocoretext-fontmap.c
@@ -1233,6 +1233,7 @@ pango_core_text_font_map_load_fontset (PangoFontMap *fontmap,
PangoCoreTextFontset *fontset;
PangoCoreTextFontsetKey key;
PangoCoreTextFontMap *ctfontmap = PANGO_CORE_TEXT_FONT_MAP (fontmap);
+ static gboolean warned_full_fallback = FALSE;
pango_core_text_fontset_key_init (&key, ctfontmap,
context, desc, language);
@@ -1250,7 +1251,8 @@ pango_core_text_font_map_load_fontset (PangoFontMap *fontmap,
else
{
/* If no font(set) could be loaded, we fallback to "Sans",
- * which should always work on Mac.
+ * which should always work on Mac. We try to adhere to the
+ * requested style at first.
*/
PangoFontDescription *tmp_desc;
@@ -1265,13 +1267,47 @@ pango_core_text_font_map_load_fontset (PangoFontMap *fontmap,
fontset = g_hash_table_lookup (ctfontmap->fontset_hash, &key);
if (G_UNLIKELY (!fontset))
- {
- fontset = pango_core_text_fontset_new (&key, tmp_desc);
- g_hash_table_insert (ctfontmap->fontset_hash,
- pango_core_text_fontset_get_key (fontset),
- fontset);
+ fontset = pango_core_text_fontset_new (&key, tmp_desc);
+ if (G_UNLIKELY (!fontset))
+ {
+ /* We could not load Sans in the requested style; reset
+ * variant, weight and stretch to sensible defaults (we should
+ * be able to adhere the PangoStyle with "Sans").
+ */
+ pango_font_description_set_variant (tmp_desc, PANGO_VARIANT_NORMAL);
+ pango_font_description_set_weight (tmp_desc, PANGO_WEIGHT_NORMAL);
+ pango_font_description_set_stretch (tmp_desc, PANGO_STRETCH_NORMAL);
+
+ if (!warned_full_fallback)
+ {
+ char *ctmp;
+
+ warned_full_fallback = TRUE;
+
+ ctmp = pango_font_description_to_string (desc);
+ g_warning ("couldn't load font \"%s\", modified variant/"
+ "weight/stretch as fallback, expect ugly output.",
+ ctmp);
+ g_free (ctmp);
+ }
+
+ fontset = g_hash_table_lookup (ctfontmap->fontset_hash, &key);
+ if (G_UNLIKELY (!fontset))
+ fontset = pango_core_text_fontset_new (&key, tmp_desc);
+
+ if (G_UNLIKELY (!fontset))
+ {
+ /* If even that failed, display a sensible error message
+ * and bail out, in contrast to failing randomly.
+ */
+ g_error ("Could not load fallback font, bailing out.");
+ }
}
+
+ g_hash_table_insert (ctfontmap->fontset_hash,
+ pango_core_text_fontset_get_key (fontset),
+ fontset);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]