[cairo] Hash rewrite #3: cairo_scaled_font_map
Keith Packard
keithp at keithp.com
Thu Aug 11 18:29:34 PDT 2005
On Thu, 2005-08-11 at 17:30 -0700, Carl Worth wrote:
cairo_scaled_font_map = malloc (sizeof (cairo_scaled_font_map_t));
if (cairo_scaled_font_map == NULL)
goto FAIL;
cairo_scaled_font_map->hash_table =
_cairo_hash_table_create (_cairo_scaled_font_keys_equal);
if (cairo_scaled_font_map->hash_table == NULL)
goto FAIL;
cairo_scaled_font_map->num_holdovers = 0;
Looks like this doesn't distinguish between a failure to create the font
map and a failure to create the hash table.
hash = _hash_bytes_fnv ((unsigned char *)(&scaled_font->font_matrix.xx),
sizeof(double) * 4,
hash);
I assume you're trying to avoid incorporating the translation elements
into the hash; a comment might make that more clear
here (and the one with the ctm as well). I don't think there's a serious
concern that there would be additional padding between double members of
a structure, so the
implementation should be OK.
Should we just set the translation elements to zero and hash the whole
structure instead?
Similarly, should we just memcmp the whole key? I don't see any pointers
in it. Or are you concerned about padding in the options structure?
+ /* If the original reference count is 0, then this font must have
+ * been found in font_map->holdovers, (which means this caching is
+ * actually working). So now we remove it from the holdovers
+ * array. */
Could the removal of this element from the holdover array occur a bit
closer to the code which locates it there? This kind of 'reference == 0'
magic seems fragile to me.
-keith
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.freedesktop.org/archives/cairo/attachments/20050811/62f3cd27/attachment.pgp
More information about the cairo
mailing list