summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Reiter <reiter.christoph@gmail.com>2018-04-07 06:44:53 +0200
committerChristoph Reiter <reiter.christoph@gmail.com>2018-04-09 15:47:26 +0200
commit5d46e21df66a11233186ddf27ca8c70149307871 (patch)
tree794d415401349b5fd1d33e6d2633f020f0ad0e81
parent8e86f613160d023257d041ff24f94c88a8e12a46 (diff)
downloadpango-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
-rw-r--r--pango/pangowin32-shape.c30
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);