summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-07-10 10:17:14 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-07-10 10:17:14 +0000
commit1753306eec6eeeebf0964a9f94ae7f59fb10f7db (patch)
treea1be9b5b27db436bad8f24a006b11df7d816cf1e
parent0a70a9de2ea865be280fe8702383c601da1cc3bf (diff)
downloadpango-1753306eec6eeeebf0964a9f94ae7f59fb10f7db.tar.gz
Be more robust when trying to set the unicode character map on the font.
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)
-rw-r--r--ChangeLog6
-rw-r--r--ChangeLog.pre-1-106
-rw-r--r--ChangeLog.pre-1-26
-rw-r--r--ChangeLog.pre-1-46
-rw-r--r--ChangeLog.pre-1-66
-rw-r--r--ChangeLog.pre-1-86
-rw-r--r--pango/pangoft2.c122
-rw-r--r--pango/pangoxft-font.c86
8 files changed, 178 insertions, 66 deletions
diff --git a/ChangeLog b/ChangeLog
index 5cde10bd..1a1a7596 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}