Skip to content

Commit

Permalink
EomExifDetails: Take Exif IFD into account when creating hash keys
Browse files Browse the repository at this point in the history
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
fxri authored and raveit65 committed Jul 15, 2018
1 parent 0c6a01d commit 667f5b2
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions src/eom-exif-details.c
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}
}
}
Expand Down

0 comments on commit 667f5b2

Please sign in to comment.