From 0b8eb418967d3685d6984bf7a7639ad031df8295 Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 2 Mar 2018 00:12:02 +0100 Subject: [PATCH 1/3] The EXIFIfd data type produced by libtiff is updated to 0x0004 which make the Exifs understandable by Windows. (see #4393) --- rtengine/imageio.cc | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index bebebbd2d..391ca6cfe 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1337,6 +1337,8 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) pl->setProgress (0.0); } + bool applyExifPatch = false; + if (exifRoot) { rtexif::TagDirectory* cl = (const_cast (exifRoot))->clone (nullptr); @@ -1379,6 +1381,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // at a different offset: TIFFSetWriteOffset (out, exif_size + 8); TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + applyExifPatch = true; } } @@ -1490,6 +1493,40 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) writeOk = false; } + /************************************************************************************************************ + * + * Hombre: This is a dirty hack to update the Exif tag data type to 0x0004 so that Windows can understand it. + * libtiff will set this data type to 0x000d and doesn't provide any mechanism to update it before + * dumping to the file. + * + */ + if (applyExifPatch) { + unsigned char b[10]; + uint16 tagCount = 0; + lseek(fileno, 4, SEEK_SET); + read(fileno, b, 4); + uint32 ifd0Offset = rtexif::sget4(b, exifRoot->getOrder()); + printf("IFD0Offset: %d\n", ifd0Offset); + lseek(fileno, ifd0Offset, SEEK_SET); + read(fileno, b, 2); + tagCount = rtexif::sget2(b, exifRoot->getOrder()); + for (size_t i = 0; i < tagCount ; ++i) { + uint16 tagID = 0; + read(fileno, b, 2); + tagID = rtexif::sget2(b, exifRoot->getOrder()); + printf("TagID: %d\n", tagID); + if (tagID == 0x8769) { + rtexif::sset2(4, b, exifRoot->getOrder()); + write(fileno, b, 4); + break; + } else { + read(fileno, b, 10); + } + } + } + /************************************************************************************************************/ + + TIFFClose (out); #ifdef WIN32 fclose (file); From abec60d099934d2bec1652f44bafa4fd9fc65934 Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 2 Mar 2018 01:03:00 +0100 Subject: [PATCH 2/3] Bugfix: wrong length written to file --- rtengine/imageio.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 391ca6cfe..147edba53 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -1506,7 +1506,6 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) lseek(fileno, 4, SEEK_SET); read(fileno, b, 4); uint32 ifd0Offset = rtexif::sget4(b, exifRoot->getOrder()); - printf("IFD0Offset: %d\n", ifd0Offset); lseek(fileno, ifd0Offset, SEEK_SET); read(fileno, b, 2); tagCount = rtexif::sget2(b, exifRoot->getOrder()); @@ -1514,10 +1513,9 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) uint16 tagID = 0; read(fileno, b, 2); tagID = rtexif::sget2(b, exifRoot->getOrder()); - printf("TagID: %d\n", tagID); if (tagID == 0x8769) { rtexif::sset2(4, b, exifRoot->getOrder()); - write(fileno, b, 4); + write(fileno, b, 2); break; } else { read(fileno, b, 10); From 466aa17295e9594cb3bc2c623e69a96e6fde78ad Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 2 Mar 2018 22:08:08 +0100 Subject: [PATCH 3/3] Fixing linking error : removed 'inline' statement (see #4393) --- rtexif/rtexif.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index b7ba5ff1d..52411b33c 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -61,11 +61,11 @@ bool extractLensInfo (std::string &fullname, double &minFocal, double &maxFocal, unsigned short sget2 (unsigned char *s, ByteOrder order); int sget4 (unsigned char *s, ByteOrder order); -inline unsigned short get2 (FILE* f, ByteOrder order); -inline int get4 (FILE* f, ByteOrder order); -inline void sset2 (unsigned short v, unsigned char *s, ByteOrder order); -inline void sset4 (int v, unsigned char *s, ByteOrder order); -inline float int_to_float (int i); +unsigned short get2 (FILE* f, ByteOrder order); +int get4 (FILE* f, ByteOrder order); +void sset2 (unsigned short v, unsigned char *s, ByteOrder order); +void sset4 (int v, unsigned char *s, ByteOrder order); +float int_to_float (int i); short int int2_to_signed (short unsigned int i); struct TIFFHeader {