diff --git a/src/error.cpp b/src/error.cpp index 2507db1b..faac04a3 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -123,7 +123,7 @@ namespace Exiv2 { case LogMsg::info: break; case LogMsg::warn: std::cerr << "Warning: "; break; case LogMsg::error: std::cerr << "Error: "; break; - case LogMsg::mute: assert(true); + case LogMsg::mute: assert(false); } std::cerr << s; } diff --git a/src/exif.cpp b/src/exif.cpp index 1fe153f6..e325397b 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -693,6 +693,7 @@ namespace Exiv2 { subImage7Id, subImage8Id, subImage9Id, + subThumb1Id, panaRawId, ifd2Id, ifd3Id diff --git a/src/preview.cpp b/src/preview.cpp index c9675891..d4dc77ad 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -255,14 +255,16 @@ namespace { { 0, createLoaderTiff, 3 }, { 0, createLoaderTiff, 4 }, { 0, createLoaderTiff, 5 }, + { 0, createLoaderTiff, 6 }, { 0, createLoaderExifJpeg, 0 }, { 0, createLoaderExifJpeg, 1 }, { 0, createLoaderExifJpeg, 2 }, { 0, createLoaderExifJpeg, 3 }, { 0, createLoaderExifJpeg, 4 }, { 0, createLoaderExifJpeg, 5 }, - { "image/x-canon-cr2", createLoaderExifJpeg, 6 }, - { 0, createLoaderExifJpeg, 7 } + { 0, createLoaderExifJpeg, 6 }, + { "image/x-canon-cr2", createLoaderExifJpeg, 7 }, + { 0, createLoaderExifJpeg, 8 } }; const LoaderExifJpeg::Param LoaderExifJpeg::param_[] = { @@ -271,9 +273,10 @@ namespace { { "Exif.SubImage2.JPEGInterchangeFormat", "Exif.SubImage2.JPEGInterchangeFormatLength", 0 }, // 2 { "Exif.SubImage3.JPEGInterchangeFormat", "Exif.SubImage3.JPEGInterchangeFormatLength", 0 }, // 3 { "Exif.SubImage4.JPEGInterchangeFormat", "Exif.SubImage4.JPEGInterchangeFormatLength", 0 }, // 4 - { "Exif.Image2.JPEGInterchangeFormat", "Exif.Image2.JPEGInterchangeFormatLength", 0 }, // 5 - { "Exif.Image.StripOffsets", "Exif.Image.StripByteCounts", 0 }, // 6 - { "Exif.OlympusCs.PreviewImageStart", "Exif.OlympusCs.PreviewImageLength", "Exif.MakerNote.Offset"} // 7 + { "Exif.SubThumb1.JPEGInterchangeFormat", "Exif.SubThumb1.JPEGInterchangeFormatLength", 0 }, // 5 + { "Exif.Image2.JPEGInterchangeFormat", "Exif.Image2.JPEGInterchangeFormatLength", 0 }, // 6 + { "Exif.Image.StripOffsets", "Exif.Image.StripByteCounts", 0 }, // 7 + { "Exif.OlympusCs.PreviewImageStart", "Exif.OlympusCs.PreviewImageLength", "Exif.MakerNote.Offset"} // 8 }; const LoaderExifDataJpeg::Param LoaderExifDataJpeg::param_[] = { @@ -294,7 +297,8 @@ namespace { { "SubImage2", "Exif.SubImage2.NewSubfileType", "1" }, // 2 { "SubImage3", "Exif.SubImage3.NewSubfileType", "1" }, // 3 { "SubImage4", "Exif.SubImage4.NewSubfileType", "1" }, // 4 - { "Thumbnail", 0, 0 } // 5 + { "SubThumb1", "Exif.SubThumb1.NewSubfileType", "1" }, // 5 + { "Thumbnail", 0, 0 } // 6 }; Loader::AutoPtr Loader::create(PreviewId id, const Image &image) diff --git a/src/tags.cpp b/src/tags.cpp index c3940717..6331c20a 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -99,6 +99,7 @@ namespace Exiv2 { { subImage7Id, "SubImage7", "SubImage7", ifdTagList }, { subImage8Id, "SubImage8", "SubImage8", ifdTagList }, { subImage9Id, "SubImage9", "SubImage9", ifdTagList }, + { subThumb1Id, "SubThumb1", "SubThumb1", ifdTagList }, { panaRawId, "PanaRaw", "PanasonicRaw", PanasonicMakerNote::tagListRaw }, { mnId, "Makernote", "MakerNote", mnTagList }, { canonId, "Makernote", "Canon", CanonMakerNote::tagList }, @@ -1956,6 +1957,7 @@ namespace Exiv2 { case subImage7Id: case subImage8Id: case subImage9Id: + case subThumb1Id: case panaRawId: rc = true; break; default: rc = false; break; } diff --git a/src/tags_int.hpp b/src/tags_int.hpp index 37c4c31e..8559482c 100644 --- a/src/tags_int.hpp +++ b/src/tags_int.hpp @@ -71,6 +71,7 @@ namespace Exiv2 { subImage7Id, subImage8Id, subImage9Id, + subThumb1Id, panaRawId, mnId, canonId, diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index c602d68a..75b22cbd 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -1100,6 +1100,7 @@ namespace Exiv2 { { Tag::root, ifd3Id, ifd2Id, Tag::next }, { Tag::root, olympusId, exifId, 0x927c }, { Tag::root, olympus2Id, exifId, 0x927c }, + { Tag::root, subThumb1Id, ifd1Id, 0x014a }, { Tag::root, olympusEqId, olympus2Id, 0x2010 }, { Tag::root, olympusCsId, olympus2Id, 0x2020 }, { Tag::root, olympusRdId, olympus2Id, 0x2030 }, @@ -1321,11 +1322,22 @@ namespace Exiv2 { { 0x0117, ifd1Id, newTiffThumbSize<0x0111, ifd1Id> }, { 0x0144, ifd1Id, newTiffImageData<0x0145, ifd1Id> }, { 0x0145, ifd1Id, newTiffImageSize<0x0144, ifd1Id> }, + { 0x014a, ifd1Id, newTiffSubIfd }, { 0x0201, ifd1Id, newTiffThumbData<0x0202, ifd1Id> }, { 0x0202, ifd1Id, newTiffThumbSize<0x0201, ifd1Id> }, { Tag::next, ifd1Id, newTiffDirectory }, { Tag::all, ifd1Id, newTiffEntry }, + // Subdir subThumb1 + { 0x0111, subThumb1Id, newTiffImageData<0x0117, subThumb1Id> }, + { 0x0117, subThumb1Id, newTiffImageSize<0x0111, subThumb1Id> }, + { 0x0144, subThumb1Id, newTiffImageData<0x0145, subThumb1Id> }, + { 0x0145, subThumb1Id, newTiffImageSize<0x0144, subThumb1Id> }, + { 0x0201, subThumb1Id, newTiffImageData<0x0202, subThumb1Id> }, + { 0x0202, subThumb1Id, newTiffImageSize<0x0201, subThumb1Id> }, + { Tag::next, subThumb1Id, newTiffDirectory }, + { Tag::all, subThumb1Id, newTiffEntry }, + // IFD2 (eg, in Pentax PEF and Canon CR2 files) { 0x0111, ifd2Id, newTiffImageData<0x0117, ifd2Id> }, { 0x0117, ifd2Id, newTiffImageSize<0x0111, ifd2Id> }, diff --git a/src/tiffvisitor.cpp b/src/tiffvisitor.cpp index f1d984d6..7c1afd7c 100644 --- a/src/tiffvisitor.cpp +++ b/src/tiffvisitor.cpp @@ -1337,6 +1337,9 @@ namespace Exiv2 { if ( (object->tiffType() == ttUnsignedLong || object->tiffType() == ttSignedLong || object->tiffType() == ttTiffIfd) && object->count() >= 1) { + // Todo: Fix hack + uint32_t maxi = 9; + if (object->group() == ifd1Id) maxi = 1; for (uint32_t i = 0; i < object->count(); ++i) { int32_t offset = getLong(object->pData() + 4*i, byteOrder()); if ( baseOffset() + offset > size_ @@ -1350,7 +1353,7 @@ namespace Exiv2 { #endif return; } - if (object->newGroup_ + i == subImage9Id + 1) { + if (i >= maxi) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Directory " << groupName(object->group()) << ", entry 0x" << std::setw(4)