summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@gnome.org>2006-04-27 23:47:55 +0000
committerBehdad Esfahbod <behdad@src.gnome.org>2006-04-27 23:47:55 +0000
commit4f2f6d1280407e8a2782e3ac26b6286d94d41ac8 (patch)
treefbf5b803da199136f4a69ea332c49e17550f1a0d
parenta3e944420e7352140ca2069f58e15cc787a9e884 (diff)
downloadpango-4f2f6d1280407e8a2782e3ac26b6286d94d41ac8.tar.gz
Add more warning_history items and handle more font failures, to make sure
2006-04-27 Behdad Esfahbod <behdad@gnome.org> * 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.
-rw-r--r--ChangeLog11
-rw-r--r--pango/fonts.c26
-rw-r--r--pango/pango-impl-utils.h2
-rw-r--r--pango/pangocairo-render.c40
4 files changed, 69 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 70e5d9bc..e17420d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2006-04-27 Behdad Esfahbod <behdad@gnome.org>
+ * 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 <behdad@gnome.org>
+
* === Released 1.12.2 ===
* configure.in: Version 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);
}