diff options
author | Christoph Reiter <reiter.christoph@gmail.com> | 2018-04-07 06:44:53 +0200 |
---|---|---|
committer | Christoph Reiter <reiter.christoph@gmail.com> | 2018-04-09 15:47:26 +0200 |
commit | 5d46e21df66a11233186ddf27ca8c70149307871 (patch) | |
tree | 794d415401349b5fd1d33e6d2633f020f0ad0e81 /pango | |
parent | 8e86f613160d023257d041ff24f94c88a8e12a46 (diff) | |
download | pango-5d46e21df66a11233186ddf27ca8c70149307871.tar.gz |
pangowin32: fix script cache hash key for 64bit builds
It joins the HFONT and script key to a gint64 and uses this as a
hash key, but HFONT is a pointer type and on 64bit Windows it
doesn't fit in 32bit and the value gets truncated.
This breaks the build with meson where -Werror=pointer-to-int-cast
is enabled by default.
Instead of using the gint64 hash functions add our own key type and implement
matching hash and equality functions for it.
https://bugzilla.gnome.org/show_bug.cgi?id=795045
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pangowin32-shape.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/pango/pangowin32-shape.c b/pango/pangowin32-shape.c index 001fc430..aad0243e 100644 --- a/pango/pangowin32-shape.c +++ b/pango/pangowin32-shape.c @@ -370,6 +370,24 @@ convert_log_clusters_to_byte_offsets (const char *text, g_free (byte_offset); } +typedef struct { + HFONT hfont; + gint32 script; +} script_cache_key; + +static guint +script_cache_key_hash_func (script_cache_key *key) +{ + return g_direct_hash (key->hfont) ^ g_int_hash (&(key->script)); +} + +static gboolean +script_cache_key_equal_func (script_cache_key *a, + script_cache_key *b) +{ + return (a->hfont == b->hfont) && (a->script == b->script); +} + static gboolean itemize_shape_and_place (PangoFont *font, HDC hdc, @@ -389,7 +407,8 @@ itemize_shape_and_place (PangoFont *font, static GHashTable *script_cache_hash = NULL; if (!script_cache_hash) - script_cache_hash = g_hash_table_new (g_int64_hash, g_int64_equal); + script_cache_hash = g_hash_table_new ((GHashFunc)script_cache_key_hash_func, + (GEqualFunc)script_cache_key_equal_func); memset (&control, 0, sizeof (control)); memset (&state, 0, sizeof (state)); @@ -440,7 +459,7 @@ itemize_shape_and_place (PangoFont *font, int ng; int char_offset; SCRIPT_CACHE *script_cache; - gint64 font_and_script_key; + script_cache_key font_and_script_key; memset (advances, 0, sizeof (advances)); memset (offsets, 0, sizeof (offsets)); @@ -472,16 +491,17 @@ itemize_shape_and_place (PangoFont *font, items[item].iCharPos, items[item+1].iCharPos-1, itemlen); #endif /* Create a hash key based on hfont and script engine */ - font_and_script_key = (((gint64) ((gint32) hfont)) << 32) | script; + font_and_script_key.hfont = hfont; + font_and_script_key.script = script; /* Get the script cache for this hfont and script */ script_cache = g_hash_table_lookup (script_cache_hash, &font_and_script_key); if (!script_cache) { - gint64 *key_n; + script_cache_key *key_n; SCRIPT_CACHE *new_script_cache; - key_n = g_new (gint64, 1); + key_n = g_new (script_cache_key, 1); *key_n = font_and_script_key; new_script_cache = g_new0 (SCRIPT_CACHE, 1); |