summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-08-06 03:43:16 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-08-06 03:43:16 +0000
commit9629e9e1ffa2f76989c877a2c2e4c0324716100d (patch)
treefebf99a1e4bc4601aed073b4ac5d41fe02036c46
parent4b1d623ea4e751b2038588c894a19c0589840f4b (diff)
downloadpango-9629e9e1ffa2f76989c877a2c2e4c0324716100d.tar.gz
Patch from Keith Packard:
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.
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-1-1016
-rw-r--r--ChangeLog.pre-1-216
-rw-r--r--ChangeLog.pre-1-416
-rw-r--r--ChangeLog.pre-1-616
-rw-r--r--ChangeLog.pre-1-816
-rw-r--r--pango/pangoxft-font.c29
-rw-r--r--pango/pangoxft-fontmap.c48
-rw-r--r--pango/pangoxft-private.h21
9 files changed, 166 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index d8f7e150..bbb1b1b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);