diff options
author | Owen Taylor <otaylor@redhat.com> | 2004-12-16 19:08:36 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2004-12-16 19:08:36 +0000 |
commit | 72672341918128556cc486afcd6e9af0f1507379 (patch) | |
tree | 772d47a235b29a54c66bba4d1846a725ad9829d0 /pango/pangofc-fontmap.c | |
parent | 9f334f6aa7f9a47c6d77a0165b32c6ce90de79e2 (diff) | |
download | pango-72672341918128556cc486afcd6e9af0f1507379.tar.gz |
Add short and long descriptions.pango-1-8-branchpoint
Thu Dec 16 14:03:32 2004 Owen Taylor <otaylor@redhat.com>
* docs/tmpl/pango-renderer.sgml: Add short and long descriptions.
Diffstat (limited to 'pango/pangofc-fontmap.c')
-rw-r--r-- | pango/pangofc-fontmap.c | 153 |
1 files changed, 132 insertions, 21 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index a7e9f375..6f50e0f4 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -22,6 +22,8 @@ /* Size of fontset cache */ #define FONTSET_CACHE_SIZE 16 +#include <math.h> + #include "pango-context.h" #include "pangofc-fontmap.h" #include "pangofc-private.h" @@ -233,12 +235,56 @@ pango_fc_coverage_key_equal (PangoFcCoverageKey *key1, } typedef struct _FontsetHashListNode FontsetHashListNode; +typedef struct _FontsetHashKey FontsetHashKey; struct _FontsetHashListNode { GHashTable *fontset_hash; PangoLanguage *language; }; +struct _FontsetHashKey { + PangoFontDescription *desc; + int x_size; + int y_size; +}; + +static gboolean +fontset_hash_key_equal (const FontsetHashKey *key_a, + const FontsetHashKey *key_b) +{ + if (key_a->x_size == key_b->x_size && + key_a->y_size == key_b->y_size && + pango_font_description_equal (key_a->desc, key_b->desc)) + return TRUE; + else + return FALSE; +} + +static guint +fontset_hash_key_hash (const FontsetHashKey *key) +{ + return (key->x_size << 16) ^ (key->y_size) ^ pango_font_description_hash (key->desc); +} + +static void +fontset_hash_key_free (FontsetHashKey *key) +{ + pango_font_description_free (key->desc); + g_free (key); +} + +static FontsetHashKey * +fontset_hash_key_copy (FontsetHashKey *old) +{ + FontsetHashKey *key = g_new (FontsetHashKey, 1); + + key->x_size = old->x_size; + key->y_size = old->y_size; + key->desc = pango_font_description_copy (old->desc); + + return key; +} + /* Get the description => fontset map for a particular * language tag. */ @@ -280,9 +326,9 @@ pango_fc_get_fontset_hash (PangoFcFontMap *fcfontmap, priv->fontset_hash_list = g_list_prepend (priv->fontset_hash_list, node); node->fontset_hash = - g_hash_table_new_full ((GHashFunc)pango_font_description_hash, - (GEqualFunc)pango_font_description_equal, - (GDestroyNotify)pango_font_description_free, + g_hash_table_new_full ((GHashFunc)fontset_hash_key_hash, + (GEqualFunc)fontset_hash_key_equal, + (GDestroyNotify)fontset_hash_key_free, (GDestroyNotify)pango_fc_pattern_set_free); node->language = language; @@ -745,11 +791,66 @@ pango_fc_default_substitute (PangoFcFontMap *fontmap, PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->default_substitute (fontmap, pattern); } +static double +transformed_length (const PangoMatrix *matrix, + double dx, + double dy) +{ + double tx = (dx * matrix->xx + dy * matrix->xy); + double ty = (dx * matrix->yx + dy * matrix->yy); + + return sqrt (tx * tx + ty * ty); +} + +static gboolean +pango_fc_font_map_get_rendered_size (PangoFcFontMap *fcfontmap, + PangoContext *context, + const PangoFontDescription *desc, + int *x_size, + int *y_size) +{ + if (PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->get_rendered_size) + return PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->get_rendered_size (fcfontmap, context, desc, x_size, y_size); + else + { + int size = pango_font_description_get_size (desc); + const PangoMatrix *matrix; + gboolean retval = TRUE; + + if (context) + matrix = pango_context_get_matrix (context); + else + matrix = NULL; + + *x_size = size; + *y_size = size; + + if (matrix) + { + double xl = transformed_length (matrix, 1., 0.); + double yl = transformed_length (matrix, 0., 1.); + + if (xl != 0. && yl != 0.) + { + *x_size = (int)(xl * *x_size + 0.5); + *y_size = (int)(yl * *y_size + 0.5); + + retval = (matrix->yx / xl < 1 / 65536. && matrix->xy / yl < 1 / 65536.); + } + else + retval = FALSE; + } + + return retval; + } +} + static PangoFcPatternSet * pango_fc_font_map_get_patterns (PangoFontMap *fontmap, - PangoContext *context, - const PangoFontDescription *desc, - PangoLanguage *language) + PangoContext *context, + const PangoFontDescription *desc, + PangoLanguage *language, + gboolean *cache_out) { PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap; FcPattern *pattern, *font_pattern; @@ -758,12 +859,21 @@ pango_fc_font_map_get_patterns (PangoFontMap *fontmap, PangoFcPatternSet *patterns; FcFontSet *font_patterns; GHashTable *fontset_hash; + FontsetHashKey key; + gboolean cache; if (!language && context) language = pango_context_get_language (context); fontset_hash = pango_fc_get_fontset_hash (fcfontmap, language); - patterns = g_hash_table_lookup (fontset_hash, desc); + key.desc = pango_font_description_copy_static (desc); + pango_font_description_unset_fields (key.desc, PANGO_FONT_MASK_SIZE); + + cache = pango_fc_font_map_get_rendered_size (fcfontmap, context, desc, &key.x_size, &key.y_size); + if (cache_out) + *cache_out = cache; + + patterns = g_hash_table_lookup (fontset_hash, &key); if (patterns == NULL) { @@ -820,10 +930,12 @@ pango_fc_font_map_get_patterns (PangoFontMap *fontmap, FcFontSetSortDestroy (font_patterns); g_hash_table_insert (fontset_hash, - pango_font_description_copy (desc), + fontset_hash_key_copy (&key), patterns); } + pango_font_description_free (key.desc); + return patterns; } @@ -832,7 +944,7 @@ pango_fc_font_map_load_font (PangoFontMap *fontmap, PangoContext *context, const PangoFontDescription *description) { - PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, description, NULL); + PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, description, NULL, NULL); if (!patterns) return NULL; @@ -903,28 +1015,27 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap, const PangoFontDescription *desc, PangoLanguage *language) { - PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language); + gboolean cache; + PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language, &cache); PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap); PangoFcFontMapPrivate *priv = fcfontmap->priv; PangoFontset *result; - const PangoMatrix *matrix; int i; if (!patterns) return NULL; - if (context) - matrix = pango_context_get_matrix (context); - else - matrix = NULL; - - /* We never cache fontsets when a transformation is in place - */ - if (!patterns->fontset || matrix) + if (!patterns->fontset || !cache) { PangoFontsetSimple *simple; + const PangoMatrix *matrix; simple = pango_fontset_simple_new (language); result = PANGO_FONTSET (simple); + + if (context) + matrix = pango_context_get_matrix (context); + else + matrix = NULL; for (i = 0; i < patterns->n_patterns; i++) { @@ -935,7 +1046,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap, pango_fontset_simple_append (simple, font); } - if (!matrix) + if (cache) { patterns->fontset = PANGO_FONTSET (simple); g_object_add_weak_pointer (G_OBJECT (patterns->fontset), @@ -945,7 +1056,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap, else result = g_object_ref (patterns->fontset); - if (!matrix && + if (cache && (!patterns->cache_link || patterns->cache_link != priv->fontset_cache->head)) pango_fc_font_map_cache_fontset (fcfontmap, patterns); |