diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | ChangeLog.pre-1-10 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-1-2 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-1-4 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-1-6 | 16 | ||||
-rw-r--r-- | ChangeLog.pre-1-8 | 16 | ||||
-rw-r--r-- | pango/pangoxft-font.c | 29 | ||||
-rw-r--r-- | pango/pangoxft-fontmap.c | 48 | ||||
-rw-r--r-- | pango/pangoxft-private.h | 21 |
9 files changed, 166 insertions, 28 deletions
@@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index d8f7e150..bbb1b1b3 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 index d8f7e150..bbb1b1b3 100644 --- a/ChangeLog.pre-1-2 +++ b/ChangeLog.pre-1-2 @@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index d8f7e150..bbb1b1b3 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index d8f7e150..bbb1b1b3 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index d8f7e150..bbb1b1b3 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,19 @@ +Mon Aug 5 23:12:13 2002 Owen Taylor <otaylor@redhat.com> + + Patch from Keith Packard: + + * pango/pangoxft-private.h (struct _PangoXftFont): Add + some comments. + + * pango/pangoxft-private.h pango/pangoxft-font.c + pango/pangoxft-fontmap.c: Identify coverage by a + pair of filename and index within the filename instead + of just a filename, to handle TrueType Collection (TTC) + fonts. + + * pango/pangoxft-fontmap.c (pango_xft_make_pattern): + Remove some leftover comments. + Mon Aug 5 21:54:21 2002 Owen Taylor <otaylor@redhat.com> * pango/pangoxft-fontmap.c (pango_xft_get_font_map): Export. diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c index f24e385e..c82ba44e 100644 --- a/pango/pangoxft-font.c +++ b/pango/pangoxft-font.c @@ -551,7 +551,7 @@ pango_xft_font_get_coverage (PangoFont *font, PangoLanguage *language) { PangoXftFont *xfont = (PangoXftFont *)font; - FcChar8 *filename = NULL; + PangoXftCoverageKey key; PangoCoverage *coverage; Display *display; FcChar32 map[FC_CHARSET_MAP_SIZE]; @@ -561,15 +561,33 @@ pango_xft_font_get_coverage (PangoFont *font, _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL); - FcPatternGetString (xfont->font_pattern, FC_FILE, 0, &filename); + /* + * Assume that coverage information is identified by + * a filename/index pair; there shouldn't be any reason + * this isn't true, but it's not specified anywhere + */ + if (FcPatternGetString (xfont->font_pattern, FC_FILE, 0, (FcChar8 **) &key.filename) != FcResultMatch) + return NULL; + + if (FcPatternGetInteger (xfont->font_pattern, FC_INDEX, 0, &key.id) != FcResultMatch) + return NULL; - coverage = _pango_xft_font_map_get_coverage (xfont->fontmap, (char *) filename); + coverage = _pango_xft_font_map_get_coverage (xfont->fontmap, &key); if (coverage) return pango_coverage_ref (coverage); - FcPatternGetCharSet (xfont->font_pattern, FC_CHARSET, 0, &charset); + /* + * Pull the coverage out of the pattern, this + * doesn't require loading the font + */ + if (FcPatternGetCharSet (xfont->font_pattern, FC_CHARSET, 0, &charset) != FcResultMatch) + return NULL; + /* + * Convert an Fc CharSet into a pango coverage structure. Sure + * would be nice to just use the Fc structure in place... + */ coverage = pango_coverage_new (); for (ucs4 = FcCharSetFirstPage (charset, map, &pos); ucs4 != FC_CHARSET_DONE; @@ -592,7 +610,7 @@ pango_xft_font_get_coverage (PangoFont *font, } } - _pango_xft_font_map_set_coverage (xfont->fontmap, filename, coverage); + _pango_xft_font_map_set_coverage (xfont->fontmap, &key, coverage); return coverage; } @@ -906,4 +924,3 @@ pango_xft_font_has_char (PangoFont *font, return XftCharExists (NULL, xft_font, wc); } - diff --git a/pango/pangoxft-fontmap.c b/pango/pangoxft-fontmap.c index eee35a9b..32926f0a 100644 --- a/pango/pangoxft-fontmap.c +++ b/pango/pangoxft-fontmap.c @@ -43,7 +43,7 @@ struct _PangoXftFontMap PangoFontMap parent_instance; GHashTable *fontset_hash; /* Maps PangoFontDescription -> PangoXftPatternSet */ - GHashTable *coverage_hash; /* Maps font file name -> PangoCoverage */ + GHashTable *coverage_hash; /* Maps font file name/id -> PangoCoverage */ GHashTable *fonts; /* Maps XftPattern -> PangoXftFont */ GQueue *freed_fonts; /* Fonts in fonts that has been freed */ @@ -203,6 +203,20 @@ pango_xft_pattern_equal (FcPattern *pattern1, return FcPatternEqual (pattern1, pattern2); } +static guint +pango_xft_coverage_key_hash (PangoXftCoverageKey *key) +{ + return g_str_hash (key->filename) ^ key->id; +} + +static gboolean +pango_xft_coverage_key_equal (PangoXftCoverageKey *key1, + PangoXftCoverageKey *key2) +{ + return key1->id == key2->id && strcmp (key1->filename, key2->filename) == 0; +} + + static void pango_xft_init_fontset_hash (PangoXftFontMap *xfontmap) { @@ -282,8 +296,9 @@ pango_xft_get_font_map (Display *display, xfontmap->fonts = g_hash_table_new ((GHashFunc)pango_xft_pattern_hash, (GEqualFunc)pango_xft_pattern_equal); - pango_xft_init_fontset_hash (xfontmap); - xfontmap->coverage_hash = g_hash_table_new_full (g_str_hash, g_str_equal, + + xfontmap->coverage_hash = g_hash_table_new_full ((GHashFunc)pango_xft_coverage_key_hash, + (GEqualFunc)pango_xft_coverage_key_equal, (GDestroyNotify)g_free, (GDestroyNotify)pango_coverage_unref); xfontmap->freed_fonts = g_queue_new (); @@ -592,9 +607,6 @@ pango_xft_make_pattern (const PangoFontDescription *description) slant = pango_xft_convert_slant (pango_style); weight = pango_xft_convert_weight (pango_font_description_get_weight (description)); - /* To fool Xft into not munging glyph indices, we open it as glyphs-fontspecific - * then set the encoding ourself - */ pattern = FcPatternBuild (0, FC_WEIGHT, FcTypeInteger, weight, FC_SLANT, FcTypeInteger, slant, @@ -820,23 +832,29 @@ pango_xft_font_map_cache_clear (PangoXftFontMap *xfontmap) } void -_pango_xft_font_map_set_coverage (PangoFontMap *fontmap, - const char *name, - PangoCoverage *coverage) +_pango_xft_font_map_set_coverage (PangoFontMap *fontmap, + const PangoXftCoverageKey *key, + PangoCoverage *coverage) { - PangoXftFontMap *xfontmap = PANGO_XFT_FONT_MAP (fontmap); + PangoXftFontMap *xfontmap = PANGO_XFT_FONT_MAP (fontmap); + PangoXftCoverageKey *key_dup; - g_hash_table_insert (xfontmap->coverage_hash, g_strdup (name), - pango_coverage_ref (coverage)); + key_dup = g_malloc (sizeof (PangoXftCoverageKey) + strlen (key->filename) + 1); + key_dup->id = key->id; + key_dup->filename = (char *) (key_dup + 1); + strcpy (key_dup->filename, key->filename); + + g_hash_table_insert (xfontmap->coverage_hash, + key_dup, pango_coverage_ref (coverage)); } PangoCoverage * -_pango_xft_font_map_get_coverage (PangoFontMap *fontmap, - const char *name) +_pango_xft_font_map_get_coverage (PangoFontMap *fontmap, + const PangoXftCoverageKey *key) { PangoXftFontMap *xfontmap = PANGO_XFT_FONT_MAP (fontmap); - return g_hash_table_lookup (xfontmap->coverage_hash, name); + return g_hash_table_lookup (xfontmap->coverage_hash, key); } void diff --git a/pango/pangoxft-private.h b/pango/pangoxft-private.h index ffc5a3c5..07dbad44 100644 --- a/pango/pangoxft-private.h +++ b/pango/pangoxft-private.h @@ -28,26 +28,33 @@ G_BEGIN_DECLS typedef struct _PangoXftFont PangoXftFont; +typedef struct _PangoXftCoverageKey PangoXftCoverageKey; struct _PangoXftFont { PangoFont parent_instance; - FcPattern *font_pattern; - XftFont *xft_font; - PangoFont *mini_font; - PangoFontMap *fontmap; + FcPattern *font_pattern; /* fully resolved pattern */ + XftFont *xft_font; /* created on demand */ + PangoFont *mini_font; /* font used to display missing glyphs */ + PangoFontMap *fontmap; /* associated map */ PangoFontDescription *description; GSList *metrics_by_lang; - guint16 mini_width; + guint16 mini_width; /* metrics for missing glyph drawing */ guint16 mini_height; guint16 mini_pad; gboolean in_cache; }; +struct _PangoXftCoverageKey +{ + char *filename; + int id; /* needed to handle TTC files with multiple faces */ +}; + PangoXftFont * _pango_xft_font_new (PangoFontMap *font, FcPattern *pattern); void _pango_xft_font_map_cache_add (PangoFontMap *fontmap, @@ -57,10 +64,10 @@ void _pango_xft_font_map_add (PangoFontMap *fo void _pango_xft_font_map_remove (PangoFontMap *fontmap, PangoXftFont *xfont); void _pango_xft_font_map_set_coverage (PangoFontMap *fontmap, - const char *name, + const PangoXftCoverageKey *key, PangoCoverage *coverage); PangoCoverage *_pango_xft_font_map_get_coverage (PangoFontMap *fontmap, - const char *name); + const PangoXftCoverageKey *key); void _pango_xft_font_map_get_info (PangoFontMap *fontmap, Display **display, int *screen); |