diff options
author | Owen Taylor <otaylor@redhat.com> | 2002-08-19 18:10:28 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2002-08-19 18:10:28 +0000 |
commit | 2378ff9771db2606e11b27cba5bd802463699d41 (patch) | |
tree | bfb35594c26becacae1c3aa1d72395335c10edd8 /pango/pangofc-fontmap.cI | |
parent | 2c1bc52c9d3429c34a26ad643eff8f84c339034e (diff) | |
download | pango-2378ff9771db2606e11b27cba5bd802463699d41.tar.gz |
Delete the FC_PATTERN out of the result of FcFontRenderPrepare(), because
Mon Aug 19 14:07:02 2002 Owen Taylor <otaylor@redhat.com>
* pango/pangofc-fontmap.cI (pango_fc_font_map_get_patterns):
Delete the FC_PATTERN out of the result of FcFontRenderPrepare(),
because it makes identical fonts look like not identical fonts.
* pango/pangofc-fontmap.cI (uniquify_pattern): pango/pangoft-fontmap.c
pango/pangoxft-fontmap.c: Use a hash table to uniquify the patterns
we cache to save memory and speed lookups.
* pango/pangoxft-font.c (pango_xft_font_get_font): Split into
a public wrappper (with g_return_if_fail()) around a static
internal function (without check).
* pango/pangoxft-fontmap.c (_pango_xft_font_map_get_info): Remove
checked cast, since it was showing up high on profiles.
Diffstat (limited to 'pango/pangofc-fontmap.cI')
-rw-r--r-- | pango/pangofc-fontmap.cI | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/pango/pangofc-fontmap.cI b/pango/pangofc-fontmap.cI index 13b5c1cd..86cdfbf9 100644 --- a/pango/pangofc-fontmap.cI +++ b/pango/pangofc-fontmap.cI @@ -140,9 +140,7 @@ pango_fc_font_map_init (PangoFcFontMap *fcfontmap) { fcfontmap->n_families = -1; - fcfontmap->fonts = g_hash_table_new ((GHashFunc)pango_fc_pattern_hash, - (GEqualFunc)pango_fc_pattern_equal); - + fcfontmap->fonts = g_hash_table_new ((GHashFunc)g_direct_hash, NULL); fcfontmap->coverage_hash = g_hash_table_new_full ((GHashFunc)pango_fc_coverage_key_hash, (GEqualFunc)pango_fc_coverage_key_equal, (GDestroyNotify)g_free, @@ -307,6 +305,9 @@ pango_fc_font_map_finalize (GObject *object) if (fcfontmap->fonts) g_hash_table_destroy (fcfontmap->fonts); + if (fcfontmap->pattern_hash) + g_hash_table_destroy (fcfontmap->pattern_hash); + pango_fc_do_finalize (fcfontmap); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -525,6 +526,33 @@ pango_fc_font_map_new_font (PangoFontMap *fontmap, return (PangoFont *)_pango_fc_font_new (fontmap, match); } +static FcPattern * +uniquify_pattern (PangoFcFontMap *fcfontmap, + FcPattern *pattern) +{ + FcPattern *old_pattern; + + if (!fcfontmap->pattern_hash) + fcfontmap->pattern_hash = + g_hash_table_new_full ((GHashFunc)pango_fc_pattern_hash, + (GEqualFunc)pango_fc_pattern_equal, + (GDestroyNotify)FcPatternDestroy, NULL); + + old_pattern = g_hash_table_lookup (fcfontmap->pattern_hash, pattern); + if (old_pattern) + { + FcPatternDestroy (pattern); + FcPatternReference (old_pattern); + return old_pattern; + } + else + { + FcPatternReference (pattern); + g_hash_table_insert (fcfontmap->pattern_hash, pattern, pattern); + return pattern; + } +} + static PangoFcPatternSet * pango_fc_font_map_get_patterns (PangoFontMap *fontmap, PangoContext *context, @@ -566,9 +594,13 @@ pango_fc_font_map_get_patterns (PangoFontMap *fontmap, { font_pattern = FcFontRenderPrepare (NULL, pattern, font_patterns->fonts[f]); - + /* The FC_PATTERN element, which points back to our the original patterm + * defeats our hash tables. + */ + FcPatternDel (font_pattern, FC_PATTERN); + if (font_pattern) - patterns->patterns[patterns->n_patterns++] = font_pattern; + patterns->patterns[patterns->n_patterns++] = uniquify_pattern (fcfontmap, font_pattern); } FcPatternDestroy (pattern); |