Skip to content
Permalink
Browse files

EomExifDetails: Take Exif IFD into account when creating hash keys

This should solve conflicts with Exif values that have the same number
but are stored in different IFD blocks (e.g GPS and Interoperability).

https://bugzilla.gnome.org/show_bug.cgi?id=670700

origin commit:
https://gitlab.gnome.org/GNOME/eog/commit/38f49dc
  • Loading branch information...
Felix Riemann authored and raveit65 committed Feb 26, 2012
1 parent a3a89e0 commit b3f9b82e3a18ccbcd291d3e942d536e3211f9418
Showing with 12 additions and 3 deletions.
  1. +12 −3 src/eom-exif-details.c
@@ -451,13 +451,22 @@ exif_entry_cb (ExifEntry *entry, gpointer data)
ExifIfd ifd = exif_entry_get_ifd (entry);
char *path;
char b[1024];
const gint key = ifd << 16 | entry->tag;

/* This should optimize away if comparision is correct */
g_warn_if_fail (EXIF_IFD_COUNT <= G_MAXUINT16);

view = EOM_EXIF_DETAILS (data);
priv = view->priv;

store = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));

path = g_hash_table_lookup (priv->id_path_hash, GINT_TO_POINTER (entry->tag));
/* Take the tag's IFD into account when caching their GtkTreePaths.
* That should fix key collisions for tags that have the same number
* but are stored in different IFDs. Exif tag numbers are 16-bit
* values so we should be able to set the high word to the IFD number.
*/
path = g_hash_table_lookup (priv->id_path_hash, GINT_TO_POINTER (key));

if (path != NULL) {
set_row_data (store,
@@ -500,8 +509,8 @@ exif_entry_cb (ExifEntry *entry, gpointer data)
sizeof(b)));

g_hash_table_insert (priv->id_path_hash,
GINT_TO_POINTER (entry->tag),
path);
GINT_TO_POINTER (key),
path);
}
}
}

0 comments on commit b3f9b82

Please sign in to comment.
You can’t perform that action at this time.