diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.pre-1-10 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-1-2 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-1-4 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-1-6 | 6 | ||||
-rw-r--r-- | ChangeLog.pre-1-8 | 6 | ||||
-rw-r--r-- | pango/pangoft2.c | 122 | ||||
-rw-r--r-- | pango/pangoxft-font.c | 86 |
8 files changed, 178 insertions, 66 deletions
@@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index 5cde10bd..1a1a7596 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 index 5cde10bd..1a1a7596 100644 --- a/ChangeLog.pre-1-2 +++ b/ChangeLog.pre-1-2 @@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index 5cde10bd..1a1a7596 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index 5cde10bd..1a1a7596 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index 5cde10bd..1a1a7596 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,9 @@ +Wed Jul 3 18:39:45 2002 Owen Taylor <otaylor@redhat.com> + + * pango/pangoft2.c pango/pangoxft-font.c: Be more + robust when trying to set the unicode character + map on the font. (#86911) + Wed Jul 10 06:12:37 2002 Owen Taylor <otaylor@redhat.com> * pango/mini-xft/minixftlex.l: Add a stdlib include diff --git a/pango/pangoft2.c b/pango/pangoft2.c index aa5066cb..8eaeda57 100644 --- a/pango/pangoft2.c +++ b/pango/pangoft2.c @@ -120,6 +120,74 @@ _pango_ft2_font_new (PangoFontMap *fontmap, return ft2font; } +gboolean +set_unicode_charmap (FT_Face face) +{ + int charmap; + + for (charmap = 0; charmap < face->num_charmaps; charmap++) + if (face->charmaps[charmap]->encoding == ft_encoding_unicode) + { + FT_Error error = FT_Set_Charmap(face, face->charmaps[charmap]); + return error == FT_Err_Ok; + } + + return FALSE; +} + +void +load_fallback_face (PangoFT2Font *ft2font, + const char *original_file) +{ + MiniXftPattern *sans; + MiniXftPattern *matched; + MiniXftResult result; + FT_Error error; + char *filename2 = NULL; + gchar *name; + int id; + + sans = MiniXftPatternBuild (0, + XFT_FAMILY, MiniXftTypeString, "sans", + XFT_ENCODING, MiniXftTypeString, "glyphs-fontspecific", + XFT_SIZE, MiniXftTypeDouble, (double)pango_font_description_get_size (ft2font->description)/PANGO_SCALE, + NULL); + + matched = MiniXftFontMatch ((Display *)1, 0, sans, &result); + + if (MiniXftPatternGetString (matched, XFT_FILE, 0, &filename2) != MiniXftResultMatch) + goto bail1; + + if (MiniXftPatternGetInteger (matched, XFT_INDEX, 0, &id) != MiniXftResultMatch) + goto bail1; + + error = FT_New_Face (_pango_ft2_font_map_get_library (ft2font->fontmap), + filename2, id, &ft2font->face); + + if (error) + { + bail1: + name = pango_font_description_to_string (ft2font->description); + g_warning ("Unable to open font file %s for font %s, exiting\n", filename2, name); + exit (1); + } + else + { + name = pango_font_description_to_string (ft2font->description); + g_warning ("Unable to open font file %s for font %s, falling back to %s\n", original_file, name, filename2); + g_free (name); + } + + if (!set_unicode_charmap (ft2font->face)) + { + g_warning ("Unable to load unicode charmap from file %s, exiting\n", filename2); + exit (1); + } + + MiniXftPatternDestroy (sans); + MiniXftPatternDestroy (matched); + +} /** * pango_ft2_font_get_face: @@ -152,50 +220,10 @@ pango_ft2_font_get_face (PangoFont *font) error = FT_New_Face (_pango_ft2_font_map_get_library (ft2font->fontmap), filename, id, &ft2font->face); - if (error) + if (error != FT_Err_Ok) { - MiniXftPattern *sans; - MiniXftPattern *matched; - MiniXftResult result; - char *filename2 = NULL; - gchar *name; - bail0: - - sans = MiniXftPatternBuild (0, - XFT_FAMILY, MiniXftTypeString, "sans", - XFT_ENCODING, MiniXftTypeString, "glyphs-fontspecific", - XFT_SIZE, MiniXftTypeDouble, (double)pango_font_description_get_size (ft2font->description)/PANGO_SCALE, - NULL); - - matched = MiniXftFontMatch ((Display *)1, 0, sans, &result); - - if (MiniXftPatternGetString (matched, XFT_FILE, 0, &filename2) != MiniXftResultMatch) - goto bail1; - - if (MiniXftPatternGetInteger (matched, XFT_INDEX, 0, &id) != MiniXftResultMatch) - goto bail1; - - error = FT_New_Face (_pango_ft2_font_map_get_library (ft2font->fontmap), - filename2, id, &ft2font->face); - - - if (error) - { - bail1: - name = pango_font_description_to_string (ft2font->description); - g_warning ("Unable to open font file %s for font %s, exiting\n", filename2, name); - exit (1); - } - else - { - name = pango_font_description_to_string (ft2font->description); - g_warning ("Unable to open font file %s for font %s, falling back to %s\n", filename, name, filename2); - g_free (name); - } - - MiniXftPatternDestroy (sans); - MiniXftPatternDestroy (matched); + load_fallback_face (ft2font, filename); } ft2font->face->generic.data = 0; } @@ -204,6 +232,16 @@ pango_ft2_font_get_face (PangoFont *font) face = ft2font->face; + if (!set_unicode_charmap (face)) + { + g_warning ("Unable to load unicode charmap from font file %s", filename); + + FT_Done_Face (ft2font->face); + ft2font->face = NULL; + + load_fallback_face (ft2font, filename); + } + if (ft2font->size != GPOINTER_TO_UINT (face->generic.data)) { face->generic.data = GUINT_TO_POINTER (ft2font->size); diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c index ed35be84..a0771c22 100644 --- a/pango/pangoxft-font.c +++ b/pango/pangoxft-font.c @@ -677,6 +677,52 @@ pango_xft_font_find_shaper (PangoFont *font, return (PangoEngineShape *)pango_map_get_engine (shape_map, ch); } +gboolean +set_unicode_charmap (FT_Face face) +{ + int charmap; + + for (charmap = 0; charmap < face->num_charmaps; charmap++) + if (face->charmaps[charmap]->encoding == ft_encoding_unicode) + { + FT_Error error = FT_Set_Charmap(face, face->charmaps[charmap]); + return error == FT_Err_Ok; + } + + return FALSE; +} + +void +load_fallback_font (PangoXftFont *xfont) +{ + Display *display; + int screen; + XftFont *xft_font; + + _pango_xft_font_map_get_info (xfont->fontmap, &display, &screen); + + xft_font = XftFontOpen (display, screen, + XFT_FAMILY, XftTypeString, "sans", + XFT_ENCODING, XftTypeString, "glyphs-fontspecific", + XFT_CORE, XftTypeBool, False, + XFT_SIZE, XftTypeDouble, (double)pango_font_description_get_size (xfont->description)/PANGO_SCALE, + NULL); + + if (!xft_font) + { + g_warning ("Cannot open fallback font, nothing to do"); + exit (1); + } + + if (!set_unicode_charmap (xft_font->u.ft.font->face)) + { + g_warning ("Cannot set unicode character map for fallback font, nothing to do"); + exit (1); + } + + xfont->xft_font = xft_font; +} + /** * pango_xft_font_get_font: * @font: a #PangoFont. @@ -691,9 +737,6 @@ pango_xft_font_get_font (PangoFont *font) PangoXftFont *xfont; Display *display; int screen; - FT_Face face; - FT_Error error; - int charmap; g_return_val_if_fail (PANGO_XFT_IS_FONT (font), NULL); @@ -715,31 +758,26 @@ pango_xft_font_get_font (PangoFont *font) g_warning ("Cannot open font file for font %s", name); g_free (name); - xfont->xft_font = XftFontOpen (display, screen, - XFT_FAMILY, XftTypeString, "sans", - XFT_ENCODING, XftTypeString, "glyphs-fontspecific", - XFT_CORE, XftTypeBool, False, - XFT_SIZE, XftTypeDouble, (double)pango_font_description_get_size (xfont->description)/PANGO_SCALE, - NULL); + load_fallback_font (xfont); } - if (!xfont->xft_font) + else { - g_warning ("Cannot open fallback font, nothing to do"); - exit (1); + /* There should be a unicode encoding, since we queried for it */ + if (!set_unicode_charmap (xfont->xft_font->u.ft.font->face)) + { + gchar *name = pango_font_description_to_string (xfont->description); + + g_warning ("Cannot load unicode character map for font %s", name); + g_free (name); + + XftFontClose (display, xfont->xft_font); + xfont->xft_font = NULL; + + load_fallback_font (xfont); + } } - - face = xfont->xft_font->u.ft.font->face; - - /* There should be a unicode encoding, since we queried for it */ - for (charmap = 0; charmap < face->num_charmaps; charmap++) - if (face->charmaps[charmap]->encoding == ft_encoding_unicode) - break; - - g_assert (charmap != face->num_charmaps); - - error = FT_Set_Charmap(face, face->charmaps[charmap]); } - + return xfont->xft_font; } |