From d06c2fee22ac256421ae3ce5d05ca821cc9115bd Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Mon, 9 Jul 2018 09:35:39 +0100 Subject: [PATCH] use exif_tag_get_name_in_ifd() everywhere exif tag names change with the ids they appear in, so you must always use exif_tag_get_name_in_ifd(), not exif_tag_get_name() see: https://github.com/jcupitt/libvips/pull/1030 --- ChangeLog | 1 + libvips/foreign/exif.c | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 637cc439..39e25271 100644 --- a/ChangeLog +++ b/ChangeLog @@ -33,6 +33,7 @@ - add `palette` option to pngsave [felixbuenemann] - support writing string-valued fields via libexif - paste in the test suite from pyvips +- get EXIF tag names from tag plus ifd [@Nan619] 12/3/18 started 8.6.4 - better fitting of fonts with overhanging edges [AdriĆ ] diff --git a/libvips/foreign/exif.c b/libvips/foreign/exif.c index 0a087e81..c4b82f8c 100644 --- a/libvips/foreign/exif.c +++ b/libvips/foreign/exif.c @@ -9,6 +9,8 @@ * - remove exif thumbnail if "jpeg-thumbnail-data" has been removed * 3/7/18 * - add support for writing string-valued fields + * 9/7/18 [@Nan619] + * - get tag name from tag plus ifd */ /* @@ -309,6 +311,21 @@ typedef struct _VipsExifParams { ExifData *ed; } VipsExifParams; +/* tags do not uniquely set tag names: the same tag can have different + * names in different ifds. + * + * As long as this entry has been linked to an ifd, get the tag name. + */ +static const char * +vips_exif_entry_get_name( ExifEntry *entry ) +{ + if( !entry->parent ) + return( NULL ); + + return( exif_tag_get_name_in_ifd( entry->tag, + exif_entry_get_ifd( entry ) ) ); +} + static void vips_exif_attach_entry( ExifEntry *entry, VipsExifParams *params ) { @@ -317,9 +334,8 @@ vips_exif_attach_entry( ExifEntry *entry, VipsExifParams *params ) VipsBuf vips_name = VIPS_BUF_STATIC( vips_name_txt ); char value_txt[256]; VipsBuf value = VIPS_BUF_STATIC( value_txt ); - ExifIfd ifd = exif_entry_get_ifd( entry ); - if( !(tag_name = exif_tag_get_name_in_ifd( entry->tag, ifd )) ) + if( !(tag_name = vips_exif_entry_get_name( entry )) ) return; vips_buf_appendf( &vips_name, "exif-ifd%d-%s", @@ -541,7 +557,7 @@ vips_exif_set_int( ExifData *ed, offset = component * sizeof_component; VIPS_DEBUG_MSG( "vips_exif_set_int: %s = %d\n", - exif_tag_get_name( entry->tag ), value ); + vips_exif_entry_get_name( entry ), value ); if( entry->format == EXIF_FORMAT_SHORT ) exif_set_short( entry->data + offset, bo, value ); @@ -619,7 +635,7 @@ vips_exif_set_rational( ExifData *ed, offset = component * sizeof_component; VIPS_DEBUG_MSG( "vips_exif_set_rational: %s = \"%s\"\n", - exif_tag_get_name( entry->tag ), value ); + vips_exif_entry_get_name( entry ), value ); if( entry->format == EXIF_FORMAT_RATIONAL ) { ExifRational rv; @@ -673,7 +689,7 @@ vips_exif_set_double( ExifData *ed, offset = component * sizeof_component; VIPS_DEBUG_MSG( "vips_exif_set_double: %s = %g\n", - exif_tag_get_name( entry->tag ), value ); + vips_exif_entry_get_name( entry ), value ); if( entry->format == EXIF_FORMAT_RATIONAL ) { ExifRational rv; @@ -1192,7 +1208,7 @@ vips_exif_exif_entry( ExifEntry *entry, VipsExifRemove *ve ) char vips_name_txt[256]; VipsBuf vips_name = VIPS_BUF_STATIC( vips_name_txt ); - if( !(tag_name = exif_tag_get_name( entry->tag )) ) + if( !(tag_name = vips_exif_entry_get_name( entry )) ) return; vips_buf_appendf( &vips_name, "exif-ifd%d-%s", @@ -1230,7 +1246,7 @@ vips_exif_exif_remove( ExifEntry *entry, VipsExifRemove *ve ) char vips_name_txt[256]; VipsBuf vips_name = VIPS_BUF_STATIC( vips_name_txt ); - tag_name = exif_tag_get_name( entry->tag ); + tag_name = vips_exif_entry_get_name( entry ); vips_buf_appendf( &vips_name, "exif-ifd%d-%s", exif_entry_get_ifd( entry ), tag_name );