From 4f2f6d1280407e8a2782e3ac26b6286d94d41ac8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Apr 2006 23:47:55 +0000 Subject: Add more warning_history items and handle more font failures, to make sure 2006-04-27 Behdad Esfahbod * pango/pango-impl-utils.h: * pango/fonts.c (pango_font_get_glyph_extents), (pango_font_get_metrics), (pango_font_get_font_map): * pango/pangocairo-render.c (pango_cairo_show_glyph_string), (pango_cairo_glyph_string_path): Add more warning_history items and handle more font failures, to make sure that instead of crashing, gedit runs and draws empty boxes when pango.modules is not set properly. --- ChangeLog | 11 +++++++++++ pango/fonts.c | 26 +++++++++++++++++++++++++- pango/pango-impl-utils.h | 2 ++ pango/pangocairo-render.c | 40 +++++++++++++++++++++++++++++++--------- 4 files changed, 69 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 70e5d9bc..e17420d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-04-27 Behdad Esfahbod + + * pango/pango-impl-utils.h: + * pango/fonts.c (pango_font_get_glyph_extents), + (pango_font_get_metrics), (pango_font_get_font_map): + * pango/pangocairo-render.c (pango_cairo_show_glyph_string), + (pango_cairo_glyph_string_path): Add more warning_history items and + handle more font failures, to make sure that instead of crashing, + gedit runs and draws empty boxes when pango.modules is not set + properly. + 2006-04-27 Behdad Esfahbod * === Released 1.12.2 === diff --git a/pango/fonts.c b/pango/fonts.c index c9ae0555..e89335e7 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -30,6 +30,8 @@ #include "pango-fontmap.h" #include "pango-utils.h" +static const char bad_font_warning[] = "%s called with bad font, expect ugly output"; + struct _PangoFontDescription { char *family_name; @@ -1172,7 +1174,7 @@ pango_font_get_glyph_extents (PangoFont *font, if (!_pango_warning_history.get_glyph_extents) { _pango_warning_history.get_glyph_extents = TRUE; - g_warning ("pango_font_get_glyph_extents called with bad font, expect ugly output"); + g_warning (bad_font_warning, "pango_font_get_glyph_extents"); } if (ink_rect) { @@ -1213,6 +1215,17 @@ PangoFontMetrics * pango_font_get_metrics (PangoFont *font, PangoLanguage *language) { + if (G_UNLIKELY (!PANGO_IS_FONT (font))) + { + + if (!_pango_warning_history.get_metrics) + { + _pango_warning_history.get_metrics = TRUE; + g_warning (bad_font_warning, "pango_font_get_metrics"); + } + return pango_font_metrics_new (); + } + return PANGO_FONT_GET_CLASS (font)->get_metrics (font, language); } @@ -1229,6 +1242,17 @@ pango_font_get_metrics (PangoFont *font, PangoFontMap * pango_font_get_font_map (PangoFont *font) { + if (G_UNLIKELY (!PANGO_IS_FONT (font))) + { + + if (!_pango_warning_history.get_font_map) + { + _pango_warning_history.get_font_map = TRUE; + g_warning (bad_font_warning, "pango_font_get_font_map"); + } + return NULL; + } + if (PANGO_FONT_GET_CLASS (font)->get_font_map) return PANGO_FONT_GET_CLASS (font)->get_font_map (font); else diff --git a/pango/pango-impl-utils.h b/pango/pango-impl-utils.h index 7e1d3136..41fd494c 100644 --- a/pango/pango-impl-utils.h +++ b/pango/pango-impl-utils.h @@ -80,6 +80,8 @@ struct _PangoWarningHistory { guint shape_font : 1; guint shape_shape_engine : 1; guint get_glyph_extents : 1; + guint get_metrics : 1; + guint get_font_map : 1; }; extern PangoWarningHistory _pango_warning_history; diff --git a/pango/pangocairo-render.c b/pango/pangocairo-render.c index 08a58def..98c0237e 100644 --- a/pango/pangocairo-render.c +++ b/pango/pangocairo-render.c @@ -419,13 +419,19 @@ pango_cairo_show_glyph_string (cairo_t *cr, PangoFontMap *fontmap; PangoCairoRenderer *crenderer; PangoRenderer *renderer; + gboolean unref_renderer = FALSE; g_return_if_fail (cr != NULL); - g_return_if_fail (PANGO_IS_CAIRO_FONT (font)); g_return_if_fail (glyphs != NULL); fontmap = pango_font_get_font_map (font); renderer = _pango_cairo_font_map_get_renderer (PANGO_CAIRO_FONT_MAP (fontmap)); + if (G_UNLIKELY (!renderer)) + { + renderer = g_object_new (PANGO_TYPE_CAIRO_RENDERER, NULL); + unref_renderer = TRUE; + } + crenderer = PANGO_CAIRO_RENDERER (renderer); cairo_save (cr); @@ -445,9 +451,14 @@ pango_cairo_show_glyph_string (cairo_t *cr, pango_renderer_deactivate (renderer); - crenderer->cr = NULL; - crenderer->x_offset = 0.; - crenderer->y_offset = 0.; + if (G_UNLIKELY (unref_renderer)) + g_object_unref (renderer); + else + { + crenderer->cr = NULL; + crenderer->x_offset = 0.; + crenderer->y_offset = 0.; + } cairo_restore (cr); } @@ -558,13 +569,19 @@ pango_cairo_glyph_string_path (cairo_t *cr, PangoFontMap *fontmap; PangoCairoRenderer *crenderer; PangoRenderer *renderer; + gboolean unref_renderer = FALSE; g_return_if_fail (cr != NULL); - g_return_if_fail (PANGO_IS_CAIRO_FONT (font)); g_return_if_fail (glyphs != NULL); fontmap = pango_font_get_font_map (font); renderer = _pango_cairo_font_map_get_renderer (PANGO_CAIRO_FONT_MAP (fontmap)); + if (G_UNLIKELY (!renderer)) + { + renderer = g_object_new (PANGO_TYPE_CAIRO_RENDERER, NULL); + unref_renderer = TRUE; + } + crenderer = PANGO_CAIRO_RENDERER (renderer); crenderer->cr = cr; @@ -573,10 +590,15 @@ pango_cairo_glyph_string_path (cairo_t *cr, pango_renderer_draw_glyphs (renderer, font, glyphs, 0, 0); - crenderer->cr = NULL; - crenderer->do_path = FALSE; - crenderer->x_offset = 0.; - crenderer->y_offset = 0.; + if (G_UNLIKELY (unref_renderer)) + g_object_unref (renderer); + else + { + crenderer->cr = NULL; + crenderer->do_path = FALSE; + crenderer->x_offset = 0.; + crenderer->y_offset = 0.; + } cairo_set_font_face (cr, NULL); } -- cgit v1.2.1