From 707e22c5772bba4174577985210f0143f41736f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Wed, 20 Apr 2022 11:52:08 +0200 Subject: [PATCH 01/80] Add some F mount lenses --- src/nikonmn_int.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 2d872021..336bff46 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -2024,6 +2024,8 @@ std::ostream& Nikon3MakerNote::printLensId(std::ostream& os, const Value& value, "AF-S Nikkor 50mm f/1.4G"}, {0xA1, 0x40, 0x18, 0x37, 0x2C, 0x34, 0xA3, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA804DA", "AF-S DX Nikkor 10-24mm f/3.5-4.5G ED"}, + {0xA2, 0x38, 0x5C, 0x8E, 0x34, 0x40, 0xCD, 0x86, 0x00, 0x00, 0x00, "Nikon", "JAA829DA", + "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"}, {0xA2, 0x48, 0x5C, 0x80, 0x24, 0x24, 0xA4, 0x0E, 0x13, 0x00, 0x00, "Nikon", "JAA807DA", "AF-S Nikkor 70-200mm f/2.8G ED VR II"}, {0xA3, 0x3C, 0x29, 0x44, 0x30, 0x30, 0xA5, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA806DA", @@ -2047,6 +2049,8 @@ std::ostream& Nikon3MakerNote::printLensId(std::ostream& os, const Value& value, "AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR"}, {0xAD, 0x3C, 0x2D, 0x8E, 0x2C, 0x3C, 0xAF, 0x0E, 0x01, 0x00, 0x00, "Nikon", "JAA812DA", "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"}, + {0xAD, 0x3C, 0xA0, 0xA0, 0x3C, 0x3C, 0xD8, 0x4E, 0x00, 0x00, 0x00, "Nikon", "JAA535DA", + "AF-S Nikkor 500mm f/5.6E PF ED VR"}, {0xAE, 0x54, 0x62, 0x62, 0x0C, 0x0C, 0xB0, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA338DA", "AF-S Nikkor 85mm f/1.4G"}, {0xAF, 0x54, 0x44, 0x44, 0x0C, 0x0C, 0xB1, 0x06, 0x01, 0x00, 0x00, "Nikon", "JAA134DA", @@ -2482,6 +2486,8 @@ std::ostream& Nikon3MakerNote::printLensId(std::ostream& os, const Value& value, // M "Tamron" "63D" "AF 35-90mm F/4-5.6"; // M "Tamron" "65D" "SP AF 35-105mm F/2.8 Aspherical"; // M "Tamron" "" "AF 35-135mm F/3.5-4.5"; + {0xC9, 0x3C, 0x44, 0x76, 0x25, 0x31, 0xDF, 0x4E, 0x00, 0x00, 0x00, "Tamron", "A043", + "35-150mm F/2.8-4 Di VC OSD"}, {0x00, 0x47, 0x53, 0x80, 0x30, 0x3C, 0x00, 0x06, 0x00, 0x00, 0x00, "Tamron", "A15", "AF 55-200mm F/4-5.6 Di II LD"}, {0xF7, 0x53, 0x5C, 0x80, 0x24, 0x24, 0x84, 0x06, 0x01, 0x00, 0x00, "Tamron", "A001", From 1ff09506e036ab868e7992f64c0a90713ef32ab2 Mon Sep 17 00:00:00 2001 From: Viktor Schneider Date: Sat, 14 May 2022 09:29:26 +0200 Subject: [PATCH 02/80] add missing header for std::unique_ptr in values.hpp 76f01fd4d3b502869074b9a6d390caf2d542d55a removes the header which is required to use std::unique_ptr for some builds (e.g. archlinux using gcc 12.1.0). --- include/exiv2/value.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/exiv2/value.hpp b/include/exiv2/value.hpp index c9c3830e..7152cd69 100644 --- a/include/exiv2/value.hpp +++ b/include/exiv2/value.hpp @@ -14,6 +14,7 @@ #include #include #include +#include // ***************************************************************************** // namespace extensions From e00422ae5214110ff0ca974eb9d66cf7ae1ed223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Wed, 11 May 2022 12:19:42 +0200 Subject: [PATCH 03/80] Account for header bytes for Exif and XMP boxes --- src/bmffimage.cpp | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index f36874cf..ce14fe5c 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -437,10 +437,10 @@ long BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStruc parseTiff(Internal::Tag::cmt4, box_length); break; case TAG_exif: - parseTiff(Internal::Tag::root, box_length, address + 8); + parseTiff(Internal::Tag::root, buffer_size, io_->tell()); break; case TAG_xml: - parseXmp(box_length, io_->tell()); + parseXmp(buffer_size, io_->tell()); break; case TAG_thmb: switch (version) { @@ -521,28 +521,26 @@ void BmffImage::parseTiff(uint32_t root_tag, uint64_t length) { } void BmffImage::parseXmp(uint64_t length, uint64_t start) { - if (length > 8) { - enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata); - enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata); - - long restore = io_->tell(); - io_->seek(static_cast(start), BasicIo::beg); + enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata); + enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata); - auto lengthSizeT = static_cast(length); - DataBuf xmp(lengthSizeT + 1); - xmp.write_uint8(lengthSizeT, 0); // ensure xmp is null terminated! - if (io_->read(xmp.data(), lengthSizeT) != lengthSizeT) - throw Error(ErrorCode::kerInputDataReadFailed); - if (io_->error()) - throw Error(ErrorCode::kerFailedToReadImageData); - try { - Exiv2::XmpParser::decode(xmpData(), std::string(xmp.c_str())); - } catch (...) { - throw Error(ErrorCode::kerFailedToReadImageData); - } + long restore = io_->tell(); + io_->seek(static_cast(start), BasicIo::beg); - io_->seek(restore, BasicIo::beg); + auto lengthSizeT = static_cast(length); + DataBuf xmp(lengthSizeT + 1); + xmp.write_uint8(lengthSizeT, 0); // ensure xmp is null terminated! + if (io_->read(xmp.data(), lengthSizeT) != lengthSizeT) + throw Error(ErrorCode::kerInputDataReadFailed); + if (io_->error()) + throw Error(ErrorCode::kerFailedToReadImageData); + try { + Exiv2::XmpParser::decode(xmpData(), std::string(xmp.c_str())); + } catch (...) { + throw Error(ErrorCode::kerFailedToReadImageData); } + + io_->seek(restore, BasicIo::beg); } /// \todo instead of passing the last 4 parameters, pass just one and build the different offsets inside From 4f9bed24e167c15bd71dcc900e066a1e03bc56bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Wed, 11 May 2022 18:00:24 +0200 Subject: [PATCH 04/80] Add more JXL tests --- test/data/issue_2233_poc1.jxl | Bin 0 -> 19049 bytes test/data/issue_2233_poc2.jxl | Bin 0 -> 19049 bytes .../issue_2233_poc1.jxl.out | 39 ++++++++++++++++++ .../issue_2233_poc2.jxl.out | 39 ++++++++++++++++++ tests/bugfixes/github/test_issue_2233.py | 37 +++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 test/data/issue_2233_poc1.jxl create mode 100644 test/data/issue_2233_poc2.jxl create mode 100644 test/data/test_reference_files/issue_2233_poc1.jxl.out create mode 100644 test/data/test_reference_files/issue_2233_poc2.jxl.out create mode 100644 tests/bugfixes/github/test_issue_2233.py diff --git a/test/data/issue_2233_poc1.jxl b/test/data/issue_2233_poc1.jxl new file mode 100644 index 0000000000000000000000000000000000000000..e5570ab3807576a710819a018fd2d7901d555c37 GIT binary patch literal 19049 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 ?cy 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 literal 0 HcmV?d00001 diff --git a/test/data/test_reference_files/issue_2233_poc1.jxl.out b/test/data/test_reference_files/issue_2233_poc1.jxl.out new file mode 100644 index 00000000..7b7fb75d --- /dev/null +++ b/test/data/test_reference_files/issue_2233_poc1.jxl.out @@ -0,0 +1,39 @@ +Exif.Image.ImageWidth Long 1 160 160 +Exif.Image.ImageLength Long 1 97 97 +Exif.Image.BitsPerSample Short 3 8 8 8 8 8 8 +Exif.Image.Orientation Short 1 1 top, left +Exif.Image.XResolution Rational 1 300/1 300 +Exif.Image.YResolution Rational 1 300/1 300 +Exif.Image.ResolutionUnit Short 1 2 inch +Exif.Image.Software Ascii 13 GIMP 2.99.11 GIMP 2.99.11 +Exif.Image.DateTime Ascii 20 2022:05:10 17:10:08 2022:05:10 17:10:08 +Exif.Image.ExifTag Long 1 202 202 +Exif.Photo.ColorSpace Short 1 1 sRGB +Exif.Image.GPSTag Long 1 220 220 +Exif.GPSInfo.GPSAltitude Rational 1 0/100 0.0 m +Xmp.xmpMM.DocumentID XmpText 52 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 +Xmp.xmpMM.InstanceID XmpText 44 xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a +Xmp.xmpMM.OriginalDocumentID XmpText 44 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 +Xmp.xmpMM.History XmpText 0 type="Seq" +Xmp.xmpMM.History[1] XmpText 0 type="Struct" +Xmp.xmpMM.History[1]/stEvt:action XmpText 5 saved saved +Xmp.xmpMM.History[1]/stEvt:changed XmpText 9 /metadata /metadata +Xmp.xmpMM.History[1]/stEvt:instanceID XmpText 44 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 +Xmp.xmpMM.History[1]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux) +Xmp.xmpMM.History[1]/stEvt:when XmpText 25 2022-05-10T17:09:05+02:00 2022-05-10T17:09:05+02:00 +Xmp.xmpMM.History[2] XmpText 0 type="Struct" +Xmp.xmpMM.History[2]/stEvt:action XmpText 5 saved saved +Xmp.xmpMM.History[2]/stEvt:changed XmpText 1 / / +Xmp.xmpMM.History[2]/stEvt:instanceID XmpText 44 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 +Xmp.xmpMM.History[2]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux) +Xmp.xmpMM.History[2]/stEvt:when XmpText 25 2022-05-10T17:10:08+02:00 2022-05-10T17:10:08+02:00 +Xmp.dc.Format XmpText 9 image/jxl image/jxl +Xmp.dc.creator XmpSeq 1 exiv2.org exiv2.org +Xmp.dc.description LangAlt 1 lang="x-default" Test image lang="x-default" Test image +Xmp.dc.title LangAlt 1 lang="x-default" Logo lang="x-default" Logo +Xmp.GIMP.API XmpText 3 3.0 3.0 +Xmp.GIMP.Platform XmpText 5 Linux Linux +Xmp.GIMP.TimeStamp XmpText 16 1652195408540570 1652195408540570 +Xmp.GIMP.Version XmpText 7 2.99.11 2.99.11 +Xmp.tiff.Orientation XmpText 1 1 top, left +Xmp.xmp.CreatorTool XmpText 4 GIMP GIMP diff --git a/test/data/test_reference_files/issue_2233_poc2.jxl.out b/test/data/test_reference_files/issue_2233_poc2.jxl.out new file mode 100644 index 00000000..7b7fb75d --- /dev/null +++ b/test/data/test_reference_files/issue_2233_poc2.jxl.out @@ -0,0 +1,39 @@ +Exif.Image.ImageWidth Long 1 160 160 +Exif.Image.ImageLength Long 1 97 97 +Exif.Image.BitsPerSample Short 3 8 8 8 8 8 8 +Exif.Image.Orientation Short 1 1 top, left +Exif.Image.XResolution Rational 1 300/1 300 +Exif.Image.YResolution Rational 1 300/1 300 +Exif.Image.ResolutionUnit Short 1 2 inch +Exif.Image.Software Ascii 13 GIMP 2.99.11 GIMP 2.99.11 +Exif.Image.DateTime Ascii 20 2022:05:10 17:10:08 2022:05:10 17:10:08 +Exif.Image.ExifTag Long 1 202 202 +Exif.Photo.ColorSpace Short 1 1 sRGB +Exif.Image.GPSTag Long 1 220 220 +Exif.GPSInfo.GPSAltitude Rational 1 0/100 0.0 m +Xmp.xmpMM.DocumentID XmpText 52 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 gimp:docid:gimp:044333cc-8cd4-44da-a3f7-b4d9ae9ee740 +Xmp.xmpMM.InstanceID XmpText 44 xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a xmp.iid:b9cf7f00-cf00-4264-a8f8-bccde48e0f1a +Xmp.xmpMM.OriginalDocumentID XmpText 44 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 xmp.did:6589fec5-f1c4-4e37-b7ba-f58bfcc61271 +Xmp.xmpMM.History XmpText 0 type="Seq" +Xmp.xmpMM.History[1] XmpText 0 type="Struct" +Xmp.xmpMM.History[1]/stEvt:action XmpText 5 saved saved +Xmp.xmpMM.History[1]/stEvt:changed XmpText 9 /metadata /metadata +Xmp.xmpMM.History[1]/stEvt:instanceID XmpText 44 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 xmp.iid:d87c2c5a-77f8-4da9-b6ac-04ce223765a9 +Xmp.xmpMM.History[1]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux) +Xmp.xmpMM.History[1]/stEvt:when XmpText 25 2022-05-10T17:09:05+02:00 2022-05-10T17:09:05+02:00 +Xmp.xmpMM.History[2] XmpText 0 type="Struct" +Xmp.xmpMM.History[2]/stEvt:action XmpText 5 saved saved +Xmp.xmpMM.History[2]/stEvt:changed XmpText 1 / / +Xmp.xmpMM.History[2]/stEvt:instanceID XmpText 44 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 xmp.iid:f9384fe5-1151-433d-a148-49f9fe6cf112 +Xmp.xmpMM.History[2]/stEvt:softwareAgent XmpText 20 GIMP 2.99.11 (Linux) GIMP 2.99.11 (Linux) +Xmp.xmpMM.History[2]/stEvt:when XmpText 25 2022-05-10T17:10:08+02:00 2022-05-10T17:10:08+02:00 +Xmp.dc.Format XmpText 9 image/jxl image/jxl +Xmp.dc.creator XmpSeq 1 exiv2.org exiv2.org +Xmp.dc.description LangAlt 1 lang="x-default" Test image lang="x-default" Test image +Xmp.dc.title LangAlt 1 lang="x-default" Logo lang="x-default" Logo +Xmp.GIMP.API XmpText 3 3.0 3.0 +Xmp.GIMP.Platform XmpText 5 Linux Linux +Xmp.GIMP.TimeStamp XmpText 16 1652195408540570 1652195408540570 +Xmp.GIMP.Version XmpText 7 2.99.11 2.99.11 +Xmp.tiff.Orientation XmpText 1 1 top, left +Xmp.xmp.CreatorTool XmpText 4 GIMP GIMP diff --git a/tests/bugfixes/github/test_issue_2233.py b/tests/bugfixes/github/test_issue_2233.py new file mode 100644 index 00000000..fe1f8652 --- /dev/null +++ b/tests/bugfixes/github/test_issue_2233.py @@ -0,0 +1,37 @@ +from system_tests import CaseMeta, path + +class TestJXLBoxEndXML(metaclass=CaseMeta): + """ + Regression test for the bug described in: + https://github.com/Exiv2/exiv2/issues/2233 + """ + url = "https://github.com/Exiv2/exiv2/issues/2233" + + filename = path("$data_path/issue_2233_poc1.jxl") + commands = ["$exiv2 -pS $filename"] + stdout = ["""Exiv2::BmffImage::boxHandler: JXL 0->12 +Exiv2::BmffImage::boxHandler: ftyp 12->20 brand: jxl +Exiv2::BmffImage::boxHandler: jxlc 32->15060 +Exiv2::BmffImage::boxHandler: Exif 15092->258 +Exiv2::BmffImage::boxHandler: xml 15350->3699 +"""] + stderr = [""] + retval = [0] + +class TestJXLBoxEndExif(metaclass=CaseMeta): + """ + Regression test for the bug described in: + https://github.com/Exiv2/exiv2/issues/2233 + """ + url = "https://github.com/Exiv2/exiv2/issues/2233" + + filename = path("$data_path/issue_2233_poc2.jxl") + commands = ["$exiv2 -pS $filename"] + stdout = ["""Exiv2::BmffImage::boxHandler: JXL 0->12 +Exiv2::BmffImage::boxHandler: ftyp 12->20 brand: jxl +Exiv2::BmffImage::boxHandler: jxlc 32->15060 +Exiv2::BmffImage::boxHandler: xml 15092->3699 +Exiv2::BmffImage::boxHandler: Exif 18791->258 +"""] + stderr = [""] + retval = [0] From e1ed1df0d70923f8e1c450a12bb501d7623dea5a Mon Sep 17 00:00:00 2001 From: Luis Diaz Date: Tue, 26 Apr 2022 16:40:27 +0200 Subject: [PATCH 05/80] Definition of new CMake presets & usage in CI jobs Additional interesting changes in this commit: - conan: use cmake-conan for better CMake-Conan integration - cmake+doc: Remove deprecated EXIV2_ENABLE_WIN_UNICODE - Ignore CMakeUserPresets.json - doc: Add notes about the usage of CMake presets --- .github/workflows/on_PR_linux_fuzz.yml | 14 +- .github/workflows/on_PR_linux_matrix.yml | 16 +- .../workflows/on_PR_linux_special_builds.yml | 62 ++------ .../workflows/on_PR_linux_staticAnalysis.yml | 14 +- .github/workflows/on_PR_mac_matrix.yml | 17 +- .../workflows/on_PR_mac_special_builds.yml | 18 +-- .github/workflows/on_PR_windows_matrix.yml | 35 ++-- .github/workflows/on_push_BasicWinLinMac.yml | 54 +------ .../workflows/on_push_ExtraJobsForMain.yml | 16 +- .github/workflows/release.yml | 22 +-- .gitignore | 1 + CMakePresets.json | 149 ++++++++++++++++++ README.md | 143 ++++++++++++++--- cmake/findDependencies.cmake | 19 +++ 14 files changed, 327 insertions(+), 253 deletions(-) create mode 100644 CMakePresets.json diff --git a/.github/workflows/on_PR_linux_fuzz.yml b/.github/workflows/on_PR_linux_fuzz.yml index e28a3410..746ce262 100644 --- a/.github/workflows/on_PR_linux_fuzz.yml +++ b/.github/workflows/on_PR_linux_fuzz.yml @@ -24,18 +24,8 @@ jobs: - name: build and compile run: | - mkdir build && cd build && \ - cmake -GNinja -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_CXX_COMPILER=$(which clang++) \ - -DEXIV2_BUILD_FUZZ_TESTS=ON \ - -DEXIV2_TEAM_USE_SANITIZERS=ON \ - .. && \ - cmake --build . --parallel + cmake --preset linux-sanitizers -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=$(which clang++) -DEXIV2_BUILD_FUZZ_TESTS=ON -DEXIV2_BUILD_UNIT_TESTS=OFF + cmake --build build --parallel - name: Fuzz run: | diff --git a/.github/workflows/on_PR_linux_matrix.yml b/.github/workflows/on_PR_linux_matrix.yml index a3c3e991..454b8b76 100644 --- a/.github/workflows/on_PR_linux_matrix.yml +++ b/.github/workflows/on_PR_linux_matrix.yml @@ -39,20 +39,8 @@ jobs: - name: Build run: | - cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ - -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . --parallel + cmake --preset base_linux -S . -B build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} + cmake --build build --parallel - name: Install run: | diff --git a/.github/workflows/on_PR_linux_special_builds.yml b/.github/workflows/on_PR_linux_special_builds.yml index 4cceffc3..36bf5ef4 100644 --- a/.github/workflows/on_PR_linux_special_builds.yml +++ b/.github/workflows/on_PR_linux_special_builds.yml @@ -37,21 +37,8 @@ jobs: - name: Build run: | - cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DBUILD_WITH_COVERAGE=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . --parallel + cmake --preset linux-coverage -S . -B build + cmake --build build --parallel - name: Tests + Upload coverage run: | @@ -78,7 +65,6 @@ jobs: - name: install dependencies run: | - sudo apt-get update sudo apt-get install valgrind ninja-build pip3 install conan==1.45.0 @@ -96,9 +82,8 @@ jobs: - name: Build run: | - cd build - cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DEXIV2_ENABLE_PNG=ON -DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_ENABLE_CURL=ON -DEXIV2_BUILD_UNIT_TESTS=ON -DEXIV2_ENABLE_BMFF=ON -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON -DBUILD_WITH_COVERAGE=OFF -DCMAKE_INSTALL_PREFIX=install .. - cmake --build . --parallel + cmake --preset linux-release -S . -B build + cmake --build build --parallel - name: Tests with valgrind run: | @@ -132,22 +117,8 @@ jobs: - name: Build run: | - cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DBUILD_WITH_COVERAGE=OFF \ - -DEXIV2_TEAM_USE_SANITIZERS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . --parallel + cmake --preset linux-sanitizers -S . -B build + cmake --build build --parallel - name: Tests run: | @@ -163,8 +134,7 @@ jobs: - name: install dependencies run: | - sudo apt-get update - sudo apt-get install valgrind doxygen graphviz gettext + sudo apt-get install valgrind doxygen graphviz gettext ninja-build pip3 install conan==1.45.0 - name: Conan common config @@ -181,22 +151,8 @@ jobs: - name: Build run: | - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DBUILD_WITH_COVERAGE=ON \ - -DEXIV2_BUILD_DOC=ON \ - -DEXIV2_ENABLE_NLS=ON \ - -DCMAKE_CXX_FLAGS="-DEXIV2_DEBUG_MESSAGES" \ - .. && \ - cmake --build . --parallel + cmake --preset linux-release -S . -B build -DEXIV2_BUILD_DOC=ON -DCMAKE_CXX_FLAGS="-DEXIV2_DEBUG_MESSAGES" + cmake --build build --parallel - name: Generate documentation run: | diff --git a/.github/workflows/on_PR_linux_staticAnalysis.yml b/.github/workflows/on_PR_linux_staticAnalysis.yml index c3c764cb..8d2c7bd4 100644 --- a/.github/workflows/on_PR_linux_staticAnalysis.yml +++ b/.github/workflows/on_PR_linux_staticAnalysis.yml @@ -40,19 +40,7 @@ jobs: - name: Configure run: | - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DBUILD_WITH_COVERAGE=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - .. \ + cmake --preset linux-debug-NoConan -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - name: Static Analysis env: diff --git a/.github/workflows/on_PR_mac_matrix.yml b/.github/workflows/on_PR_mac_matrix.yml index 55bedca1..f1f3df86 100644 --- a/.github/workflows/on_PR_mac_matrix.yml +++ b/.github/workflows/on_PR_mac_matrix.yml @@ -33,21 +33,8 @@ jobs: - name: Build run: | - mkdir build && cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ - -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" \ - .. && \ - cmake --build . --parallel + cmake --preset base_mac -S . -B build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" + cmake --build build --parallel - name: Install run: | diff --git a/.github/workflows/on_PR_mac_special_builds.yml b/.github/workflows/on_PR_mac_special_builds.yml index 3b159b07..35158260 100644 --- a/.github/workflows/on_PR_mac_special_builds.yml +++ b/.github/workflows/on_PR_mac_special_builds.yml @@ -28,22 +28,8 @@ jobs: - name: Build run: | - mkdir build && cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DBUILD_WITH_COVERAGE=OFF \ - -DEXIV2_TEAM_USE_SANITIZERS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . --parallel + cmake --preset base_mac -S . -B build -DEXIV2_TEAM_USE_SANITIZERS=ON + cmake --build build --parallel - name: Tests run: | diff --git a/.github/workflows/on_PR_windows_matrix.yml b/.github/workflows/on_PR_windows_matrix.yml index 13cf3acc..c0034236 100644 --- a/.github/workflows/on_PR_windows_matrix.yml +++ b/.github/workflows/on_PR_windows_matrix.yml @@ -73,23 +73,12 @@ jobs: - name: Build run: | - cmake -GNinja ` - -DCMAKE_BUILD_TYPE=${{matrix.build_type}} ` - -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} ` - -DEXIV2_ENABLE_NLS=OFF ` - -DEXIV2_ENABLE_WEBREADY=ON ` - -DEXIV2_ENABLE_BMFF=ON ` - -DEXIV2_BUILD_UNIT_TESTS=ON ` - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON ` - -DCMAKE_INSTALL_PREFIX=install ` - -S . -B build && ` + cmake --preset base_windows -S . -B build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} cmake --build build --parallel - name: Install run: | - cd build - cmake --install . - tree /f install + cmake --install build - name: Test if: ${{matrix.platform == 'x64'}} @@ -122,26 +111,26 @@ jobs: install: >- base-devel pacboy: >- - toolchain:p + cc:p + gcc-libs:p + libwinpthread:p cmake:p + ninja:p expat:p gettext:p gtest:p libiconv:p zlib:p + curl:p - name: Build run: | - cmake -G"MSYS Makefiles" \ - -DCMAKE_CXX_FLAGS=-Wno-deprecated \ + cmake --preset base_windows -S . -B build \ -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ -DBUILD_SHARED_LIBS=${{matrix.shared_libraries}} \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_NLS=OFF \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -S . -B build && \ + -DCONAN_AUTO_INSTALL=OFF \ + -DCMAKE_CXX_FLAGS=-Wno-deprecated \ + -DEXIV2_TEAM_WARNINGS_AS_ERRORS=OFF cmake --build build --parallel - name: Test @@ -176,6 +165,7 @@ jobs: gcc-g++ cmake ninja + libcurl-devel libexpat-devel libxml2-devel libxslt-devel @@ -190,6 +180,7 @@ jobs: -DEXIV2_ENABLE_NLS=OFF \ -DEXIV2_ENABLE_WIN_UNICODE=OFF \ -DEXIV2_ENABLE_WEBREADY=ON \ + -DEXIV2_ENABLE_CURL=ON \ -DEXIV2_ENABLE_BMFF=ON \ -DEXIV2_BUILD_UNIT_TESTS=OFF \ -S . -B build && \ diff --git a/.github/workflows/on_push_BasicWinLinMac.yml b/.github/workflows/on_push_BasicWinLinMac.yml index 4ea08930..ad868347 100644 --- a/.github/workflows/on_push_BasicWinLinMac.yml +++ b/.github/workflows/on_push_BasicWinLinMac.yml @@ -48,28 +48,9 @@ jobs: conan profile update settings.compiler.version=17 default conan config set storage.path=$Env:GITHUB_WORKSPACE/conanCache - - name: Run Conan - run: | - md build - cd build - conan profile list - conan install .. --build missing - - name: Build run: | - cmake -GNinja ` - -DCMAKE_BUILD_TYPE=Release ` - -DBUILD_SHARED_LIBS=ON ` - -DEXIV2_BUILD_SAMPLES=ON ` - -DEXIV2_ENABLE_NLS=OFF ` - -DEXIV2_ENABLE_PNG=ON ` - -DEXIV2_ENABLE_WEBREADY=ON ` - -DEXIV2_ENABLE_BMFF=ON ` - -DEXIV2_BUILD_UNIT_TESTS=ON ` - -DEXIV2_ENABLE_WIN_UNICODE=OFF ` - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON ` - -DCMAKE_INSTALL_PREFIX=install .. ` - -S . -B build && ` + cmake --preset win-release -S . -B build cmake --build build --parallel @@ -100,20 +81,8 @@ jobs: - name: build and compile run: | - cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . --parallel + cmake --preset linux-release-NoConan -S . -B build + cmake --build build --parallel - name: Test run: | @@ -141,21 +110,8 @@ jobs: - name: build and compile run: | - mkdir build && cd build && \ - cmake -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" \ - .. && \ - cmake --build . --parallel + cmake --preset base_mac -S . -B build -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations" + cmake --build build --parallel - name: Test run: | diff --git a/.github/workflows/on_push_ExtraJobsForMain.yml b/.github/workflows/on_push_ExtraJobsForMain.yml index f5f9a78e..9099ca4f 100644 --- a/.github/workflows/on_push_ExtraJobsForMain.yml +++ b/.github/workflows/on_push_ExtraJobsForMain.yml @@ -36,20 +36,8 @@ jobs: - name: Build run: | - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_ENABLE_PNG=ON \ - -DEXIV2_ENABLE_WEBREADY=ON \ - -DEXIV2_ENABLE_CURL=ON \ - -DEXIV2_BUILD_UNIT_TESTS=ON \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DEXIV2_BUILD_SAMPLES=ON \ - -DBUILD_WITH_COVERAGE=ON \ - -DCMAKE_INSTALL_PREFIX=install \ - .. && \ - cmake --build . + cmake --preset linux-coverage -S . -B build + cmake --build build - name: Tests + Upload coverage run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e399a1b0..0bd8c767 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,16 +39,7 @@ jobs: - name: Build packaged release run: | - cmake -GNinja -S . -B build \ - -DEXIV2_TEAM_PACKAGING=ON \ - -DBUILD_SHARED_LIBS=ON \ - -DEXIV2_ENABLE_WEBREADY=OFF \ - -DEXIV2_ENABLE_NLS=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DEXIV2_ENABLE_BMFF=ON \ - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON \ - -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \ - -DEXIV2_BUILD_DOC=ON + cmake --preset linux-all -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON cmake --build build -t doc cmake --build build -t package @@ -137,16 +128,7 @@ jobs: - name: Build packaged release run: | - cmake -GNinja -S . -B build ` - -DEXIV2_TEAM_PACKAGING=ON ` - -DBUILD_SHARED_LIBS=ON ` - -DEXIV2_ENABLE_WEBREADY=OFF ` - -DEXIV2_ENABLE_NLS=OFF ` - -DCMAKE_BUILD_TYPE=Release ` - -DEXIV2_ENABLE_BMFF=ON ` - -DEXIV2_TEAM_WARNINGS_AS_ERRORS=ON ` - -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON ` - -DEXIV2_BUILD_DOC=ON + cmake --preset win-release -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DEXIV2_BUILD_DOC=ON cmake --build build -t doc cmake --build build -t package diff --git a/.gitignore b/.gitignore index c46bd2e7..02b6d1ad 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,6 @@ doc/html contrib/vms/.vagrant /.vscode .vs/ +CMakeUserPresets.json *cppcheck* diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000..045053c8 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,149 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "base_ninja", + "description": "Base preset to use ninja as generator", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/build-${presetName}", + "installDir": "${sourceDir}/build-${presetName}/install", + "cacheVariables": { + "BUILD_SHARED_LIBS": true, + "CONAN_AUTO_INSTALL": true, + "EXIV2_BUILD_SAMPLES": true, + "EXIV2_ENABLE_WEBREADY": true, + "EXIV2_ENABLE_CURL": true, + "EXIV2_ENABLE_PNG": true, + "EXIV2_ENABLE_BMFF": true, + "EXIV2_BUILD_UNIT_TESTS": true, + "EXIV2_TEAM_WARNINGS_AS_ERRORS": true, + "EXIV2_ENABLE_NLS": false + } + }, + { + "name": "base_windows", + "description": "Base preset for Windows (specially useful for CI jobs)", + "displayName": "Base preset for Windows (specially useful for CI jobs)", + "inherits": "base_ninja", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + } + }, + { + "name": "base_linux", + "description": "Base preset for Linux", + "displayName": "Base preset for Linux with default compiler: GCC (specially useful for CI jobs)", + "inherits": "base_ninja", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Linux" + }, + "cacheVariables": { + "BUILD_WITH_CCACHE": true + } + }, + { + "name": "base_mac", + "description": "Base preset for macOS (no conan usage)", + "displayName": "Base preset for macOS with default compiler: AppleClang (specially useful for CI jobs)", + "inherits": "base_ninja", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Darwin" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CONAN_AUTO_INSTALL": false + } + }, + + { + "name": "msvc", + "displayName": "Visual Studio cl toolchain (also usable from VS Code)", + "inherits": "base_windows", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "toolset": { + "value": "host=x64", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "win-debug", + "displayName": "Windows Debug with configured architecture", + "description": "Sets Debug build type with the preloaded Visual Studio Environment", + "inherits": "base_windows", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "win-release", + "displayName": "Windows Release with configured architecture", + "description": "Sets Release build type with the preloaded Visual Studio Environment", + "inherits": "base_windows", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "linux-debug", + "displayName": "Linux Debug (Ninja Generator) with default architecture", + "inherits": "base_linux", + "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" } + }, + { + "name": "linux-release", + "displayName": "Linux Release (Ninja Generator) with default architecture", + "inherits": "base_linux", + "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } + }, + { + "name": "linux-debug-NoConan", + "displayName": "Same as linux-debug but without automatic conan execution", + "inherits": "linux-debug", + "cacheVariables": { "CONAN_AUTO_INSTALL": false } + }, + { + "name": "linux-release-NoConan", + "displayName": "Same as linux-release but without automatic conan execution", + "inherits": "linux-release", + "cacheVariables": { "CONAN_AUTO_INSTALL": false } + }, + { + "name": "linux-coverage", + "displayName": "Same as linux-debug-NoConan with coverage enabled", + "inherits": "linux-debug-NoConan", + "cacheVariables": { "BUILD_WITH_COVERAGE": true } + }, + { + "name": "linux-sanitizers", + "displayName": "Same as linux-debug-NoConan with sanitizers enabled", + "inherits": "linux-debug-NoConan", + "cacheVariables": { "EXIV2_TEAM_USE_SANITIZERS": true } + }, + { + "name": "linux-all", + "displayName": "Same as linux-release-NoConan and with rest of things enabled (doc + NLS)", + "description": "requires installation of packages: doxygen graphviz gettext", + "inherits": "linux-release-NoConan", + "cacheVariables": { + "EXIV2_ENABLE_NLS": true, + "EXIV2_BUILD_DOC": true + } + } + + ] +} diff --git a/README.md b/README.md index f6a906ea..6aeb2f18 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ The file ReadMe.txt in a build bundle describes how to install the library on th - [Building, Installing, Using and Uninstalling Exiv2](#B_I_U) - [Build, Install, Use and Uninstall Exiv2 on a UNIX-like system](#B_I_U_Unix) - [Build and Install Exiv2 with Visual Studio](#B_I_U_VisualStudio) + - [Configure the project with CMake presets](#CMakePresets) - [Build Options](#BuildOptions) - [Dependencies](#Dependencies) - [Building and linking your code with Exiv2](#BuildAndLinkYourCode) @@ -126,7 +127,7 @@ path. ## Build and Install Exiv2 with Visual Studio -We recommend that you use conan to download the Exiv2 external dependencies on Windows. On other platforms (macOS, Linux and others), traditionally the platform package managers have been used. These are discussed at [Platform Notes](#PlatformNotes). The options to configure and compile the project using Visual Studio are similar to UNIX like systems. +We recommend to use conan to download the Exiv2 external dependencies on Windows. On other platforms (macOS, Linux and others), traditionally the platform package managers have been used. However, conan can be used in any platform/architecture to bring the project dependencies. These are discussed at [Platform Notes](#PlatformNotes). The options to configure and compile the project using Visual Studio are similar to UNIX like systems. See [README-CONAN](README-CONAN.md) for more information about Conan. When you build, you may install with the following command. @@ -136,6 +137,99 @@ When you build, you may install with the following command. ``` This will create and copy the exiv2 build artefacts to `%ProgramFiles%/exiv2`. To be able to run the `exiv2` command line application from any terminal you should modify your path to include `%ProgramFiles%/exiv2/bin`. +[TOC](#TOC) +
+ +## Configure the project with the CMake presets + +CMake presets (see documentation [here](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html)) were added recently to the project to ease the CMake configuration process for typical configurations. The presets are defined in the file `CMakePresets.json` and they can be used from the terminal or interpreted by different IDEs. Please note that one needs to use a recent version of CMake (>= 3.21) supporting the presets feature. + +One can list the available presets using the `--list-presets` option: + +```bash +# Running the command from a Windows terminal +$ cmake --list-presets +Available configure presets: + + "msvc" - Visual Studio cl toolchain (also usable from VS Code) + "win-debug" - Windows Debug with configured architecture + "win-release" - Windows Release with configured architecture + +# Running the command from a Linux terminal +$ cmake --list-presets +Available configure presets: + + "linux-debug" - Linux Debug with default architecture + "linux-release" - Linux Release with default architecture +``` + +The project configuration with a specific preset can be choosen with the CMake `--preset` option. In the following terminal output we comment out some interesting things happening during the project configuration: + +```bash +# Configuring the project using a preset +$ cmake --preset win-release +Preset CMake variables: + +# Note that with the usage of a preset, we pass many different options to CMake. + BUILD_SHARED_LIBS:BOOL="TRUE" + CMAKE_BUILD_TYPE="Release" + CMAKE_INSTALL_PREFIX:PATH="C:/dev/personal/exiv2/build-win-release/install" + # A build & install directory are configured with the preset + CONAN_AUTO_INSTALL:BOOL="TRUE" + EXIV2_BUILD_SAMPLES:BOOL="TRUE" + EXIV2_BUILD_UNIT_TESTS:BOOL="TRUE" + EXIV2_ENABLE_BMFF:BOOL="TRUE" + EXIV2_ENABLE_CURL:BOOL="TRUE" + EXIV2_ENABLE_NLS:BOOL="FALSE" + EXIV2_ENABLE_PNG:BOOL="TRUE" + EXIV2_ENABLE_WEBREADY:BOOL="TRUE" + EXIV2_TEAM_WARNINGS_AS_ERRORS:BOOL="TRUE" + +# Conan can be automatically detected in your system and it is run automatically to bring the +# project dependencies +-- Conan: Detected VS runtime: MD +-- Conan: checking conan executable +-- Conan: Found program C:/dev/envs/conan/Scripts/conan.exe +-- Conan: Version found Conan version 1.47.0 +-- Conan executing: C:/dev/envs/conan/Scripts/conan.exe install .. --remote conancenter --build missing --options webready=True --settings arch=x86_64 --settings build_type=Release --settings compiler=Visual Studio --settings compiler.version=17 --settings compiler.runtime=MD +... + +# CMake finds the project dependencies which were automatically handled by conan +-- Conan: Using autogenerated FindZLIB.cmake +-- Library zlib found C:/Users/luis/.conan/data/zlib/1.2.11/_/_/package/-- Conan: Using autogenerated FindCURL.cmake +-- Library libcurl_imp found C:/Users/luis/.conan/data/libcurl/7.79.0/_/_/package/ +... + +# CMake finish the project configuration and prints a report +-- Install prefix: C:/dev/personal/exiv2/build-win-release/install +-- ------------------------------------------------------------------ +-- CMake Generator: Ninja +-- CMAKE_BUILD_TYPE: Release +-- Compiler info: MSVC (C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.30.30705/bin/Hostx64/x64/cl.exe) ; version: 19.30.30705.0 +-- CMAKE_CXX_STANDARD:17 +-- --- Compiler flags --- +-- General: /DWIN32 /D_WINDOWS /W3 /GR /EHsc + /MP + /utf-8 + /WX +-- Extra: +-- Debug: /MDd /Zi /Ob0 /Ox /Zo +-- Release: /MD /O2 /DNDEBUG +-- RelWithDebInfo: /MD /Zi /O2 /DNDEBUG +-- MinSizeRel: /MD /O1 /DNDEBUG +-- --- Linker flags --- +-- General: /machine:x64 /WX +-- Debug: /debug /INCREMENTAL +-- Release: /INCREMENTAL:NO +-- RelWithDebInfo: /debug /INCREMENTAL +-- MinSizeRel: /INCREMENTAL:NO +-- +... +-- Build files have been written to: C:/dev/personal/exiv2/build-win-release +``` + +Note that the usage of CMake presets allow the project contributors to use the same set of options easily in different environments (using terminal, IDEs or CI). + [TOC](#TOC)
@@ -145,7 +239,7 @@ There are two groups of CMake options which are relevant to the project: global | Options | Purpose (_default_) | |:------------- |:------------- | -| CMAKE\_INSTALL\_PREFIX
CMAKE\_BUILD\_TYPE
BUILD\_SHARED\_LIBS | Where to install on your computer _**(/usr/local)**_
Type of build _**(Release)**_ See: [Debugging Exiv2](#Debugging)
Build exiv2lib as shared or static _**(On)**_ | +| CMAKE\_INSTALL\_PREFIX
CMAKE\_BUILD\_TYPE
BUILD\_SHARED\_LIBS | Where to install on your computer _**(/usr/local)**_
Type of build _**(Release)**_ See: [Debugging Exiv2](#Debugging)
Build exiv2lib as SHARED or STATIC | Options defined at `exiv2/CMakeLists.txt` include: @@ -160,10 +254,10 @@ option( EXIV2_ENABLE_BMFF "Build with BMFF support" ON 577 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $ ``` -Options are defined on the CMake command-line: +Using the command-line, these variables can be set/updated using the option `-D`: ```bash -$ cmake -DBUILD_SHARED_LIBS=On -DEXIV2_ENABLE_NLS=Off +$ cmake -DBUILD_SHARED_LIBS=ON -DEXIV2_ENABLE_NLS=OFF ``` [TOC](#TOC) @@ -175,9 +269,9 @@ The following Exiv2 features require external libraries: | Feature | Package | Default | To change default | Availability | |:-------------------------- |:-------- |:--------:| :---------------------------- |:----------- | -| PNG image support | zlib | ON | -DEXIV2\_ENABLE\_PNG=Off | [http://zlib.net/](http://zlib.net/) | -| XMP support | expat | ON | -DEXIV2\_ENABLE\_XMP=Off | [http://expat.sourceforge.net](http://expat.sourceforge.net)/
Use _**Expat 2.2.6**_ and later | -| Natural language system | gettext | OFF | -DEXIV2\_ENABLE\_NLS=On | [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) | +| PNG image support | zlib | ON | -DEXIV2\_ENABLE\_PNG=OFF | [http://zlib.net/](http://zlib.net/) | +| XMP support | expat | ON | -DEXIV2\_ENABLE\_XMP=OFF | [http://expat.sourceforge.net](http://expat.sourceforge.net)/
Use _**Expat 2.2.6**_ and later | +| Natural language system | gettext | OFF | -DEXIV2\_ENABLE\_NLS=ON | [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) | | Character set conversion | libiconv | | Disabled for Visual Studio.
Linked when installed on UNIX like platforms. | [https://www.gnu.org/software/libiconv/](https://www.gnu.org/software/libiconv/) | On UNIX systems, you may install the dependencies using the distribution's package management system. Install the @@ -297,7 +391,7 @@ Localisation is supported on a UNIX-like platform: Linux, macOS, Cygwin and Min Crowdin have provided Exiv2 with a free open-source license to use their services. The Exiv2 localisation project is located at [https://crowdin.com/project/exiv2](https://crowdin.com/project/exiv2). You will also need to register to have a free user account on Crowdin. The Crowdin setup is discussed here: [https://github.com/Exiv2/exiv2/issues/1510](https://github.com/Exiv2/exiv2/issues/1510). It is recommended that you coordinate with Leonardo before contributing localisation changes on Crowdin. You can contact Leonardo by via GitHub. -To build localisation support, use the CMake option `-DEXIV2_ENABLE_NLS=On`. You must install the `gettext` package with your package manager or from source. The `gettext` package is available from [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) and includes the library `libintl` and utilities to build localisation files. If CMake produces error messages which mention libintl or gettext, you should verify that the package `gettext` has been correctly built and installed. +To build localisation support, use the CMake option `-DEXIV2_ENABLE_NLS=ON`. You must install the `gettext` package with your package manager or from source. The `gettext` package is available from [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) and includes the library `libintl` and utilities to build localisation files. If CMake produces error messages which mention libintl or gettext, you should verify that the package `gettext` has been correctly built and installed. You must install the build to test localisation. This ensures that the localisation message files can be found at run-time. You cannot test localisation in the directory `build\bin`. @@ -386,11 +480,11 @@ $ Building documentation requires installing special tools. You will probably prefer to read the documentation on-line from the project website: https://exiv2.org -To build documentation, use the CMake option **`-DEXIV2_BUILD_DOC=On`**. +To build documentation, use the CMake option **`-DEXIV2_BUILD_DOC=ON`**. Additionally, you will require an additional build step to actually build the documentation. ```bash -$ cmake ..options.. -DEXIV2_BUILD_DOC=On +$ cmake ..options.. -DEXIV2_BUILD_DOC=ON $ cmake --build . --target doc ``` @@ -437,7 +531,7 @@ When the Exiv2 websites are updated, the generated tag webpages are reformatted ## Building Exiv2 Packages -To enable the building of Exiv2 packages, use the CMake option `-DEXIV2_TEAM_PACKAGING=On`. +To enable the building of Exiv2 packages, use the CMake option `-DEXIV2_TEAM_PACKAGING=ON`. You should not build Exiv2 Packages. This feature is intended for use by Team Exiv2 to create Platform and Source Packages on the buildserver. @@ -451,7 +545,7 @@ Create and build exiv2 for your platform. $ git clone https://github.com/exiv2/exiv2 $ mkdir -p exiv2/build $ cd exiv2/build -$ cmake .. -G "Unix Makefiles" -DEXIV2_TEAM_PACKAGING=On +$ cmake .. -G "Unix Makefiles" -DEXIV2_TEAM_PACKAGING=ON ... -- Build files have been written to: .../build $ cmake --build . --config Release @@ -603,19 +697,19 @@ Installing and using ccache (and other similar utilities), is platform dependent $ sudo apt install --yes ccache ``` -To build with ccache, use the CMake option **-DBUILD\_WITH\_CCACHE=On** +To build with ccache, use the CMake option **-DBUILD\_WITH\_CCACHE=ON** ```bash $ cd $ mkdir build ; cd build ; cd build -$ cmake .. -G "Unix Makefiles" -DBUILD_WITH_CCACHE=On +$ cmake .. -G "Unix Makefiles" -DBUILD_WITH_CCACHE=ON $ cmake --build . # Build again to appreciate the performance gain $ cmake --build . --target clean $ cmake --build . ``` -Due to the way in which ccache is installed in Fedora (and other Linux distros), ccache effectively replaces the compiler. A default build or **-DBUILD\_WITH\_CCACHE=Off** is not effective and the environment variable CCACHE_DISABLE is required to disable ccache. [https://github.com/Exiv2/exiv2/issues/361](https://github.com/Exiv2/exiv2/issues/361) +Due to the way in which ccache is installed in Fedora (and other Linux distros), ccache effectively replaces the compiler. A default build or **-DBUILD\_WITH\_CCACHE=OFF** is not effective and the environment variable CCACHE_DISABLE is required to disable ccache. [https://github.com/Exiv2/exiv2/issues/361](https://github.com/Exiv2/exiv2/issues/361) [TOC](#TOC)
@@ -707,10 +801,9 @@ $ make Note, you may wish to choose to build with optional features and/or build static libraries. To do this, request appropriately on the mingw64-cmake command: ```bash -$ mingw64-cmake .. -DEXIV2_TEAM_EXTRA_WARNINGS=On \ - -DEXIV2_ENABLE_WEBREADY=On \ - -DEXIV2_ENABLE_WIN_UNICODE=On \ - -DBUILD_SHARED_LIBS=Off +$ mingw64-cmake .. -DEXIV2_TEAM_EXTRA_WARNINGS=ON \ + -DEXIV2_ENABLE_WEBREADY=ON \ + -DBUILD_SHARED_LIBS=OFF ``` The options available for cross-compiling are the same as provided for all builds. See: [Build Options](#BuildOptions) @@ -773,7 +866,7 @@ You will find that 3 tests fail at the end of the test suite. It is safe to ign ## Static and Shared Libraries -You can build either static or shared libraries. Both can be linked with either static or shared run-time libraries. You specify the shared/static with the option `-BUILD_SHARED_LIBS=On|Off` You specify the run-time with the option `-DEXIV2_ENABLE_DYNAMIC_RUNTIME=On|Off`. The default for both options default is On. So you build shared and use the shared libraries which are `.dll` on Windows (msvc, Cygwin and MinGW/msys), `.dylib` on macOS and `.so` on Linux and UNIX. +You can build either static or shared libraries. Both can be linked with either static or shared run-time libraries. You specify the shared/static with the option `-BUILD_SHARED_LIBS=ON|OFF` You specify the run-time with the option `-DEXIV2_ENABLE_DYNAMIC_RUNTIME=ON|OFF`. The default for both options default is ON. So you build shared and use the shared libraries which are `.dll` on Windows (msvc, Cygwin and MinGW/msys), `.dylib` on macOS and `.so` on Linux and UNIX. CMake creates your build artefacts in the directories `bin` and `lib`. The `bin` directory contains your executables and .DLLs. The `lib` directory contains your static libraries. When you install exiv2, the build artefacts are copied to your system's prefix directory which by default is `/usr/local/`. If you wish to test and use your build without installing, you will have to set you PATH appropriately. Linux/Unix users should also set `LD_LIBRARY_PATH` and macOS users should set `DYLD_LIBRARY_PATH`. @@ -806,13 +899,13 @@ This is discussed: [https://github.com/Exiv2/exiv2/issues/1230](https://github.c **Attention is drawn to the possibility that bmff support may be the subject of patent rights. _Exiv2 shall not be held responsible for identifying any or all such patent rights. Exiv2 shall not be held responsible for the legal consequences of the use of this code_.** -Access to the bmff code is guarded in two ways. Firstly, you have to build the library with the CMake option: `-DEXIV2_ENABLE_BMFF=On`. Secondly, the application must enable bmff support at run-time by calling the following function. +Access to the bmff code is guarded in two ways. Firstly, you have to build the library with the CMake option: `-DEXIV2_ENABLE_BMFF=ON`. Secondly, the application must enable bmff support at run-time by calling the following function. ```cpp EXIV2API bool enableBMFF(bool enable); ``` -The return value from `enableBMFF()` is true if the library has been build with bmff support (CMake option -DEXIV2_ENABLE_BMFF=On). +The return value from `enableBMFF()` is true if the library has been build with bmff support (CMake option -DEXIV2_ENABLE_BMFF=ON). Applications may wish to provide a preference setting to enable bmff support and thereby place the responsibility for the use of this code with the user of the application. @@ -928,7 +1021,7 @@ The Variable EXIV2\_PORT or EXIV2\_HTTP can be set to None to skip http tests. You can run tests directly from the build: ```bash -$ cmake .. -G "Unix Makefiles" -DEXIV2_BUILD_UNIT_TESTS=On +$ cmake .. -G "Unix Makefiles" -DEXIV2_BUILD_UNIT_TESTS=ON ... lots of output and build summary ... $ cmake --build . ... lots of output ... @@ -993,7 +1086,7 @@ As a summary, the procedure is: c:\...\exiv2>mkdir build c:\...\exiv2>cd build c:\...\exiv2\build>conan install .. --build missing --profile msvc2019Release -c:\...\exiv2\build>cmake .. -DEXIV2_BUILD_UNIT_TESTS=On -G "Visual Studio 16 2019" +c:\...\exiv2\build>cmake .. -DEXIV2_BUILD_UNIT_TESTS=ON -G "Visual Studio 16 2019" c:\...\exiv2\build>cmake --build . --config Release ... lots of output from compiler and linker ... c:\...\exiv2\build>ctest -C Release @@ -1012,7 +1105,7 @@ set EXIV2_PORT= ## Unit Tests -The code for the unit tests is in `/unitTests`. To include unit tests in the build, use the *CMake* option `-DEXIV2_BUILD_UNIT_TESTS=On`. +The code for the unit tests is in `/unitTests`. To include unit tests in the build, use the *CMake* option `-DEXIV2_BUILD_UNIT_TESTS=ON`. There is a discussion on the web about installing GTest: [https://github.com/Exiv2/exiv2/issues/575](https://github.com/Exiv2/exiv2/issues/575) diff --git a/cmake/findDependencies.cmake b/cmake/findDependencies.cmake index 8ce82d4b..9315f43c 100644 --- a/cmake/findDependencies.cmake +++ b/cmake/findDependencies.cmake @@ -1,5 +1,24 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") +if (CONAN_AUTO_INSTALL) + # Download automatically the cmake-conan integration file + if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") + message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") + file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake" + "${CMAKE_BINARY_DIR}/conan.cmake" + TLS_VERIFY ON) + endif() + + include(${CMAKE_BINARY_DIR}/conan.cmake) + + conan_cmake_autodetect(settings) + conan_cmake_install(PATH_OR_REFERENCE .. + BUILD missing + REMOTE conancenter + OPTIONS webready=True + SETTINGS ${settings}) +endif() + if (APPLE) # On Apple, we use the conan cmake_paths generator if (EXISTS ${CMAKE_BINARY_DIR}/conan_paths.cmake) From 3cd39b789a96aaab0c518d5afbbcc7960ebb219f Mon Sep 17 00:00:00 2001 From: Luis Diaz Date: Thu, 19 May 2022 14:53:48 +0200 Subject: [PATCH 06/80] Update versions of conan dependencies --- conanfile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.py b/conanfile.py index 6946e3df..36f06419 100644 --- a/conanfile.py +++ b/conanfile.py @@ -21,7 +21,7 @@ class Exiv2Conan(ConanFile): self.options['gtest'].shared = False def requirements(self): - self.requires('zlib/1.2.11') + self.requires('zlib/1.2.12') if self.options.webready: self.requires('libcurl/7.79.0') @@ -37,7 +37,7 @@ class Exiv2Conan(ConanFile): if self.options.xmp: self.requires('XmpSdk/2016.7@piponazo/stable') # from conan-piponazo else: - self.requires('expat/2.4.1') + self.requires('expat/2.4.8') def imports(self): self.copy('*.dll', dst='bin', src='bin') From 0309cb01cb5a699e18207294b070820595b57ca9 Mon Sep 17 00:00:00 2001 From: Luis Diaz Date: Thu, 19 May 2022 15:05:35 +0200 Subject: [PATCH 07/80] ci: update conan version in all jobs --- .github/workflows/on_PR_linux_matrix.yml | 2 +- .github/workflows/on_PR_linux_special_builds.yml | 8 ++++---- .github/workflows/on_PR_linux_staticAnalysis.yml | 2 +- .github/workflows/on_PR_windows_matrix.yml | 2 +- .github/workflows/on_push_BasicWinLinMac.yml | 4 ++-- .github/workflows/on_push_ExtraJobsForMain.yml | 2 +- conanfile.py | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/on_PR_linux_matrix.yml b/.github/workflows/on_PR_linux_matrix.yml index 454b8b76..f9abb960 100644 --- a/.github/workflows/on_PR_linux_matrix.yml +++ b/.github/workflows/on_PR_linux_matrix.yml @@ -22,7 +22,7 @@ jobs: - name: install dependencies run: | sudo apt-get install ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan common config run: | diff --git a/.github/workflows/on_PR_linux_special_builds.yml b/.github/workflows/on_PR_linux_special_builds.yml index 36bf5ef4..2b38687b 100644 --- a/.github/workflows/on_PR_linux_special_builds.yml +++ b/.github/workflows/on_PR_linux_special_builds.yml @@ -20,7 +20,7 @@ jobs: - name: install dependencies run: | sudo apt-get install ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 pip3 install gcovr - name: Conan common config @@ -66,7 +66,7 @@ jobs: - name: install dependencies run: | sudo apt-get install valgrind ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan common config run: | @@ -101,7 +101,7 @@ jobs: - name: install dependencies run: | sudo apt-get install ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan common config run: | @@ -135,7 +135,7 @@ jobs: - name: install dependencies run: | sudo apt-get install valgrind doxygen graphviz gettext ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan common config run: | diff --git a/.github/workflows/on_PR_linux_staticAnalysis.yml b/.github/workflows/on_PR_linux_staticAnalysis.yml index 8d2c7bd4..b8d77f63 100644 --- a/.github/workflows/on_PR_linux_staticAnalysis.yml +++ b/.github/workflows/on_PR_linux_staticAnalysis.yml @@ -19,7 +19,7 @@ jobs: - name: install dependencies run: | - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 sudo add-apt-repository ppa:ubuntu-lxc/daily -y wget -q -O - https://files.pvs-studio.com/etc/pubkey.txt |sudo apt-key add - sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.pvs-studio.com/etc/viva64.list diff --git a/.github/workflows/on_PR_windows_matrix.yml b/.github/workflows/on_PR_windows_matrix.yml index c0034236..bd794f59 100644 --- a/.github/workflows/on_PR_windows_matrix.yml +++ b/.github/workflows/on_PR_windows_matrix.yml @@ -50,7 +50,7 @@ jobs: - name: Install Conan & Common config run: | - pip.exe install "conan==1.45.0" + pip.exe install "conan==1.48.1" conan config install https://github.com/conan-io/conanclientcert.git conan profile new --detect default conan profile update settings.build_type=${{matrix.build_type}} default diff --git a/.github/workflows/on_push_BasicWinLinMac.yml b/.github/workflows/on_push_BasicWinLinMac.yml index ad868347..634b7c14 100644 --- a/.github/workflows/on_push_BasicWinLinMac.yml +++ b/.github/workflows/on_push_BasicWinLinMac.yml @@ -41,7 +41,7 @@ jobs: - name: Install Conan & Common config run: | - pip.exe install "conan==1.45.0" + pip.exe install "conan==1.48.1" conan profile new --detect default conan profile show default conan profile update settings.compiler="Visual Studio" default @@ -69,7 +69,7 @@ jobs: - name: install dependencies run: | sudo apt-get install ninja-build - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan run: | diff --git a/.github/workflows/on_push_ExtraJobsForMain.yml b/.github/workflows/on_push_ExtraJobsForMain.yml index 9099ca4f..f16ff055 100644 --- a/.github/workflows/on_push_ExtraJobsForMain.yml +++ b/.github/workflows/on_push_ExtraJobsForMain.yml @@ -19,7 +19,7 @@ jobs: - name: install dependencies run: | - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 pip install gcovr - name: Conan common config diff --git a/conanfile.py b/conanfile.py index 36f06419..b9bed818 100644 --- a/conanfile.py +++ b/conanfile.py @@ -24,7 +24,7 @@ class Exiv2Conan(ConanFile): self.requires('zlib/1.2.12') if self.options.webready: - self.requires('libcurl/7.79.0') + self.requires('libcurl/7.80.0') if os_info.is_windows and self.options.iconv: self.requires('libiconv/1.16') From bf7a33c1feeb1d2f80c959a6686012cbd91c92fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20D=C3=ADaz=20M=C3=A1s?= Date: Thu, 19 May 2022 17:39:46 +0200 Subject: [PATCH 08/80] Fix special builds for main --- .github/workflows/on_push_ExtraJobsForMain.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/on_push_ExtraJobsForMain.yml b/.github/workflows/on_push_ExtraJobsForMain.yml index f16ff055..c41560d5 100644 --- a/.github/workflows/on_push_ExtraJobsForMain.yml +++ b/.github/workflows/on_push_ExtraJobsForMain.yml @@ -8,6 +8,7 @@ on: - '!*' paths-ignore: - "*.md" + workflow_dispatch: jobs: special_debugRelease: @@ -19,8 +20,9 @@ jobs: - name: install dependencies run: | + sudo apt-get install ninja-build pip3 install conan==1.48.1 - pip install gcovr + pip3 install gcovr - name: Conan common config run: | From b4c90b5e16c17f9a2681df33676ea1c1da281c3d Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 21 May 2022 16:33:35 -0700 Subject: [PATCH 09/80] clang-tidy: replace pointer magic with data() Signed-off-by: Rosen Penev --- samples/tiff-test.cpp | 2 +- src/crwimage.cpp | 2 +- src/image.cpp | 4 ++-- src/image_int.cpp | 4 ++-- src/jpgimage.cpp | 10 +++++----- src/photoshop.cpp | 2 +- src/pngchunk_int.cpp | 2 +- src/pngimage.cpp | 2 +- src/psdimage.cpp | 2 +- src/tiffvisitor_int.cpp | 2 +- src/value.cpp | 2 +- src/webpimage.cpp | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/samples/tiff-test.cpp b/samples/tiff-test.cpp index acd8e3dc..7b02d4b0 100644 --- a/samples/tiff-test.cpp +++ b/samples/tiff-test.cpp @@ -61,7 +61,7 @@ void mini1(const char* path) { enforce(wm == wmIntrusive, Exiv2::ErrorCode::kerErrorMessage, "encode returned an unexpected value"); std::cout << "Test 3: Wrote non-empty Exif data without original binary data:\n"; exifData.clear(); - ByteOrder bo = ExifParser::decode(exifData, &blob[0], blob.size()); + ByteOrder bo = ExifParser::decode(exifData, blob.data(), blob.size()); enforce(bo == bigEndian, Exiv2::ErrorCode::kerErrorMessage, "decode returned an unexpected value"); print(exifData); } diff --git a/src/crwimage.cpp b/src/crwimage.cpp index d9686ea4..2a79e560 100644 --- a/src/crwimage.cpp +++ b/src/crwimage.cpp @@ -93,7 +93,7 @@ void CrwImage::writeMetadata() { // Write new buffer to file MemIo tempIo; - tempIo.write((!blob.empty() ? &blob[0] : nullptr), blob.size()); + tempIo.write((!blob.empty() ? blob.data() : nullptr), blob.size()); io_->close(); io_->transfer(tempIo); // may throw diff --git a/src/image.cpp b/src/image.cpp index ed6c090c..208fe9c2 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -425,10 +425,10 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata); // position std::vector bytes(count); // allocate memory // TODO: once we have C++11 use bytes.data() - io.readOrThrow(&bytes[0], count, ErrorCode::kerCorruptedMetadata); + io.readOrThrow(bytes.data(), count, ErrorCode::kerCorruptedMetadata); io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata); // TODO: once we have C++11 use bytes.data() - IptcData::printStructure(out, makeSliceUntil(&bytes[0], count), depth); + IptcData::printStructure(out, makeSliceUntil(bytes.data(), count), depth); } } else if (option == kpsRecursive && tag == 0x927c /* MakerNote */ && count > 10) { const long restore = io.tell(); // save diff --git a/src/image_int.cpp b/src/image_int.cpp index df6420c3..51dc6722 100644 --- a/src/image_int.cpp +++ b/src/image_int.cpp @@ -24,14 +24,14 @@ std::string stringFormat(const char* format, ...) { buffer.resize(need + 1); va_list args; // variable arg list va_start(args, format); // args start after format - rc = vsnprintf(&buffer[0], buffer.size(), format, args); + rc = vsnprintf(buffer.data(), buffer.size(), format, args); va_end(args); // free the args if (rc > 0) need = static_cast(rc); } while (buffer.size() <= need); if (rc > 0) - result = std::string(&buffer[0], need); + result = std::string(buffer.data(), need); return result; } diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index ae726253..da9c32b0 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -188,7 +188,7 @@ void JpegBase::readMetadata() { append(psBlob, buf.c_data(16), size - 16); } // Check whether psBlob is complete - if (!psBlob.empty() && Photoshop::valid(&psBlob[0], psBlob.size())) { + if (!psBlob.empty() && Photoshop::valid(psBlob.data(), psBlob.size())) { --search; foundCompletePsData = true; } @@ -263,7 +263,7 @@ void JpegBase::readMetadata() { const byte* record = nullptr; uint32_t sizeIptc = 0; uint32_t sizeHdr = 0; - const byte* pCur = &psBlob[0]; + const byte* pCur = psBlob.data(); const byte* pEnd = pCur + psBlob.size(); while (pCur < pEnd && 0 == Photoshop::locateIptcIrb(pCur, pEnd - pCur, &record, sizeHdr, sizeIptc)) { #ifdef EXIV2_DEBUG_MESSAGES @@ -274,7 +274,7 @@ void JpegBase::readMetadata() { } pCur = record + sizeHdr + sizeIptc + (sizeIptc & 1); } - if (!iptcBlob.empty() && IptcParser::decode(iptcData_, &iptcBlob[0], iptcBlob.size())) { + if (!iptcBlob.empty() && IptcParser::decode(iptcData_, iptcBlob.data(), iptcBlob.size())) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Failed to decode IPTC metadata.\n"; #endif @@ -680,7 +680,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { // Append to psBlob append(psBlob, buf.c_data(16), buf.size() - 16); // Check whether psBlob is complete - if (!psBlob.empty() && Photoshop::valid(&psBlob[0], psBlob.size())) { + if (!psBlob.empty() && Photoshop::valid(psBlob.data(), psBlob.size())) { foundCompletePsData = true; } } else if (marker == com_ && skipCom == notfound) { @@ -750,7 +750,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { size_t exifSize = rawExif.size(); WriteMethod wm = ExifParser::encode(blob, pExifData, exifSize, bo, exifData_); if (wm == wmIntrusive) { - pExifData = !blob.empty() ? &blob[0] : nullptr; + pExifData = !blob.empty() ? blob.data() : nullptr; exifSize = blob.size(); } if (exifSize > 0) { diff --git a/src/photoshop.cpp b/src/photoshop.cpp index 526f2ea0..043a6eb0 100644 --- a/src/photoshop.cpp +++ b/src/photoshop.cpp @@ -170,7 +170,7 @@ DataBuf Photoshop::setIptcIrb(const byte* pPsData, size_t sizePsData, const Iptc // Data is rounded to be even if (!psBlob.empty()) - rc = DataBuf(&psBlob[0], psBlob.size()); + rc = DataBuf(psBlob.data(), psBlob.size()); #ifdef EXIV2_DEBUG_MESSAGES std::cerr << "IRB block at the end of Photoshop::setIptcIrb\n"; if (rc.empty()) diff --git a/src/pngchunk_int.cpp b/src/pngchunk_int.cpp index a046ebe0..53ae8093 100644 --- a/src/pngchunk_int.cpp +++ b/src/pngchunk_int.cpp @@ -246,7 +246,7 @@ void PngChunk::parseChunkContent(Image* pImage, const byte* key, size_t keySize, pCur = record + sizeHdr + sizeIptc; pCur += (sizeIptc & 1); } - if (!iptcBlob.empty() && IptcParser::decode(pImage->iptcData(), &iptcBlob[0], iptcBlob.size())) { + if (!iptcBlob.empty() && IptcParser::decode(pImage->iptcData(), iptcBlob.data(), iptcBlob.size())) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Failed to decode IPTC metadata.\n"; #endif diff --git a/src/pngimage.cpp b/src/pngimage.cpp index df4b1ec1..75d509e2 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -572,7 +572,7 @@ void PngImage::doWriteMetadata(BasicIo& outIo) { if (!blob.empty()) { static const char exifHeader[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00}; std::string rawExif = - std::string(exifHeader, 6) + std::string(reinterpret_cast(&blob[0]), blob.size()); + std::string(exifHeader, 6) + std::string(reinterpret_cast(blob.data()), blob.size()); std::string chunk = PngChunk::makeMetadataChunk(rawExif, mdExif); if (outIo.write(reinterpret_cast(chunk.data()), chunk.size()) != chunk.size()) { throw Error(ErrorCode::kerImageWriteFailed); diff --git a/src/psdimage.cpp b/src/psdimage.cpp index 7e5d7b65..94ac7788 100644 --- a/src/psdimage.cpp +++ b/src/psdimage.cpp @@ -610,7 +610,7 @@ uint32_t PsdImage::writeExifData(const ExifData& exifData, BasicIo& out) { if (out.write(buf, 4) != 4) throw Error(ErrorCode::kerImageWriteFailed); // Write encoded Exif data - if (out.write(&blob[0], blob.size()) != blob.size()) + if (out.write(blob.data(), blob.size()) != blob.size()) throw Error(ErrorCode::kerImageWriteFailed); resLength += static_cast(blob.size()) + 12; if (blob.size() & 1) // even padding diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index 82f6592c..b7a39ceb 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -557,7 +557,7 @@ void TiffEncoder::encodeXmp() { if (!xmpPacket.empty()) { // Set the XMP Exif tag to the new value auto value = Value::create(unsignedByte); - value->read(reinterpret_cast(&xmpPacket[0]), xmpPacket.size(), invalidByteOrder); + value->read(reinterpret_cast(xmpPacket.data()), xmpPacket.size(), invalidByteOrder); Exifdatum xmpDatum(xmpKey, value.get()); exifData_.add(xmpDatum); } diff --git a/src/value.cpp b/src/value.cpp index 5af114b0..526c57e7 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -490,7 +490,7 @@ size_t XmpValue::copy(byte* buf, ByteOrder /*byteOrder*/) const { write(os); std::string s = os.str(); if (!s.empty()) - std::memcpy(buf, &s[0], s.size()); + std::memcpy(buf, s.data(), s.size()); return s.size(); } diff --git a/src/webpimage.cpp b/src/webpimage.cpp index 3ed1dbaa..c1806c78 100644 --- a/src/webpimage.cpp +++ b/src/webpimage.cpp @@ -377,7 +377,7 @@ void WebPImage::doWriteMetadata(BasicIo& outIo) { ul2Data(data, static_cast(blob.size()), littleEndian); if (outIo.write(data, WEBP_TAG_SIZE) != WEBP_TAG_SIZE) throw Error(ErrorCode::kerImageWriteFailed); - if (outIo.write(&blob[0], blob.size()) != blob.size()) { + if (outIo.write(blob.data(), blob.size()) != blob.size()) { throw Error(ErrorCode::kerImageWriteFailed); } if (outIo.tell() % 2) { From a98954a98e733ba6310ef92d0ef1fcc69ae98ff5 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 21 May 2022 17:06:36 -0700 Subject: [PATCH 10/80] clang-tidy: add missing special member functions Signed-off-by: Rosen Penev --- app/actions.hpp | 2 ++ app/exiv2app.hpp | 2 ++ include/exiv2/webpimage.hpp | 1 + src/crwimage_int.hpp | 4 ++++ src/makernote_int.hpp | 4 +++- 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/actions.hpp b/app/actions.hpp index 62a1c557..ec89ef85 100644 --- a/app/actions.hpp +++ b/app/actions.hpp @@ -97,8 +97,10 @@ class TaskFactory { */ static TaskFactory& instance(); + ~TaskFactory() = default; //! Prevent copy construction: not implemented. TaskFactory(const TaskFactory&) = delete; + TaskFactory& operator=(const TaskFactory&) = delete; //! Destructor void cleanup(); diff --git a/app/exiv2app.hpp b/app/exiv2app.hpp index c12fce61..8921045b 100644 --- a/app/exiv2app.hpp +++ b/app/exiv2app.hpp @@ -110,7 +110,9 @@ class Params : public Util::Getopt { static Params& instance(); //! Prevent copy-construction: not implemented. + ~Params() = default; Params(const Params&) = delete; + Params& operator=(const Params&) = delete; //! Enumerates print modes enum PrintMode { diff --git a/include/exiv2/webpimage.hpp b/include/exiv2/webpimage.hpp index 09e60b23..d9dda5a7 100644 --- a/include/exiv2/webpimage.hpp +++ b/include/exiv2/webpimage.hpp @@ -54,6 +54,7 @@ class EXIV2API WebPImage : public Image { [[nodiscard]] std::string mimeType() const override; //@} + ~WebPImage() = default; //! Copy constructor WebPImage(const WebPImage&) = delete; //! Assignment operator diff --git a/src/crwimage_int.hpp b/src/crwimage_int.hpp index 4c09abf8..2c2318e9 100644 --- a/src/crwimage_int.hpp +++ b/src/crwimage_int.hpp @@ -330,6 +330,9 @@ class CiffDirectory : public CiffComponent { ~CiffDirectory() override; //@} + CiffDirectory(const CiffDirectory&) = delete; + CiffDirectory& operator=(const CiffDirectory&) = delete; + //! @name Manipulators //@{ // Default assignment operator is fine @@ -522,6 +525,7 @@ struct CrwMapping { */ class CrwMap { public: + ~CrwMap() = delete; //! @name Not implemented //@{ CrwMap(const CrwMap&) = delete; diff --git a/src/makernote_int.hpp b/src/makernote_int.hpp index 28b25f0f..5a8880fa 100644 --- a/src/makernote_int.hpp +++ b/src/makernote_int.hpp @@ -81,8 +81,10 @@ class TiffMnCreator { */ static TiffComponent* create(uint16_t tag, IfdId group, IfdId mnGroup); + ~TiffMnCreator() = default; //! Prevent destruction (needed if used as a policy class) - ~TiffMnCreator() = delete; + TiffMnCreator(const TiffComponent&) = delete; + TiffMnCreator& operator=(const TiffComponent&) = delete; private: static const TiffMnRegistry registry_[]; // Date: Sat, 21 May 2022 16:43:19 -0700 Subject: [PATCH 11/80] clang-tidy: C casts to C++ Signed-off-by: Rosen Penev --- app/exiv2.cpp | 2 +- samples/addmoddel.cpp | 8 ++++---- samples/exifdata-test.cpp | 14 +++++++------- samples/iptceasy.cpp | 2 +- samples/remotetest.cpp | 12 ++++++------ samples/write2-test.cpp | 32 ++++++++++++++++---------------- samples/xmpsample.cpp | 2 +- src/convert.cpp | 2 +- src/crwimage.cpp | 2 +- src/exif.cpp | 8 ++++---- src/http.cpp | 2 +- src/makernote_int.cpp | 2 +- src/minoltamn_int.cpp | 4 ++-- src/nikonmn_int.cpp | 12 ++++++------ src/pngimage.cpp | 4 ++-- src/preview.cpp | 4 ++-- src/safe_op.hpp | 2 +- src/tiffcomposite_int.cpp | 22 +++++++++++++--------- src/tiffimage_int.cpp | 5 +++-- src/types.cpp | 2 +- src/webpimage.cpp | 8 ++++---- 21 files changed, 78 insertions(+), 73 deletions(-) diff --git a/app/exiv2.cpp b/app/exiv2.cpp index d30cfcb5..7ff23c61 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -137,7 +137,7 @@ int main(int argc, char* const argv[]) { try { // Create the required action class - auto task = Action::TaskFactory::instance().create(Action::TaskType(params.action_)); + auto task = Action::TaskFactory::instance().create(static_cast(params.action_)); // Process all files auto filesCount = params.files_.size(); diff --git a/samples/addmoddel.cpp b/samples/addmoddel.cpp index 0ea379d8..272a83f8 100644 --- a/samples/addmoddel.cpp +++ b/samples/addmoddel.cpp @@ -31,10 +31,10 @@ int main(int argc, char* const argv[]) { // This is the quickest way to add (simple) Exif data. If a metadatum for // a given key already exists, its value is overwritten. Otherwise a new // tag is added. - exifData["Exif.Image.Model"] = "Test 1"; // AsciiValue - exifData["Exif.Image.SamplesPerPixel"] = uint16_t(162); // UShortValue - exifData["Exif.Image.XResolution"] = -2; // LongValue - exifData["Exif.Image.YResolution"] = Exiv2::Rational(-2, 3); // RationalValue + exifData["Exif.Image.Model"] = "Test 1"; // AsciiValue + exifData["Exif.Image.SamplesPerPixel"] = static_cast(162); // UShortValue + exifData["Exif.Image.XResolution"] = -2; // LongValue + exifData["Exif.Image.YResolution"] = Exiv2::Rational(-2, 3); // RationalValue std::cout << "Added a few tags the quick way.\n"; // Create a ASCII string value (note the use of create) diff --git a/samples/exifdata-test.cpp b/samples/exifdata-test.cpp index 04513612..b2a8fbc5 100644 --- a/samples/exifdata-test.cpp +++ b/samples/exifdata-test.cpp @@ -34,9 +34,9 @@ int main(int argc, char* const argv[]) { std::cout << "Copy construction, non-intrusive changes\n"; Exiv2::ExifData ed1(ed); ed1["Exif.Image.DateTime"] = "Sunday, 11am"; - ed1["Exif.Image.Orientation"] = uint16_t(2); + ed1["Exif.Image.Orientation"] = static_cast(2); ed1["Exif.Photo.DateTimeOriginal"] = "Sunday, 11am"; - ed1["Exif.Photo.MeteringMode"] = uint16_t(1); + ed1["Exif.Photo.MeteringMode"] = static_cast(1); ed1["Exif.Iop.InteroperabilityIndex"] = "123"; // ed1["Exif.Thumbnail.Orientation"] = uint16_t(2); write(file, ed1); @@ -61,11 +61,11 @@ int main(int argc, char* const argv[]) { ed3["Exif.Thumbnail.Artist"] = "Test 6 Ifd1 tag"; ed3 = ed; ed3["Exif.Image.DateTime"] = "Sunday, 11am"; - ed3["Exif.Image.Orientation"] = uint16_t(2); + ed3["Exif.Image.Orientation"] = static_cast(2); ed3["Exif.Photo.DateTimeOriginal"] = "Sunday, 11am"; - ed3["Exif.Photo.MeteringMode"] = uint16_t(1); + ed3["Exif.Photo.MeteringMode"] = static_cast(1); ed3["Exif.Iop.InteroperabilityIndex"] = "123"; - ed3["Exif.Thumbnail.Orientation"] = uint16_t(2); + ed3["Exif.Thumbnail.Orientation"] = static_cast(2); write(file, ed3); print(file); std::cout << "----------------------------------------------\n"; @@ -78,9 +78,9 @@ int main(int argc, char* const argv[]) { ed4["Exif.Image.DateTime"] = "Sunday, 11am and ten minutes"; ed4["Exif.Image.Orientation"] = "2 3 4 5"; ed4["Exif.Photo.DateTimeOriginal"] = "Sunday, 11am and ten minutes"; - ed4["Exif.Photo.MeteringMode"] = uint16_t(1); + ed4["Exif.Photo.MeteringMode"] = static_cast(1); ed4["Exif.Iop.InteroperabilityIndex"] = "123"; - ed4["Exif.Thumbnail.Orientation"] = uint16_t(2); + ed4["Exif.Thumbnail.Orientation"] = static_cast(2); write(file, ed4); print(file); diff --git a/samples/iptceasy.cpp b/samples/iptceasy.cpp index 45ecc877..379b0095 100644 --- a/samples/iptceasy.cpp +++ b/samples/iptceasy.cpp @@ -23,7 +23,7 @@ int main(int argc, char* const argv[]) try { iptcData["Iptc.Application2.Headline"] = "The headline I am"; iptcData["Iptc.Application2.Keywords"] = "Yet another keyword"; iptcData["Iptc.Application2.DateCreated"] = "2004-8-3"; - iptcData["Iptc.Application2.Urgency"] = uint16_t(1); + iptcData["Iptc.Application2.Urgency"] = static_cast(1); iptcData["Iptc.Envelope.ModelVersion"] = 42; iptcData["Iptc.Envelope.TimeSent"] = "14:41:0-05:00"; iptcData["Iptc.Application2.RasterizedCaption"] = "230 42 34 2 90 84 23 146"; diff --git a/samples/remotetest.cpp b/samples/remotetest.cpp index d2907feb..0ebfb891 100644 --- a/samples/remotetest.cpp +++ b/samples/remotetest.cpp @@ -34,12 +34,12 @@ int main(int argc, char* const argv[]) { // set/add metadata std::cout << "Modify the metadata ...\n"; Exiv2::ExifData exifData; - exifData["Exif.Photo.UserComment"] = "Hello World"; // AsciiValue - exifData["Exif.Image.Software"] = "Exiv2"; // AsciiValue - exifData["Exif.Image.Copyright"] = "Exiv2"; // AsciiValue - exifData["Exif.Image.Make"] = "Canon"; // AsciiValue - exifData["Exif.Canon.OwnerName"] = "Tuan"; // UShortValue - exifData["Exif.CanonCs.LensType"] = uint16_t(65535); // LongValue + exifData["Exif.Photo.UserComment"] = "Hello World"; // AsciiValue + exifData["Exif.Image.Software"] = "Exiv2"; // AsciiValue + exifData["Exif.Image.Copyright"] = "Exiv2"; // AsciiValue + exifData["Exif.Image.Make"] = "Canon"; // AsciiValue + exifData["Exif.Canon.OwnerName"] = "Tuan"; // UShortValue + exifData["Exif.CanonCs.LensType"] = static_cast(65535); // LongValue Exiv2::Value::UniquePtr v = Exiv2::Value::create(Exiv2::asciiString); v->read("2013:06:09 14:30:30"); Exiv2::ExifKey key("Exif.Image.DateTime"); diff --git a/samples/write2-test.cpp b/samples/write2-test.cpp index b18365f5..b6773db9 100644 --- a/samples/write2-test.cpp +++ b/samples/write2-test.cpp @@ -56,11 +56,11 @@ int main(int argc, char* const argv[]) { edMn1["Exif.Image.Make"] = "Canon"; edMn1["Exif.Image.Model"] = "Canon PowerShot S40"; edMn1["Exif.Canon.0xabcd"] = "A Canon makernote tag"; - edMn1["Exif.CanonCs.0x0002"] = uint16_t(41); - edMn1["Exif.CanonSi.0x0005"] = uint16_t(42); - edMn1["Exif.CanonCf.0x0001"] = uint16_t(43); - edMn1["Exif.CanonPi.0x0001"] = uint16_t(44); - edMn1["Exif.CanonPa.0x0001"] = uint16_t(45); + edMn1["Exif.CanonCs.0x0002"] = static_cast(41); + edMn1["Exif.CanonSi.0x0005"] = static_cast(42); + edMn1["Exif.CanonCf.0x0001"] = static_cast(43); + edMn1["Exif.CanonPi.0x0001"] = static_cast(44); + edMn1["Exif.CanonPa.0x0001"] = static_cast(45); write(file, edMn1); print(file); @@ -69,8 +69,8 @@ int main(int argc, char* const argv[]) { image->readMetadata(); Exiv2::ExifData& rEd = image->exifData(); - rEd["Exif.CanonCs.0x0001"] = uint16_t(88); - rEd["Exif.CanonSi.0x0004"] = uint16_t(99); + rEd["Exif.CanonCs.0x0001"] = static_cast(88); + rEd["Exif.CanonSi.0x0004"] = static_cast(99); image->writeMetadata(); print(file); @@ -118,7 +118,7 @@ int main(int argc, char* const argv[]) { Exiv2::ExifData edMn7; edMn7["Exif.Image.Make"] = "OLYMPUS CORPORATION"; edMn7["Exif.Image.Model"] = "C8080WZ"; - edMn7["Exif.Olympus.0x0201"] = uint16_t(1); + edMn7["Exif.Olympus.0x0201"] = static_cast(1); write(file, edMn7); print(file); @@ -126,7 +126,7 @@ int main(int argc, char* const argv[]) { Exiv2::ExifData edMn8; edMn8["Exif.Image.Make"] = "Panasonic"; edMn8["Exif.Image.Model"] = "DMC-FZ5"; - edMn8["Exif.Panasonic.0x0001"] = uint16_t(1); + edMn8["Exif.Panasonic.0x0001"] = static_cast(1); write(file, edMn8); print(file); @@ -142,13 +142,13 @@ int main(int argc, char* const argv[]) { Exiv2::ExifData edMn10; edMn10["Exif.Image.Make"] = "Minolta"; edMn10["Exif.Image.Model"] = "A fancy Minolta camera"; - edMn10["Exif.Minolta.ColorMode"] = uint32_t(1); - edMn10["Exif.MinoltaCsNew.WhiteBalance"] = uint32_t(2); - edMn10["Exif.MinoltaCs5D.WhiteBalance"] = uint16_t(3); - edMn10["Exif.MinoltaCs5D.ColorTemperature"] = int16_t(-1); - edMn10["Exif.MinoltaCs7D.WhiteBalance"] = uint16_t(4); - edMn10["Exif.MinoltaCs7D.ExposureCompensation"] = int16_t(-2); - edMn10["Exif.MinoltaCs7D.ColorTemperature"] = int16_t(-3); + edMn10["Exif.Minolta.ColorMode"] = static_cast(1); + edMn10["Exif.MinoltaCsNew.WhiteBalance"] = static_cast(2); + edMn10["Exif.MinoltaCs5D.WhiteBalance"] = static_cast(3); + edMn10["Exif.MinoltaCs5D.ColorTemperature"] = static_cast(-1); + edMn10["Exif.MinoltaCs7D.WhiteBalance"] = static_cast(4); + edMn10["Exif.MinoltaCs7D.ExposureCompensation"] = static_cast(-2); + edMn10["Exif.MinoltaCs7D.ColorTemperature"] = static_cast(-3); write(file, edMn10); print(file); diff --git a/samples/xmpsample.cpp b/samples/xmpsample.cpp index 972620e7..e02b3f06 100644 --- a/samples/xmpsample.cpp +++ b/samples/xmpsample.cpp @@ -40,7 +40,7 @@ int main() try { xmpData["Xmp.dc.one"] = -1; xmpData["Xmp.dc.two"] = 3.1415; xmpData["Xmp.dc.three"] = Exiv2::Rational(5, 7); - xmpData["Xmp.dc.four"] = uint16_t(255); + xmpData["Xmp.dc.four"] = static_cast(255); xmpData["Xmp.dc.five"] = 256; xmpData["Xmp.dc.six"] = false; diff --git a/src/convert.cpp b/src/convert.cpp index 739eb343..de9aafac 100644 --- a/src/convert.cpp +++ b/src/convert.cpp @@ -1584,7 +1584,7 @@ bool convertStringCharsetIconv(std::string& str, const char* from, const char* t size_t outbytesleft = sizeof(outbuf); size_t rc = iconv(cd, &inptr, &inbytesleft, &outptr, &outbytesleft); const size_t outbytesProduced = sizeof(outbuf) - outbytesleft; - if (rc == size_t(-1) && errno != E2BIG) { + if (rc == static_cast(-1) && errno != E2BIG) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "iconv: " << strError() << " inbytesleft = " << inbytesleft << "\n"; #endif diff --git a/src/crwimage.cpp b/src/crwimage.cpp index 2a79e560..70cc1eb7 100644 --- a/src/crwimage.cpp +++ b/src/crwimage.cpp @@ -108,7 +108,7 @@ void CrwParser::decode(CrwImage* pCrwImage, const byte* pData, size_t size) { // a hack to get absolute offset of preview image inside CRW structure auto preview = header.findComponent(0x2007, 0x0000); if (preview) { - (pCrwImage->exifData())["Exif.Image2.JPEGInterchangeFormat"] = uint32_t(preview->pData() - pData); + (pCrwImage->exifData())["Exif.Image2.JPEGInterchangeFormat"] = static_cast(preview->pData() - pData); (pCrwImage->exifData())["Exif.Image2.JPEGInterchangeFormatLength"] = static_cast(preview->size()); } } // CrwParser::decode diff --git a/src/exif.cpp b/src/exif.cpp index f41b7d62..8ca9f517 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -301,7 +301,7 @@ int Exifdatum::ifdId() const { } const char* Exifdatum::ifdName() const { - return key_ ? Internal::ifdName(Internal::IfdId(key_->ifdId())) : ""; + return key_ ? Internal::ifdName(static_cast(key_->ifdId())) : ""; } int Exifdatum::idx() const { @@ -422,11 +422,11 @@ void ExifThumb::setJpegThumbnail(const std::string& path) { } void ExifThumb::setJpegThumbnail(const byte* buf, size_t size) { - exifData_["Exif.Thumbnail.Compression"] = uint16_t(6); + exifData_["Exif.Thumbnail.Compression"] = static_cast(6); Exifdatum& format = exifData_["Exif.Thumbnail.JPEGInterchangeFormat"]; - format = uint32_t(0); + format = static_cast(0); format.setDataArea(buf, size); - exifData_["Exif.Thumbnail.JPEGInterchangeFormatLength"] = uint32_t(size); + exifData_["Exif.Thumbnail.JPEGInterchangeFormatLength"] = static_cast(size); } void ExifThumb::erase() { diff --git a/src/http.cpp b/src/http.cpp index dc02eaa1..32b7042e 100644 --- a/src/http.cpp +++ b/src/http.cpp @@ -336,7 +336,7 @@ int Exiv2::http(Exiv2::Dictionary& request, Exiv2::Dictionary& response, std::st if (n != FINISH || !OK(status)) { snprintf(buffer, sizeof buffer, "wsa_error = %d,n = %d,sleep_ = %d status = %d", WSAGetLastError(), n, - int(sleep_.count()), status); + static_cast(sleep_.count()), status); error(errors, buffer, nullptr, nullptr, 0); } else if (bSearching && OK(status)) { if (end) { diff --git a/src/makernote_int.cpp b/src/makernote_int.cpp index 78562843..033743d0 100644 --- a/src/makernote_int.cpp +++ b/src/makernote_int.cpp @@ -1036,7 +1036,7 @@ const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const ui std::string getExifModel(Exiv2::Internal::TiffComponent* pRoot) { // Lookup the Exif.Image.Model tag const auto value = getExifValue(pRoot, 0x0110, Exiv2::Internal::ifd0Id); - return (!value || value->count() == 0) ? std::string("") : std::string(value->toString()); + return (!value || value->count() == 0) ? std::string("") : static_cast(value->toString()); } void ncrypt(Exiv2::byte* pData, uint32_t size, uint32_t count, uint32_t serial) { diff --git a/src/minoltamn_int.cpp b/src/minoltamn_int.cpp index 34b66f34..2155cb1e 100644 --- a/src/minoltamn_int.cpp +++ b/src/minoltamn_int.cpp @@ -583,7 +583,7 @@ std::ostream& MinoltaMakerNote::printMinoltaExposureManualBias5D(std::ostream& o std::ios::fmtflags f(os.flags()); std::ostringstream oss; oss.copyfmt(os); - os << std::fixed << std::setprecision(2) << (float(value.toInt64() - 128) / 24); + os << std::fixed << std::setprecision(2) << (static_cast(value.toInt64() - 128) / 24); os.copyfmt(oss); os.flags(f); return os; @@ -595,7 +595,7 @@ std::ostream& MinoltaMakerNote::printMinoltaExposureCompensation5D(std::ostream& std::ios::fmtflags f(os.flags()); std::ostringstream oss; oss.copyfmt(os); - os << std::fixed << std::setprecision(2) << (float(value.toInt64() - 300) / 100); + os << std::fixed << std::setprecision(2) << (static_cast(value.toInt64() - 300) / 100); os.copyfmt(oss); os.flags(f); return os; diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 336bff46..15236e6f 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -3013,7 +3013,7 @@ std::ostream& Nikon3MakerNote::printFlashCompensation(std::ostream& os, const Va } std::ostringstream oss; oss.copyfmt(os); - float temp = (value.toFloat() / float(-6.0)); + float temp = (value.toFloat() / static_cast(-6.0)); if (temp == 0) os << 0; @@ -3064,7 +3064,7 @@ std::ostream& Nikon3MakerNote::printFlashGroupAData(std::ostream& os, const Valu std::ostringstream oss; oss.copyfmt(os); - double temp = value.toFloat() / double(-6.0); + double temp = value.toFloat() / (-6.0); auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupAControlData")); if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte) { @@ -3100,7 +3100,7 @@ std::ostream& Nikon3MakerNote::printFlashGroupBData(std::ostream& os, const Valu std::ostringstream oss; oss.copyfmt(os); - double temp = value.toFloat() / double(-6.0); + double temp = value.toFloat() / (-6.0); auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupBCControlData")); if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte) { @@ -3136,7 +3136,7 @@ std::ostream& Nikon3MakerNote::printFlashGroupCData(std::ostream& os, const Valu std::ostringstream oss; oss.copyfmt(os); - double temp = value.toFloat() / double(-6.0); + double temp = value.toFloat() / (-6.0); auto pos = metadata->findKey(ExifKey("Exif.NikonFl7.FlashGroupBCControlData")); if (pos == metadata->end() || pos->count() != 1 || pos->typeId() != unsignedByte) { @@ -3172,8 +3172,8 @@ std::ostream& Nikon3MakerNote::printTimeZone(std::ostream& os, const Value& valu std::ostringstream oss; oss.copyfmt(os); char sign = value.toInt64() < 0 ? '-' : '+'; - long h = long(std::abs(static_cast(value.toFloat() / 60.0F))) % 24; - long min = long(std::abs(static_cast(value.toFloat() - h * 60))) % 60; + long h = static_cast(std::abs(static_cast(value.toFloat() / 60.0F))) % 24; + long min = static_cast(std::abs(static_cast(value.toFloat() - h * 60))) % 60; os << std::fixed << "UTC " << sign << std::setw(2) << std::setfill('0') << h << ":" << std::setw(2) << std::setfill('0') << min; os.copyfmt(oss); diff --git a/src/pngimage.cpp b/src/pngimage.cpp index 75d509e2..a2415549 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -224,7 +224,7 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in // test that we haven't hit EOF, or wanting to read excessive data long restore = io_->tell(); - if (restore == -1 || dataOffset > uint32_t(0x7FFFFFFF) || dataOffset > imgSize - restore) { + if (restore == -1 || dataOffset > static_cast(0x7FFFFFFF) || dataOffset > imgSize - restore) { throw Exiv2::Error(ErrorCode::kerFailedToReadImageData); } @@ -408,7 +408,7 @@ void PngImage::readMetadata() { // Decode chunk data length. uint32_t chunkLength = cheaderBuf.read_uint32(0, Exiv2::bigEndian); long pos = io_->tell(); - if (pos == -1 || chunkLength > uint32_t(0x7FFFFFFF) || chunkLength > imgSize - pos) { + if (pos == -1 || chunkLength > static_cast(0x7FFFFFFF) || chunkLength > imgSize - pos) { throw Exiv2::Error(ErrorCode::kerFailedToReadImageData); } diff --git a/src/preview.cpp b/src/preview.cpp index ef6f842e..c13e0c5d 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -349,7 +349,7 @@ PreviewProperties Loader::getProperties() const { } PreviewId Loader::getNumLoaders() { - return PreviewId(std::size(loaderList_)); + return static_cast(std::size(loaderList_)); } LoaderNative::LoaderNative(PreviewId id, const Image& image, int parIdx) : Loader(id, image) { @@ -753,7 +753,7 @@ DataBuf LoaderTiff::getData() const { // Fix compression value in the CR2 IFD2 image if (0 == strcmp(group_, "Image2") && image_.mimeType() == "image/x-canon-cr2") { - preview["Exif.Image.Compression"] = uint16_t(1); + preview["Exif.Image.Compression"] = static_cast(1); } // write new image diff --git a/src/safe_op.hpp b/src/safe_op.hpp index 3b924d3e..27f542af 100644 --- a/src/safe_op.hpp +++ b/src/safe_op.hpp @@ -46,7 +46,7 @@ namespace Internal { */ template struct is_signed { - enum { VALUE = T(-1) < T(0) }; + enum { VALUE = static_cast(-1) < static_cast(0) }; }; /*! diff --git a/src/tiffcomposite_int.cpp b/src/tiffcomposite_int.cpp index d5dc88c7..903391ba 100644 --- a/src/tiffcomposite_int.cpp +++ b/src/tiffcomposite_int.cpp @@ -54,7 +54,7 @@ void IoWrapper::setTarget(int id, int64_t target) { throw Error(ErrorCode::kerOffsetOutOfRange); } if (pow_) - pow_->setTarget(OffsetWriter::OffsetId(id), static_cast(target)); + pow_->setTarget(static_cast(id), static_cast(target)); } TiffComponent::TiffComponent(uint16_t tag, IfdId group) : tag_(tag), group_(group) { @@ -388,7 +388,7 @@ bool TiffBinaryArray::initialize(IfdId group) { if (arraySet_[idx].cfg_.group_ == group) { arrayCfg_ = &arraySet_[idx].cfg_; arrayDef_ = arraySet_[idx].def_; - defSize_ = int(arraySet_[idx].defSize_); + defSize_ = static_cast(arraySet_[idx].defSize_); return true; } } @@ -403,7 +403,7 @@ bool TiffBinaryArray::initialize(TiffComponent* pRoot) { if (idx > -1) { arrayCfg_ = &arraySet_[idx].cfg_; arrayDef_ = arraySet_[idx].def_; - defSize_ = int(arraySet_[idx].defSize_); + defSize_ = static_cast(arraySet_[idx].defSize_); } return idx > -1; } @@ -825,7 +825,7 @@ uint32_t TiffComponent::write(IoWrapper& ioWrapper, ByteOrder byteOrder, int64_t uint32_t TiffDirectory::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64_t offset, uint32_t valueIdx, uint32_t dataIdx, uint32_t& imageIdx) { - bool isRootDir = (imageIdx == uint32_t(-1)); + bool isRootDir = (imageIdx == static_cast(-1)); // Number of components to write const size_t compCount = count(); @@ -935,7 +935,8 @@ uint32_t TiffDirectory::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64 // 4th: Write next-IFD if (pNext_ && sizeNext) { - idx += pNext_->write(ioWrapper, byteOrder, offset + idx, uint32_t(-1), uint32_t(-1), imageIdx); + idx += pNext_->write(ioWrapper, byteOrder, offset + idx, static_cast(-1), static_cast(-1), + imageIdx); } // 5th, at the root directory level only: write image data @@ -1065,7 +1066,8 @@ uint32_t TiffMnEntry::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64_t if (!mn_) { return TiffEntryBase::doWrite(ioWrapper, byteOrder, offset, valueIdx, dataIdx, imageIdx); } - return mn_->write(ioWrapper, byteOrder, offset + valueIdx, uint32_t(-1), uint32_t(-1), imageIdx); + return mn_->write(ioWrapper, byteOrder, offset + valueIdx, static_cast(-1), static_cast(-1), + imageIdx); } // TiffMnEntry::doWrite uint32_t TiffIfdMakernote::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64_t offset, uint32_t /*valueIdx*/, @@ -1073,7 +1075,8 @@ uint32_t TiffIfdMakernote::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, in mnOffset_ = static_cast(offset); setImageByteOrder(byteOrder); auto len = static_cast(writeHeader(ioWrapper, this->byteOrder())); - len += ifd_.write(ioWrapper, this->byteOrder(), offset - baseOffset() + len, uint32_t(-1), uint32_t(-1), imageIdx); + len += ifd_.write(ioWrapper, this->byteOrder(), offset - baseOffset() + len, static_cast(-1), + static_cast(-1), imageIdx); return len; } // TiffIfdMakernote::doWrite @@ -1196,7 +1199,8 @@ uint32_t TiffSubIfd::doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, int6 uint32_t& imageIdx) const { uint32_t len = 0; for (auto&& ifd : ifds_) { - len += ifd->write(ioWrapper, byteOrder, offset + dataIdx + len, uint32_t(-1), uint32_t(-1), imageIdx); + len += ifd->write(ioWrapper, byteOrder, offset + dataIdx + len, static_cast(-1), + static_cast(-1), imageIdx); } // Align data to word boundary uint32_t align = (len & 1); @@ -1484,7 +1488,7 @@ static const TagInfo* findTagInfo(uint16_t tag, IfdId group) { // ************************************************************************* // free functions TypeId toTypeId(TiffType tiffType, uint16_t tag, IfdId group) { - auto ti = TypeId(tiffType); + auto ti = static_cast(tiffType); // On the fly type conversion for Exif.Photo.UserComment, Exif.GPSProcessingMethod, GPSAreaInformation if (const TagInfo* pTag = ti == undefined ? findTagInfo(tag, group) : nullptr) { if (pTag->typeId_ == comment) { diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index f0dcee48..1b34a324 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -1892,8 +1892,9 @@ WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size DataBuf header = pHeader->write(); auto tempIo = MemIo(); IoWrapper ioWrapper(tempIo, header.c_data(), header.size(), pOffsetWriter); - auto imageIdx(uint32_t(-1)); - createdTree->write(ioWrapper, pHeader->byteOrder(), header.size(), uint32_t(-1), uint32_t(-1), imageIdx); + auto imageIdx(static_cast(-1)); + createdTree->write(ioWrapper, pHeader->byteOrder(), header.size(), static_cast(-1), + static_cast(-1), imageIdx); if (pOffsetWriter) pOffsetWriter->writeOffsets(tempIo); io.transfer(tempIo); // may throw diff --git a/src/types.cpp b/src/types.cpp index bea58c40..8cb4b618 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -465,7 +465,7 @@ void hexdump(std::ostream& os, const byte* buf, size_t len, size_t offset) { do { byte c = buf[i]; os << std::setw(2) << std::setfill('0') << std::right << std::hex << static_cast(c) << " "; - ss << (static_cast(c) >= 31 && static_cast(c) < 127 ? char(buf[i]) : '.'); + ss << (static_cast(c) >= 31 && static_cast(c) < 127 ? static_cast(buf[i]) : '.'); } while (++i < len && i % 16 != 0); std::string::size_type width = 9 + ((i - 1) % 16 + 1) * 3; os << (width > pos ? "" : align.substr(width)) << ss.str() << "\n"; diff --git a/src/webpimage.cpp b/src/webpimage.cpp index c1806c78..dbdfde18 100644 --- a/src/webpimage.cpp +++ b/src/webpimage.cpp @@ -23,8 +23,8 @@ namespace { [[maybe_unused]] std::string binaryToHex(const uint8_t* data, size_t size) { std::stringstream hexOutput; - auto tl = size_t(size / 16) * 16; - auto tl_offset = size_t(size) - tl; + auto tl = static_cast(size / 16) * 16; + auto tl_offset = size - tl; for (size_t loop = 0; loop < size; loop++) { if (data[loop] < 16) { @@ -37,8 +37,8 @@ namespace { if ((loop % 16) == 15 || loop == (tl + tl_offset - 1)) { int max = 15; if (loop >= tl) { - max = int(tl_offset) - 1; - for (int offset = 0; offset < int(16 - tl_offset); offset++) { + max = static_cast(tl_offset) - 1; + for (int offset = 0; offset < static_cast(16 - tl_offset); offset++) { if ((offset % 8) == 7) { hexOutput << " "; } From 2e0ab1a0376620201dbd7b26c03d070e5437ca7a Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sun, 22 May 2022 19:55:01 +0100 Subject: [PATCH 12/80] More bounds checking in Adjust::adjustDateTime --- app/actions.cpp | 58 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/app/actions.cpp b/app/actions.cpp index 752d026c..a4f3fac1 100644 --- a/app/actions.cpp +++ b/app/actions.cpp @@ -6,12 +6,14 @@ #include "app_utils.hpp" #include "config.h" #include "easyaccess.hpp" +#include "enforce.hpp" #include "exif.hpp" #include "futils.hpp" #include "i18n.h" // NLS support. #include "image.hpp" #include "iptc.hpp" #include "preview.hpp" +#include "safe_op.hpp" #include "types.hpp" #include "xmp_exiv2.hpp" @@ -1407,19 +1409,47 @@ int Adjust::adjustDateTime(Exiv2::ExifData& exifData, const std::string& key, co std::cerr << path << ": " << _("Failed to parse timestamp") << " `" << timeStr << "'\n"; return 1; } - const long monOverflow = (tm.tm_mon + monthAdjustment_) / 12; - tm.tm_mon = (tm.tm_mon + monthAdjustment_) % 12; - tm.tm_year += yearAdjustment_ + monOverflow; + + // bounds checking for yearAdjustment_ + enforce(yearAdjustment_ >= std::numeric_limits::min(), + "year adjustment too low"); + enforce(yearAdjustment_ <= std::numeric_limits::max(), + "year adjustment too high"); + const auto yearAdjustment = static_cast(yearAdjustment_); + + // bounds checking for monthAdjustment_ + enforce(monthAdjustment_ >= std::numeric_limits::min(), + "month adjustment too low"); + enforce(monthAdjustment_ <= std::numeric_limits::max(), + "month adjustment too high"); + const auto monthAdjustment = static_cast(monthAdjustment_); + + // bounds checking for dayAdjustment_ + static constexpr time_t secondsInDay = 24 * 60 * 60; + enforce(dayAdjustment_ >= std::numeric_limits::min() / secondsInDay, + "day adjustment too low"); + enforce(dayAdjustment_ <= std::numeric_limits::max() / secondsInDay, + "day adjustment too high"); + const auto dayAdjustment = static_cast(dayAdjustment_); + + // bounds checking for adjustment_ + enforce(adjustment_ >= std::numeric_limits::min(), "seconds adjustment too low"); + enforce(adjustment_ <= std::numeric_limits::max(), "seconds adjustment too high"); + const auto adjustment = static_cast(adjustment_); + + const auto monOverflow = Safe::add(tm.tm_mon, monthAdjustment) / 12; + tm.tm_mon = Safe::add(tm.tm_mon, monthAdjustment) % 12; + tm.tm_year = Safe::add(tm.tm_year, Safe::add(yearAdjustment, monOverflow)); // Let's not create files with non-4-digit years, we can't read them. if (tm.tm_year > 9999 - 1900 || tm.tm_year < 1000 - 1900) { if (Params::instance().verbose_) std::cout << std::endl; - std::cerr << path << ": " << _("Can't adjust timestamp by") << " " << yearAdjustment_ + monOverflow << " " + std::cerr << path << ": " << _("Can't adjust timestamp by") << " " << yearAdjustment + monOverflow << " " << _("years") << "\n"; return 1; } time_t time = mktime(&tm); - time += adjustment_ + dayAdjustment_ * 86400; + time = Safe::add(time, Safe::add(adjustment, dayAdjustment * secondsInDay)); timeStr = time2Str(time); if (Params::instance().verbose_) { std::cout << " " << _("to") << " " << timeStr << std::endl; @@ -1590,22 +1620,28 @@ int str2Tm(const std::string& timeStr, struct tm* tm) { long tmp = 0; if (!Util::strtol(timeStr.substr(0, 4).c_str(), tmp)) return 5; - tm->tm_year = tmp - 1900; + // tmp is a 4-digit number so this cast cannot overflow + tm->tm_year = static_casttm_year)>(tmp - 1900); if (!Util::strtol(timeStr.substr(5, 2).c_str(), tmp)) return 6; - tm->tm_mon = tmp - 1; + // tmp is a 2-digit number so this cast cannot overflow + tm->tm_mon = static_casttm_mon)>(tmp - 1); if (!Util::strtol(timeStr.substr(8, 2).c_str(), tmp)) return 7; - tm->tm_mday = tmp; + // tmp is a 2-digit number so this cast cannot overflow + tm->tm_mday = static_casttm_mday)>(tmp); if (!Util::strtol(timeStr.substr(11, 2).c_str(), tmp)) return 8; - tm->tm_hour = tmp; + // tmp is a 2-digit number so this cast cannot overflow + tm->tm_hour = static_casttm_hour)>(tmp); if (!Util::strtol(timeStr.substr(14, 2).c_str(), tmp)) return 9; - tm->tm_min = tmp; + // tmp is a 2-digit number so this cast cannot overflow + tm->tm_min = static_casttm_min)>(tmp); if (!Util::strtol(timeStr.substr(17, 2).c_str(), tmp)) return 10; - tm->tm_sec = tmp; + // tmp is a 2-digit number so this cast cannot overflow + tm->tm_sec = static_casttm_sec)>(tmp); // Conversions to set remaining fields of the tm structure if (mktime(tm) == static_cast(-1)) From 1ceddb296245f77a5674c7cce81faaa17ad626b5 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sun, 22 May 2022 19:59:11 +0100 Subject: [PATCH 13/80] Replace long with int64_t in exiv2app.hpp --- app/actions.cpp | 50 +++++----- app/actions.hpp | 8 +- app/app_utils.cpp | 15 ++- app/app_utils.hpp | 6 +- app/exiv2.cpp | 126 ++++++++++++-------------- app/exiv2app.hpp | 60 ++++++++---- tests/bugfixes/github/test_pr_2244.py | 36 ++++++++ 7 files changed, 183 insertions(+), 118 deletions(-) create mode 100644 tests/bugfixes/github/test_pr_2244.py diff --git a/app/actions.cpp b/app/actions.cpp index a4f3fac1..1f5502dd 100644 --- a/app/actions.cpp +++ b/app/actions.cpp @@ -179,7 +179,7 @@ int setModeAndPrintStructure(Exiv2::PrintStructureOption option, const std::stri ascii.write_uint8(str.size() * 3, 0); std::copy(str.begin(), str.end(), iccProfile.begin()); if (Exiv2::base64encode(iccProfile.c_data(), str.size(), reinterpret_cast(ascii.data()), str.size() * 3)) { - long chunk = 60; + const size_t chunk = 60; std::string code = std::string("data:") + ascii.c_str(); size_t length = code.size(); for (size_t start = 0; start < length; start += chunk) { @@ -364,8 +364,8 @@ int Print::printList() { auto image = Exiv2::ImageFactory::open(path_); image->readMetadata(); // Set defaults for metadata types and data columns - if (Params::instance().printTags_ == Exiv2::mdNone) { - Params::instance().printTags_ = Exiv2::mdExif | Exiv2::mdIptc | Exiv2::mdXmp; + if (Params::instance().printTags_ == MetadataId::invalid) { + Params::instance().printTags_ = MetadataId::exif | MetadataId::iptc | MetadataId::xmp; } if (Params::instance().printItems_ == 0) { Params::instance().printItems_ = Params::prKey | Params::prType | Params::prCount | Params::prTrans; @@ -376,7 +376,7 @@ int Print::printList() { int Print::printMetadata(const Exiv2::Image* image) { bool ret = false; bool noExif = false; - if (Params::instance().printTags_ & Exiv2::mdExif) { + if ((Params::instance().printTags_ & MetadataId::exif) == MetadataId::exif) { const Exiv2::ExifData& exifData = image->exifData(); for (auto&& md : exifData) { ret |= printMetadatum(md, image); @@ -386,7 +386,7 @@ int Print::printMetadata(const Exiv2::Image* image) { } bool noIptc = false; - if (Params::instance().printTags_ & Exiv2::mdIptc) { + if ((Params::instance().printTags_ & MetadataId::iptc) == MetadataId::iptc) { const Exiv2::IptcData& iptcData = image->iptcData(); for (auto&& md : iptcData) { ret |= printMetadatum(md, image); @@ -396,7 +396,7 @@ int Print::printMetadata(const Exiv2::Image* image) { } bool noXmp = false; - if (Params::instance().printTags_ & Exiv2::mdXmp) { + if ((Params::instance().printTags_ & MetadataId::xmp) == MetadataId::xmp) { const Exiv2::XmpData& xmpData = image->xmpData(); for (auto&& md : xmpData) { ret |= printMetadatum(md, image); @@ -1148,23 +1148,23 @@ int Modify::applyCommands(Exiv2::Image* pImage) { int ret = 0; for (auto&& cmd : modifyCmds) { switch (cmd.cmdId_) { - case add: + case CmdId::add: ret = addMetadatum(pImage, cmd); if (rc == 0) rc = ret; break; - case set: + case CmdId::set: ret = setMetadatum(pImage, cmd); if (rc == 0) rc = ret; break; - case del: + case CmdId::del: delMetadatum(pImage, cmd); break; - case reg: + case CmdId::reg: regNamespace(cmd); break; - case invalidCmdId: + case CmdId::invalid: break; } } @@ -1184,13 +1184,13 @@ int Modify::addMetadatum(Exiv2::Image* pImage, const ModifyCmd& modifyCmd) { auto value = Exiv2::Value::create(modifyCmd.typeId_); int rc = value->read(modifyCmd.value_); if (0 == rc) { - if (modifyCmd.metadataId_ == exif) { + if (modifyCmd.metadataId_ == MetadataId::exif) { exifData.add(Exiv2::ExifKey(modifyCmd.key_), value.get()); } - if (modifyCmd.metadataId_ == iptc) { + if (modifyCmd.metadataId_ == MetadataId::iptc) { iptcData.add(Exiv2::IptcKey(modifyCmd.key_), value.get()); } - if (modifyCmd.metadataId_ == xmp) { + if (modifyCmd.metadataId_ == MetadataId::xmp) { xmpData.add(Exiv2::XmpKey(modifyCmd.key_), value.get()); } } else { @@ -1213,19 +1213,19 @@ int Modify::setMetadatum(Exiv2::Image* pImage, const ModifyCmd& modifyCmd) { Exiv2::IptcData& iptcData = pImage->iptcData(); Exiv2::XmpData& xmpData = pImage->xmpData(); Exiv2::Metadatum* metadatum = nullptr; - if (modifyCmd.metadataId_ == exif) { + if (modifyCmd.metadataId_ == MetadataId::exif) { auto pos = exifData.findKey(Exiv2::ExifKey(modifyCmd.key_)); if (pos != exifData.end()) { metadatum = &(*pos); } } - if (modifyCmd.metadataId_ == iptc) { + if (modifyCmd.metadataId_ == MetadataId::iptc) { auto pos = iptcData.findKey(Exiv2::IptcKey(modifyCmd.key_)); if (pos != iptcData.end()) { metadatum = &(*pos); } } - if (modifyCmd.metadataId_ == xmp) { + if (modifyCmd.metadataId_ == MetadataId::xmp) { auto pos = xmpData.findKey(Exiv2::XmpKey(modifyCmd.key_)); if (pos != xmpData.end()) { metadatum = &(*pos); @@ -1246,13 +1246,13 @@ int Modify::setMetadatum(Exiv2::Image* pImage, const ModifyCmd& modifyCmd) { if (metadatum) { metadatum->setValue(value.get()); } else { - if (modifyCmd.metadataId_ == exif) { + if (modifyCmd.metadataId_ == MetadataId::exif) { exifData.add(Exiv2::ExifKey(modifyCmd.key_), value.get()); } - if (modifyCmd.metadataId_ == iptc) { + if (modifyCmd.metadataId_ == MetadataId::iptc) { iptcData.add(Exiv2::IptcKey(modifyCmd.key_), value.get()); } - if (modifyCmd.metadataId_ == xmp) { + if (modifyCmd.metadataId_ == MetadataId::xmp) { xmpData.add(Exiv2::XmpKey(modifyCmd.key_), value.get()); } } @@ -1273,21 +1273,21 @@ void Modify::delMetadatum(Exiv2::Image* pImage, const ModifyCmd& modifyCmd) { Exiv2::ExifData& exifData = pImage->exifData(); Exiv2::IptcData& iptcData = pImage->iptcData(); Exiv2::XmpData& xmpData = pImage->xmpData(); - if (modifyCmd.metadataId_ == exif) { + if (modifyCmd.metadataId_ == MetadataId::exif) { Exiv2::ExifData::iterator pos; const Exiv2::ExifKey exifKey(modifyCmd.key_); while ((pos = exifData.findKey(exifKey)) != exifData.end()) { exifData.erase(pos); } } - if (modifyCmd.metadataId_ == iptc) { + if (modifyCmd.metadataId_ == MetadataId::iptc) { Exiv2::IptcData::iterator pos; const Exiv2::IptcKey iptcKey(modifyCmd.key_); while ((pos = iptcData.findKey(iptcKey)) != iptcData.end()) { iptcData.erase(pos); } } - if (modifyCmd.metadataId_ == xmp) { + if (modifyCmd.metadataId_ == MetadataId::xmp) { Exiv2::XmpData::iterator pos; const Exiv2::XmpKey xmpKey(modifyCmd.key_); if ((pos = xmpData.findKey(xmpKey)) != xmpData.end()) { @@ -1617,7 +1617,7 @@ int str2Tm(const std::string& timeStr, struct tm* tm) { std::memset(tm, 0x0, sizeof(struct tm)); tm->tm_isdst = -1; - long tmp = 0; + int64_t tmp = 0; if (!Util::strtol(timeStr.substr(0, 4).c_str(), tmp)) return 5; // tmp is a 4-digit number so this cast cannot overflow @@ -1759,7 +1759,7 @@ int metacopy(const std::string& source, const std::string& tgt, Exiv2::ImageType } // #1148 use Raw XMP packet if there are no XMP modification commands - int tRawSidecar = Params::ctXmpSidecar | Params::ctXmpRaw; // option -eXX + Params::CommonTarget tRawSidecar = Params::ctXmpSidecar | Params::ctXmpRaw; // option -eXX if (Params::instance().modifyCmds_.empty() && (Params::instance().target_ & tRawSidecar) == tRawSidecar) { // std::cout << "short cut" << std::endl; // http://www.cplusplus.com/doc/tutorial/files/ diff --git a/app/actions.hpp b/app/actions.hpp index 62a1c557..1da379ae 100644 --- a/app/actions.hpp +++ b/app/actions.hpp @@ -187,10 +187,10 @@ class Adjust : public Task { private: int adjustDateTime(Exiv2::ExifData& exifData, const std::string& key, const std::string& path) const; - long adjustment_{0}; - long yearAdjustment_{0}; - long monthAdjustment_{0}; - long dayAdjustment_{0}; + int64_t adjustment_{0}; + int64_t yearAdjustment_{0}; + int64_t monthAdjustment_{0}; + int64_t dayAdjustment_{0}; }; // class Adjust diff --git a/app/app_utils.cpp b/app/app_utils.cpp index cc28ece2..d36694b2 100644 --- a/app/app_utils.cpp +++ b/app/app_utils.cpp @@ -1,19 +1,26 @@ // SPDX-License-Identifier: GPL-2.0-or-later +#include "app_utils.hpp" #include #include +#include namespace Util { -bool strtol(const char* nptr, long& n) { +bool strtol(const char* nptr, int64_t& n) { if (!nptr || *nptr == '\0') return false; char* endptr = nullptr; - long tmp = std::strtol(nptr, &endptr, 10); + long long tmp = std::strtoll(nptr, &endptr, 10); if (*endptr != '\0') return false; - if (tmp == LONG_MAX || tmp == LONG_MIN) + // strtoll returns LLONG_MAX or LLONG_MIN if an overflow occurs. + if (tmp == LLONG_MAX || tmp == LLONG_MIN) return false; - n = tmp; + if (tmp < std::numeric_limits::min()) + return false; + if (tmp > std::numeric_limits::max()) + return false; + n = static_cast(tmp); return true; } diff --git a/app/app_utils.hpp b/app/app_utils.hpp index 90a6a792..731a71af 100644 --- a/app/app_utils.hpp +++ b/app/app_utils.hpp @@ -3,13 +3,15 @@ #ifndef APP_UTILS_HPP_ #define APP_UTILS_HPP_ +#include + namespace Util { /*! - @brief Convert a C string to a long value, which is returned in n. + @brief Convert a C string to an int64_t value, which is returned in n. Returns true if the conversion is successful, else false. n is not modified if the conversion is unsuccessful. See strtol(2). */ -bool strtol(const char* nptr, long& n); +bool strtol(const char* nptr, int64_t& n); } // namespace Util #endif // #ifndef UTILS_HPP_ diff --git a/app/exiv2.cpp b/app/exiv2.cpp index d30cfcb5..73071fdd 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -42,7 +42,11 @@ const Params::YodAdjust emptyYodAdjust_[] = { //! List of all command identifiers and corresponding strings const CmdIdAndString cmdIdAndString[] = { - {add, "add"}, {set, "set"}, {del, "del"}, {reg, "reg"}, {invalidCmdId, "invalidCmd"}, // End of list marker + {CmdId::add, "add"}, + {CmdId::set, "set"}, + {CmdId::del, "del"}, + {CmdId::reg, "reg"}, + {CmdId::invalid, "invalidCmd"}, // End of list marker }; // Return a command Id for a command string @@ -50,7 +54,7 @@ CmdId commandId(const std::string& cmdString); // Evaluate [-]HH[:MM[:SS]], returns true and sets time to the value // in seconds if successful, else returns false. -bool parseTime(const std::string& ts, long& time); +bool parseTime(const std::string& ts, int64_t& time); /*! @brief Parse the oparg string into a bitmap of common targets. @@ -58,7 +62,7 @@ bool parseTime(const std::string& ts, long& time); @param action Action being processed @return A bitmap of common targets or -1 in case of a parse error */ -int parseCommonTargets(const std::string& optArg, const std::string& action); +int64_t parseCommonTargets(const std::string& optArg, const std::string& action); /*! @brief Parse numbers separated by commas into container @@ -672,13 +676,13 @@ int Params::evalPrintFlags(const std::string& optArg) { for (auto&& i : optArg) { switch (i) { case 'E': - printTags_ |= Exiv2::mdExif; + printTags_ |= MetadataId::exif; break; case 'I': - printTags_ |= Exiv2::mdIptc; + printTags_ |= MetadataId::iptc; break; case 'X': - printTags_ |= Exiv2::mdXmp; + printTags_ |= MetadataId::xmp; break; case 'x': printItems_ |= prTag; @@ -735,81 +739,71 @@ int Params::evalPrintFlags(const std::string& optArg) { } // Params::evalPrintFlags int Params::evalDelete(const std::string& optArg) { - int rc = 0; switch (action_) { case Action::none: action_ = Action::erase; - target_ = 0; + target_ = CommonTarget(0); // fallthrough - case Action::erase: - rc = parseCommonTargets(optArg, "erase"); + case Action::erase: { + const auto rc = parseCommonTargets(optArg, "erase"); if (rc > 0) { - target_ |= rc; - rc = 0; + target_ |= CommonTarget(rc); + return 0; } else { - rc = 1; + return 1; } - break; + } default: std::cerr << progname() << ": " << _("Option -d is not compatible with a previous option\n"); - rc = 1; - break; + return 1; } - return rc; } // Params::evalDelete int Params::evalExtract(const std::string& optArg) { - int rc = 0; switch (action_) { case Action::none: case Action::modify: action_ = Action::extract; - target_ = 0; + target_ = CommonTarget(0); // fallthrough - case Action::extract: - rc = parseCommonTargets(optArg, "extract"); + case Action::extract: { + const auto rc = parseCommonTargets(optArg, "extract"); if (rc > 0) { - target_ |= rc; - rc = 0; + target_ |= CommonTarget(rc); + return 0; } else { - rc = 1; + return 1; } - break; + } default: std::cerr << progname() << ": " << _("Option -e is not compatible with a previous option\n"); - rc = 1; - break; + return 1; } - return rc; } // Params::evalExtract int Params::evalInsert(const std::string& optArg) { - int rc = 0; switch (action_) { case Action::none: case Action::modify: action_ = Action::insert; - target_ = 0; + target_ = CommonTarget(0); // fallthrough - case Action::insert: - rc = parseCommonTargets(optArg, "insert"); + case Action::insert: { + const auto rc = parseCommonTargets(optArg, "insert"); if (rc > 0) { - target_ |= rc; - rc = 0; + target_ |= CommonTarget(rc); + return 0; } else { - rc = 1; + return 1; } - break; + } default: std::cerr << progname() << ": " << _("Option -i is not compatible with a previous option\n"); - rc = 1; - break; + return 1; } - return rc; } // Params::evalInsert int Params::evalModify(int opt, const std::string& optArg) { - int rc = 0; switch (action_) { case Action::none: action_ = Action::modify; @@ -823,14 +817,12 @@ int Params::evalModify(int opt, const std::string& optArg) { cmdFiles_.push_back(optArg); // parse the files later if (opt == 'M') cmdLines_.push_back(optArg); // parse the commands later - break; + return 0; default: std::cerr << progname() << ": " << _("Option") << " -" << static_cast(opt) << " " << _("is not compatible with a previous option\n"); - rc = 1; - break; + return 1; } - return rc; } // Params::evalModify int Params::nonoption(const std::string& argv) { @@ -1090,7 +1082,7 @@ cleanup: // ***************************************************************************** // local implementations namespace { -bool parseTime(const std::string& ts, long& time) { +bool parseTime(const std::string& ts, int64_t& time) { std::string hstr, mstr, sstr; auto cts = new char[ts.length() + 1]; strcpy(cts, ts.c_str()); @@ -1106,7 +1098,7 @@ bool parseTime(const std::string& ts, long& time) { delete[] cts; int sign = 1; - long hh(0), mm(0), ss(0); + int64_t hh(0), mm(0), ss(0); // [-]HH part if (!Util::strtol(hstr.c_str(), hh)) return false; @@ -1145,11 +1137,11 @@ void printUnrecognizedArgument(const char argc, const std::string& action) { << argc << "'\n"; } -int parseCommonTargets(const std::string& optArg, const std::string& action) { - int rc = 0; - int target = 0; - int all = Params::ctExif | Params::ctIptc | Params::ctComment | Params::ctXmp; - int extra = Params::ctXmpSidecar | Params::ctExif | Params::ctIptc | Params::ctXmp; +int64_t parseCommonTargets(const std::string& optArg, const std::string& action) { + int64_t rc = 0; + Params::CommonTarget target = Params::CommonTarget(0); + Params::CommonTarget all = Params::ctExif | Params::ctIptc | Params::ctComment | Params::ctXmp; + Params::CommonTarget extra = Params::ctXmpSidecar | Params::ctExif | Params::ctIptc | Params::ctXmp; for (size_t i = 0; rc == 0 && i < optArg.size(); ++i) { switch (optArg[i]) { case 'e': @@ -1183,7 +1175,7 @@ int parseCommonTargets(const std::string& optArg, const std::string& action) { target |= extra; // -eX if (i > 0) { // -eXX or -iXX target |= Params::ctXmpRaw; - target &= ~extra; // turn off those bits + target = Params::CommonTarget(target & ~extra); // turn off those bits } break; @@ -1204,7 +1196,7 @@ int parseCommonTargets(const std::string& optArg, const std::string& action) { break; } } - return rc ? rc : target; + return rc ? rc : int64_t(target); } int parsePreviewNumbers(Params::PreviewNumbers& previewNumbers, const std::string& optArg, int j) { @@ -1334,38 +1326,38 @@ bool parseLine(ModifyCmd& modifyCmd, const std::string& line, int num) { std::string cmd(line.substr(cmdStart, cmdEnd - cmdStart)); CmdId cmdId = commandId(cmd); - if (cmdId == invalidCmdId) { + if (cmdId == CmdId::invalid) { throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, Exiv2::toString(num) + ": " + _("Invalid command") + " `" + cmd + "'"); } Exiv2::TypeId defaultType = Exiv2::invalidTypeId; std::string key(line.substr(keyStart, keyEnd - keyStart)); - MetadataId metadataId = invalidMetadataId; - if (cmdId != reg) { + MetadataId metadataId = MetadataId::invalid; + if (cmdId != CmdId::reg) { try { Exiv2::IptcKey iptcKey(key); - metadataId = iptc; + metadataId = MetadataId::iptc; defaultType = Exiv2::IptcDataSets::dataSetType(iptcKey.tag(), iptcKey.record()); } catch (const Exiv2::Error&) { } - if (metadataId == invalidMetadataId) { + if (metadataId == MetadataId::invalid) { try { Exiv2::ExifKey exifKey(key); - metadataId = exif; + metadataId = MetadataId::exif; defaultType = exifKey.defaultTypeId(); } catch (const Exiv2::Error&) { } } - if (metadataId == invalidMetadataId) { + if (metadataId == MetadataId::invalid) { try { Exiv2::XmpKey xmpKey(key); - metadataId = xmp; + metadataId = MetadataId::xmp; defaultType = Exiv2::XmpProperties::propertyType(xmpKey); } catch (const Exiv2::Error&) { } } - if (metadataId == invalidMetadataId) { + if (metadataId == MetadataId::invalid) { throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, Exiv2::toString(num) + ": " + _("Invalid key") + " `" + key + "'"); } @@ -1373,7 +1365,7 @@ bool parseLine(ModifyCmd& modifyCmd, const std::string& line, int num) { std::string value; Exiv2::TypeId type = defaultType; bool explicitType = false; - if (cmdId != del) { + if (cmdId != CmdId::del) { // Get type and value std::string::size_type typeStart = std::string::npos; if (keyEnd != std::string::npos) @@ -1386,12 +1378,12 @@ bool parseLine(ModifyCmd& modifyCmd, const std::string& line, int num) { if (valStart != std::string::npos) valEnd = line.find_last_not_of(delim); - if (cmdId == reg && (keyEnd == std::string::npos || valStart == std::string::npos)) { + if (cmdId == CmdId::reg && (keyEnd == std::string::npos || valStart == std::string::npos)) { throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, Exiv2::toString(num) + ": " + _("Invalid command line") + " "); } - if (cmdId != reg && typeStart != std::string::npos && typeEnd != std::string::npos) { + if (cmdId != CmdId::reg && typeStart != std::string::npos && typeEnd != std::string::npos) { std::string typeStr(line.substr(typeStart, typeEnd - typeStart)); Exiv2::TypeId tmpType = Exiv2::TypeInfo::typeId(typeStr); if (tmpType != Exiv2::invalidTypeId) { @@ -1421,7 +1413,7 @@ bool parseLine(ModifyCmd& modifyCmd, const std::string& line, int num) { modifyCmd.explicitType_ = explicitType; modifyCmd.value_ = value; - if (cmdId == reg) { + if (cmdId == CmdId::reg) { if (value.empty()) { throw Exiv2::Error(Exiv2::ErrorCode::kerErrorMessage, Exiv2::toString(num) + ": " + _("Empty value for key") + +" `" + key + "'"); @@ -1437,7 +1429,7 @@ bool parseLine(ModifyCmd& modifyCmd, const std::string& line, int num) { CmdId commandId(const std::string& cmdString) { int i = 0; - while (cmdIdAndString[i].first != invalidCmdId && cmdIdAndString[i].second != cmdString) { + while (cmdIdAndString[i].first != CmdId::invalid && cmdIdAndString[i].second != cmdString) { ++i; } return cmdIdAndString[i].first; diff --git a/app/exiv2app.hpp b/app/exiv2app.hpp index c12fce61..e6f9e8b1 100644 --- a/app/exiv2app.hpp +++ b/app/exiv2app.hpp @@ -21,28 +21,40 @@ #include //! Command identifiers -enum CmdId { - invalidCmdId, +enum class CmdId { + invalid, add, set, del, reg, }; //! Metadata identifiers -enum MetadataId { - invalidMetadataId = Exiv2::mdNone, // 0 - exif = Exiv2::mdExif, // 1 - iptc = Exiv2::mdIptc, // 2 - xmp = Exiv2::mdXmp, // 8 +enum class MetadataId : uint32_t { + invalid = Exiv2::mdNone, // 0 + exif = Exiv2::mdExif, // 1 + iptc = Exiv2::mdIptc, // 2 + xmp = Exiv2::mdXmp, // 8 }; +inline MetadataId operator&(MetadataId x, MetadataId y) { + return (MetadataId)(uint32_t(x) & uint32_t(y)); +} + +inline MetadataId operator|(MetadataId x, MetadataId y) { + return (MetadataId)(uint32_t(x) | uint32_t(y)); +} + +inline MetadataId& operator|=(MetadataId& x, MetadataId y) { + return x = x | y; +} + //! Structure for one parsed modification command struct ModifyCmd { //! C'tor ModifyCmd() = default; - CmdId cmdId_{invalidCmdId}; //!< Command identifier + CmdId cmdId_{CmdId::invalid}; //!< Command identifier std::string key_; //!< Exiv2 key string - MetadataId metadataId_{invalidMetadataId}; //!< Metadata identifier + MetadataId metadataId_{MetadataId::invalid}; //!< Metadata identifier Exiv2::TypeId typeId_{Exiv2::invalidTypeId}; //!< Exiv2 type identifier //! Flag to indicate if the type was explicitly specified (true) bool explicitType_{false}; @@ -125,7 +137,7 @@ class Params : public Util::Getopt { }; //! Individual items to print, bitmap - enum PrintItem { + enum PrintItem : uint32_t { prTag = 1, prGroup = 2, prKey = 4, @@ -141,7 +153,7 @@ class Params : public Util::Getopt { }; //! Enumerates common targets, bitmap - enum CommonTarget { + enum CommonTarget : uint32_t { ctExif = 1, ctIptc = 2, ctComment = 4, @@ -173,7 +185,7 @@ class Params : public Util::Getopt { struct YodAdjust { bool flag_; //!< Adjustment flag. const char* option_; //!< Adjustment option string. - long adjustment_; //!< Adjustment value. + int64_t adjustment_; //!< Adjustment value. }; bool help_{false}; //!< Help option flag. @@ -188,13 +200,13 @@ class Params : public Util::Getopt { FileExistsPolicy fileExistsPolicy_{askPolicy}; //!< What to do if file to rename exists. bool adjust_{false}; //!< Adjustment flag. PrintMode printMode_{pmSummary}; //!< Print mode. - unsigned long printItems_{0}; //!< Print items. - unsigned long printTags_{Exiv2::mdNone}; //!< Print tags (bitmap of MetadataId flags). + PrintItem printItems_{0}; //!< Print items. + MetadataId printTags_{Exiv2::mdNone}; //!< Print tags (bitmap of MetadataId flags). //! %Action (integer rather than TaskType to avoid dependency). int action_{0}; - int target_; //!< What common target to process. + CommonTarget target_; //!< What common target to process. - long adjustment_{0}; //!< Adjustment in seconds. + int64_t adjustment_{0}; //!< Adjustment in seconds. YodAdjust yodAdjust_[3]; //!< Year, month and day adjustment info. std::string format_; //!< Filename format (-r option arg). bool formatSet_{false}; //!< Whether the format is set with -r @@ -270,4 +282,20 @@ class Params : public Util::Getopt { }; // class Params +inline Params::CommonTarget operator|(Params::CommonTarget x, Params::CommonTarget y) { + return (Params::CommonTarget)(uint32_t(x) | uint32_t(y)); +} + +inline Params::CommonTarget& operator|=(Params::CommonTarget& x, Params::CommonTarget y) { + return x = x | y; +} + +inline Params::PrintItem operator|(Params::PrintItem x, Params::PrintItem y) { + return (Params::PrintItem)(uint32_t(x) | uint32_t(y)); +} + +inline Params::PrintItem& operator|=(Params::PrintItem& x, Params::PrintItem y) { + return x = x | y; +} + #endif // #ifndef EXIV2APP_HPP_ diff --git a/tests/bugfixes/github/test_pr_2244.py b/tests/bugfixes/github/test_pr_2244.py new file mode 100644 index 00000000..07f34c55 --- /dev/null +++ b/tests/bugfixes/github/test_pr_2244.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, CopyTmpFiles, path +@CopyTmpFiles("$data_path/test_issue_1180.exv") + +class test_pr_2244(metaclass=CaseMeta): + + filename = path("$tmp_path/test_issue_1180.exv") + commands = [ "$exiv2 -Y 10000000000 $filename", + "$exiv2 -Y -10000000000 $filename", + "$exiv2 -O 10000000000 $filename", + "$exiv2 -O -10000000000 $filename", + "$exiv2 -D 1000000000000000 $filename", + "$exiv2 -D -1000000000000000 $filename" + ] + stdout = [ "", + "", + "", + "", + "", + "" + ] + stderr = [ "Uncaught exception: year adjustment too high\n", + "Uncaught exception: year adjustment too low\n", + "Uncaught exception: month adjustment too high\n", + "Uncaught exception: month adjustment too low\n", + "Uncaught exception: day adjustment too high\n", + "Uncaught exception: day adjustment too low\n" + ] + retval = [ 1, + 1, + 1, + 1, + 1, + 1 + ] From 16d72c9945b732ada4796809dbe82d0254af1f47 Mon Sep 17 00:00:00 2001 From: Christoph Hasse Date: Fri, 10 Jun 2022 16:42:17 +0200 Subject: [PATCH 14/80] fix naming of canon EF 35-80mm.closes #2247 --- src/canonmn_int.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canonmn_int.cpp b/src/canonmn_int.cpp index 0f6cc203..c67ac888 100644 --- a/src/canonmn_int.cpp +++ b/src/canonmn_int.cpp @@ -1474,9 +1474,9 @@ constexpr TagDetails canonCsLensType[] = {{1, "Canon EF 50mm f/1.8"}, {33, "Carl Zeiss Makro-Planar T* 50mm f/2 ZE"}, // 11 {33, "Carl Zeiss Makro-Planar T* 100mm f/2 ZE"}, // 12 {33, "Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE"}, // 13 - {35, "Canon EF 35-80mm f/4-5.6"}, + {35, "Canon EF 35-80mm f/4-5.6 II"}, {36, "Canon EF 38-76mm f/4.5-5.6"}, - {37, "Canon EF 35-80mm f/4-5.6"}, + {37, "Canon EF 35-80mm f/4-5.6 III"}, {37, "Tamron 70-200mm f/2.8 Di LD IF Macro"}, // 1 {37, "Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro"}, // 2 {37, "Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]"}, // 3 From 333c4365ed7814dc1fcb6f53c19a8915ad4a1bd7 Mon Sep 17 00:00:00 2001 From: Christoph Hasse Date: Fri, 10 Jun 2022 16:58:30 +0200 Subject: [PATCH 15/80] add files from #2247 to regression test suite --- test/data/20220610_MG_7237.exv | Bin 0 -> 37253 bytes test/data/20220610_MG_7238.exv | Bin 0 -> 37571 bytes test/data/20220610_MG_7239.exv | Bin 0 -> 36843 bytes test/data/20220610_MG_7240.exv | Bin 0 -> 36257 bytes test/data/20220610_MG_7241.exv | Bin 0 -> 37033 bytes .../20220610_MG_7237.exv.out | 213 ++++++++++++++++++ .../20220610_MG_7238.exv.out | 213 ++++++++++++++++++ .../20220610_MG_7239.exv.out | 213 ++++++++++++++++++ .../20220610_MG_7240.exv.out | 213 ++++++++++++++++++ .../20220610_MG_7241.exv.out | 213 ++++++++++++++++++ 10 files changed, 1065 insertions(+) create mode 100644 test/data/20220610_MG_7237.exv create mode 100644 test/data/20220610_MG_7238.exv create mode 100644 test/data/20220610_MG_7239.exv create mode 100644 test/data/20220610_MG_7240.exv create mode 100644 test/data/20220610_MG_7241.exv create mode 100644 test/data/test_reference_files/20220610_MG_7237.exv.out create mode 100644 test/data/test_reference_files/20220610_MG_7238.exv.out create mode 100644 test/data/test_reference_files/20220610_MG_7239.exv.out create mode 100644 test/data/test_reference_files/20220610_MG_7240.exv.out create mode 100644 test/data/test_reference_files/20220610_MG_7241.exv.out diff --git a/test/data/20220610_MG_7237.exv b/test/data/20220610_MG_7237.exv new file mode 100644 index 0000000000000000000000000000000000000000..eeda50a947246a8f900bb7c575529d7720998ed2 GIT binary patch literal 37253 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 jtWMRbnn_Lyq@FD`j+ZF&<7-TK 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 DjZztA literal 0 HcmV?d00001 diff --git a/test/data/20220610_MG_7238.exv b/test/data/20220610_MG_7238.exv new file mode 100644 index 0000000000000000000000000000000000000000..f468304703cf34b07e384d38f42cc2c3e6a662ea GIT binary patch literal 37571 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%0A$pv3AZgZm#aqtI5Ge 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 literal 0 HcmV?d00001 diff --git a/test/data/20220610_MG_7240.exv b/test/data/20220610_MG_7240.exv new file mode 100644 index 0000000000000000000000000000000000000000..c129c93639dd92b38b4b2ed42b689f7a9cbb584f GIT binary patch literal 36257 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®WA{JMDc!Y4*`C%Px6QO*_m>z|s)p7e70vL3Cjq7ni{`}f-<4nb z)A|rz%FWHaH&v*wr`y%@$*7*I_<7My%gDpBfjJq0B%^Fe;V-VZ&YvyHOHPZ5m+TSl zW*(bz#d65j)^uc@{v<-@u9c*9?_dOB!-KA{T)~@+gQyo?qYO{3B}6QIJXP5ENbTs& z@raIr)~TUvySba@qOyi%V%A&?A6;6aI(AQfYo%*565?i@6PLZ(5^Gh7~1L=XxhzD^v8+w)SV<{#NdCtFu+#(Jw}tP9}KpSoM8tFV7aLRz>-z z2V@pzG1hq}M5VkG5v@0$wBRlq8vgnGHbbE#wkqO5AZTcL9Xv2*YxsXJ$Nxk!yW zrG`$ZPy0vp&rE5h^N;nA&VIOlFTKvgb8n<66}DC9?QW$;OXs#a=Z9&JIT~x6n8+rZ z@|J2%8O2$`k!#P zzT58}-&WPpclIb%Iy{?IMYT)W$LziVmb<^Ug~0FQr+csC9Oo~K$AY^}#W5U;M17RQ z((K6{Qx#td9(-JF5*joXt2B|Cqne_dt?o4pu95Kw^xb3lSyTR&8->M`Gh_Y?_f_fT z?rAj#0>`UXJ?O`uPArTh$ahgcul2}IG{8&Nxzpq;_8rFV_worxO?!?8wC1Yob3%wP1COJ zIh7Rm`@Smnb*S1EGkuJUX&fljY`lCY?8Hu|ox9u`G&-NgQ!oq?EV>*~iAs*;rR7Ue zAj|%$8q?OB1Xg(~`YQbB93*g{OX=vW>wbrM1*-DxtzOd9oi`b|_=6$h=yWM9?7>-Mk}J^SFc zGvsVxSYJ1}YtftULt&MN!|pS)aauGUQ>$v?7)=@zpV_1BXy*{iIJ_j6bh_Sw^_0f7 z=blT-MU5snaKV4npP2rEG*6zHMu)r1wVeaoK1@IE&lTlmI6pMEJL;CBgZ*8V<9wt1 z6nYa<9Nx`TCQf!!EZcm$SQwTWmSiVob_ACx*=H(5`X1=T_RQ$EEjJd?2?uQ_jK4zt zIBu^ZG5fn@zUCBxqY5pHktYWC9SEQHQ&*T(*1o1dEx&)61RF4*9l|{PGek%{YNt~F ziu~f&L#;zOI~!ZQckD`a)L2O&GvquKEbHS(HWlv1HZ1TlY&dXO>2f#gf~7fe`Gq5w zGIhMGMGvF|>4of0a_8S!%*1yx`0+>u7Y;bk{#2m)Vs=$$pt@-_BbCEK~AcJ$r$uo}a6u6Aw$(b+@^W=t$U zJ6(QoRS2Yf9ce$s+@lwoaV5?9_S+{Ui!??Fw9c_-V=DM;0^27(5H^3V;mDhff66mN z5cmG8DDgd>lJEQ-_er$J4&LuLZfl`Yb1as>bLg9u5&@kNf3Q>YP80;cTS3_mR|=_-xGM5bpaR zsr5F|&Y{tgSEo3MBWWp5M#oIXn8x}QyS=mRrTZ=+8q#h`TB{^=rsSLD>Rx}b8PgPO zO6p?P$^4Pf`DIL=9{~Q}klmgyKbtVJu9HS4`FZ2+ zjjuQ}$olAR4994%2C0sp{_HMh^qH!UYL)CU{bS#r-a^-x5s%O95h#2=6<$8|_LZ3} zTlA#}NwF!@+sBo5*QYyT{13M&@8lN&fhrgCW%Ba$d|rn+v}-ZyU)!boB%RRXY4;wH z6u#n5q(9`mhN6bf>Dcl=R?qw#!?9nPSvP9oOyhw)eyABkF3%xjKAvXUr(sc#sLG9_ zRge7@1E`6evZY#S6J zTpF@;3HzST(w*U=5SrLNE%};+;9GLE%fg3K*8PvF0wz4Otn4~fj(odMKwXIgPh|85 ziwIuJq5~%LzoX!xhfdlZhvQ^16+4G)THAB*>&8l@5*1Kb|PD^va z(x;z(&^aQ4GMGJVVjoxK@t9u5F}oS6XqlaM5xiBSa#DF=?O#ZKid5}(2~cF_ebBJW zlD7qYA*PA`^6~Byjg=3h8y>N`tnj^ms`%PMXO09Fbbi02rf@xJ{%v0l&o8!;`}c9K z45YJOACyQQd2e)!q<)ISPeft%7!~lA#oiuxVcqcTYK+T{2#&x5JFi(EEsvGF$xgt1 zBiLEwWaZ~#DM07XKSx|EPgBuW#LL{i{W{6b)B9r*o!H-B82?n}#n_`0{s7D_A+wkh-dW5&Zr_uYN}DY3T=c90&@0 z*KUy4O}9_uRhhks@RFMJxJlRtqi@60pT$0TODwT_s%UBvb<`fi2Ax|>*4bHb?;Niz zO{&BP_r`||vjOU7L{e(*xlymyd8vl>m$Z2k+U6<^7}}BF)~MG~Q9nYr)6#agx;F*G zwYf;oyv}2n!|Ys$PiA+o^unR;`PGkp%)S)M5|6Rca~}Orm>*PEOo__(NWCdaB~^TT zZib$7xO2>sZN%DCc<6k0=PtU|UiXSwJ;#6@Elg4UEDc$)&M$7MRM_W7BRh^iwPmNRZzXbOcjL&W zCH++Ce3k(Y-Tj1JIFMg#)w=TabWnVvxPe{n%W?Bk(}jyqZeaXZ-QPlUawWg9 z70aXk{OR1!%cr%4&X+SL7%1~Z3)3$0p8qkOSs^oblxjsguWOR!<&p{f#xFKDF(c{; zYYDdpwE>THaez@g-9UN}{x{i=qg=B@M;Z?|8^aURuRl zyyAk1n$6F4Ir^Hf;g$GwtNCn0t@NF?W%+OF6tSlo=h(YX=LGTid^S8<%FXm;bnL)) zfjK=K(0=}`qHWaBFl)aE=c}SyckjH+-)UBVo0{nqN$U-n9}FF2c_ODLEC(<3E-oJ( zomapP_QA2M>+Fk;dY=QezJgc}A4j)LyQHI`13L)CuvOW`Fa?4@XqWLVV=q&oc* ztI+o_wMZ}clFRmMa}=FEDdYXcG2*+Wp4~Sm@^ihI`@n)zBa!bz?*j%Nm5ey+DaU16 zq4^c;=9^lcbq2|nLCe6gIl%y<|h zc(|o%h}Nexztvk;b49Cme~-e=`7(@0ZM^*_)0p|~w;u3@kD851Grn>?K5@%y|H1kL zNlQw@a$q6eY<>y(`SpL(&n zO1xBXNxOY0vWN4C{i#!>m*D*0+oNeXAd^s(c*Z$<_0c2FycSBI?)(wHx19Fu`gX=D z?c+x2VQ0Dm>IqNZI%(^W$4RMu)9EWwD+jF>rr?Wjm0uOjvV~yylB?(TIu4!`*4dt- zjOMgKcl+hml?w9omX~6VK z+qP!YL+{xMNtkLM&&9=Ig}BP8>Ns(L@hpG4LXvzdT=fCk&+Um_zWLofA?Nx@`^q!( za(1P~<)0bPbPKt-eaye+ZS~;Rtp_S!2DwwbI$n)9zrEXDm6!E;kKmaB z9ZFC6A74Fc4+OV;e`T`BL91z%rR~PN=SmEd|FT;Cp4g-6l3oJkx^t0V)l)P>x%OGb zp1r8)q)8W->fO#xOWOByS~~xkiE7L9UY(Wf)gj6o+;9{RKT6hpg9F#lJaznzM#*Te z(X{NxFRP*yYE?}NDHmBDq|T~7Pt@+3>@#7!zuzk@j%nDhV7elYf2lEWl5yc?u(`B! zz9zwoCZm!3XF^49Je%}b1HQR3VBK(lQ09YBo-YShu-@*fy-Y{7y)1P$%@fs|#nJ8w zoPqh<#!ZO_;_QO#>g2lh2YeEPoBVQ4+#1X9V|(lS83&%qN`0-cWeFD<%ommPN(5Rx*5LjYeCs zj|We=bodtSePw2{d=6W1zi!|DUTRrwH~P6kT~*1Mu_|;D}YLdOlIN!-MsVHtU{%5c-Pq z&)`onp-x`Qqe;N=lY_!&!K!QjMOPVZ?v?L0m=dhdoZ*0Kbrk)0`F^b9pfD-nFs-2U~(<)X{U$k?5WGiNM^1J$dXQpiDN~j!}yFb+5gC(MiuzJRV z15^SlYzp$MvYs-Y_D=Rzu4b&B_U9d3WIW~A@QKSnjF5%c zSn({bc5-Y6TE|$G9N~Yh7Z(&46c$kSv~?F{gK0Qho|Vx#tg@a0ypv;F7uCbVL(oG^ z(9zjiNJLs%T1Z$_NK{k+atOFwbZ|BE6mW21-$>!Gm5YV5t&^**qXR3FqM5m)o2wif z%zsTVd#7K?{;38KMkg5^Ggn&&YdJPyHX$gP(7I>{{8dtU)-AWCfh`SeX<$nOTN>EX Wz<-|xej6)UIluvu2OJ6EKK?H)&q-YX literal 0 HcmV?d00001 diff --git a/test/data/20220610_MG_7241.exv b/test/data/20220610_MG_7241.exv new file mode 100644 index 0000000000000000000000000000000000000000..70fe9295b5fb42de7662a01a33d394889f43def1 GIT binary patch literal 37033 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 fz6SO+u&;rA4gBY6;2&cp6B{r Date: Tue, 21 Jun 2022 17:05:10 +0100 Subject: [PATCH 16/80] Change return type of BasicIo::tell() to size_t. --- include/exiv2/basicio.hpp | 14 ++++---- include/exiv2/bmffimage.hpp | 6 ++-- include/exiv2/webpimage.hpp | 11 ++++--- src/basicio.cpp | 14 ++++---- src/bmffimage.cpp | 60 ++++++++++++++++----------------- src/epsimage.cpp | 12 +++---- src/image.cpp | 10 +++--- src/jp2image.cpp | 27 +++++++-------- src/jpgimage.cpp | 10 +++--- src/pgfimage.cpp | 2 +- src/pngimage.cpp | 36 ++++++++++---------- src/psdimage.cpp | 6 ++-- src/tgaimage.cpp | 2 +- src/webpimage.cpp | 66 ++++++++++++++----------------------- 14 files changed, 129 insertions(+), 147 deletions(-) diff --git a/include/exiv2/basicio.hpp b/include/exiv2/basicio.hpp index 869a8044..756a0013 100644 --- a/include/exiv2/basicio.hpp +++ b/include/exiv2/basicio.hpp @@ -198,10 +198,9 @@ class EXIV2API BasicIo { //@{ /*! @brief Get the current IO position. - @return Offset from the start of IO if successful;
- -1 if failure; + @return Offset from the start of IO */ - [[nodiscard]] virtual long tell() const = 0; + [[nodiscard]] virtual size_t tell() const = 0; /*! @brief Get the current size of the IO source in bytes. @return Size of the IO source in bytes;
@@ -439,10 +438,9 @@ class EXIV2API FileIo : public BasicIo { //@{ /*! @brief Get the current file position. - @return Offset from the start of the file if successful;
- -1 if failure; + @return Offset from the start of the file */ - [[nodiscard]] long tell() const override; + [[nodiscard]] size_t tell() const override; /*! @brief Flush any buffered writes and get the current file size in bytes. @@ -624,7 +622,7 @@ class EXIV2API MemIo : public BasicIo { @brief Get the current IO position. @return Offset from the start of the memory block */ - [[nodiscard]] long tell() const override; + [[nodiscard]] size_t tell() const override; /*! @brief Get the current memory buffer size in bytes. @return Size of the in memory data in bytes;
@@ -874,7 +872,7 @@ class EXIV2API RemoteIo : public BasicIo { @brief Get the current IO position. @return Offset from the start of the memory block */ - [[nodiscard]] long tell() const override; + [[nodiscard]] size_t tell() const override; /*! @brief Get the current memory buffer size in bytes. @return Size of the in memory data in bytes;
diff --git a/include/exiv2/bmffimage.hpp b/include/exiv2/bmffimage.hpp index cefa9212..d7963837 100644 --- a/include/exiv2/bmffimage.hpp +++ b/include/exiv2/bmffimage.hpp @@ -122,13 +122,13 @@ class EXIV2API BmffImage : public Image { @return address of next box @warning This function should only be called by readMetadata() */ - long boxHandler(std::ostream& out, Exiv2::PrintStructureOption option, long pbox_end, int depth); + uint64_t boxHandler(std::ostream& out, Exiv2::PrintStructureOption option, uint64_t pbox_end, int depth); [[nodiscard]] static std::string indent(int i) { return std::string(2 * i, ' '); } uint32_t fileType_{0}; - std::set visits_; + std::set visits_; uint64_t visits_max_{0}; uint16_t unknownID_{0xffff}; uint16_t exifID_{0xffff}; @@ -140,7 +140,7 @@ class EXIV2API BmffImage : public Image { /*! @brief box utilities */ - static std::string toAscii(long n); + static std::string toAscii(uint32_t n); std::string boxName(uint32_t box); static bool superBox(uint32_t box); static bool fullBox(uint32_t box); diff --git a/include/exiv2/webpimage.hpp b/include/exiv2/webpimage.hpp index d9dda5a7..5fbc6d6b 100644 --- a/include/exiv2/webpimage.hpp +++ b/include/exiv2/webpimage.hpp @@ -63,12 +63,13 @@ class EXIV2API WebPImage : public Image { private: void doWriteMetadata(BasicIo& outIo); - //! @name NOT Implemented - //@{ - static long getHeaderOffset(const byte* data, size_t data_size, const byte* header, size_t header_size); + + //! Finds the offset of header in data. Returns std::string::npos if the header isn't found. + static size_t getHeaderOffset(const byte* data, size_t data_size, const byte* header, size_t header_size); + static bool equalsWebPTag(Exiv2::DataBuf& buf, const char* str); - void debugPrintHex(byte* data, long size); - void decodeChunks(long filesize); + void debugPrintHex(byte* data, size_t size); + void decodeChunks(uint32_t filesize); void inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_alpha, bool has_icc, int width, int height); /* Misc. */ static constexpr byte WEBP_PAD_ODD = 0; diff --git a/src/basicio.cpp b/src/basicio.cpp index 6539b762..0a8c7191 100644 --- a/src/basicio.cpp +++ b/src/basicio.cpp @@ -458,8 +458,10 @@ int FileIo::seek(int64_t offset, Position pos) { #endif } -long FileIo::tell() const { - return std::ftell(p_->fp_); +size_t FileIo::tell() const { + const long pos = std::ftell(p_->fp_); + enforce(pos >= 0, ErrorCode::kerInputDataReadFailed); + return static_cast(pos); } size_t FileIo::size() const { @@ -786,8 +788,8 @@ int MemIo::munmap() { return 0; } -long MemIo::tell() const { - return static_cast(p_->idx_); +size_t MemIo::tell() const { + return p_->idx_; } size_t MemIo::size() const { @@ -1341,8 +1343,8 @@ int RemoteIo::munmap() { return 0; } -long RemoteIo::tell() const { - return static_cast(p_->idx_); +size_t RemoteIo::tell() const { + return p_->idx_; } size_t RemoteIo::size() const { diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index ce14fe5c..e27207d9 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -74,7 +74,7 @@ BmffImage::BmffImage(BasicIo::UniquePtr io, bool /* create */) : Image(ImageType::bmff, mdExif | mdIptc | mdXmp, std::move(io)) { } // BmffImage::BmffImage -std::string BmffImage::toAscii(long n) { +std::string BmffImage::toAscii(uint32_t n) { const auto p = reinterpret_cast(&n); std::string result; for (int i = 0; i < 4; i++) { @@ -152,9 +152,9 @@ std::string BmffImage::uuidName(Exiv2::DataBuf& uuid) { return result; } -long BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStructureOption option /* = kpsNone */, - long pbox_end, int depth) { - long address = io_->tell(); +uint64_t BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStructureOption option /* = kpsNone */, + uint64_t pbox_end, int depth) { + const size_t address = io_->tell(); // never visit a box twice! if (depth == 0) visits_.clear(); @@ -198,22 +198,22 @@ long BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStruc } // read data in box and restore file position - long restore = io_->tell(); + const size_t restore = io_->tell(); enforce(box_length >= hdrsize, Exiv2::ErrorCode::kerCorruptedMetadata); - enforce(box_length - hdrsize <= static_cast(pbox_end - restore), Exiv2::ErrorCode::kerCorruptedMetadata); + enforce(box_length - hdrsize <= pbox_end - restore, Exiv2::ErrorCode::kerCorruptedMetadata); - const auto buffer_size = static_cast(box_length - hdrsize); + const auto buffer_size = box_length - hdrsize; if (skipBox(box_type)) { if (bTrace) { out << std::endl; } // The enforce() above checks that restore + buffer_size won't // exceed pbox_end, and by implication, won't exceed LONG_MAX - return restore + static_cast(buffer_size); + return restore + buffer_size; } - DataBuf data(buffer_size); - const long box_end = restore + static_cast(data.size()); + DataBuf data(static_cast(buffer_size)); + const size_t box_end = restore + data.size(); io_->read(data.data(), data.size()); io_->seek(restore, BasicIo::beg); @@ -478,26 +478,25 @@ long BmffImage::boxHandler(std::ostream& out /* = std::cout*/, Exiv2::PrintStruc void BmffImage::parseTiff(uint32_t root_tag, uint64_t length, uint64_t start) { enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata); enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata); - enforce(start <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); - enforce(length <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); + enforce(start <= static_cast(std::numeric_limits::max()), ErrorCode::kerCorruptedMetadata); + enforce(length <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); // read and parse exif data - long restore = io_->tell(); + const size_t restore = io_->tell(); DataBuf exif(static_cast(length)); - io_->seek(static_cast(start), BasicIo::beg); + io_->seek(static_cast(start), BasicIo::beg); if (exif.size() > 8 && io_->read(exif.data(), exif.size()) == exif.size()) { // hunt for "II" or "MM" - long eof = 0xffffffff; // impossible value for punt - long punt = eof; + const size_t eof = std::numeric_limits::max(); // impossible value for punt + size_t punt = eof; for (size_t i = 0; i < exif.size() - 8 && punt == eof; i += 2) { if (exif.read_uint8(i) == exif.read_uint8(i + 1)) if (exif.read_uint8(i) == 'I' || exif.read_uint8(i) == 'M') - punt = static_cast(i); + punt = i; } if (punt != eof) { - Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), exif.c_data(punt), - static_cast(exif.size() - punt), root_tag, - Internal::TiffMapping::findDecoder); + Internal::TiffParserWorker::decode(exifData(), iptcData(), xmpData(), exif.c_data(punt), exif.size() - punt, + root_tag, Internal::TiffMapping::findDecoder); } } io_->seek(restore, BasicIo::beg); @@ -506,7 +505,7 @@ void BmffImage::parseTiff(uint32_t root_tag, uint64_t length, uint64_t start) { void BmffImage::parseTiff(uint32_t root_tag, uint64_t length) { if (length > 8) { enforce(length - 8 <= io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata); - enforce(length - 8 <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); + enforce(length - 8 <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); DataBuf data(static_cast(length - 8u)); const size_t bufRead = io_->read(data.data(), data.size()); @@ -524,8 +523,8 @@ void BmffImage::parseXmp(uint64_t length, uint64_t start) { enforce(start <= io_->size(), ErrorCode::kerCorruptedMetadata); enforce(length <= io_->size() - start, ErrorCode::kerCorruptedMetadata); - long restore = io_->tell(); - io_->seek(static_cast(start), BasicIo::beg); + const size_t restore = io_->tell(); + io_->seek(static_cast(start), BasicIo::beg); auto lengthSizeT = static_cast(length); DataBuf xmp(lengthSizeT + 1); @@ -547,9 +546,8 @@ void BmffImage::parseXmp(uint64_t length, uint64_t start) { void BmffImage::parseCr3Preview(DataBuf& data, std::ostream& out, bool bTrace, uint8_t version, size_t width_offset, size_t height_offset, size_t size_offset, size_t relative_position) { // Derived from https://github.com/lclevy/canon_cr3 - long here = io_->tell(); - enforce(here >= 0 && here <= std::numeric_limits::max() - static_cast(relative_position), - ErrorCode::kerCorruptedMetadata); + const size_t here = io_->tell(); + enforce(here <= std::numeric_limits::max() - relative_position, ErrorCode::kerCorruptedMetadata); NativePreview nativePreview; nativePreview.position_ = here + relative_position; nativePreview.width_ = data.read_uint16(width_offset, endian_); @@ -600,8 +598,8 @@ void BmffImage::readMetadata() { exifID_ = unknownID_; xmpID_ = unknownID_; - long address = 0; - const auto file_end = static_cast(io_->size()); + uint64_t address = 0; + const auto file_end = io_->size(); while (address < file_end) { io_->seek(address, BasicIo::beg); address = boxHandler(std::cout, kpsNone, file_end, 0); @@ -635,8 +633,8 @@ void BmffImage::printStructure(std::ostream& out, Exiv2::PrintStructureOption op openOrThrow(); IoCloser closer(*io_); - long address = 0; - const auto file_end = static_cast(io_->size()); + uint64_t address = 0; + const auto file_end = io_->size(); while (address < file_end) { io_->seek(address, BasicIo::beg); address = boxHandler(out, option, file_end, depth); @@ -682,7 +680,7 @@ bool isBmffType(BasicIo& iIo, bool advance) { bool const is_video = (buf[8] == 'q' && buf[9] == 't' && buf[10] == ' ' && buf[11] == ' '); bool matched = is_jxl || (is_ftyp && !is_video); if (!advance || !matched) { - iIo.seek(static_cast(0), BasicIo::beg); + iIo.seek(0, BasicIo::beg); } return matched; } diff --git a/src/epsimage.cpp b/src/epsimage.cpp index 4c1d30d9..1d1c987d 100644 --- a/src/epsimage.cpp +++ b/src/epsimage.cpp @@ -11,6 +11,7 @@ #include "config.h" #include "basicio.hpp" +#include "enforce.hpp" #include "epsimage.hpp" #include "error.hpp" #include "futils.hpp" @@ -101,13 +102,8 @@ void writeTemp(BasicIo& tempIo, const std::string& data) { //! Get the current write position of temp file, taking care of errors uint32_t posTemp(const BasicIo& tempIo) { - const long pos = tempIo.tell(); - if (pos == -1) { -#ifndef SUPPRESS_WARNINGS - EXV_WARNING << "Internal error while determining current write position in temporary file.\n"; -#endif - throw Error(ErrorCode::kerImageWriteFailed); - } + const size_t pos = tempIo.tell(); + enforce(pos <= std::numeric_limits::max(), ErrorCode::kerImageWriteFailed); return static_cast(pos); } @@ -1167,7 +1163,7 @@ bool isEpsType(BasicIo& iIo, bool advance) { bufSize = i.size(); } } - const long restore = iIo.tell(); // save + const size_t restore = iIo.tell(); // save DataBuf buf = iIo.read(bufSize); if (iIo.error() || buf.size() != bufSize) { iIo.seek(restore, BasicIo::beg); diff --git a/src/image.cpp b/src/image.cpp index 208fe9c2..93cbfa59 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -287,7 +287,7 @@ static bool typeValid(uint16_t type) { return type >= 1 && type <= 13; } -static std::set visits; // #547 +static std::set visits; // #547 void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStructureOption option, size_t start, bool bSwap, char c, int depth) { @@ -370,7 +370,7 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct const bool bOffsetIsPointer = count_x_size > 4; if (bOffsetIsPointer) { // read into buffer - const long restore = io.tell(); // save + const size_t restore = io.tell(); // save io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata); // position io.readOrThrow(buf.data(), count_x_size, ErrorCode::kerCorruptedMetadata); // read io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata); // restore @@ -410,7 +410,7 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct if (option == kpsRecursive && (tag == 0x8769 /* ExifTag */ || tag == 0x014a /*SubIFDs*/ || type == tiffIfd)) { for (size_t k = 0; k < count; k++) { - const long restore = io.tell(); + const size_t restore = io.tell(); offset = byteSwap4(buf, k * size, bSwap); printIFDStructure(io, out, option, offset, bSwap, c, depth); io.seekOrThrow(restore, BasicIo::beg, ErrorCode::kerCorruptedMetadata); @@ -421,7 +421,7 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct throw Error(ErrorCode::kerCorruptedMetadata); } - const long restore = io.tell(); + const size_t restore = io.tell(); io.seekOrThrow(offset, BasicIo::beg, ErrorCode::kerCorruptedMetadata); // position std::vector bytes(count); // allocate memory // TODO: once we have C++11 use bytes.data() @@ -431,7 +431,7 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct IptcData::printStructure(out, makeSliceUntil(bytes.data(), count), depth); } } else if (option == kpsRecursive && tag == 0x927c /* MakerNote */ && count > 10) { - const long restore = io.tell(); // save + const size_t restore = io.tell(); // save uint32_t jump = 10; byte bytes[20]; diff --git a/src/jp2image.cpp b/src/jp2image.cpp index 05298bda..5892557f 100644 --- a/src/jp2image.cpp +++ b/src/jp2image.cpp @@ -151,7 +151,7 @@ void Jp2Image::readMetadata() { while (io_->read(reinterpret_cast(&box), boxHSize) == boxHSize) { boxes_check(boxesCount++, boxem); - long position = io_->tell(); + const size_t position = io_->tell(); box.length = getLong(reinterpret_cast(&box.length), bigEndian); box.type = getLong(reinterpret_cast(&box.type), bigEndian); #ifdef EXIV2_DEBUG_MESSAGES @@ -191,7 +191,7 @@ void Jp2Image::readMetadata() { #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::Jp2Image::readMetadata: JP2Header box found" << std::endl; #endif - long restore = io_->tell(); + size_t restore = io_->tell(); while (io_->read(reinterpret_cast(&subBox), boxHSize) == boxHSize && subBox.length) { boxes_check(boxesCount++, boxem); @@ -210,7 +210,7 @@ void Jp2Image::readMetadata() { << "Color data found" << std::endl; #endif - const long pad = 3; // 3 padding bytes 2 0 0 + const size_t pad = 3; // 3 padding bytes 2 0 0 const size_t data_length = Safe::add(subBox.length, 8u); // data_length makes no sense if it is larger than the rest of the file if (data_length > io_->size() - io_->tell()) { @@ -291,13 +291,14 @@ void Jp2Image::readMetadata() { // Find the position of Exif header in bytes array. const char a = rawData.read_uint8(0); const char b = rawData.read_uint8(1); - long pos = (a == b && (a == 'I' || a == 'M')) ? 0 : -1; + const size_t notfound = std::numeric_limits::max(); + size_t pos = (a == b && (a == 'I' || a == 'M')) ? 0 : notfound; // #1242 Forgive having Exif\0\0 in rawData.pData_ std::array exifHeader{0x45, 0x78, 0x69, 0x66, 0x00, 0x00}; - for (size_t i = 0; pos < 0 && i < (rawData.size() - exifHeader.size()); i++) { + for (size_t i = 0; pos == notfound && i < (rawData.size() - exifHeader.size()); i++) { if (rawData.cmpBytes(i, exifHeader.data(), exifHeader.size()) == 0) { - pos = static_cast(i + sizeof(exifHeader)); + pos = i + sizeof(exifHeader); #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Reading non-standard UUID-EXIF_bad box in " << io_->path() << std::endl; #endif @@ -305,7 +306,7 @@ void Jp2Image::readMetadata() { } // If found it, store only these data at from this place. - if (pos >= 0) { + if (pos != notfound) { #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::Jp2Image::readMetadata: Exif header found at position " << pos << std::endl; #endif @@ -380,7 +381,7 @@ void Jp2Image::readMetadata() { lastBoxTypeRead = box.type; // Move to the next box. - io_->seek(static_cast(position - boxHSize + box.length), BasicIo::beg); + io_->seek(static_cast(position - boxHSize + box.length), BasicIo::beg); if (io_->error()) throw Error(ErrorCode::kerFailedToReadImageData); } @@ -418,7 +419,7 @@ void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, in while (box.length && box.type != kJp2BoxTypeClose && io_->read(reinterpret_cast(&box), boxHSize) == boxHSize) { - long position = io_->tell(); + const size_t position = io_->tell(); box.length = getLong(reinterpret_cast(&box.length), bigEndian); box.type = getLong(reinterpret_cast(&box.type), bigEndian); enforce(box.length <= boxHSize + io_->size() - io_->tell(), ErrorCode::kerCorruptedMetadata); @@ -454,7 +455,7 @@ void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, in /// \todo All files shall contain one and only one Header box. while (io_->read(reinterpret_cast(&subBox), boxHSize) == boxHSize && - io_->tell() < position + static_cast(box.length)) // don't read beyond the box! + io_->tell() < position + box.length) // don't read beyond the box! { const size_t address = io_->tell() - boxHSize; subBox.length = getLong(reinterpret_cast(&subBox.length), bigEndian); @@ -571,7 +572,7 @@ void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, in } // Move to the next box. - io_->seek(static_cast(position - boxHSize + box.length), BasicIo::beg); + io_->seek(static_cast(position - boxHSize + box.length), BasicIo::beg); if (io_->error()) throw Error(ErrorCode::kerFailedToReadImageData); if (bPrint) @@ -704,7 +705,7 @@ void Jp2Image::doWriteMetadata(BasicIo& outIo) { byte boxUUIDtype[4]; DataBuf bheaderBuf(8); - while (io_->tell() < static_cast(io_->size())) { + while (io_->tell() < io_->size()) { #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::Jp2Image::doWriteMetadata: Position: " << io_->tell() << " / " << io_->size() << std::endl; #endif @@ -893,7 +894,7 @@ bool isJp2Type(BasicIo& iIo, bool advance) { } bool matched = (memcmp(buf, Jp2Signature.data(), Jp2Signature.size()) == 0); if (!advance || !matched) { - iIo.seek(-static_cast(Jp2Signature.size()), BasicIo::cur); // Return to original position + iIo.seek(-static_cast(Jp2Signature.size()), BasicIo::cur); // Return to original position } return matched; } diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index da9c32b0..24d68a24 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -304,7 +304,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } bool bPrint = option == kpsBasic || option == kpsRecursive; - std::vector iptcDataSegs; + std::vector iptcDataSegs; if (bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase) { // mnemonic for markers @@ -618,7 +618,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { // Used to initialize search variables such as skipCom. static const size_t notfound = std::numeric_limits::max(); - const long seek = io_->tell(); + const size_t seek = io_->tell(); size_t count = 0; size_t search = 0; size_t insertPos = 0; @@ -809,7 +809,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { tmpBuf[0] = 0xff; tmpBuf[1] = app2_; - const long chunk_size = 256 * 256 - 40; // leave bytes for marker, header and padding + const size_t chunk_size = 256 * 256 - 40; // leave bytes for marker, header and padding size_t size = iccProfile_.size(); if (size >= 255 * chunk_size) throw Error(ErrorCode::kerTooLargeJpegSegment, "IccProfile"); @@ -844,7 +844,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { // Set the new IPTC IRB, keeps existing IRBs but removes the // IPTC block if there is no new IPTC data to write DataBuf newPsData = Photoshop::setIptcIrb(psBlob.data(), psBlob.size(), iptcData_); - const long maxChunkSize = 0xffff - 16; + const size_t maxChunkSize = 0xffff - 16; const byte* chunkStart = newPsData.empty() ? nullptr : newPsData.c_data(); const byte* chunkEnd = newPsData.empty() ? nullptr : newPsData.c_data(newPsData.size() - 1); while (chunkStart < chunkEnd) { @@ -853,7 +853,7 @@ void JpegBase::doWriteMetadata(BasicIo& outIo) { if (chunkSize > maxChunkSize) { chunkSize = maxChunkSize; // Don't break at a valid IRB boundary - const auto writtenSize = static_cast(chunkStart - newPsData.c_data()); + const auto writtenSize = chunkStart - newPsData.c_data(); if (Photoshop::valid(newPsData.c_data(), writtenSize + chunkSize)) { // Since an IRB has minimum size 12, // (chunkSize - 8) can't be also a IRB boundary diff --git a/src/pgfimage.cpp b/src/pgfimage.cpp index c41c85b3..dcac5973 100644 --- a/src/pgfimage.cpp +++ b/src/pgfimage.cpp @@ -90,7 +90,7 @@ void PgfImage::readMetadata() { // And now, the most interesting, the user data byte array where metadata are stored as small image. enforce(headerSize <= std::numeric_limits::max() - 8, ErrorCode::kerCorruptedMetadata); - size_t size = headerSize + 8 - static_cast(io_->tell()); + size_t size = headerSize + 8 - io_->tell(); #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::PgfImage::readMetadata: Found Image data (" << size << " bytes)\n"; diff --git a/src/pngimage.cpp b/src/pngimage.cpp index a2415549..fe5b8c5e 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -72,8 +72,8 @@ std::string PngImage::mimeType() const { return "image/png"; } -static bool zlibToDataBuf(const byte* bytes, long length, DataBuf& result) { - uLongf uncompressedLen = length * 2; // just a starting point +static bool zlibToDataBuf(const byte* bytes, uLongf length, DataBuf& result) { + uLongf uncompressedLen = length; // just a starting point int zlibResult = Z_BUF_ERROR; do { @@ -101,7 +101,7 @@ static bool zlibToDataBuf(const byte* bytes, long length, DataBuf& result) { return zlibResult == Z_OK; } -static bool zlibToCompressed(const byte* bytes, long length, DataBuf& result) { +static bool zlibToCompressed(const byte* bytes, uLongf length, DataBuf& result) { uLongf compressedLen = length; // just a starting point int zlibResult = Z_BUF_ERROR; @@ -122,7 +122,7 @@ static bool zlibToCompressed(const byte* bytes, long length, DataBuf& result) { return zlibResult == Z_OK; } -static bool tEXtToDataBuf(const byte* bytes, long length, DataBuf& result) { +static bool tEXtToDataBuf(const byte* bytes, size_t length, DataBuf& result) { static std::array value; static bool bFirst = true; if (bFirst) { @@ -137,21 +137,21 @@ static bool tEXtToDataBuf(const byte* bytes, long length, DataBuf& result) { // calculate length and allocate result; // count: number of \n in the header - long count = 0; + size_t count = 0; // p points to the current position in the array bytes const byte* p = bytes; // header is '\nsomething\n number\n hex' // => increment p until it points to the byte after the last \n // p must stay within bounds of the bytes array! - while ((count < 3) && (p - bytes < length)) { + while (count < 3 && 0 < length) { // length is later used for range checks of p => decrement it for each increment of p --length; if (*p++ == '\n') { count++; } } - for (long i = 0; i < length; i++) + for (size_t i = 0; i < length; i++) if (value[p[i]]) ++count; result.alloc((count + 1) / 2); @@ -160,7 +160,7 @@ static bool tEXtToDataBuf(const byte* bytes, long length, DataBuf& result) { count = 0; byte* r = result.data(); int n = 0; // nibble - for (long i = 0; i < length; i++) { + for (size_t i = 0; i < length; i++) { if (value[p[i]]) { int v = value[p[i]] - 1; if (++count % 2) @@ -208,7 +208,7 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in DataBuf cheaderBuf(8); while (!io_->eof() && ::strcmp(chType, "IEND") != 0) { - size_t address = io_->tell(); + const size_t address = io_->tell(); size_t bufRead = io_->read(cheaderBuf.data(), cheaderBuf.size()); if (io_->error()) @@ -223,8 +223,8 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in } // test that we haven't hit EOF, or wanting to read excessive data - long restore = io_->tell(); - if (restore == -1 || dataOffset > static_cast(0x7FFFFFFF) || dataOffset > imgSize - restore) { + const size_t restore = io_->tell(); + if (dataOffset > imgSize - restore) { throw Exiv2::Error(ErrorCode::kerFailedToReadImageData); } @@ -297,10 +297,11 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in // decode the chunk bool bGood = false; if (tEXt) { - bGood = tEXtToDataBuf(data.c_data(name_l), static_cast(dataOffset - name_l), dataBuf); + bGood = tEXtToDataBuf(data.c_data(name_l), dataOffset - name_l, dataBuf); } if (zTXt || iCCP) { - bGood = zlibToDataBuf(data.c_data(name_l + 1), static_cast(dataOffset - name_l - 1), + enforce(dataOffset - name_l - 1 <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); + bGood = zlibToDataBuf(data.c_data(name_l + 1), static_cast(dataOffset - name_l - 1), dataBuf); // +1 = 'compressed' flag } if (iTXt) { @@ -407,8 +408,8 @@ void PngImage::readMetadata() { // Decode chunk data length. uint32_t chunkLength = cheaderBuf.read_uint32(0, Exiv2::bigEndian); - long pos = io_->tell(); - if (pos == -1 || chunkLength > static_cast(0x7FFFFFFF) || chunkLength > imgSize - pos) { + const size_t pos = io_->tell(); + if (chunkLength > imgSize - pos) { throw Exiv2::Error(ErrorCode::kerFailedToReadImageData); } @@ -451,7 +452,7 @@ void PngImage::readMetadata() { ++iccOffset; // +1 = 'compressed' flag enforce(iccOffset <= chunkLength, Exiv2::ErrorCode::kerCorruptedMetadata); - zlibToDataBuf(chunkData.c_data(iccOffset), chunkLength - iccOffset, iccProfile_); + zlibToDataBuf(chunkData.c_data(iccOffset), static_cast(chunkLength - iccOffset), iccProfile_); #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::PngImage::readMetadata: profile name: " << profileName_ << std::endl; std::cout << "Exiv2::PngImage::readMetadata: iccProfile.size_ (uncompressed) : " << iccProfile_.size() @@ -594,7 +595,8 @@ void PngImage::doWriteMetadata(BasicIo& outIo) { if (iccProfileDefined()) { DataBuf compressed; - if (zlibToCompressed(iccProfile_.c_data(), static_cast(iccProfile_.size()), compressed)) { + enforce(iccProfile_.size() <= std::numeric_limits::max(), ErrorCode::kerCorruptedMetadata); + if (zlibToCompressed(iccProfile_.c_data(), static_cast(iccProfile_.size()), compressed)) { const auto nameLength = static_cast(profileName_.size()); const uint32_t chunkLength = nameLength + 2 + static_cast(compressed.size()); byte length[4]; diff --git a/src/psdimage.cpp b/src/psdimage.cpp index 94ac7788..b5e132e7 100644 --- a/src/psdimage.cpp +++ b/src/psdimage.cpp @@ -194,7 +194,7 @@ void PsdImage::readMetadata() { throw Error(ErrorCode::kerNotAnImage, "Photoshop"); } uint32_t resourceSize = getULong(buf, bigEndian); - uint32_t curOffset = io_->tell(); + const size_t curOffset = io_->tell(); #ifdef EXIV2_DEBUG_MESSAGES std::cerr << std::hex << "resourceId: " << resourceId << std::dec << " length: " << resourceSize << std::hex @@ -382,7 +382,7 @@ void PsdImage::doWriteMetadata(BasicIo& outIo) { if (outIo.error()) throw Error(ErrorCode::kerImageWriteFailed); - uint32_t resLenOffset = io_->tell(); // remember for later update + const size_t resLenOffset = io_->tell(); // remember for later update // Read length of all resource blocks from original PSD if (io_->read(buf, 4) != 4) @@ -433,7 +433,7 @@ void PsdImage::doWriteMetadata(BasicIo& outIo) { uint32_t resourceSize = getULong(buf, bigEndian); uint32_t pResourceSize = (resourceSize + 1) & ~1; // padded resource size - uint32_t curOffset = io_->tell(); + const size_t curOffset = io_->tell(); // Write IPTC_NAA resource block if ((resourceId == kPhotoshopResourceID_IPTC_NAA || resourceId > kPhotoshopResourceID_IPTC_NAA) && !iptcDone) { diff --git a/src/tgaimage.cpp b/src/tgaimage.cpp index f48967f6..20d015f6 100644 --- a/src/tgaimage.cpp +++ b/src/tgaimage.cpp @@ -103,7 +103,7 @@ bool isTgaType(BasicIo& iIo, bool /*advance*/) { return true; } byte buf[26]; - long curPos = iIo.tell(); + const size_t curPos = iIo.tell(); if (curPos < 26) return false; diff --git a/src/webpimage.cpp b/src/webpimage.cpp index dbdfde18..954254a2 100644 --- a/src/webpimage.cpp +++ b/src/webpimage.cpp @@ -154,13 +154,11 @@ void WebPImage::doWriteMetadata(BasicIo& outIo) { /* Verify for a VP8X Chunk First before writing in case we have any exif or xmp data, also check for any chunks with alpha frame/layer set */ - while (!io_->eof() && static_cast(io_->tell()) < filesize) { + while (!io_->eof() && io_->tell() < filesize) { io_->readOrThrow(chunkId.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata); io_->readOrThrow(size_buff, WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata); const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian); - // Check that `size_u32` is safe to cast to `long`. - enforce(size_u32 <= std::numeric_limits::max(), Exiv2::ErrorCode::kerCorruptedMetadata); DataBuf payload(size_u32); if (!payload.empty()) { io_->readOrThrow(payload.data(), payload.size(), Exiv2::ErrorCode::kerCorruptedMetadata); @@ -286,15 +284,11 @@ void WebPImage::doWriteMetadata(BasicIo& outIo) { } io_->seek(12, BasicIo::beg); - while (!io_->eof() && static_cast(io_->tell()) < filesize) { + while (!io_->eof() && io_->tell() < filesize) { io_->readOrThrow(chunkId.data(), 4, Exiv2::ErrorCode::kerCorruptedMetadata); io_->readOrThrow(size_buff, 4, Exiv2::ErrorCode::kerCorruptedMetadata); const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian); - - // Check that `size_u32` is safe to cast to `long`. - enforce(size_u32 <= std::numeric_limits::max(), Exiv2::ErrorCode::kerCorruptedMetadata); - DataBuf payload(size_u32); io_->readOrThrow(payload.data(), size_u32, Exiv2::ErrorCode::kerCorruptedMetadata); if (io_->tell() % 2) @@ -438,19 +432,18 @@ void WebPImage::printStructure(std::ostream& out, PrintStructureOption option, i } io_->seek(0, BasicIo::beg); // rewind - while (!io_->eof() && static_cast(io_->tell()) < filesize) { - auto offset = static_cast(io_->tell()); + while (!io_->eof() && io_->tell() < filesize) { + auto offset = io_->tell(); byte size_buff[WEBP_TAG_SIZE]; io_->read(chunkId.data(), WEBP_TAG_SIZE); io_->read(size_buff, WEBP_TAG_SIZE); - long size = Exiv2::getULong(size_buff, littleEndian); + const uint32_t size = Exiv2::getULong(size_buff, littleEndian); DataBuf payload(offset ? size : WEBP_TAG_SIZE); // header is different from chunks io_->read(payload.data(), payload.size()); if (bPrint) { out << Internal::indent(depth) - << Internal::stringFormat(" %s | %8u | %8u | ", chunkId.c_str(), static_cast(size), - static_cast(offset)) + << Internal::stringFormat(" %s | %8u | %8u | ", chunkId.c_str(), size, static_cast(offset)) << Internal::binaryToString(makeSlice(payload, 0, payload.size() > 32 ? 32 : payload.size())) << std::endl; } @@ -492,18 +485,14 @@ void WebPImage::readMetadata() { io_->readOrThrow(data, WEBP_TAG_SIZE * 3, Exiv2::ErrorCode::kerCorruptedMetadata); - const uint32_t filesize_u32 = Safe::add(Exiv2::getULong(data + WEBP_TAG_SIZE, littleEndian), 8U); - enforce(filesize_u32 <= io_->size(), Exiv2::ErrorCode::kerCorruptedMetadata); + const uint32_t filesize = Safe::add(Exiv2::getULong(data + WEBP_TAG_SIZE, littleEndian), 8U); + enforce(filesize <= io_->size(), Exiv2::ErrorCode::kerCorruptedMetadata); - // Check that `filesize_u32` is safe to cast to `long`. - enforce(filesize_u32 <= static_cast(std::numeric_limits::max()), - Exiv2::ErrorCode::kerCorruptedMetadata); - - WebPImage::decodeChunks(static_cast(filesize_u32)); + WebPImage::decodeChunks(filesize); } // WebPImage::readMetadata -void WebPImage::decodeChunks(long filesize) { +void WebPImage::decodeChunks(uint32_t filesize) { DataBuf chunkId(5); byte size_buff[WEBP_TAG_SIZE]; bool has_canvas_data = false; @@ -517,12 +506,7 @@ void WebPImage::decodeChunks(long filesize) { io_->readOrThrow(chunkId.data(), WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata); io_->readOrThrow(size_buff, WEBP_TAG_SIZE, Exiv2::ErrorCode::kerCorruptedMetadata); - const uint32_t size_u32 = Exiv2::getULong(size_buff, littleEndian); - - // Check that `size_u32` is safe to cast to `long`. - enforce(size_u32 <= static_cast(std::numeric_limits::max()), - Exiv2::ErrorCode::kerCorruptedMetadata); - const auto size = static_cast(size_u32); + const uint32_t size = Exiv2::getULong(size_buff, littleEndian); // Check that `size` is within bounds. enforce(io_->tell() <= filesize, Exiv2::ErrorCode::kerCorruptedMetadata); @@ -619,23 +603,23 @@ void WebPImage::decodeChunks(long filesize) { bool s_header = false; bool le_header = false; bool be_header = false; - long pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast(&exifLongHeader), 4); + size_t pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast(&exifLongHeader), 4); - if (pos == -1) { + if (pos == std::string::npos) { pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast(&exifLongHeader), 6); - if (pos != -1) { + if (pos != std::string::npos) { s_header = true; } } - if (pos == -1) { + if (pos == std::string::npos) { pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast(&exifTiffLEHeader), 3); - if (pos != -1) { + if (pos != std::string::npos) { le_header = true; } } - if (pos == -1) { + if (pos == std::string::npos) { pos = getHeaderOffset(payload.c_data(), payload.size(), reinterpret_cast(&exifTiffBEHeader), 4); - if (pos != -1) { + if (pos != std::string::npos) { be_header = true; } } @@ -666,11 +650,11 @@ void WebPImage::decodeChunks(long filesize) { std::copy(payload.begin(), payload.end(), rawExifData.begin() + offset); #ifdef EXIV2_DEBUG_MESSAGES - std::cout << "Display Hex Dump [size:" << static_cast(sizePayload) << "]" << std::endl; + std::cout << "Display Hex Dump [size:" << sizePayload << "]" << std::endl; std::cout << binaryToHex(rawExifData.c_data(), sizePayload); #endif - if (pos != -1) { + if (pos != std::string::npos) { XmpData xmpData; ByteOrder bo = ExifParser::decode(exifData_, payload.c_data(pos), payload.size() - pos); setByteOrder(bo); @@ -689,7 +673,7 @@ void WebPImage::decodeChunks(long filesize) { #endif } else { #ifdef EXIV2_DEBUG_MESSAGES - std::cout << "Display Hex Dump [size:" << static_cast(payload.size()) << "]" << std::endl; + std::cout << "Display Hex Dump [size:" << payload.size() << "]" << std::endl; std::cout << binaryToHex(payload.c_data(), payload.size()); #endif } @@ -807,14 +791,14 @@ void WebPImage::inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_ } } -long WebPImage::getHeaderOffset(const byte* data, size_t data_size, const byte* header, size_t header_size) { +size_t WebPImage::getHeaderOffset(const byte* data, size_t data_size, const byte* header, size_t header_size) { + size_t pos = std::string::npos; // error value if (data_size < header_size) { - return -1; + return pos; } - long pos = -1; for (size_t i = 0; i < data_size - header_size; i++) { if (memcmp(header, &data[i], header_size) == 0) { - pos = static_cast(i); + pos = i; break; } } From c2fbff291e52844a6a31aad9e20a2f1c4de845e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20Komar=C4=8Devi=C4=87?= Date: Wed, 29 Jun 2022 17:53:41 +0200 Subject: [PATCH 17/80] PNG: always strip the existing iCCP chunk --- src/pngimage.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/pngimage.cpp b/src/pngimage.cpp index a2415549..741e649c 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -193,7 +193,6 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in const auto exifKey = upper("Raw profile type exif"); const auto app1Key = upper("Raw profile type APP1"); const auto iptcKey = upper("Raw profile type iptc"); - const auto iccKey = upper("icc"); const auto softKey = upper("Software"); const auto commKey = upper("Comment"); const auto descKey = upper("Description"); @@ -272,13 +271,12 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in // for XMP, ICC etc: read and format data const auto dataStringU = upper(dataString); bool bXMP = option == kpsXMP && findi(dataStringU, xmpKey) == 0; - bool bICC = option == kpsIccProfile && findi(dataStringU, iccKey) == 0; bool bExif = option == kpsRecursive && (findi(dataStringU, exifKey) == 0 || findi(dataStringU, app1Key) == 0); bool bIptc = option == kpsRecursive && findi(dataStringU, iptcKey) == 0; bool bSoft = option == kpsRecursive && findi(dataStringU, softKey) == 0; bool bComm = option == kpsRecursive && findi(dataStringU, commKey) == 0; bool bDesc = option == kpsRecursive && findi(dataStringU, descKey) == 0; - bool bDump = bXMP || bICC || bExif || bIptc || bSoft || bComm || bDesc || eXIf; + bool bDump = bXMP || bExif || bIptc || bSoft || bComm || bDesc || iCCP || eXIf; if (bDump) { DataBuf dataBuf; @@ -346,7 +344,7 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in bLF = true; } - if (bICC || bComm) { + if ((iCCP && option == kpsIccProfile) || bComm) { out.write(dataBuf.c_str(), dataBuf.size()); bLF = bComm; } @@ -356,6 +354,7 @@ void PngImage::printStructure(std::ostream& out, PrintStructureOption option, in out.write(decoded.c_str(), decoded.size()); bLF = true; } + if (eXIf && option == kpsRecursive) { // create memio object with the data, then print the structure MemIo p(data.c_data(), dataOffset); @@ -546,9 +545,14 @@ void PngImage::doWriteMetadata(BasicIo& outIo) { throw Error(ErrorCode::kerImageWriteFailed); return; } - if (!strcmp(szChunk, "eXIf")) { - ; // do nothing Exif metadata is written following IHDR - ; // as zTXt chunk with signature Raw profile type exif__ + if (!strcmp(szChunk, "eXIf") || !strcmp(szChunk, "iCCP")) { + // do nothing (strip): Exif metadata is written following IHDR + // as zTXt chunk with signature "Raw profile type exif", + // together with the ICC profile as a fresh iCCP chunk +#ifdef EXIV2_DEBUG_MESSAGES + std::cout << "Exiv2::PngImage::doWriteMetadata: strip " << szChunk << " chunk (length: " << dataOffset << ")" + << std::endl; +#endif } else if (!strcmp(szChunk, "IHDR")) { #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::PngImage::doWriteMetadata: Write IHDR chunk (length: " << dataOffset << ")\n"; @@ -636,13 +640,11 @@ void PngImage::doWriteMetadata(BasicIo& outIo) { throw Error(ErrorCode::kerImageWriteFailed); } } - } else if (!strcmp(szChunk, "tEXt") || !strcmp(szChunk, "zTXt") || !strcmp(szChunk, "iTXt") || - !strcmp(szChunk, "iCCP")) { + } else if (!strcmp(szChunk, "tEXt") || !strcmp(szChunk, "zTXt") || !strcmp(szChunk, "iTXt")) { DataBuf key = PngChunk::keyTXTChunk(chunkBuf, true); if (!key.empty() && (compare("Raw profile type exif", key) || compare("Raw profile type APP1", key) || compare("Raw profile type iptc", key) || compare("Raw profile type xmp", key) || - compare("XML:com.adobe.xmp", key) || compare("icc", key) || // see test/data/imagemagick.png - compare("ICC", key) || compare("Description", key))) { + compare("XML:com.adobe.xmp", key) || compare("Description", key))) { #ifdef EXIV2_DEBUG_MESSAGES std::cout << "Exiv2::PngImage::doWriteMetadata: strip " << szChunk << " chunk (length: " << dataOffset << ")" << std::endl; From bae7da19cafba3bc6b84006252120fc713d19b2f Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:22:18 -0700 Subject: [PATCH 18/80] clang-tidy: use default member init Signed-off-by: Rosen Penev --- include/exiv2/basicio.hpp | 2 +- include/exiv2/image.hpp | 14 +++++++------- include/exiv2/tiffimage.hpp | 8 ++++---- include/exiv2/value.hpp | 6 +++--- src/basicio.cpp | 30 +++++++++++------------------- src/image.cpp | 8 ++------ src/preview.cpp | 15 +++++++-------- src/tiffcomposite_int.cpp | 7 +++---- src/tiffcomposite_int.hpp | 24 ++++++++++++------------ src/tiffimage.cpp | 2 +- src/tiffvisitor_int.cpp | 17 +++-------------- src/tiffvisitor_int.hpp | 34 +++++++++++++++++----------------- src/value.cpp | 4 ++-- 13 files changed, 73 insertions(+), 98 deletions(-) diff --git a/include/exiv2/basicio.hpp b/include/exiv2/basicio.hpp index 869a8044..e12aa08a 100644 --- a/include/exiv2/basicio.hpp +++ b/include/exiv2/basicio.hpp @@ -737,7 +737,7 @@ class EXIV2API XPathIo : public FileIo { private: // True if the file is a temporary file and it should be deleted in destructor. - bool isTemp_; + bool isTemp_{true}; std::string tempFilePath_; }; // class XPathIo #endif diff --git a/include/exiv2/image.hpp b/include/exiv2/image.hpp index 2a968fc3..8e0166b1 100644 --- a/include/exiv2/image.hpp +++ b/include/exiv2/image.hpp @@ -467,8 +467,8 @@ class EXIV2API Image { DataBuf iccProfile_; //!< ICC buffer (binary data) std::string comment_; //!< User comment std::string xmpPacket_; //!< XMP packet - uint32_t pixelWidth_; //!< image pixel width - uint32_t pixelHeight_; //!< image pixel height + uint32_t pixelWidth_{0}; //!< image pixel width + uint32_t pixelHeight_{0}; //!< image pixel height NativePreviewList nativePreviews_; //!< list of native previews //! Return tag name for given tag id. @@ -479,13 +479,13 @@ class EXIV2API Image { private: // DATA - ImageType imageType_; //!< Image type - uint16_t supportedMetadata_; //!< Bitmap with all supported metadata types - bool writeXmpFromPacket_; //!< Determines the source when writing XMP - ByteOrder byteOrder_; //!< Byte order + ImageType imageType_; //!< Image type + uint16_t supportedMetadata_; //!< Bitmap with all supported metadata types + bool writeXmpFromPacket_; //!< Determines the source when writing XMP + ByteOrder byteOrder_{invalidByteOrder}; //!< Byte order std::map tags_; //!< Map of tags - bool init_; //!< Flag marking if map of tags needs to be initialized + bool init_{true}; //!< Flag marking if map of tags needs to be initialized }; // class Image diff --git a/include/exiv2/tiffimage.hpp b/include/exiv2/tiffimage.hpp index 121c9021..75fe93eb 100644 --- a/include/exiv2/tiffimage.hpp +++ b/include/exiv2/tiffimage.hpp @@ -85,10 +85,10 @@ class EXIV2API TiffImage : public Image { //@} // DATA - mutable std::string primaryGroup_; //!< The primary group - mutable std::string mimeType_; //!< The MIME type - mutable uint32_t pixelWidthPrimary_; //!< Width of the primary image in pixels - mutable uint32_t pixelHeightPrimary_; //!< Height of the primary image in pixels + mutable std::string primaryGroup_; //!< The primary group + mutable std::string mimeType_; //!< The MIME type + mutable uint32_t pixelWidthPrimary_{0}; //!< Width of the primary image in pixels + mutable uint32_t pixelHeightPrimary_{0}; //!< Height of the primary image in pixels }; // class TiffImage diff --git a/include/exiv2/value.hpp b/include/exiv2/value.hpp index 7152cd69..9cf37588 100644 --- a/include/exiv2/value.hpp +++ b/include/exiv2/value.hpp @@ -229,7 +229,7 @@ class EXIV2API Value { */ Value& operator=(const Value&) = default; // DATA - mutable bool ok_; //!< Indicates the status of the previous to conversion + mutable bool ok_{true}; //!< Indicates the status of the previous to conversion private: //! Internal virtual copy constructor. @@ -648,8 +648,8 @@ class EXIV2API XmpValue : public Value { private: // DATA - XmpArrayType xmpArrayType_; //!< Type of XMP array - XmpStruct xmpStruct_; //!< XMP structure indicator + XmpArrayType xmpArrayType_{xaNone}; //!< Type of XMP array + XmpStruct xmpStruct_{xsNone}; //!< XMP structure indicator }; // class XmpValue diff --git a/src/basicio.cpp b/src/basicio.cpp index 6539b762..b75ee5ef 100644 --- a/src/basicio.cpp +++ b/src/basicio.cpp @@ -899,7 +899,7 @@ void XPathIo::ReadDataUri(const std::string& path) { } #else -XPathIo::XPathIo(const std::string& orgPath) : FileIo(XPathIo::writeDataToFile(orgPath)), isTemp_(true) { +XPathIo::XPathIo(const std::string& orgPath) : FileIo(XPathIo::writeDataToFile(orgPath)) { tempFilePath_ = path(); } @@ -992,15 +992,15 @@ class RemoteIo::Impl { Impl& operator=(const Impl&) = delete; // DATA - std::string path_; //!< (Standard) path - size_t blockSize_; //!< Size of the block memory. - BlockMap* blocksMap_; //!< An array contains all blocksMap - size_t size_; //!< The file size - size_t idx_; //!< Index into the memory area - bool isMalloced_; //!< Was the blocksMap_ allocated? - bool eof_; //!< EOF indicator - Protocol protocol_; //!< the protocol of url - size_t totalRead_; //!< bytes requested from host + std::string path_; //!< (Standard) path + size_t blockSize_; //!< Size of the block memory. + BlockMap* blocksMap_{nullptr}; //!< An array contains all blocksMap + size_t size_{0}; //!< The file size + size_t idx_{0}; //!< Index into the memory area + bool isMalloced_{false}; //!< Was the blocksMap_ allocated? + bool eof_{false}; //!< EOF indicator + Protocol protocol_; //!< the protocol of url + size_t totalRead_{0}; //!< bytes requested from host // METHODS /*! @@ -1042,15 +1042,7 @@ class RemoteIo::Impl { }; // class RemoteIo::Impl RemoteIo::Impl::Impl(const std::string& url, size_t blockSize) : - path_(url), - blockSize_(blockSize), - blocksMap_(nullptr), - size_(0), - idx_(0), - isMalloced_(false), - eof_(false), - protocol_(fileProtocol(url)), - totalRead_(0) { + path_(url), blockSize_(blockSize), protocol_(fileProtocol(url)) { } size_t RemoteIo::Impl::populateBlocks(size_t lowBlock, size_t highBlock) { diff --git a/src/image.cpp b/src/image.cpp index 208fe9c2..b91ca3e7 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -116,17 +116,13 @@ std::string pathOfFileUrl(const std::string& url) { namespace Exiv2 { Image::Image(ImageType type, uint16_t supportedMetadata, BasicIo::UniquePtr io) : io_(std::move(io)), - pixelWidth_(0), - pixelHeight_(0), imageType_(type), supportedMetadata_(supportedMetadata), #ifdef EXV_HAVE_XMP_TOOLKIT - writeXmpFromPacket_(false), + writeXmpFromPacket_(false) { #else - writeXmpFromPacket_(true), + writeXmpFromPacket_(true) { #endif - byteOrder_(invalidByteOrder), - init_(true) { } void Image::printStructure(std::ostream&, PrintStructureOption, int /*depth*/) { diff --git a/src/preview.cpp b/src/preview.cpp index c13e0c5d..2d578006 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -101,16 +101,16 @@ class Loader { const Image& image_; //! Preview image width - size_t width_; + size_t width_{0}; //! Preview image length - size_t height_; + size_t height_{0}; //! Preview image size in bytes - size_t size_; + size_t size_{0}; //! True if the source image contains a preview image of given type - bool valid_; + bool valid_{false}; }; //! Loader for native previews @@ -163,7 +163,7 @@ class LoaderExifJpeg : public Loader { static const Param param_[]; //! Offset value - size_t offset_; + size_t offset_{0}; }; //! Function to create new LoaderExifJpeg @@ -335,8 +335,7 @@ Loader::UniquePtr Loader::create(PreviewId id, const Image& image) { return loader; } -Loader::Loader(PreviewId id, const Image& image) : - id_(id), image_(image), width_(0), height_(0), size_(0), valid_(false) { +Loader::Loader(PreviewId id, const Image& image) : id_(id), image_(image) { } PreviewProperties Loader::getProperties() const { @@ -457,7 +456,7 @@ bool LoaderNative::readDimensions() { return true; } -LoaderExifJpeg::LoaderExifJpeg(PreviewId id, const Image& image, int parIdx) : Loader(id, image), offset_(0) { +LoaderExifJpeg::LoaderExifJpeg(PreviewId id, const Image& image, int parIdx) : Loader(id, image) { const ExifData& exifData = image_.exifData(); auto pos = exifData.findKey(ExifKey(param_[parIdx].offsetKey_)); if (pos != exifData.end() && pos->count() > 0) { diff --git a/src/tiffcomposite_int.cpp b/src/tiffcomposite_int.cpp index 903391ba..f488c5e6 100644 --- a/src/tiffcomposite_int.cpp +++ b/src/tiffcomposite_int.cpp @@ -28,7 +28,7 @@ bool TiffMappingInfo::operator==(const TiffMappingInfo::Key& key) const { } IoWrapper::IoWrapper(BasicIo& io, const byte* pHeader, size_t size, OffsetWriter* pow) : - io_(io), pHeader_(pHeader), size_(size), wroteHeader_(false), pow_(pow) { + io_(io), pHeader_(pHeader), size_(size), pow_(pow) { if (!pHeader_ || size_ == 0) wroteHeader_ = true; } @@ -73,7 +73,7 @@ TiffMnEntry::TiffMnEntry(uint16_t tag, IfdId group, IfdId mnGroup) : } TiffIfdMakernote::TiffIfdMakernote(uint16_t tag, IfdId group, IfdId mnGroup, MnHeader* pHeader, bool hasNext) : - TiffComponent(tag, group), pHeader_(pHeader), ifd_(tag, mnGroup, hasNext), imageByteOrder_(invalidByteOrder) { + TiffComponent(tag, group), pHeader_(pHeader), ifd_(tag, mnGroup, hasNext) { } TiffBinaryArray::TiffBinaryArray(uint16_t tag, IfdId group, const ArrayCfg* arrayCfg, const ArrayDef* arrayDef, @@ -90,8 +90,7 @@ TiffBinaryArray::TiffBinaryArray(uint16_t tag, IfdId group, const ArraySet* arra // We'll figure out the correct cfg later } -TiffBinaryElement::TiffBinaryElement(uint16_t tag, IfdId group) : - TiffEntryBase(tag, group), elByteOrder_(invalidByteOrder) { +TiffBinaryElement::TiffBinaryElement(uint16_t tag, IfdId group) : TiffEntryBase(tag, group) { elDef_.idx_ = 0; elDef_.tiffType_ = ttUndefined; elDef_.count_ = 0; diff --git a/src/tiffcomposite_int.hpp b/src/tiffcomposite_int.hpp index f18ee31f..0f8a04a2 100644 --- a/src/tiffcomposite_int.hpp +++ b/src/tiffcomposite_int.hpp @@ -134,12 +134,12 @@ class IoWrapper { private: // DATA - BasicIo& io_; //! Reference for the IO instance. - const byte* pHeader_; //! Pointer to the header data. - size_t size_; //! Size of the header data. - bool wroteHeader_; //! Indicates if the header has been written. - OffsetWriter* pow_; //! Pointer to an offset-writer, if any, or 0 -}; // class IoWrapper + BasicIo& io_; //! Reference for the IO instance. + const byte* pHeader_; //! Pointer to the header data. + size_t size_; //! Size of the header data. + bool wroteHeader_{false}; //! Indicates if the header has been written. + OffsetWriter* pow_; //! Pointer to an offset-writer, if any, or 0 +}; // class IoWrapper /*! @brief Interface class for components of a TIFF directory hierarchy @@ -1229,10 +1229,10 @@ class TiffIfdMakernote : public TiffComponent { private: // DATA - MnHeader* pHeader_; //!< Makernote header - TiffDirectory ifd_; //!< Makernote IFD - uint32_t mnOffset_{}; //!< Makernote offset - ByteOrder imageByteOrder_; //!< Byte order for the image + MnHeader* pHeader_; //!< Makernote header + TiffDirectory ifd_; //!< Makernote IFD + uint32_t mnOffset_{}; //!< Makernote offset + ByteOrder imageByteOrder_{invalidByteOrder}; //!< Byte order for the image }; // class TiffIfdMakernote @@ -1496,8 +1496,8 @@ class TiffBinaryElement : public TiffEntryBase { private: // DATA - ArrayDef elDef_; //!< The array element definition - ByteOrder elByteOrder_; //!< Byte order to read/write the element + ArrayDef elDef_; //!< The array element definition + ByteOrder elByteOrder_{invalidByteOrder}; //!< Byte order to read/write the element }; // class TiffBinaryElement diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index fadf8c80..1e6938d4 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -39,7 +39,7 @@ namespace Exiv2 { using namespace Internal; TiffImage::TiffImage(BasicIo::UniquePtr io, bool /*create*/) : - Image(ImageType::tiff, mdExif | mdIptc | mdXmp, std::move(io)), pixelWidthPrimary_(0), pixelHeightPrimary_(0) { + Image(ImageType::tiff, mdExif | mdIptc | mdXmp, std::move(io)) { } // TiffImage::TiffImage //! Structure for TIFF compression to MIME type mappings diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index b7a39ceb..61ea1d29 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -193,8 +193,7 @@ TiffDecoder::TiffDecoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpDat iptcData_(iptcData), xmpData_(xmpData), pRoot_(pRoot), - findDecoderFct_(std::move(findDecoderFct)), - decodedIptc_(false) { + findDecoderFct_(std::move(findDecoderFct)) { // #1402 Fujifilm RAF. Search for the make // Find camera make in existing metadata (read from the JPEG) ExifKey key("Exif.Image.Make"); @@ -454,15 +453,11 @@ TiffEncoder::TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpD exifData_(std::move(exifData)), iptcData_(iptcData), xmpData_(xmpData), - del_(true), pHeader_(pHeader), pRoot_(pRoot), isNewImage_(isNewImage), pPrimaryGroups_(pPrimaryGroups), - pSourceTree_(nullptr), - findEncoderFct_(std::move(findEncoderFct)), - dirty_(false), - writeMethod_(wmNonIntrusive) { + findEncoderFct_(std::move(findEncoderFct)) { byteOrder_ = pHeader->byteOrder(); origByteOrder_ = byteOrder_; @@ -994,13 +989,7 @@ void TiffEncoder::add(TiffComponent* pRootDir, TiffComponent* pSourceDir, uint32 } // TiffEncoder::add TiffReader::TiffReader(const byte* pData, size_t size, TiffComponent* pRoot, TiffRwState state) : - pData_(pData), - size_(size), - pLast_(pData + size), - pRoot_(pRoot), - origState_(state), - mnState_(state), - postProc_(false) { + pData_(pData), size_(size), pLast_(pData + size), pRoot_(pRoot), origState_(state), mnState_(state) { pState_ = &origState_; } // TiffReader::TiffReader diff --git a/src/tiffvisitor_int.hpp b/src/tiffvisitor_int.hpp index 8dceb456..40fbc45a 100644 --- a/src/tiffvisitor_int.hpp +++ b/src/tiffvisitor_int.hpp @@ -317,7 +317,7 @@ class TiffDecoder : public TiffVisitor { TiffComponent* pRoot_; //!< Root element of the composite FindDecoderFct findDecoderFct_; //!< Ptr to the function to find special decoding functions std::string make_; //!< Camera make, determined from the tags to decode - bool decodedIptc_; //!< Indicates if IPTC has been decoded yet + bool decodedIptc_{false}; //!< Indicates if IPTC has been decoded yet }; // class TiffDecoder @@ -503,21 +503,21 @@ class TiffEncoder : public TiffVisitor { //@} // DATA - ExifData exifData_; //!< Copy of the Exif data to encode - const IptcData& iptcData_; //!< IPTC data to encode, just a reference - const XmpData& xmpData_; //!< XMP data to encode, just a reference - bool del_; //!< Indicates if Exif data entries should be deleted after encoding - const TiffHeaderBase* pHeader_; //!< TIFF image header - TiffComponent* pRoot_; //!< Root element of the composite - const bool isNewImage_; //!< True if the TIFF image is created from scratch - const PrimaryGroups* pPrimaryGroups_; //!< List of primary image groups - TiffComponent* pSourceTree_; //!< Parsed source tree for reference - ByteOrder byteOrder_; //!< Byteorder for encoding - ByteOrder origByteOrder_; //!< Byteorder as set in the c'tor - const FindEncoderFct findEncoderFct_; //!< Ptr to the function to find special encoding functions - std::string make_; //!< Camera make, determined from the tags to encode - bool dirty_; //!< Signals if any tag is deleted or allocated - WriteMethod writeMethod_; //!< Write method used. + ExifData exifData_; //!< Copy of the Exif data to encode + const IptcData& iptcData_; //!< IPTC data to encode, just a reference + const XmpData& xmpData_; //!< XMP data to encode, just a reference + bool del_{true}; //!< Indicates if Exif data entries should be deleted after encoding + const TiffHeaderBase* pHeader_; //!< TIFF image header + TiffComponent* pRoot_; //!< Root element of the composite + bool isNewImage_; //!< True if the TIFF image is created from scratch + const PrimaryGroups* pPrimaryGroups_; //!< List of primary image groups + TiffComponent* pSourceTree_{nullptr}; //!< Parsed source tree for reference + ByteOrder byteOrder_; //!< Byteorder for encoding + ByteOrder origByteOrder_; //!< Byteorder as set in the c'tor + FindEncoderFct findEncoderFct_; //!< Ptr to the function to find special encoding functions + std::string make_; //!< Camera make, determined from the tags to encode + bool dirty_{false}; //!< Signals if any tag is deleted or allocated + WriteMethod writeMethod_{wmNonIntrusive}; //!< Write method used. }; // class TiffEncoder @@ -669,7 +669,7 @@ class TiffReader : public TiffVisitor { DirList dirList_; //!< List of IFD pointers and their groups IdxSeq idxSeq_; //!< Sequences for group, used for the entry's idx PostList postList_; //!< List of components with deferred reading - bool postProc_; //!< True in postProcessList() + bool postProc_{false}; //!< True in postProcessList() }; // class TiffReader } // namespace Internal diff --git a/src/value.cpp b/src/value.cpp index 526c57e7..06880825 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -15,7 +15,7 @@ // ***************************************************************************** // class member definitions namespace Exiv2 { -Value::Value(TypeId typeId) : ok_(true), type_(typeId) { +Value::Value(TypeId typeId) : type_(typeId) { } Value::UniquePtr Value::create(TypeId typeId) { @@ -448,7 +448,7 @@ CommentValue* CommentValue::clone_() const { return new CommentValue(*this); } -XmpValue::XmpValue(TypeId typeId) : Value(typeId), xmpArrayType_(xaNone), xmpStruct_(xsNone) { +XmpValue::XmpValue(TypeId typeId) : Value(typeId) { } void XmpValue::setXmpArrayType(XmpArrayType xmpArrayType) { From a0ab146e3b82ab1c37fe619251167883c50d3d75 Mon Sep 17 00:00:00 2001 From: Christoph Hasse Date: Tue, 5 Jul 2022 09:59:22 +0200 Subject: [PATCH 19/80] fix(ci) disable webready and curl for release builds [ci skip] --- .github/workflows/release.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0bd8c767..5d9cbf3c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install ninja-build gettext doxygen graphviz - pip3 install conan==1.45.0 + pip3 install conan==1.48.1 - name: Conan common config run: | @@ -39,7 +39,7 @@ jobs: - name: Build packaged release run: | - cmake --preset linux-all -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON + cmake --preset linux-all -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DEXIV2_ENABLE_WEBREADY=OFF -DEXIV2_ENABLE_CURL=OFF cmake --build build -t doc cmake --build build -t package @@ -105,20 +105,28 @@ jobs: - name: Set up Python uses: actions/setup-python@v3 with: - python-version: 3.9 + python-version: 3.7 - name: Install doxygen run: | choco install doxygen.install choco install graphviz + - name: Restore conan cache + uses: actions/cache@v2 + with: + path: ${{github.workspace}}/conanCache + key: ${{runner.os}}-release-win-${{ hashFiles('conanfile.py') }} + - name: Install Conan & Common config run: | - pip.exe install "conan==1.45.0" + pip.exe install "conan==1.48.1" conan profile new --detect default + conan profile show default conan profile update settings.build_type=Release default conan profile update settings.compiler="Visual Studio" default conan profile update settings.compiler.version=17 default + conan config set storage.path=$Env:GITHUB_WORKSPACE/conanCache - name: Run Conan run: | @@ -128,9 +136,9 @@ jobs: - name: Build packaged release run: | - cmake --preset win-release -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DEXIV2_BUILD_DOC=ON - cmake --build build -t doc - cmake --build build -t package + cmake --preset win-release -S . -B build -DEXIV2_TEAM_PACKAGING=ON -DEXIV2_BUILD_DOC=ON -DEXIV2_ENABLE_WEBREADY=OFF -DEXIV2_ENABLE_CURL=OFF + cmake --build build --parallel -t doc + cmake --build build --parallel -t package - uses: actions/upload-artifact@v3 with: From fc0e0506a12f1d2bfc1417c4fc55293278d0aec2 Mon Sep 17 00:00:00 2001 From: Christoph Hasse Date: Tue, 5 Jul 2022 15:55:29 +0200 Subject: [PATCH 20/80] fix(ci) adapt to breaking changes of upgrading github-script [ci skip] --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d9cbf3c..df60c687 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -186,14 +186,14 @@ jobs: with: script: | try{ - const rel_id = await github.repos.getReleaseByTag({ + const rel_id = await github.rest.repos.getReleaseByTag({ ...context.repo, tag: "nightly" }).then(result => result.data.id); console.log( "Found existing nightly release with id: ", rel_id); - await github.repos.deleteRelease({ + await github.rest.repos.deleteRelease({ ...context.repo, release_id: rel_id }); @@ -205,7 +205,7 @@ jobs: } try{ - await github.git.deleteRef({ + await github.rest.git.deleteRef({ ...context.repo, ref: "tags/nightly" }); From b3f2ab59881606954c906292ead9757889838cfc Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Tue, 5 Jul 2022 18:34:57 +0100 Subject: [PATCH 21/80] Fix some "signed shift" warnings. --- cmake/config.h.cmake | 8 +++---- include/exiv2/version.hpp | 6 ++--- include/exiv2/webpimage.hpp | 3 ++- src/types.cpp | 48 ++++++++++++++++++------------------- src/version.cpp | 4 ++-- src/webpimage.cpp | 16 ++++++------- 6 files changed, 43 insertions(+), 42 deletions(-) diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake index 0bed81c5..c42d9ed8 100644 --- a/cmake/config.h.cmake +++ b/cmake/config.h.cmake @@ -62,10 +62,10 @@ /* Define to the version of this package. */ #cmakedefine EXV_PACKAGE_VERSION "@PROJECT_VERSION@" -#define EXIV2_MAJOR_VERSION (@PROJECT_VERSION_MAJOR@) -#define EXIV2_MINOR_VERSION (@PROJECT_VERSION_MINOR@) -#define EXIV2_PATCH_VERSION (@PROJECT_VERSION_PATCH@) -#define EXIV2_TWEAK_VERSION (@PROJECT_VERSION_TWEAK@) +#define EXIV2_MAJOR_VERSION (@PROJECT_VERSION_MAJOR@U) +#define EXIV2_MINOR_VERSION (@PROJECT_VERSION_MINOR@U) +#define EXIV2_PATCH_VERSION (@PROJECT_VERSION_PATCH@U) +#define EXIV2_TWEAK_VERSION (@PROJECT_VERSION_TWEAK@U) // Definition to enable translation of Nikon lens names. #cmakedefine EXV_HAVE_LENSDATA diff --git a/include/exiv2/version.hpp b/include/exiv2/version.hpp index 86ce9a98..703c4abb 100644 --- a/include/exiv2/version.hpp +++ b/include/exiv2/version.hpp @@ -72,9 +72,9 @@ // namespace extensions namespace Exiv2 { /*! - @brief Return the version of %Exiv2 available at runtime as an integer. + @brief Return the version of %Exiv2 available at runtime as a uint32_t. */ -EXIV2API int versionNumber(); +EXIV2API uint32_t versionNumber(); /*! @brief Return the version string Example: "0.25.0" (major.minor.patch) */ @@ -96,7 +96,7 @@ EXIV2API const char* version(); Versions are denoted using a triplet of integers: \em major.minor.patch . The fourth version number is designated a "tweak" an used by Release Candidates */ -EXIV2API bool testVersion(int major, int minor, int patch); +EXIV2API bool testVersion(uint32_t major, uint32_t minor, uint32_t patch); /*! @brief dumpLibraryInfo implements the exiv2 option --version --verbose used by exiv2 test suite to inspect libraries loaded at run-time diff --git a/include/exiv2/webpimage.hpp b/include/exiv2/webpimage.hpp index 5fbc6d6b..317e5986 100644 --- a/include/exiv2/webpimage.hpp +++ b/include/exiv2/webpimage.hpp @@ -70,7 +70,8 @@ class EXIV2API WebPImage : public Image { static bool equalsWebPTag(Exiv2::DataBuf& buf, const char* str); void debugPrintHex(byte* data, size_t size); void decodeChunks(uint32_t filesize); - void inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_alpha, bool has_icc, int width, int height); + void inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_alpha, bool has_icc, uint32_t width, + uint32_t height); /* Misc. */ static constexpr byte WEBP_PAD_ODD = 0; static constexpr int WEBP_TAG_SIZE = 0x4; diff --git a/src/types.cpp b/src/types.cpp index 8cb4b618..1ec865e4 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -332,26 +332,26 @@ double getDouble(const byte* buf, ByteOrder byteOrder) { long us2Data(byte* buf, uint16_t s, ByteOrder byteOrder) { if (byteOrder == littleEndian) { - buf[0] = static_cast(s & 0x00ff); - buf[1] = static_cast((s & 0xff00) >> 8); + buf[0] = static_cast(s & 0x00ffU); + buf[1] = static_cast((s & 0xff00U) >> 8); } else { - buf[0] = static_cast((s & 0xff00) >> 8); - buf[1] = static_cast(s & 0x00ff); + buf[0] = static_cast((s & 0xff00U) >> 8); + buf[1] = static_cast(s & 0x00ffU); } return 2; } long ul2Data(byte* buf, uint32_t l, ByteOrder byteOrder) { if (byteOrder == littleEndian) { - buf[0] = static_cast(l & 0x000000ff); - buf[1] = static_cast((l & 0x0000ff00) >> 8); - buf[2] = static_cast((l & 0x00ff0000) >> 16); - buf[3] = static_cast((l & 0xff000000) >> 24); + buf[0] = static_cast(l & 0x000000ffU); + buf[1] = static_cast((l & 0x0000ff00U) >> 8); + buf[2] = static_cast((l & 0x00ff0000U) >> 16); + buf[3] = static_cast((l & 0xff000000U) >> 24); } else { - buf[0] = static_cast((l & 0xff000000) >> 24); - buf[1] = static_cast((l & 0x00ff0000) >> 16); - buf[2] = static_cast((l & 0x0000ff00) >> 8); - buf[3] = static_cast(l & 0x000000ff); + buf[0] = static_cast((l & 0xff000000U) >> 24); + buf[1] = static_cast((l & 0x00ff0000U) >> 16); + buf[2] = static_cast((l & 0x0000ff00U) >> 8); + buf[3] = static_cast(l & 0x000000ffU); } return 4; } @@ -379,26 +379,26 @@ long ur2Data(byte* buf, URational l, ByteOrder byteOrder) { long s2Data(byte* buf, int16_t s, ByteOrder byteOrder) { if (byteOrder == littleEndian) { - buf[0] = static_cast(s & 0x00ff); - buf[1] = static_cast((s & 0xff00) >> 8); + buf[0] = static_cast(s & 0x00ffU); + buf[1] = static_cast((s & 0xff00U) >> 8); } else { - buf[0] = static_cast((s & 0xff00) >> 8); - buf[1] = static_cast(s & 0x00ff); + buf[0] = static_cast((s & 0xff00U) >> 8); + buf[1] = static_cast(s & 0x00ffU); } return 2; } long l2Data(byte* buf, int32_t l, ByteOrder byteOrder) { if (byteOrder == littleEndian) { - buf[0] = static_cast(l & 0x000000ff); - buf[1] = static_cast((l & 0x0000ff00) >> 8); - buf[2] = static_cast((l & 0x00ff0000) >> 16); - buf[3] = static_cast((l & 0xff000000) >> 24); + buf[0] = static_cast(l & 0x000000ffU); + buf[1] = static_cast((l & 0x0000ff00U) >> 8); + buf[2] = static_cast((l & 0x00ff0000U) >> 16); + buf[3] = static_cast((l & 0xff000000U) >> 24); } else { - buf[0] = static_cast((l & 0xff000000) >> 24); - buf[1] = static_cast((l & 0x00ff0000) >> 16); - buf[2] = static_cast((l & 0x0000ff00) >> 8); - buf[3] = static_cast(l & 0x000000ff); + buf[0] = static_cast((l & 0xff000000U) >> 24); + buf[1] = static_cast((l & 0x00ff0000U) >> 16); + buf[2] = static_cast((l & 0x0000ff00U) >> 8); + buf[3] = static_cast(l & 0x000000ffU); } return 4; } diff --git a/src/version.cpp b/src/version.cpp index b3f65f18..f719f4b0 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -58,7 +58,7 @@ #endif namespace Exiv2 { -int versionNumber() { +uint32_t versionNumber() { return EXIV2_MAKE_VERSION(EXIV2_MAJOR_VERSION, EXIV2_MINOR_VERSION, EXIV2_PATCH_VERSION); } @@ -78,7 +78,7 @@ const char* version() { return EXV_PACKAGE_VERSION; } -bool testVersion(int major, int minor, int patch) { +bool testVersion(uint32_t major, uint32_t minor, uint32_t patch) { return versionNumber() >= EXIV2_MAKE_VERSION(major, minor, patch); } } // namespace Exiv2 diff --git a/src/webpimage.cpp b/src/webpimage.cpp index 954254a2..c6c80490 100644 --- a/src/webpimage.cpp +++ b/src/webpimage.cpp @@ -132,8 +132,8 @@ void WebPImage::doWriteMetadata(BasicIo& outIo) { bool has_alpha = false; bool has_icc = iccProfileDefined(); - int width = 0; - int height = 0; + uint32_t width = 0; + uint32_t height = 0; byte size_buff[WEBP_TAG_SIZE]; Blob blob; @@ -244,8 +244,8 @@ void WebPImage::doWriteMetadata(BasicIo& outIo) { // Fetch height - 14 bits wide memcpy(&size_buf_h, payload.c_data(2), 3); - size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3F) << 0x2); - size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xF) << 0x2); + size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3FU) << 0x2); + size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xFU) << 0x2); height = Exiv2::getUShort(size_buf_h, littleEndian) + 1; } @@ -567,8 +567,8 @@ void WebPImage::decodeChunks(uint32_t filesize) { // Fetch height memcpy(&size_buf_h, payload.c_data(2), 3); - size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3F) << 0x2); - size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xF) << 0x2); + size_buf_h[0] = ((size_buf_h[0] >> 6) & 0x3) | ((size_buf_h[1] & 0x3FU) << 0x2); + size_buf_h[1] = ((size_buf_h[1] >> 6) & 0x3) | ((size_buf_h[2] & 0xFU) << 0x2); pixelHeight_ = Exiv2::getUShort(size_buf_h, littleEndian) + 1; } else if (equalsWebPTag(chunkId, WEBP_CHUNK_HEADER_ANMF) && !has_canvas_data) { enforce(size >= 12, Exiv2::ErrorCode::kerCorruptedMetadata); @@ -737,8 +737,8 @@ bool WebPImage::equalsWebPTag(Exiv2::DataBuf& buf, const char* str) { @param has_exif Verify if we have exif data and set required flag @return Returns void */ -void WebPImage::inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_alpha, bool has_icc, int width, - int height) { +void WebPImage::inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_alpha, bool has_icc, uint32_t width, + uint32_t height) { byte size[4] = {0x0A, 0x00, 0x00, 0x00}; byte data[10] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; iIo.write(reinterpret_cast(WEBP_CHUNK_HEADER_VP8X), WEBP_TAG_SIZE); From 1ada3607744ed1fc5fbb92477c806e0df38e1bc0 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Tue, 5 Jul 2022 17:50:27 +0100 Subject: [PATCH 22/80] Fix some incorrect format specifiers. --- src/bmffimage.cpp | 2 +- src/image.cpp | 2 +- src/jp2image.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index e27207d9..70906a09 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -565,7 +565,7 @@ void BmffImage::parseCr3Preview(DataBuf& data, std::ostream& out, bool bTrace, u nativePreviews_.push_back(nativePreview); if (bTrace) { - out << Internal::stringFormat("width,height,size = %u,%u,%u", nativePreview.width_, nativePreview.height_, + out << Internal::stringFormat("width,height,size = %zu,%zu,%zu", nativePreview.width_, nativePreview.height_, nativePreview.size_); } } diff --git a/src/image.cpp b/src/image.cpp index 93cbfa59..70b65a59 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -381,7 +381,7 @@ void Image::printIFDStructure(BasicIo& io, std::ostream& out, Exiv2::PrintStruct const std::string offsetString = bOffsetIsPointer ? Internal::stringFormat("%10u", offset) : ""; out << Internal::indent(depth) - << Internal::stringFormat("%8u | %#06x %-28s |%10s |%9u |%10s | ", address, tag, tagName(tag).c_str(), + << Internal::stringFormat("%8zu | %#06x %-28s |%10s |%9u |%10s | ", address, tag, tagName(tag).c_str(), typeName(type), count, offsetString.c_str()); if (isShortType(type)) { for (size_t k = 0; k < kount; k++) { diff --git a/src/jp2image.cpp b/src/jp2image.cpp index 5892557f..3df9526e 100644 --- a/src/jp2image.cpp +++ b/src/jp2image.cpp @@ -468,7 +468,7 @@ void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, in DataBuf data(subBox.length - boxHSize); io_->read(data.data(), data.size()); if (bPrint) { - out << Internal::stringFormat("%8ld | %8ld | sub:", address, subBox.length) << toAscii(subBox.type) + out << Internal::stringFormat("%8zu | %8u | sub:", address, subBox.length) << toAscii(subBox.type) << " | " << Internal::binaryToString(makeSlice(data, 0, std::min(static_cast(30), data.size()))); bLF = true; From f787a4c2acda86016ae58c5c9dbb6d88b86cac30 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:36:06 -0700 Subject: [PATCH 23/80] clang-tidy: add missing override Signed-off-by: Rosen Penev --- include/exiv2/webpimage.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/exiv2/webpimage.hpp b/include/exiv2/webpimage.hpp index 317e5986..dd59142f 100644 --- a/include/exiv2/webpimage.hpp +++ b/include/exiv2/webpimage.hpp @@ -54,7 +54,7 @@ class EXIV2API WebPImage : public Image { [[nodiscard]] std::string mimeType() const override; //@} - ~WebPImage() = default; + ~WebPImage() override = default; //! Copy constructor WebPImage(const WebPImage&) = delete; //! Assignment operator From c2be02145d88ba9733bbd50b1a739cbfa4ccfa7f Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:39:15 -0700 Subject: [PATCH 24/80] clang-tidy: use C++ casts Signed-off-by: Rosen Penev --- app/exiv2.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/exiv2.cpp b/app/exiv2.cpp index a81f2123..c4f7dd19 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -742,12 +742,12 @@ int Params::evalDelete(const std::string& optArg) { switch (action_) { case Action::none: action_ = Action::erase; - target_ = CommonTarget(0); + target_ = static_cast(0); // fallthrough case Action::erase: { const auto rc = parseCommonTargets(optArg, "erase"); if (rc > 0) { - target_ |= CommonTarget(rc); + target_ |= static_cast(rc); return 0; } else { return 1; @@ -764,12 +764,12 @@ int Params::evalExtract(const std::string& optArg) { case Action::none: case Action::modify: action_ = Action::extract; - target_ = CommonTarget(0); + target_ = static_cast(0); // fallthrough case Action::extract: { const auto rc = parseCommonTargets(optArg, "extract"); if (rc > 0) { - target_ |= CommonTarget(rc); + target_ |= static_cast(rc); return 0; } else { return 1; @@ -786,12 +786,12 @@ int Params::evalInsert(const std::string& optArg) { case Action::none: case Action::modify: action_ = Action::insert; - target_ = CommonTarget(0); + target_ = static_cast(0); // fallthrough case Action::insert: { const auto rc = parseCommonTargets(optArg, "insert"); if (rc > 0) { - target_ |= CommonTarget(rc); + target_ |= static_cast(rc); return 0; } else { return 1; @@ -1139,7 +1139,7 @@ void printUnrecognizedArgument(const char argc, const std::string& action) { int64_t parseCommonTargets(const std::string& optArg, const std::string& action) { int64_t rc = 0; - Params::CommonTarget target = Params::CommonTarget(0); + Params::CommonTarget target = static_cast(0); Params::CommonTarget all = Params::ctExif | Params::ctIptc | Params::ctComment | Params::ctXmp; Params::CommonTarget extra = Params::ctXmpSidecar | Params::ctExif | Params::ctIptc | Params::ctXmp; for (size_t i = 0; rc == 0 && i < optArg.size(); ++i) { @@ -1175,7 +1175,7 @@ int64_t parseCommonTargets(const std::string& optArg, const std::string& action) target |= extra; // -eX if (i > 0) { // -eXX or -iXX target |= Params::ctXmpRaw; - target = Params::CommonTarget(target & ~extra); // turn off those bits + target = static_cast(target & ~extra); // turn off those bits } break; @@ -1196,7 +1196,7 @@ int64_t parseCommonTargets(const std::string& optArg, const std::string& action) break; } } - return rc ? rc : int64_t(target); + return rc ? rc : static_cast(target); } int parsePreviewNumbers(Params::PreviewNumbers& previewNumbers, const std::string& optArg, int j) { From 84555f1ad51f5b6f9ac5da97831073d23351477b Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:43:52 -0700 Subject: [PATCH 25/80] clang-tidy: no else after return Signed-off-by: Rosen Penev --- app/exiv2.cpp | 9 +++------ src/types.cpp | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/exiv2.cpp b/app/exiv2.cpp index c4f7dd19..cef78b55 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -749,9 +749,8 @@ int Params::evalDelete(const std::string& optArg) { if (rc > 0) { target_ |= static_cast(rc); return 0; - } else { - return 1; } + return 1; } default: std::cerr << progname() << ": " << _("Option -d is not compatible with a previous option\n"); @@ -771,9 +770,8 @@ int Params::evalExtract(const std::string& optArg) { if (rc > 0) { target_ |= static_cast(rc); return 0; - } else { - return 1; } + return 1; } default: std::cerr << progname() << ": " << _("Option -e is not compatible with a previous option\n"); @@ -793,9 +791,8 @@ int Params::evalInsert(const std::string& optArg) { if (rc > 0) { target_ |= static_cast(rc); return 0; - } else { - return 1; } + return 1; } default: std::cerr << progname() << ": " << _("Option -i is not compatible with a previous option\n"); diff --git a/src/types.cpp b/src/types.cpp index 1ec865e4..ff6bc48b 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -178,7 +178,8 @@ byte* Exiv2::DataBuf::data(size_t offset) { const byte* Exiv2::DataBuf::c_data(size_t offset) const { if (pData_.empty()) { return nullptr; - } else if (offset >= pData_.size()) { + } + if (offset >= pData_.size()) { throw std::out_of_range("Overflow in Exiv2::DataBuf::c_data"); } return &pData_[offset]; From 5ca0acd1299c013222251e58f98eea781858356e Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:49:43 -0700 Subject: [PATCH 26/80] clang-tidy: some llvm- warnings Signed-off-by: Rosen Penev --- include/exiv2/bmffimage.hpp | 2 +- include/exiv2/properties.hpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/exiv2/bmffimage.hpp b/include/exiv2/bmffimage.hpp index d7963837..7fc29479 100644 --- a/include/exiv2/bmffimage.hpp +++ b/include/exiv2/bmffimage.hpp @@ -14,7 +14,7 @@ // namespace extensions namespace Exiv2 { EXIV2API bool enableBMFF(bool enable = true); -} +} // namespace Exiv2 #ifdef EXV_ENABLE_BMFF namespace Exiv2 { diff --git a/include/exiv2/properties.hpp b/include/exiv2/properties.hpp index 36dc8179..295306fb 100644 --- a/include/exiv2/properties.hpp +++ b/include/exiv2/properties.hpp @@ -8,6 +8,7 @@ // included header files #include + #include "datasets.hpp" // ***************************************************************************** From c74ae5aa00a6ce576daab0797a5d389bd50c896e Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 20 Jun 2022 23:55:56 -0700 Subject: [PATCH 27/80] clang-tidy: remove const char operator It morphs into std::string anyway. Signed-off-by: Rosen Penev --- include/exiv2/xmp_exiv2.hpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/include/exiv2/xmp_exiv2.hpp b/include/exiv2/xmp_exiv2.hpp index ec3d02c6..e8a0495c 100644 --- a/include/exiv2/xmp_exiv2.hpp +++ b/include/exiv2/xmp_exiv2.hpp @@ -58,11 +58,6 @@ class EXIV2API Xmpdatum : public Metadatum { Calls setValue(const std::string&). */ Xmpdatum& operator=(const std::string& value); - /*! - @brief Assign const char* \em value to the %Xmpdatum. - Calls operator=(const std::string&). - */ - Xmpdatum& operator=(const char* value); /*! @brief Assign a boolean \em value to the %Xmpdatum. Translates the value to a string "true" or "false". @@ -404,10 +399,6 @@ class EXIV2API XmpParser { // ***************************************************************************** // free functions, template and inline definitions -inline Xmpdatum& Xmpdatum::operator=(const char* value) { - return Xmpdatum::operator=(std::string(value)); -} - inline Xmpdatum& Xmpdatum::operator=(const bool& value) { return operator=(value ? "True" : "False"); } From e2ee1338f500b30d931de8f8a105e8bf02231e88 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Tue, 21 Jun 2022 00:06:34 -0700 Subject: [PATCH 28/80] pass bool by value No sense in passing by reference Signed-off-by: Rosen Penev --- include/exiv2/xmp_exiv2.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/exiv2/xmp_exiv2.hpp b/include/exiv2/xmp_exiv2.hpp index e8a0495c..064a46d7 100644 --- a/include/exiv2/xmp_exiv2.hpp +++ b/include/exiv2/xmp_exiv2.hpp @@ -62,7 +62,7 @@ class EXIV2API Xmpdatum : public Metadatum { @brief Assign a boolean \em value to the %Xmpdatum. Translates the value to a string "true" or "false". */ - Xmpdatum& operator=(const bool& value); + Xmpdatum& operator=(bool value); /*! @brief Assign a \em value of any type with an output operator to the %Xmpdatum. Calls operator=(const std::string&). @@ -399,7 +399,7 @@ class EXIV2API XmpParser { // ***************************************************************************** // free functions, template and inline definitions -inline Xmpdatum& Xmpdatum::operator=(const bool& value) { +inline Xmpdatum& Xmpdatum::operator=(bool value) { return operator=(value ? "True" : "False"); } From fc1a39848853ff2d5c8e3046c508a498464fb7b4 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Tue, 21 Jun 2022 00:08:28 -0700 Subject: [PATCH 29/80] clang-tidy: remove const It doesn't do what it's supposed to here. Found with misc-misplaced-const Signed-off-by: Rosen Penev --- src/xmp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xmp.cpp b/src/xmp.cpp index cb4f422d..ed54b340 100644 --- a/src/xmp.cpp +++ b/src/xmp.cpp @@ -53,7 +53,7 @@ class XMLValidator { // error out if the depth exceeds this limit. static const size_t max_recursion_limit_ = 1000; - const XML_Parser parser_; + XML_Parser parser_; public: // Runs an XML parser on `buf`. Throws an exception if the XML is invalid. From 9f989e42285e36739481a7a5e6b3355a2aaa97d8 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Jul 2022 12:28:45 -0700 Subject: [PATCH 30/80] clang-tidy: use auto Signed-off-by: Rosen Penev --- app/exiv2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/exiv2.cpp b/app/exiv2.cpp index cef78b55..1ca9846d 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -1136,7 +1136,7 @@ void printUnrecognizedArgument(const char argc, const std::string& action) { int64_t parseCommonTargets(const std::string& optArg, const std::string& action) { int64_t rc = 0; - Params::CommonTarget target = static_cast(0); + auto target = static_cast(0); Params::CommonTarget all = Params::ctExif | Params::ctIptc | Params::ctComment | Params::ctXmp; Params::CommonTarget extra = Params::ctXmpSidecar | Params::ctExif | Params::ctIptc | Params::ctXmp; for (size_t i = 0; rc == 0 && i < optArg.size(); ++i) { From 3e37c17f5169a400d41790d0145e896d548ca25d Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Jul 2022 12:30:46 -0700 Subject: [PATCH 31/80] clang-tidy: missing override Signed-off-by: Rosen Penev --- app/exiv2app.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/exiv2app.hpp b/app/exiv2app.hpp index cae67770..5c278f9a 100644 --- a/app/exiv2app.hpp +++ b/app/exiv2app.hpp @@ -122,7 +122,7 @@ class Params : public Util::Getopt { static Params& instance(); //! Prevent copy-construction: not implemented. - ~Params() = default; + ~Params() override = default; Params(const Params&) = delete; Params& operator=(const Params&) = delete; From 7f9242afc6105c0a422ed3d2b50823f4d4e4cd94 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Jul 2022 12:34:29 -0700 Subject: [PATCH 32/80] clang-tidy: replace + with append() Silences clang-tidy performance warning Signed-off-by: Rosen Penev --- src/nikonmn_int.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 15236e6f..047beba9 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -3233,9 +3233,9 @@ std::ostream& Nikon3MakerNote::print0x009e(std::ostream& os, const Value& value, std::string d = s.empty() ? "" : "; "; const TagDetails* td = find(nikonRetouchHistory, l); if (td) { - s = std::string(exvGettext(td->label_)) + d + s; + s = std::string(exvGettext(td->label_)).append(d).append(s); } else { - s = std::string(_("Unknown")) + std::string(" (") + toString(l) + std::string(")") + d + s; + s = std::string(_("Unknown")).append(" (").append(toString(l)).append(")").append(d).append(s); } } return os << s; From c0083d6788254c58dd7dfcaed7667fbab5312da1 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Jul 2022 12:38:32 -0700 Subject: [PATCH 33/80] clang-tidy: fix mismatching declaration variable Signed-off-by: Rosen Penev --- src/utils.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.hpp b/src/utils.hpp index 1e16648d..c385b07d 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -14,7 +14,7 @@ constexpr bool startsWith(std::string_view s, std::string_view start) { std::string upper(const std::string& str); /// @brief Returns the lowercase version of \b str -std::string lower(const std::string& str); +std::string lower(const std::string& a); } // namespace Exiv2::Internal From 5be42f132cf9f2204d69e414f88229874a845881 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 2 Jul 2022 13:20:23 -0700 Subject: [PATCH 34/80] try to fix some fanalyzer warnings Signed-off-by: Rosen Penev --- src/convert.cpp | 2 +- src/pngchunk_int.cpp | 18 ++++++------------ src/tags.cpp | 2 +- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/convert.cpp b/src/convert.cpp index de9aafac..2ea74b31 100644 --- a/src/convert.cpp +++ b/src/convert.cpp @@ -1284,7 +1284,7 @@ std::string Converter::computeExifDigest(bool tiff) { } #else std::string Converter::computeExifDigest(bool) { - return std::string(""); + return {}; } #endif diff --git a/src/pngchunk_int.cpp b/src/pngchunk_int.cpp index 53ae8093..c202a6d5 100644 --- a/src/pngchunk_int.cpp +++ b/src/pngchunk_int.cpp @@ -318,31 +318,25 @@ void PngChunk::parseChunkContent(Image* pImage, const byte* key, size_t keySize, } // PngChunk::parseChunkContent std::string PngChunk::makeMetadataChunk(const std::string& metadata, MetadataId type) { - std::string chunk; std::string rawProfile; switch (type) { case mdComment: - chunk = makeUtf8TxtChunk("Description", metadata, true); - break; + return makeUtf8TxtChunk("Description", metadata, true); case mdExif: rawProfile = writeRawProfile(metadata, "exif"); - chunk = makeAsciiTxtChunk("Raw profile type exif", rawProfile, true); - break; + return makeAsciiTxtChunk("Raw profile type exif", rawProfile, true); case mdIptc: rawProfile = writeRawProfile(metadata, "iptc"); - chunk = makeAsciiTxtChunk("Raw profile type iptc", rawProfile, true); - break; + return makeAsciiTxtChunk("Raw profile type iptc", rawProfile, true); case mdXmp: - chunk = makeUtf8TxtChunk("XML:com.adobe.xmp", metadata, false); - break; + return makeUtf8TxtChunk("XML:com.adobe.xmp", metadata, false); case mdIccProfile: - break; case mdNone: - break; + return {}; } - return chunk; + return {}; } // PngChunk::makeMetadataChunk diff --git a/src/tags.cpp b/src/tags.cpp index f084dd9d..13c231c0 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -302,7 +302,7 @@ std::string ExifKey::tagLabel() const { std::string ExifKey::tagDesc() const { if (!p_->tagInfo_ || p_->tagInfo_->tag_ == 0xffff) - return ""; + return {}; return _(p_->tagInfo_->desc_); } From 75753007321cc5208e44b3cd1c5d82fe3e902854 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Mon, 4 Jul 2022 21:45:06 -0700 Subject: [PATCH 35/80] clang: remove pointless ; at the end of function Signed-off-by: Rosen Penev --- include/exiv2/xmp_exiv2.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/exiv2/xmp_exiv2.hpp b/include/exiv2/xmp_exiv2.hpp index 064a46d7..f7e78a7c 100644 --- a/include/exiv2/xmp_exiv2.hpp +++ b/include/exiv2/xmp_exiv2.hpp @@ -222,23 +222,23 @@ class EXIV2API XmpData { //! are we to use the packet? [[nodiscard]] bool usePacket() const { return usePacket_; - }; + } //! set usePacket_ bool usePacket(bool b) { bool r = usePacket_; usePacket_ = b; return r; - }; + } //! setPacket void setPacket(std::string xmpPacket) { xmpPacket_ = std::move(xmpPacket); usePacket(false); - }; + } // ! getPacket [[nodiscard]] const std::string& xmpPacket() const { return xmpPacket_; - }; + } //@} From 7f673c766da6054abe9e0aa6c3da08acbc345443 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Wed, 6 Jul 2022 22:22:30 +0100 Subject: [PATCH 36/80] Fix some "signed shift" warnings --- app/exiv2.cpp | 10 +++++----- src/canonmn_int.cpp | 6 +++--- src/convert.cpp | 12 ++++++------ src/image.cpp | 12 ++++++------ src/nikonmn_int.cpp | 4 ++-- src/pentaxmn_int.cpp | 4 ++-- src/pngchunk_int.cpp | 6 +++--- src/webpimage.cpp | 4 ++-- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/exiv2.cpp b/app/exiv2.cpp index a81f2123..65e86019 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -1465,7 +1465,7 @@ std::string parseEscapes(const std::string& input) { break; case 'u': // Escaping of unicode if (input.length() >= 4 && input.length() - 4 > i) { - int acc = 0; + uint32_t acc = 0; for (int j = 0; j < 4; ++j) { ++i; acc <<= 4; @@ -1476,19 +1476,19 @@ std::string parseEscapes(const std::string& input) { } else if (input[i] >= 'A' && input[i] <= 'F') { acc |= input[i] - 'A' + 10; } else { - acc = -1; + acc = 0xFFFFFFFF; break; } } - if (acc == -1) { + if (acc == 0xFFFFFFFF) { result.push_back('\\'); i = escapeStart; break; } std::string ucs2toUtf8; - ucs2toUtf8.push_back(static_cast((acc & 0xff00) >> 8)); - ucs2toUtf8.push_back(static_cast(acc & 0x00ff)); + ucs2toUtf8.push_back(static_cast((acc & 0xff00U) >> 8)); + ucs2toUtf8.push_back(static_cast(acc & 0x00ffU)); if (Exiv2::convertStringCharset(ucs2toUtf8, "UCS-2BE", "UTF-8")) { result.append(ucs2toUtf8); diff --git a/src/canonmn_int.cpp b/src/canonmn_int.cpp index c67ac888..a6785f56 100644 --- a/src/canonmn_int.cpp +++ b/src/canonmn_int.cpp @@ -2716,10 +2716,10 @@ std::ostream& CanonMakerNote::printSi0x000e(std::ostream& os, const Value& value if (value.typeId() != unsignedShort || value.count() == 0) return os << value; - const auto l = value.toInt64(); - const auto num = (l & 0xf000) >> 12; + const auto l = value.toUint32(); + const auto num = (l & 0xf000U) >> 12; os << num << " focus points; "; - const auto used = l & 0x0fff; + const auto used = l & 0x0fffU; if (used == 0) { os << "none"; } else { diff --git a/src/convert.cpp b/src/convert.cpp index de9aafac..fbe53d60 100644 --- a/src/convert.cpp +++ b/src/convert.cpp @@ -782,7 +782,7 @@ void Converter::cnvExifFlash(const char* from, const char* to) { return; if (!prepareXmpTarget(to)) return; - auto value = pos->toInt64(); + auto value = pos->toUint32(); if (!pos->value().ok()) { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Failed to convert " << from << " to " << to << "\n"; @@ -1052,7 +1052,7 @@ void Converter::cnvXmpFlash(const char* from, const char* to) { unsigned short value = 0; if (pos != xmpData_->end() && pos->count() > 0) { - auto fired = pos->toInt64(); + auto fired = pos->toUint32(); if (pos->value().ok()) value |= fired & 1; #ifndef SUPPRESS_WARNINGS @@ -1063,7 +1063,7 @@ void Converter::cnvXmpFlash(const char* from, const char* to) { } pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Return")); if (pos != xmpData_->end() && pos->count() > 0) { - auto ret = pos->toInt64(); + auto ret = pos->toUint32(); if (pos->value().ok()) value |= (ret & 3) << 1; #ifndef SUPPRESS_WARNINGS @@ -1074,7 +1074,7 @@ void Converter::cnvXmpFlash(const char* from, const char* to) { } pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Mode")); if (pos != xmpData_->end() && pos->count() > 0) { - auto mode = pos->toInt64(); + auto mode = pos->toUint32(); if (pos->value().ok()) value |= (mode & 3) << 3; #ifndef SUPPRESS_WARNINGS @@ -1085,7 +1085,7 @@ void Converter::cnvXmpFlash(const char* from, const char* to) { } pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:Function")); if (pos != xmpData_->end() && pos->count() > 0) { - auto function = pos->toInt64(); + auto function = pos->toUint32(); if (pos->value().ok()) value |= (function & 1) << 5; #ifndef SUPPRESS_WARNINGS @@ -1097,7 +1097,7 @@ void Converter::cnvXmpFlash(const char* from, const char* to) { pos = xmpData_->findKey(XmpKey(std::string(from) + "/exif:RedEyeMode")); if (pos != xmpData_->end()) { if (pos->count() > 0) { - auto red = pos->toInt64(); + auto red = pos->toUint32(); if (pos->value().ok()) value |= (red & 1) << 6; #ifndef SUPPRESS_WARNINGS diff --git a/src/image.cpp b/src/image.cpp index caf3cf09..13715ddd 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -186,17 +186,17 @@ uint64_t Image::byteSwap(uint64_t value, bool bSwap) { uint32_t Image::byteSwap(uint32_t value, bool bSwap) { uint32_t result = 0; - result |= (value & 0x000000FF) << 24; - result |= (value & 0x0000FF00) << 8; - result |= (value & 0x00FF0000) >> 8; - result |= (value & 0xFF000000) >> 24; + result |= (value & 0x000000FFU) << 24; + result |= (value & 0x0000FF00U) << 8; + result |= (value & 0x00FF0000U) >> 8; + result |= (value & 0xFF000000U) >> 24; return bSwap ? result : value; } uint16_t Image::byteSwap(uint16_t value, bool bSwap) { uint16_t result = 0; - result |= (value & 0x00FF) << 8; - result |= (value & 0xFF00) >> 8; + result |= (value & 0x00FFU) << 8; + result |= (value & 0xFF00U) >> 8; return bSwap ? result : value; } diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 15236e6f..2c525656 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -1500,7 +1500,7 @@ std::ostream& Nikon3MakerNote::printAfPointsInFocus(std::ostream& os, const Valu auto val = static_cast(value.toInt64()); if (dModel) - val = (val >> 8) | ((val & 0x00ff) << 8); + val = (val >> 8) | ((val & 0x00ffU) << 8); if (val == 0x07ff) return os << _("All 11 Points"); @@ -3043,7 +3043,7 @@ std::ostream& Nikon3MakerNote::printFlashGroupBCControlData(std::ostream& os, co } std::ostringstream oss; oss.copyfmt(os); - const auto temp = value.toInt64(); + const auto temp = value.toUint32(); printTag(os, (temp >> 4), data); os << ", "; diff --git a/src/pentaxmn_int.cpp b/src/pentaxmn_int.cpp index 76c1c0bd..f60d8327 100644 --- a/src/pentaxmn_int.cpp +++ b/src/pentaxmn_int.cpp @@ -964,7 +964,7 @@ std::ostream& PentaxMakerNote::printFlashCompensation(std::ostream& os, const Va } std::ostream& PentaxMakerNote::printBracketing(std::ostream& os, const Value& value, const ExifData*) { - const auto l0 = value.toInt64(0); + const auto l0 = value.toUint32(0); if (l0 < 10) { os << std::setprecision(2) << static_cast(l0) / 3 << " EV"; @@ -973,7 +973,7 @@ std::ostream& PentaxMakerNote::printBracketing(std::ostream& os, const Value& va } if (value.count() == 2) { - const auto l1 = value.toInt64(1); + const auto l1 = value.toUint32(1); os << " ("; if (l1 == 0) { os << _("No extended bracketing"); diff --git a/src/pngchunk_int.cpp b/src/pngchunk_int.cpp index 53ae8093..e7aec605 100644 --- a/src/pngchunk_int.cpp +++ b/src/pngchunk_int.cpp @@ -595,12 +595,12 @@ std::string PngChunk::writeRawProfile(const std::string& profileData, const char std::ostringstream oss; oss << '\n' << profileType << '\n' << std::setw(8) << profileData.size(); - const char* sp = profileData.data(); + const byte* sp = reinterpret_cast(profileData.data()); for (std::string::size_type i = 0; i < profileData.size(); ++i) { if (i % 36 == 0) oss << '\n'; - oss << hex[((*sp >> 4) & 0x0f)]; - oss << hex[((*sp++) & 0x0f)]; + oss << hex[((*sp >> 4) & 0x0fU)]; + oss << hex[((*sp++) & 0x0fU)]; } oss << '\n'; return oss.str(); diff --git a/src/webpimage.cpp b/src/webpimage.cpp index c6c80490..c658b080 100644 --- a/src/webpimage.cpp +++ b/src/webpimage.cpp @@ -761,13 +761,13 @@ void WebPImage::inject_VP8X(BasicIo& iIo, bool has_xmp, bool has_exif, bool has_ } /* set width - stored in 24bits*/ - int w = width - 1; + uint32_t w = width - 1; data[4] = w & 0xFF; data[5] = (w >> 8) & 0xFF; data[6] = (w >> 16) & 0xFF; /* set height - stored in 24bits */ - int h = height - 1; + uint32_t h = height - 1; data[7] = h & 0xFF; data[8] = (h >> 8) & 0xFF; data[9] = (h >> 16) & 0xFF; From cb50787ec4e29d9ab615d2e6dd21d48c61955970 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Thu, 7 Jul 2022 12:56:12 +0100 Subject: [PATCH 37/80] Eliminate some false positive results. --- .../codeql-queries/exiv2-cpp-queries/unsafe_vector_access.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/codeql-queries/exiv2-cpp-queries/unsafe_vector_access.ql b/.github/codeql-queries/exiv2-cpp-queries/unsafe_vector_access.ql index 4a4c578b..7a9356bc 100644 --- a/.github/codeql-queries/exiv2-cpp-queries/unsafe_vector_access.ql +++ b/.github/codeql-queries/exiv2-cpp-queries/unsafe_vector_access.ql @@ -53,7 +53,7 @@ predicate indexK_with_fixedarray(ClassTemplateInstantiation t, ArrayIndexCall ca t.getSimpleName() = "array" and idx = call.getArgument(0) and lowerBound(idx) >= 0 and - upperBound(idx) < t.getTemplateArgument(1).(Literal).getValue().toInt() + upperBound(idx) < lowerBound(t.getTemplateArgument(1)) ) } From 6b5453c9d5dda8fbb803d4c10a4485694c1f82ec Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Wed, 6 Jul 2022 13:22:05 +0100 Subject: [PATCH 38/80] Regression test for https://github.com/Exiv2/exiv2/issues/2268 --- test/data/issue_2268_poc.jp2 | Bin 0 -> 97 bytes tests/bugfixes/github/test_issue_2268.py | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 test/data/issue_2268_poc.jp2 create mode 100644 tests/bugfixes/github/test_issue_2268.py diff --git a/test/data/issue_2268_poc.jp2 b/test/data/issue_2268_poc.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..64fb231c0bd904b0c66d4f5012c8d378c0ebb1d6 GIT binary patch literal 97 zcmZQzVBpCLP*C9IYUg5LU=WEdsVvAUFj4@r83Z7-E|8xAV>rRU X%+3xJ<4?}d0g9mm0f+#j0s|8OE)Wf} literal 0 HcmV?d00001 diff --git a/tests/bugfixes/github/test_issue_2268.py b/tests/bugfixes/github/test_issue_2268.py new file mode 100644 index 00000000..d678fea2 --- /dev/null +++ b/tests/bugfixes/github/test_issue_2268.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, check_no_ASAN_UBSAN_errors + +class issue_2268_jp2_assert(metaclass=CaseMeta): + url = "https://github.com/Exiv2/exiv2/issues/2268" + filename = "$data_path/issue_2268_poc.jp2" + commands = ["$exiv2 -pS $filename"] + retval = [1] + stderr = ["""$exiv2_exception_message $filename: +$kerCorruptedMetadata +"""] + compare_stdout = check_no_ASAN_UBSAN_errors From 0c3da129f2cb69dadd855e0b99a591e2f99a1cfe Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Wed, 6 Jul 2022 13:23:24 +0100 Subject: [PATCH 39/80] Replace assert with enforce. (Fix for https://github.com/Exiv2/exiv2/issues/2268) --- src/jp2image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jp2image.cpp b/src/jp2image.cpp index 3df9526e..25e6e70d 100644 --- a/src/jp2image.cpp +++ b/src/jp2image.cpp @@ -475,7 +475,7 @@ void Jp2Image::printStructure(std::ostream& out, PrintStructureOption option, in } if (subBox.type == kJp2BoxTypeImageHeader) { - assert(subBox.length == 22); + enforce(subBox.length == 22, ErrorCode::kerCorruptedMetadata); // height (4), width (4), componentsCount (2), bpc (1) auto compressionType = data.read_uint8(11); auto unkC = data.read_uint8(12); From 58cef7516e5470297f728be1225b2c985c207852 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Thu, 7 Jul 2022 19:55:28 +0100 Subject: [PATCH 40/80] Add issue_2268_poc.jp2 to the exclude list. --- tests/regression_tests/test_regression_allfiles.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/regression_tests/test_regression_allfiles.py b/tests/regression_tests/test_regression_allfiles.py index 341934c4..b969fc5a 100644 --- a/tests/regression_tests/test_regression_allfiles.py +++ b/tests/regression_tests/test_regression_allfiles.py @@ -91,6 +91,7 @@ def get_valid_files(data_dir): "issue_960.poc.webp", "issue_2160_poc.jpg", "issue_2178_poc.jp2", + "issue_2268_poc.jp2", "issue_ghsa_583f_w9pm_99r2_poc.jp2", "issue_ghsa_7569_phvm_vwc2_poc.jp2", "issue_ghsa_mxw9_qx4c_6m8v_poc.jp2", From 3f7cb78a3b04bea8e41cf7eb23c77b7517f49886 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Fri, 8 Jul 2022 12:03:53 +0100 Subject: [PATCH 41/80] Move enums from tags_int.hpp to tags.hpp --- include/exiv2/tags.hpp | 194 +++++++++++++++++++++++++++++++++++++--- src/cr2image.cpp | 2 +- src/crwimage_int.hpp | 2 +- src/exif.cpp | 4 +- src/makernote_int.cpp | 15 ++-- src/preview.cpp | 2 +- src/tags.cpp | 4 +- src/tags_int.hpp | 174 ----------------------------------- src/tiffimage_int.hpp | 4 +- src/tiffvisitor_int.cpp | 2 +- 10 files changed, 201 insertions(+), 202 deletions(-) diff --git a/include/exiv2/tags.hpp b/include/exiv2/tags.hpp index d043cca4..ee092375 100644 --- a/include/exiv2/tags.hpp +++ b/include/exiv2/tags.hpp @@ -47,18 +47,192 @@ struct EXIV2API GroupInfo::GroupName { std::string g_; //!< Group name }; +//! Type to specify the IFD to which a metadata belongs +enum IfdId { + ifdIdNotSet, + ifd0Id, + ifd1Id, + ifd2Id, + ifd3Id, + exifId, + gpsId, + iopId, + mpfId, + subImage1Id, + subImage2Id, + subImage3Id, + subImage4Id, + subImage5Id, + subImage6Id, + subImage7Id, + subImage8Id, + subImage9Id, + subThumb1Id, + panaRawId, + mnId, + canonId, + canonAfCId, + canonAfMiAdjId, + canonAmId, + canonAsId, + canonCbId, + canonCiId, + canonCsId, + canonFilId, + canonFlId, + canonHdrId, + canonLeId, + canonMeId, + canonMoID, + canonMvId, + canonRawBId, + canonSiId, + canonCfId, + canonContrastId, + canonFcd1Id, + canonFcd2Id, + canonFcd3Id, + canonLiOpId, + canonMyColorID, + canonPiId, + canonPaId, + canonTiId, + canonFiId, + canonPrId, + canonPreID, + canonVigCorId, + canonVigCor2Id, + canonWbId, + casioId, + casio2Id, + fujiId, + minoltaId, + minoltaCs5DId, + minoltaCs7DId, + minoltaCsOldId, + minoltaCsNewId, + nikon1Id, + nikon2Id, + nikon3Id, + nikonPvId, + nikonVrId, + nikonPcId, + nikonWtId, + nikonIiId, + nikonAfId, + nikonAf21Id, + nikonAf22Id, + nikonAFTId, + nikonFiId, + nikonMeId, + nikonFl1Id, + nikonFl2Id, + nikonFl3Id, + nikonFl7Id, + nikonSi1Id, + nikonSi2Id, + nikonSi3Id, + nikonSi4Id, + nikonSi5Id, + nikonSi6Id, + nikonLd1Id, + nikonLd2Id, + nikonLd3Id, + nikonLd4Id, + nikonCb1Id, + nikonCb2Id, + nikonCb2aId, + nikonCb2bId, + nikonCb3Id, + nikonCb4Id, + olympusId, + olympus2Id, + olympusCsId, + olympusEqId, + olympusRdId, + olympusRd2Id, + olympusIpId, + olympusFiId, + olympusFe1Id, + olympusFe2Id, + olympusFe3Id, + olympusFe4Id, + olympusFe5Id, + olympusFe6Id, + olympusFe7Id, + olympusFe8Id, + olympusFe9Id, + olympusRiId, + panasonicId, + pentaxId, + pentaxDngId, + samsung2Id, + samsungPvId, + samsungPwId, + sigmaId, + sony1Id, + sony2Id, + sonyMltId, + sony1CsId, + sony1Cs2Id, + sony2CsId, + sony2Cs2Id, + sony2FpId, + sonyMisc1Id, + sonyMisc2bId, + sonyMisc3cId, + sonySInfo1Id, + sony2010eId, + sony1MltCs7DId, + sony1MltCsOldId, + sony1MltCsNewId, + sony1MltCsA100Id, + tagInfoMvId, + lastId, + ignoreId = lastId +}; + +/*! + @brief Section identifiers to logically group tags. A section consists + of nothing more than a name, based on the Exif standard. + */ +enum SectionId { + sectionIdNotSet, + imgStruct, // 4.6.4 A + recOffset, // 4.6.4 B + imgCharacter, // 4.6.4 C + otherTags, // 4.6.4 D + exifFormat, // 4.6.3 + exifVersion, // 4.6.5 A + imgConfig, // 4.6.5 C + userInfo, // 4.6.5 D + relatedFile, // 4.6.5 E + dateTime, // 4.6.5 F + captureCond, // 4.6.5 G + gpsTags, // 4.6.6 + iopTags, // 4.6.7 + mpfTags, + makerTags, // MakerNote + dngTags, // DNG Spec + panaRaw, + tiffEp, // TIFF-EP Spec + tiffPm6, + adobeOpi, + lastSectionId +}; + //! Tag information struct EXIV2API TagInfo { - uint16_t tag_; //!< Tag - const char* name_; //!< One word tag label - const char* title_; //!< Tag title - const char* desc_; //!< Short tag description - int ifdId_; //!< Link to the (preferred) IFD - int sectionId_; //!< Section id - TypeId typeId_; //!< Type id - int16_t count_; //!< The number of values (not bytes!), 0=any, -1=count not known. - PrintFct printFct_; //!< Pointer to tag print function -}; // struct TagInfo + uint16_t tag_; //!< Tag + const char* name_; //!< One word tag label + const char* title_; //!< Tag title + const char* desc_; //!< Short tag description + IfdId ifdId_; //!< Link to the (preferred) IFD + SectionId sectionId_; //!< Section id + TypeId typeId_; //!< Type id + int16_t count_; //!< The number of values (not bytes!), 0=any, -1=count not known. + PrintFct printFct_; //!< Pointer to tag print function +}; // struct TagInfo //! Access to Exif group and tag lists and misc. tag reference methods, implemented as a static class. class EXIV2API ExifTags { diff --git a/src/cr2image.cpp b/src/cr2image.cpp index 79814811..f77adebe 100644 --- a/src/cr2image.cpp +++ b/src/cr2image.cpp @@ -112,7 +112,7 @@ WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteO // Delete IFDs which do not occur in TIFF images static constexpr auto filteredIfds = std::array{ - Internal::panaRawId, + panaRawId, }; for (auto&& filteredIfd : filteredIfds) { #ifdef EXIV2_DEBUG_MESSAGES diff --git a/src/crwimage_int.hpp b/src/crwimage_int.hpp index 2c2318e9..48b32641 100644 --- a/src/crwimage_int.hpp +++ b/src/crwimage_int.hpp @@ -496,7 +496,7 @@ struct CrwMapping { //! @name Creators //@{ //! Default constructor - CrwMapping(uint16_t crwTagId, uint16_t crwDir, uint32_t size, uint16_t tag, Internal::IfdId ifdId, + CrwMapping(uint16_t crwTagId, uint16_t crwDir, uint32_t size, uint16_t tag, IfdId ifdId, CrwDecodeFct toExif, CrwEncodeFct fromExif) : crwTagId_(crwTagId), crwDir_(crwDir), diff --git a/src/exif.cpp b/src/exif.cpp index 8ca9f517..2bd23026 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -128,7 +128,7 @@ class JpegThumbnail : public Thumbnail { int64_t sumToLong(const Exiv2::Exifdatum& md); //! Helper function to delete all tags of a specific IFD from the metadata. -void eraseIfd(Exiv2::ExifData& ed, Exiv2::Internal::IfdId ifdId); +void eraseIfd(Exiv2::ExifData& ed, Exiv2::IfdId ifdId); } // namespace @@ -301,7 +301,7 @@ int Exifdatum::ifdId() const { } const char* Exifdatum::ifdName() const { - return key_ ? Internal::ifdName(static_cast(key_->ifdId())) : ""; + return key_ ? Internal::ifdName(static_cast(key_->ifdId())) : ""; } int Exifdatum::idx() const { diff --git a/src/makernote_int.cpp b/src/makernote_int.cpp index 033743d0..a47a7302 100644 --- a/src/makernote_int.cpp +++ b/src/makernote_int.cpp @@ -37,8 +37,7 @@ namespace fs = std::filesystem; namespace { // Todo: Can be generalized further - get any tag as a string/long/... //! Get the Value for a tag within a particular group -const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const uint16_t& tag, - const Exiv2::Internal::IfdId& group); +const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const uint16_t& tag, const Exiv2::IfdId& group); //! Get the model name from tag Exif.Image.Model std::string getExifModel(Exiv2::Internal::TiffComponent* pRoot); @@ -969,9 +968,9 @@ int sonyMisc2bSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, // > First byte must be 9 or 12 or 13 or 15 or 16 and 4th byte must be 2 (deciphered) // Get the value from the image format that is being used - auto value = getExifValue(pRoot, 0x9404, Exiv2::Internal::sony1Id); + auto value = getExifValue(pRoot, 0x9404, Exiv2::sony1Id); if (!value) { - value = getExifValue(pRoot, 0x9404, Exiv2::Internal::sony2Id); + value = getExifValue(pRoot, 0x9404, Exiv2::sony2Id); if (!value) return -1; } @@ -996,9 +995,9 @@ int sonyMisc3cSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, // > first byte decoded: 62, 48, 215, 28, 106 respectively // Get the value from the image format that is being used - auto value = getExifValue(pRoot, 0x9400, Exiv2::Internal::sony1Id); + auto value = getExifValue(pRoot, 0x9400, Exiv2::sony1Id); if (!value) { - value = getExifValue(pRoot, 0x9400, Exiv2::Internal::sony2Id); + value = getExifValue(pRoot, 0x9400, Exiv2::sony2Id); if (!value) return -1; } @@ -1024,7 +1023,7 @@ int sonyMisc3cSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, // local definitions namespace { const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const uint16_t& tag, - const Exiv2::Internal::IfdId& group) { + const Exiv2::IfdId& group) { Exiv2::Internal::TiffFinder finder(tag, group); if (!pRoot) return nullptr; @@ -1035,7 +1034,7 @@ const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const ui std::string getExifModel(Exiv2::Internal::TiffComponent* pRoot) { // Lookup the Exif.Image.Model tag - const auto value = getExifValue(pRoot, 0x0110, Exiv2::Internal::ifd0Id); + const auto value = getExifValue(pRoot, 0x0110, Exiv2::ifd0Id); return (!value || value->count() == 0) ? std::string("") : static_cast(value->toString()); } diff --git a/src/preview.cpp b/src/preview.cpp index 2d578006..3383aa32 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -697,7 +697,7 @@ DataBuf LoaderTiff::getData() const { consistent result for all previews, including JPEG */ uint16_t tag = pos.tag(); - if (tag != 0x00fe && tag != 0x00ff && Internal::isTiffImageTag(tag, Internal::ifd0Id)) { + if (tag != 0x00fe && tag != 0x00ff && Internal::isTiffImageTag(tag, ifd0Id)) { preview.add(ExifKey(tag, "Image"), &pos.value()); } } diff --git a/src/tags.cpp b/src/tags.cpp index f084dd9d..65777283 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -75,7 +75,7 @@ bool GroupInfo::operator==(const GroupName& groupName) const { } const char* ExifTags::sectionName(const ExifKey& key) { - const TagInfo* ti = tagInfo(key.tag(), static_cast(key.ifdId())); + const TagInfo* ti = tagInfo(key.tag(), static_cast(key.ifdId())); if (!ti) return sectionInfo[unknownTag.sectionId_].name_; return sectionInfo[ti->sectionId_].name_; @@ -83,7 +83,7 @@ const char* ExifTags::sectionName(const ExifKey& key) { /// \todo not used internally. At least we should test it uint16_t ExifTags::defaultCount(const ExifKey& key) { - const TagInfo* ti = tagInfo(key.tag(), static_cast(key.ifdId())); + const TagInfo* ti = tagInfo(key.tag(), static_cast(key.ifdId())); if (!ti) return unknownTag.count_; return ti->count_; diff --git a/src/tags_int.hpp b/src/tags_int.hpp index f8f73845..c7b76554 100644 --- a/src/tags_int.hpp +++ b/src/tags_int.hpp @@ -14,180 +14,6 @@ namespace Exiv2::Internal { // ***************************************************************************** // class definitions -//! Type to specify the IFD to which a metadata belongs -enum IfdId { - ifdIdNotSet, - ifd0Id, - ifd1Id, - ifd2Id, - ifd3Id, - exifId, - gpsId, - iopId, - mpfId, - subImage1Id, - subImage2Id, - subImage3Id, - subImage4Id, - subImage5Id, - subImage6Id, - subImage7Id, - subImage8Id, - subImage9Id, - subThumb1Id, - panaRawId, - mnId, - canonId, - canonAfCId, - canonAfMiAdjId, - canonAmId, - canonAsId, - canonCbId, - canonCiId, - canonCsId, - canonFilId, - canonFlId, - canonHdrId, - canonLeId, - canonMeId, - canonMoID, - canonMvId, - canonRawBId, - canonSiId, - canonCfId, - canonContrastId, - canonFcd1Id, - canonFcd2Id, - canonFcd3Id, - canonLiOpId, - canonMyColorID, - canonPiId, - canonPaId, - canonTiId, - canonFiId, - canonPrId, - canonPreID, - canonVigCorId, - canonVigCor2Id, - canonWbId, - casioId, - casio2Id, - fujiId, - minoltaId, - minoltaCs5DId, - minoltaCs7DId, - minoltaCsOldId, - minoltaCsNewId, - nikon1Id, - nikon2Id, - nikon3Id, - nikonPvId, - nikonVrId, - nikonPcId, - nikonWtId, - nikonIiId, - nikonAfId, - nikonAf21Id, - nikonAf22Id, - nikonAFTId, - nikonFiId, - nikonMeId, - nikonFl1Id, - nikonFl2Id, - nikonFl3Id, - nikonFl7Id, - nikonSi1Id, - nikonSi2Id, - nikonSi3Id, - nikonSi4Id, - nikonSi5Id, - nikonSi6Id, - nikonLd1Id, - nikonLd2Id, - nikonLd3Id, - nikonLd4Id, - nikonCb1Id, - nikonCb2Id, - nikonCb2aId, - nikonCb2bId, - nikonCb3Id, - nikonCb4Id, - olympusId, - olympus2Id, - olympusCsId, - olympusEqId, - olympusRdId, - olympusRd2Id, - olympusIpId, - olympusFiId, - olympusFe1Id, - olympusFe2Id, - olympusFe3Id, - olympusFe4Id, - olympusFe5Id, - olympusFe6Id, - olympusFe7Id, - olympusFe8Id, - olympusFe9Id, - olympusRiId, - panasonicId, - pentaxId, - pentaxDngId, - samsung2Id, - samsungPvId, - samsungPwId, - sigmaId, - sony1Id, - sony2Id, - sonyMltId, - sony1CsId, - sony1Cs2Id, - sony2CsId, - sony2Cs2Id, - sony2FpId, - sonyMisc1Id, - sonyMisc2bId, - sonyMisc3cId, - sonySInfo1Id, - sony2010eId, - sony1MltCs7DId, - sony1MltCsOldId, - sony1MltCsNewId, - sony1MltCsA100Id, - tagInfoMvId, - lastId, - ignoreId = lastId -}; - -/*! - @brief Section identifiers to logically group tags. A section consists - of nothing more than a name, based on the Exif standard. - */ -enum SectionId { - sectionIdNotSet, - imgStruct, // 4.6.4 A - recOffset, // 4.6.4 B - imgCharacter, // 4.6.4 C - otherTags, // 4.6.4 D - exifFormat, // 4.6.3 - exifVersion, // 4.6.5 A - imgConfig, // 4.6.5 C - userInfo, // 4.6.5 D - relatedFile, // 4.6.5 E - dateTime, // 4.6.5 F - captureCond, // 4.6.5 G - gpsTags, // 4.6.6 - iopTags, // 4.6.7 - mpfTags, - makerTags, // MakerNote - dngTags, // DNG Spec - panaRaw, - tiffEp, // TIFF-EP Spec - tiffPm6, - adobeOpi, - lastSectionId -}; - //! The details of a section. struct SectionInfo { constexpr SectionInfo(SectionId sectionId, const char* name, const char* desc) : diff --git a/src/tiffimage_int.hpp b/src/tiffimage_int.hpp index a928ca9c..d134cf80 100644 --- a/src/tiffimage_int.hpp +++ b/src/tiffimage_int.hpp @@ -393,7 +393,7 @@ class OffsetWriter { class FindExifdatum { public: //! Constructor, initializes the object with the IfdId to look for. - explicit FindExifdatum(Exiv2::Internal::IfdId ifdId) : ifdId_(ifdId) { + explicit FindExifdatum(Exiv2::IfdId ifdId) : ifdId_(ifdId) { } //! Returns true if IFD id matches. bool operator()(const Exiv2::Exifdatum& md) const { @@ -401,7 +401,7 @@ class FindExifdatum { } private: - Exiv2::Internal::IfdId ifdId_; + Exiv2::IfdId ifdId_; }; // class FindExifdatum diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index 61ea1d29..c62e822b 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -23,7 +23,7 @@ namespace { class FindExifdatum2 { public: //! Constructor, initializes the object with the group and index to look for. - FindExifdatum2(Exiv2::Internal::IfdId group, int idx) : groupName_(Exiv2::Internal::groupName(group)), idx_(idx) { + FindExifdatum2(Exiv2::IfdId group, int idx) : groupName_(Exiv2::Internal::groupName(group)), idx_(idx) { } //! Returns true if group and index match. bool operator()(const Exiv2::Exifdatum& md) const { From b9b2d7741b7c5154ec4aefad123366a209951af9 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Fri, 8 Jul 2022 12:48:42 +0100 Subject: [PATCH 42/80] Fix some "unsafe vector access" warnings. --- src/image.cpp | 14 ++++++-------- src/nikonmn_int.cpp | 21 +++++++-------------- src/pngimage.cpp | 10 ++++++---- unitTests/test_ImageFactory.cpp | 9 --------- 4 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/image.cpp b/src/image.cpp index 13715ddd..b2e10e5a 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -99,8 +99,6 @@ constexpr auto registry = std::array{ #ifdef EXV_ENABLE_BMFF Registry{ImageType::bmff, newBmffInstance, isBmffType, amRead, amRead, amRead, amNone}, #endif // EXV_ENABLE_BMFF - // End of list marker - Registry{ImageType::none, nullptr, nullptr, amNone, amNone, amNone, amNone}, }; std::string pathOfFileUrl(const std::string& url) { @@ -751,9 +749,9 @@ ImageType ImageFactory::getType(BasicIo& io) { if (io.open() != 0) return ImageType::none; IoCloser closer(io); - for (unsigned int i = 0; registry[i].imageType_ != ImageType::none; ++i) { - if (registry[i].isThisType_(io, false)) { - return registry[i].imageType_; + for (const auto& r : registry) { + if (r.isThisType_(io, false)) { + return r.imageType_; } } return ImageType::none; @@ -798,9 +796,9 @@ Image::UniquePtr ImageFactory::open(BasicIo::UniquePtr io) { if (io->open() != 0) { throw Error(ErrorCode::kerDataSourceOpenFailed, io->path(), strError()); } - for (unsigned int i = 0; registry[i].imageType_ != ImageType::none; ++i) { - if (registry[i].isThisType_(*io, false)) { - return registry[i].newInstance_(std::move(io), false); + for (const auto& r : registry) { + if (r.isThisType_(*io, false)) { + return r.newInstance_(std::move(io), false); } } return nullptr; diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 2c525656..f636f03b 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -237,20 +237,13 @@ std::ostream& Nikon1MakerNote::print0x0088(std::ostream& os, const Value& value, os << "; "; const uint32_t focusPoint = value.toUint32(1); - switch (focusPoint) { - // Could use array nikonFocuspoints - case 0: - case 1: - case 2: - case 3: - case 4: - os << nikonFocuspoints[focusPoint]; - break; - default: - os << value; - if (focusPoint < nikonFocuspoints.size()) - os << " " << _("guess") << " " << nikonFocuspoints[focusPoint]; - break; + if (focusPoint <= 4) { + os << nikonFocuspoints[focusPoint]; + } else { + os << value; + if (focusPoint < nikonFocuspoints.size()) { + os << " " << _("guess") << " " << nikonFocuspoints[focusPoint]; + } } } if (value.count() >= 3) { diff --git a/src/pngimage.cpp b/src/pngimage.cpp index c0617d99..64078b9a 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -127,10 +127,12 @@ static bool tEXtToDataBuf(const byte* bytes, size_t length, DataBuf& result) { static bool bFirst = true; if (bFirst) { value.fill(0); - const char* hexdigits = "0123456789ABCDEF"; - for (int i = 0; i < 16; i++) { - value[tolower(hexdigits[i])] = i + 1; - value[toupper(hexdigits[i])] = i + 1; + for (int i = 0; i < 10; i++) { + value['0' + i] = i + 1; + } + for (int i = 0; i < 6; i++) { + value['a' + i] = i + 10 + 1; + value['A' + i] = i + 10 + 1; } bFirst = false; } diff --git a/unitTests/test_ImageFactory.cpp b/unitTests/test_ImageFactory.cpp index 23572b9e..72793043 100644 --- a/unitTests/test_ImageFactory.cpp +++ b/unitTests/test_ImageFactory.cpp @@ -353,13 +353,4 @@ TEST(TheImageFactory, getsExpectedModesForXmpImages) { EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::xmp, mdIccProfile)); } -TEST(TheImageFactory, getsExpectedModesForNoneValue) { - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdNone)); - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdExif)); - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdIptc)); - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdXmp)); - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdComment)); - EXPECT_EQ(amNone, ImageFactory::checkMode(ImageType::none, mdIccProfile)); -} - /// \todo check why JpegBase is taking ImageType in the constructor From 62043c18abe14e2c9f61a70b04fc06a190030744 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Fri, 8 Jul 2022 12:52:02 +0100 Subject: [PATCH 43/80] clang-format --- src/crwimage_int.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crwimage_int.hpp b/src/crwimage_int.hpp index 48b32641..3a5751d0 100644 --- a/src/crwimage_int.hpp +++ b/src/crwimage_int.hpp @@ -496,8 +496,8 @@ struct CrwMapping { //! @name Creators //@{ //! Default constructor - CrwMapping(uint16_t crwTagId, uint16_t crwDir, uint32_t size, uint16_t tag, IfdId ifdId, - CrwDecodeFct toExif, CrwEncodeFct fromExif) : + CrwMapping(uint16_t crwTagId, uint16_t crwDir, uint32_t size, uint16_t tag, IfdId ifdId, CrwDecodeFct toExif, + CrwEncodeFct fromExif) : crwTagId_(crwTagId), crwDir_(crwDir), size_(size), From a608138f5fed7e9a67977f70cdebab12056d26e1 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Fri, 8 Jul 2022 13:51:34 +0100 Subject: [PATCH 44/80] Simplify the iptcDataSegs logic --- src/jpgimage.cpp | 68 +++++-------------- .../bugfixes/github/test_jpg_iptcDataSegs.py | 14 ++++ 2 files changed, 32 insertions(+), 50 deletions(-) create mode 100644 tests/bugfixes/github/test_jpg_iptcDataSegs.py diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index 24d68a24..deaee433 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -146,7 +146,7 @@ void JpegBase::readMetadata() { byte marker = advanceToMarker(ErrorCode::kerNotAJpeg); while (marker != sos_ && marker != eoi_ && search > 0) { - auto [sizebuf, size] = readSegmentSize(marker, *io_); + const auto [sizebuf, size] = readSegmentSize(marker, *io_); // Read the rest of the segment. DataBuf buf(size); @@ -304,7 +304,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } bool bPrint = option == kpsBasic || option == kpsRecursive; - std::vector iptcDataSegs; + std::vector> iptcDataSegs; if (bPrint || option == kpsXMP || option == kpsIccProfile || option == kpsIptcErase) { // mnemonic for markers @@ -347,7 +347,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in first = false; bool bLF = bPrint; - auto [sizebuf, size] = readSegmentSize(marker, *io_); + const auto [sizebuf, size] = readSegmentSize(marker, *io_); // Read the rest of the segment. DataBuf buf(size); @@ -412,8 +412,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } } else if (option == kpsIptcErase && signature == "Photoshop 3.0") { // delete IPTC data segment from JPEG - iptcDataSegs.push_back(io_->tell() - size); - iptcDataSegs.push_back(size); + iptcDataSegs.push_back(std::make_pair(io_->tell() - size, io_->tell())); } else if (bPrint) { const size_t start = 2; const size_t end = size > 34 ? 34 : size; @@ -518,36 +517,9 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } } if (option == kpsIptcErase && !iptcDataSegs.empty()) { -#ifdef EXIV2_DEBUG_MESSAGES - std::cout << "iptc data blocks: " << iptcDataSegs.size() << std::endl; - uint32_t toggle = 0; - for (auto&& iptc : iptcDataSegs) { - std::cout << iptc; - if (toggle++ % 2) - std::cout << std::endl; - else - std::cout << ' '; - } -#endif - size_t count = iptcDataSegs.size(); - - // figure out which blocks to copy - std::vector pos(count + 2); - pos[0] = 0; - // copy the data that is not iptc - auto it = iptcDataSegs.begin(); - for (size_t i = 0; i < count; i++) { - bool bOdd = (i % 2) != 0; - bool bEven = !bOdd; - pos[i + 1] = bEven ? *it : pos[i] + *it; - ++it; - } - pos[count + 1] = io_->size(); -#ifdef EXIV2_DEBUG_MESSAGES - for (size_t i = 0; i < count + 2; i++) - std::cout << pos[i] << " "; - std::cout << std::endl; -#endif + // Add a sentinel to the end of iptcDataSegs + iptcDataSegs.push_back(std::make_pair(io_->size(), 0)); + // $ dd bs=1 skip=$((0)) count=$((13164)) if=ETH0138028.jpg of=E1.jpg // $ dd bs=1 skip=$((49304)) count=2000000 if=ETH0138028.jpg of=E2.jpg // cat E1.jpg E2.jpg > E.jpg @@ -555,25 +527,21 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in // binary copy io_ to a temporary file MemIo tempIo; - for (size_t i = 0; i < (count / 2) + 1; i++) { - size_t start = pos[2 * i] + 2; // step JPG 2 byte marker - if (start == 2) - start = 0; // read the file 2 byte SOI - size_t length = pos[2 * i + 1] - start; - if (length) { -#ifdef EXIV2_DEBUG_MESSAGES - std::cout << start << ":" << length << std::endl; -#endif - io_->seekOrThrow(start, BasicIo::beg, ErrorCode::kerFailedToReadImageData); - DataBuf buf(length); - io_->readOrThrow(buf.data(), buf.size(), ErrorCode::kerFailedToReadImageData); - tempIo.write(buf.c_data(), buf.size()); - } + size_t start = 0; + for (const auto& p : iptcDataSegs) { + const size_t length = p.first - start; + io_->seekOrThrow(start, BasicIo::beg, ErrorCode::kerFailedToReadImageData); + DataBuf buf(length); + io_->readOrThrow(buf.data(), buf.size(), ErrorCode::kerFailedToReadImageData); + tempIo.write(buf.c_data(), buf.size()); + start = p.second + 2; // skip the 2 byte marker } io_->seekOrThrow(0, BasicIo::beg, ErrorCode::kerFailedToReadImageData); io_->transfer(tempIo); // may throw io_->seekOrThrow(0, BasicIo::beg, ErrorCode::kerFailedToReadImageData); + + // Check that the result is correctly formatted. readMetadata(); } } // JpegBase::printStructure @@ -591,7 +559,7 @@ void JpegBase::writeMetadata() { } DataBuf JpegBase::readNextSegment(byte marker) { - auto [sizebuf, size] = readSegmentSize(marker, *io_); + const auto [sizebuf, size] = readSegmentSize(marker, *io_); // Read the rest of the segment. DataBuf buf(size); diff --git a/tests/bugfixes/github/test_jpg_iptcDataSegs.py b/tests/bugfixes/github/test_jpg_iptcDataSegs.py new file mode 100644 index 00000000..4b78840a --- /dev/null +++ b/tests/bugfixes/github/test_jpg_iptcDataSegs.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from system_tests import CaseMeta, CopyTmpFiles +@CopyTmpFiles("$data_path/FurnaceCreekInn.jpg") + +class jpg_iptcDataSegs(metaclass=CaseMeta): + """ + test for the iptcDataSegs code in jpgimage.cpp + """ + filename = "$tmp_path/FurnaceCreekInn.jpg" + commands = ["$exiv2 -d I rm $filename"] + retval = [0] + stderr = [""] + stdout = [""] From 8e5b8113e724b9dec18e8c361e38b7748e2e3459 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Sat, 9 Jul 2022 21:45:58 +0100 Subject: [PATCH 45/80] Use emplace_back --- src/jpgimage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index deaee433..896cfb81 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -412,7 +412,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } } else if (option == kpsIptcErase && signature == "Photoshop 3.0") { // delete IPTC data segment from JPEG - iptcDataSegs.push_back(std::make_pair(io_->tell() - size, io_->tell())); + iptcDataSegs.emplace_back(io_->tell() - size, io_->tell()); } else if (bPrint) { const size_t start = 2; const size_t end = size > 34 ? 34 : size; @@ -518,7 +518,7 @@ void JpegBase::printStructure(std::ostream& out, PrintStructureOption option, in } if (option == kpsIptcErase && !iptcDataSegs.empty()) { // Add a sentinel to the end of iptcDataSegs - iptcDataSegs.push_back(std::make_pair(io_->size(), 0)); + iptcDataSegs.emplace_back(io_->size(), 0); // $ dd bs=1 skip=$((0)) count=$((13164)) if=ETH0138028.jpg of=E1.jpg // $ dd bs=1 skip=$((49304)) count=2000000 if=ETH0138028.jpg of=E2.jpg From 3ef783e02a454f937344a11442b61d7464289885 Mon Sep 17 00:00:00 2001 From: Kevin Backhouse Date: Mon, 11 Jul 2022 22:37:52 +0100 Subject: [PATCH 46/80] Convert IfdId and SectionId to enum classes. --- include/exiv2/exif.hpp | 2 +- include/exiv2/tags.hpp | 46 +- src/canonmn_int.cpp | 1254 +++++++++++++------------ src/casiomn_int.cpp | 223 ++--- src/cr2header_int.cpp | 2 +- src/cr2image.cpp | 2 +- src/crwimage_int.cpp | 76 +- src/exif.cpp | 11 +- src/fujimn_int.cpp | 173 ++-- src/makernote_int.cpp | 90 +- src/minoltamn_int.cpp | 780 +++++++-------- src/nikonmn_int.cpp | 1158 ++++++++++++----------- src/olympusmn_int.cpp | 1091 ++++++++++----------- src/orfimage.cpp | 2 +- src/panasonicmn_int.cpp | 428 +++++---- src/pentaxmn_int.cpp | 267 +++--- src/preview.cpp | 2 +- src/rw2image.cpp | 2 +- src/samsungmn_int.cpp | 118 +-- src/sigmamn_int.cpp | 73 +- src/sonymn_int.cpp | 518 +++++----- src/tags.cpp | 76 +- src/tags_int.cpp | 1282 ++++++++++++------------- src/tiffcomposite_int.cpp | 24 +- src/tiffimage.cpp | 2 +- src/tiffimage_int.cpp | 1875 +++++++++++++++++++------------------ src/tiffvisitor_int.cpp | 21 +- src/tiffvisitor_int.hpp | 2 +- 28 files changed, 4987 insertions(+), 4613 deletions(-) diff --git a/include/exiv2/exif.hpp b/include/exiv2/exif.hpp index c052513a..c0367ed6 100644 --- a/include/exiv2/exif.hpp +++ b/include/exiv2/exif.hpp @@ -142,7 +142,7 @@ class EXIV2API Exifdatum : public Metadatum { [[nodiscard]] std::string tagLabel() const override; [[nodiscard]] uint16_t tag() const override; //! Return the IFD id as an integer. (Do not use, this is meant for library internal use.) - [[nodiscard]] int ifdId() const; + [[nodiscard]] IfdId ifdId() const; //! Return the name of the IFD [[nodiscard]] const char* ifdName() const; //! Return the index (unique id of this key within the original IFD) diff --git a/include/exiv2/tags.hpp b/include/exiv2/tags.hpp index ee092375..356f9dce 100644 --- a/include/exiv2/tags.hpp +++ b/include/exiv2/tags.hpp @@ -30,25 +30,8 @@ using TagListFct = const TagInfo* (*)(); // ***************************************************************************** // class definitions -//! The details of an Exif group. Groups include IFDs and binary arrays. -struct EXIV2API GroupInfo { - struct GroupName; - bool operator==(int ifdId) const; //!< Comparison operator for IFD id - bool operator==(const GroupName& groupName) const; //!< Comparison operator for group name - int ifdId_; //!< IFD id - const char* ifdName_; //!< IFD name - const char* groupName_; //!< Group name, unique for each group. - TagListFct tagList_; //!< Tag list -}; - -//! Search key to find a GroupInfo by its group name. -struct EXIV2API GroupInfo::GroupName { - explicit GroupName(std::string groupName); - std::string g_; //!< Group name -}; - //! Type to specify the IFD to which a metadata belongs -enum IfdId { +enum class IfdId : uint32_t { ifdIdNotSet, ifd0Id, ifd1Id, @@ -192,11 +175,32 @@ enum IfdId { ignoreId = lastId }; +inline std::ostream& operator<<(std::ostream& os, IfdId id) { + return os << static_cast(id); +} + +//! The details of an Exif group. Groups include IFDs and binary arrays. +struct EXIV2API GroupInfo { + struct GroupName; + bool operator==(IfdId ifdId) const; //!< Comparison operator for IFD id + bool operator==(const GroupName& groupName) const; //!< Comparison operator for group name + IfdId ifdId_; //!< IFD id + const char* ifdName_; //!< IFD name + const char* groupName_; //!< Group name, unique for each group. + TagListFct tagList_; //!< Tag list +}; + +//! Search key to find a GroupInfo by its group name. +struct EXIV2API GroupInfo::GroupName { + explicit GroupName(std::string groupName); + std::string g_; //!< Group name +}; + /*! @brief Section identifiers to logically group tags. A section consists of nothing more than a name, based on the Exif standard. */ -enum SectionId { +enum class SectionId { sectionIdNotSet, imgStruct, // 4.6.4 A recOffset, // 4.6.4 B @@ -330,8 +334,8 @@ class EXIV2API ExifKey : public Key { [[nodiscard]] std::string key() const override; [[nodiscard]] const char* familyName() const override; [[nodiscard]] std::string groupName() const override; - //! Return the IFD id as an integer. (Do not use, this is meant for library internal use.) - [[nodiscard]] int ifdId() const; + //! Return the IFD id. (Do not use, this is meant for library internal use.) + [[nodiscard]] IfdId ifdId() const; [[nodiscard]] std::string tagName() const override; [[nodiscard]] uint16_t tag() const override; [[nodiscard]] std::string tagLabel() const override; diff --git a/src/canonmn_int.cpp b/src/canonmn_int.cpp index a6785f56..8422d359 100644 --- a/src/canonmn_int.cpp +++ b/src/canonmn_int.cpp @@ -446,168 +446,210 @@ constexpr TagDetails canonAFAreaMode[] = { // Canon MakerNote Tag Info constexpr TagInfo CanonMakerNote::tagInfo_[] = { - {0x0000, "0x0000", "0x0000", N_("Unknown"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0001, "CameraSettings", N_("Camera Settings"), N_("Various camera settings"), canonId, makerTags, unsignedShort, + {0x0000, "0x0000", "0x0000", N_("Unknown"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0001, "CameraSettings", N_("Camera Settings"), N_("Various camera settings"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0002, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printFocalLength}, + {0x0003, "CanonFlashInfo", "Canon Flash Info", N_("Canon Flash Info"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0004, "ShotInfo", N_("Shot Info"), N_("Shot information"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0002, "FocalLength", N_("Focal Length"), N_("Focal length"), canonId, makerTags, unsignedShort, -1, - printFocalLength}, - {0x0003, "CanonFlashInfo", "Canon Flash Info", N_("Canon Flash Info"), canonId, makerTags, unsignedShort, -1, + {0x0005, "Panorama", N_("Panorama"), N_("Panorama"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0006, "ImageType", N_("Image Type"), N_("Image type"), IfdId::canonId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0004, "ShotInfo", N_("Shot Info"), N_("Shot information"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0005, "Panorama", N_("Panorama"), N_("Panorama"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0006, "ImageType", N_("Image Type"), N_("Image type"), canonId, makerTags, asciiString, -1, printValue}, - {0x0007, "FirmwareVersion", N_("Firmware Version"), N_("Firmware version"), canonId, makerTags, asciiString, -1, + {0x0007, "FirmwareVersion", N_("Firmware Version"), N_("Firmware version"), IfdId::canonId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0008, "FileNumber", N_("File Number"), N_("File number"), IfdId::canonId, SectionId::makerTags, unsignedLong, -1, + print0x0008}, + {0x0009, "OwnerName", N_("Owner Name"), N_("Owner Name"), IfdId::canonId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0008, "FileNumber", N_("File Number"), N_("File number"), canonId, makerTags, unsignedLong, -1, print0x0008}, - {0x0009, "OwnerName", N_("Owner Name"), N_("Owner Name"), canonId, makerTags, asciiString, -1, printValue}, - {0x000a, "0x000a", N_("0x000a"), N_("Unknown"), canonId, makerTags, unsignedLong, -1, print0x000c}, - {0x000c, "SerialNumber", N_("Serial Number"), N_("Camera serial number"), canonId, makerTags, unsignedLong, -1, + {0x000a, "0x000a", N_("0x000a"), N_("Unknown"), IfdId::canonId, SectionId::makerTags, unsignedLong, -1, print0x000c}, - {0x000d, "CameraInfo", N_("Camera Info"), N_("Camera info"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x000e, "FileLength", N_("FileLength"), N_("FileLength"), canonId, makerTags, unsignedLong, -1, printValue}, - {0x000f, "CustomFunctions", N_("Custom Functions"), N_("Custom Functions"), canonId, makerTags, unsignedShort, -1, + {0x000c, "SerialNumber", N_("Serial Number"), N_("Camera serial number"), IfdId::canonId, SectionId::makerTags, + unsignedLong, -1, print0x000c}, + {0x000d, "CameraInfo", N_("Camera Info"), N_("Camera info"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x000e, "FileLength", N_("FileLength"), N_("FileLength"), IfdId::canonId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0010, "ModelID", N_("ModelID"), N_("Model ID"), canonId, makerTags, unsignedLong, -1, + {0x000f, "CustomFunctions", N_("Custom Functions"), N_("Custom Functions"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0010, "ModelID", N_("ModelID"), N_("Model ID"), IfdId::canonId, SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(canonModelId)}, - {0x0011, "MovieInfo", N_("MovieInfo"), N_("Movie info"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0012, "PictureInfo", N_("Picture Info"), N_("Picture info"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0013, "ThumbnailImageValidArea", N_("Thumbnail Image Valid Area"), N_("Thumbnail image valid area"), canonId, - makerTags, signedShort, -1, printValue}, - {0x0015, "SerialNumberFormat", N_("Serial Number Format"), N_("Serial number format"), canonId, makerTags, - unsignedLong, -1, EXV_PRINT_TAG(canonSerialNumberFormat)}, - {0x001a, "SuperMacro", N_("Super Macro"), N_("Super macro"), canonId, makerTags, signedShort, -1, + {0x0011, "MovieInfo", N_("MovieInfo"), N_("Movie info"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0012, "PictureInfo", N_("Picture Info"), N_("Picture info"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0013, "ThumbnailImageValidArea", N_("Thumbnail Image Valid Area"), N_("Thumbnail image valid area"), + IfdId::canonId, SectionId::makerTags, signedShort, -1, printValue}, + {0x0015, "SerialNumberFormat", N_("Serial Number Format"), N_("Serial number format"), IfdId::canonId, + SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(canonSerialNumberFormat)}, + {0x001a, "SuperMacro", N_("Super Macro"), N_("Super macro"), IfdId::canonId, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonSuperMacro)}, - {0x001c, "DateStampMode", N_("DateStampMode"), N_("Data_Stamp_Mode"), canonId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(canonDateStampMode)}, - {0x001d, "MyColors", N_("MyColors"), N_("My_Colors"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x001e, "FirmwareRevision", N_("FirmwareRevision"), N_("Firmware_Revision"), canonId, makerTags, unsignedLong, -1, + {0x001c, "DateStampMode", N_("DateStampMode"), N_("Data_Stamp_Mode"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(canonDateStampMode)}, + {0x001d, "MyColors", N_("MyColors"), N_("My_Colors"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - // {0x0023, "Categories", N_("Categories"), N_("Categories"), canonId, makerTags, unsignedLong -1, + {0x001e, "FirmwareRevision", N_("FirmwareRevision"), N_("Firmware_Revision"), IfdId::canonId, SectionId::makerTags, + unsignedLong, -1, printValue}, + // {0x0023, "Categories", N_("Categories"), N_("Categories"), IfdId::canonId, SectionId::makerTags, unsignedLong -1, // EXV_PRINT_TAG(canonCategories)}, - {0x0024, "FaceDetect1", N_("FaceDetect1"), N_("FaceDetect1"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0025, "FaceDetect2", N_("FaceDetect2"), N_("FaceDetect2"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0026, "AFInfo", N_("AF Info"), N_("AF info"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0027, "ContrastInfo", N_("ContrastInfo"), N_("ContrastInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0028, "ImageUniqueID", N_("ImageUniqueID"), N_("ImageUniqueID"), canonId, makerTags, unsignedShort, -1, + {0x0024, "FaceDetect1", N_("FaceDetect1"), N_("FaceDetect1"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0025, "FaceDetect2", N_("FaceDetect2"), N_("FaceDetect2"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0026, "AFInfo", N_("AF Info"), N_("AF info"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0029, "WBInfo", N_("WBInfo"), N_("WBInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x002f, "FaceDetect3", N_("FaceDetect3"), N_("FaceDetect3"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0035, "TimeInfo", N_("Time Info"), N_("Time zone information"), canonId, makerTags, signedLong, -1, printValue}, - {0x0038, "BatteryType", N_("BatteryType"), N_("BatteryType"), canonId, makerTags, unsignedLong, -1, printValue}, - {0x003c, "AFInfo3", N_("AFInfo3"), N_("AFInfo3"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x0081, "RawDataOffset", N_("RawDataOffset"), N_("RawDataOffset"), canonId, makerTags, signedLong, -1, printValue}, - {0x0083, "OriginalDecisionDataOffset", N_("Original Decision Data Offset"), N_("Original decision data offset"), - canonId, makerTags, signedLong, -1, printValue}, - {0x00a4, "WhiteBalanceTable", N_("White Balance Table"), N_("White balance table"), canonId, makerTags, + {0x0027, "ContrastInfo", N_("ContrastInfo"), N_("ContrastInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - // {0x0090, "CustomFunctions1D", N_("CustomFunctions1D"), N_("CustomFunctions1D"), canonId, makerTags, - // unsignedShort, -1, printValue}, // ToDo {0x0091, "PersonalFunctions", N_("PersonalFunctions"), - // N_("PersonalFunctions"), canonId, makerTags, unsignedShort, -1, printValue}, // ToDo {0x0092, - // "PersonalFunctionValues", N_("PersonalFunctionValues"), N_("PersonalFunctionValues"), canonId, makerTags, - // unsignedShort, -1, printValue}, // ToDo - {0x0093, "CanonFileInfo", N_("CanonFileInfo"), N_("CanonFileInfo"), canonId, makerTags, unsignedShort, -1, - printValue}, - {0x0094, "AFPointsInFocus1D", N_("AFPointsInFocus1D"), N_("AFPointsInFocus1D"), canonId, makerTags, unsignedShort, + {0x0028, "ImageUniqueID", N_("ImageUniqueID"), N_("ImageUniqueID"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0029, "WBInfo", N_("WBInfo"), N_("WBInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x002f, "FaceDetect3", N_("FaceDetect3"), N_("FaceDetect3"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0095, "LensModel", N_("Lens Model"), N_("Lens model"), canonId, makerTags, asciiString, -1, printValue}, - {0x0096, "InternalSerialNumber", N_("Internal Serial Number"), N_("Internal serial number"), canonId, makerTags, - asciiString, -1, printValue}, - {0x0097, "DustRemovalData", N_("Dust Removal Data"), N_("Dust removal data"), canonId, makerTags, asciiString, -1, - printValue}, - {0x0099, "CustomFunctions", N_("Custom Functions"), N_("Custom functions"), canonId, makerTags, unsignedShort, -1, - printValue}, - {0x009a, "AspectInfo", N_("AspectInfo"), N_("AspectInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00a0, "ProcessingInfo", N_("Processing Info"), N_("Processing info"), canonId, makerTags, unsignedShort, -1, - printValue}, - {0x00a1, "ToneCurveTable", N_("ToneCurveTable"), N_("ToneCurveTable"), canonId, makerTags, unsignedShort, -1, - printValue}, - {0x00a2, "SharpnessTable", N_("SharpnessTable"), N_("SharpnessTable"), canonId, makerTags, unsignedShort, -1, + {0x0035, "TimeInfo", N_("Time Info"), N_("Time zone information"), IfdId::canonId, SectionId::makerTags, signedLong, + -1, printValue}, + {0x0038, "BatteryType", N_("BatteryType"), N_("BatteryType"), IfdId::canonId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x003c, "AFInfo3", N_("AFInfo3"), N_("AFInfo3"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x00a3, "SharpnessFreqTable", N_("SharpnessFreqTable"), N_("SharpnessFreqTable"), canonId, makerTags, + {0x0081, "RawDataOffset", N_("RawDataOffset"), N_("RawDataOffset"), IfdId::canonId, SectionId::makerTags, + signedLong, -1, printValue}, + {0x0083, "OriginalDecisionDataOffset", N_("Original Decision Data Offset"), N_("Original decision data offset"), + IfdId::canonId, SectionId::makerTags, signedLong, -1, printValue}, + {0x00a4, "WhiteBalanceTable", N_("White Balance Table"), N_("White balance table"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + // {0x0090, "CustomFunctions1D", N_("CustomFunctions1D"), N_("CustomFunctions1D"), IfdId::canonId, + // SectionId::makerTags, unsignedShort, -1, printValue}, // ToDo {0x0091, "PersonalFunctions", + // N_("PersonalFunctions"), N_("PersonalFunctions"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, + // printValue}, // ToDo {0x0092, "PersonalFunctionValues", N_("PersonalFunctionValues"), + // N_("PersonalFunctionValues"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, // ToDo + {0x0093, "CanonFileInfo", N_("CanonFileInfo"), N_("CanonFileInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x00a4, "WhiteBalanceTable", N_("SharpnessTable"), N_("SharpnessTable"), canonId, makerTags, unsignedShort, -1, + {0x0094, "AFPointsInFocus1D", N_("AFPointsInFocus1D"), N_("AFPointsInFocus1D"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0095, "LensModel", N_("Lens Model"), N_("Lens model"), IfdId::canonId, SectionId::makerTags, asciiString, -1, printValue}, - {0x00a9, "ColorBalance", N_("ColorBalance"), N_("ColorBalance"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00aa, "MeasuredColor", N_("Measured Color"), N_("Measured color"), canonId, makerTags, unsignedShort, -1, + {0x0096, "InternalSerialNumber", N_("Internal Serial Number"), N_("Internal serial number"), IfdId::canonId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0097, "DustRemovalData", N_("Dust Removal Data"), N_("Dust removal data"), IfdId::canonId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0099, "CustomFunctions", N_("Custom Functions"), N_("Custom functions"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x009a, "AspectInfo", N_("AspectInfo"), N_("AspectInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x00ae, "ColorTemperature", N_("ColorTemperature"), N_("ColorTemperature"), canonId, makerTags, unsignedShort, -1, + {0x00a0, "ProcessingInfo", N_("Processing Info"), N_("Processing info"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00a1, "ToneCurveTable", N_("ToneCurveTable"), N_("ToneCurveTable"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00a2, "SharpnessTable", N_("SharpnessTable"), N_("SharpnessTable"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00a3, "SharpnessFreqTable", N_("SharpnessFreqTable"), N_("SharpnessFreqTable"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00a4, "WhiteBalanceTable", N_("SharpnessTable"), N_("SharpnessTable"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00a9, "ColorBalance", N_("ColorBalance"), N_("ColorBalance"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00aa, "MeasuredColor", N_("Measured Color"), N_("Measured color"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00ae, "ColorTemperature", N_("ColorTemperature"), N_("ColorTemperature"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00b0, "CanonFlags", N_("CanonFlags"), N_("CanonFlags"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x00b0, "CanonFlags", N_("CanonFlags"), N_("CanonFlags"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00b1, "ModifiedInfo", N_("ModifiedInfo"), N_("ModifiedInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00b2, "ToneCurveMatching", N_("ToneCurveMatching"), N_("ToneCurveMatching"), canonId, makerTags, unsignedShort, - -1, printValue}, - {0x00b3, "WhiteBalanceMatching", N_("WhiteBalanceMatching"), N_("WhiteBalanceMatching"), canonId, makerTags, + {0x00b1, "ModifiedInfo", N_("ModifiedInfo"), N_("ModifiedInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x00b4, "ColorSpace", N_("ColorSpace"), N_("ColorSpace"), canonId, makerTags, signedShort, -1, + {0x00b2, "ToneCurveMatching", N_("ToneCurveMatching"), N_("ToneCurveMatching"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00b3, "WhiteBalanceMatching", N_("WhiteBalanceMatching"), N_("WhiteBalanceMatching"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00b4, "ColorSpace", N_("ColorSpace"), N_("ColorSpace"), IfdId::canonId, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonColorSpace)}, - {0x00b5, "0x00b5", "0x00b5", N_("Unknown"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00b6, "PreviewImageInfo", "PreviewImageInfo", N_("PreviewImageInfo"), canonId, makerTags, unsignedShort, -1, + {0x00b5, "0x00b5", "0x00b5", N_("Unknown"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00b6, "PreviewImageInfo", "PreviewImageInfo", N_("PreviewImageInfo"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00c0, "0x00c0", "0x00c0", N_("Unknown"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00c1, "0x00c1", "0x00c1", N_("Unknown"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x00d0, "VRDOffset", N_("VRD Offset"), N_("VRD offset"), IfdId::canonId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x00c0, "0x00c0", "0x00c0", N_("Unknown"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00c1, "0x00c1", "0x00c1", N_("Unknown"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x00d0, "VRDOffset", N_("VRD Offset"), N_("VRD offset"), canonId, makerTags, unsignedLong, -1, printValue}, - {0x00e0, "SensorInfo", N_("Sensor Info"), N_("Sensor info"), canonId, makerTags, unsignedShort, -1, printValue}, + {0x00e0, "SensorInfo", N_("Sensor Info"), N_("Sensor info"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, // AFInfo2 structure has a special decoder, see decodeCanonAFInfo in // tiffvisitor_int.cpp that decoder useses the below tags from // 0x2600 to 0x2611 - {0x2600, "AFInfoSize", N_("AF InfoSize"), N_("AF InfoSize"), canonId, makerTags, signedShort, -1, printValue}, - {0x2601, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), canonId, makerTags, signedShort, -1, - EXV_PRINT_TAG(canonAFAreaMode)}, - {0x2602, "AFNumPoints", N_("AF NumPoints"), N_("AF NumPoints"), canonId, makerTags, signedShort, -1, printValue}, - {0x2603, "AFValidPoints", N_("AF ValidPoints"), N_("AF ValidPoints"), canonId, makerTags, signedShort, -1, + {0x2600, "AFInfoSize", N_("AF InfoSize"), N_("AF InfoSize"), IfdId::canonId, SectionId::makerTags, signedShort, -1, printValue}, - {0x2604, "AFCanonImageWidth", N_("AF ImageWidth"), N_("AF ImageWidth"), canonId, makerTags, signedShort, -1, + {0x2601, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::canonId, SectionId::makerTags, signedShort, + -1, EXV_PRINT_TAG(canonAFAreaMode)}, + {0x2602, "AFNumPoints", N_("AF NumPoints"), N_("AF NumPoints"), IfdId::canonId, SectionId::makerTags, signedShort, + -1, printValue}, + {0x2603, "AFValidPoints", N_("AF ValidPoints"), N_("AF ValidPoints"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x2604, "AFCanonImageWidth", N_("AF ImageWidth"), N_("AF ImageWidth"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x2605, "AFCanonImageHeight", N_("AF ImageHeight"), N_("AF ImageHeight"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x2606, "AFImageWidth", N_("AF Width"), N_("AF Width"), IfdId::canonId, SectionId::makerTags, signedShort, -1, printValue}, - {0x2605, "AFCanonImageHeight", N_("AF ImageHeight"), N_("AF ImageHeight"), canonId, makerTags, signedShort, -1, + {0x2607, "AFImageHeight", N_("AF Height"), N_("AF Height"), IfdId::canonId, SectionId::makerTags, signedShort, -1, printValue}, - {0x2606, "AFImageWidth", N_("AF Width"), N_("AF Width"), canonId, makerTags, signedShort, -1, printValue}, - {0x2607, "AFImageHeight", N_("AF Height"), N_("AF Height"), canonId, makerTags, signedShort, -1, printValue}, - {0x2608, "AFAreaWidths", N_("AF Area Widths"), N_("AF Area Widths"), canonId, makerTags, signedShort, -1, + {0x2608, "AFAreaWidths", N_("AF Area Widths"), N_("AF Area Widths"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x2609, "AFAreaHeights", N_("AF Area Heights"), N_("AF Area Heights"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x260a, "AFXPositions", N_("AF X Positions"), N_("AF X Positions"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x260b, "AFYPositions", N_("AF Y Positions"), N_("AF Y Positions"), IfdId::canonId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x260c, "AFPointsInFocus", N_("AF Points in Focus"), N_("AF Points in Focus"), IfdId::canonId, + SectionId::makerTags, signedShort, -1, printBitmask}, + {0x260d, "AFPointsSelected", N_("AF Points Selected"), N_("AF Points Selected"), IfdId::canonId, + SectionId::makerTags, signedShort, -1, printBitmask}, + {0x260e, "AFPointsUnusable", N_("AF Points Unusable"), N_("AF Points Unusable"), IfdId::canonId, + SectionId::makerTags, signedShort, -1, printBitmask}, + {0x260f, "0x260f", "0x260f", N_("0x260f"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x2610, "0x2610", "0x2610", N_("0x2610"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x2611, "AFFineRotation", N_("AF Fine Rotation"), + N_("Mathematically positive (i.e. anti-clockwise) rotation of every AF rectangle in centidegrees"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x4001, "ColorData", N_("Color Data"), N_("Color data"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x2609, "AFAreaHeights", N_("AF Area Heights"), N_("AF Area Heights"), canonId, makerTags, signedShort, -1, + {0x4002, "CRWParam", N_("CRWParam"), N_("CRWParam"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x260a, "AFXPositions", N_("AF X Positions"), N_("AF X Positions"), canonId, makerTags, signedShort, -1, + {0x4003, "ColorInfo", N_("ColorInfo"), N_("ColorInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x260b, "AFYPositions", N_("AF Y Positions"), N_("AF Y Positions"), canonId, makerTags, signedShort, -1, + {0x4005, "Flavor", N_("Flavor"), N_("Flavor"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x4008, "PictureStyleUserDef", N_("PictureStyleUserDef"), N_("PictureStyleUserDef"), IfdId::canonId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(canonPictureStyle)}, + // {0x4009, "PictureStylePC", N_("PictureStylePC"), N_("PictureStylePC"), IfdId::canonId, SectionId::makerTags, + // unsignedShort, -1, EXV_PRINT_TAG(canonPictureStyle)}, + {0x4010, "CustomPictureStyleFileName", N_("CustomPictureStyleFileName"), N_("CustomPictureStyleFileName"), + IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x4013, "AFMicroAdj", N_("AFMicroAdj"), N_("AFMicroAdj"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x260c, "AFPointsInFocus", N_("AF Points in Focus"), N_("AF Points in Focus"), canonId, makerTags, signedShort, -1, - printBitmask}, - {0x260d, "AFPointsSelected", N_("AF Points Selected"), N_("AF Points Selected"), canonId, makerTags, signedShort, - -1, printBitmask}, - {0x260e, "AFPointsUnusable", N_("AF Points Unusable"), N_("AF Points Unusable"), canonId, makerTags, signedShort, - -1, printBitmask}, - {0x260f, "0x260f", "0x260f", N_("0x260f"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x2610, "0x2610", "0x2610", N_("0x2610"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x2611, "AFFineRotation", N_("AF Fine Rotation"), - N_("Mathematically positive (i.e. anti-clockwise) rotation of every AF rectangle in centidegrees"), canonId, - makerTags, unsignedShort, -1, printValue}, - {0x4001, "ColorData", N_("Color Data"), N_("Color data"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4002, "CRWParam", N_("CRWParam"), N_("CRWParam"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4003, "ColorInfo", N_("ColorInfo"), N_("ColorInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4005, "Flavor", N_("Flavor"), N_("Flavor"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4008, "PictureStyleUserDef", N_("PictureStyleUserDef"), N_("PictureStyleUserDef"), canonId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(canonPictureStyle)}, - // {0x4009, "PictureStylePC", N_("PictureStylePC"), N_("PictureStylePC"), canonId, makerTags, unsignedShort, -1, - // EXV_PRINT_TAG(canonPictureStyle)}, - {0x4010, "CustomPictureStyleFileName", N_("CustomPictureStyleFileName"), N_("CustomPictureStyleFileName"), canonId, - makerTags, unsignedShort, -1, printValue}, - {0x4013, "AFMicroAdj", N_("AFMicroAdj"), N_("AFMicroAdj"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4015, "VignettingCorr", N_("VignettingCorr"), N_("VignettingCorr"), canonId, makerTags, unsignedShort, -1, + {0x4015, "VignettingCorr", N_("VignettingCorr"), N_("VignettingCorr"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x4016, "VignettingCorr2", N_("VignettingCorr2"), N_("VignettingCorr2"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x4018, "LightingOpt", N_("LightingOpt"), N_("LightingOpt"), IfdId::canonId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x4019, "LensInfo", N_("LensInfo"), N_("LensInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x4016, "VignettingCorr2", N_("VignettingCorr2"), N_("VignettingCorr2"), canonId, makerTags, unsignedShort, -1, + {0x4020, "AmbienceInfo", N_("AmbienceInfo"), N_("AmbienceInfo"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x4021, "MultiExp", N_("MultiExp"), N_("MultiExp"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x4018, "LightingOpt", N_("LightingOpt"), N_("LightingOpt"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4019, "LensInfo", N_("LensInfo"), N_("LensInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4020, "AmbienceInfo", N_("AmbienceInfo"), N_("AmbienceInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4021, "MultiExp", N_("MultiExp"), N_("MultiExp"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4024, "FilterInfo", N_("FilterInfo"), N_("FilterInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4025, "HDRInfo", N_("HDRInfo"), N_("HDRInfo"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x4028, "AFConfig", N_("AFConfig"), N_("AFConfig"), canonId, makerTags, unsignedShort, -1, printValue}, - {0x403f, "RawBurstModeRoll", N_("RawBurstModeRoll"), N_("RawBurstModeRoll"), canonId, makerTags, unsignedShort, -1, + {0x4024, "FilterInfo", N_("FilterInfo"), N_("FilterInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x4025, "HDRInfo", N_("HDRInfo"), N_("HDRInfo"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x4028, "AFConfig", N_("AFConfig"), N_("AFConfig"), IfdId::canonId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x403f, "RawBurstModeRoll", N_("RawBurstModeRoll"), N_("RawBurstModeRoll"), IfdId::canonId, SectionId::makerTags, + unsignedShort, -1, printValue}, // End of list marker - {0xffff, "(UnknownCanonMakerNoteTag)", "(UnknownCanonMakerNoteTag)", N_("Unknown CanonMakerNote tag"), canonId, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownCanonMakerNoteTag)", "(UnknownCanonMakerNoteTag)", N_("Unknown CanonMakerNote tag"), + IfdId::canonId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* CanonMakerNote::tagList() { @@ -616,18 +658,24 @@ const TagInfo* CanonMakerNote::tagList() { // Canon Movie Info Tag constexpr TagInfo CanonMakerNote::tagInfoMv_[] = { - {0x0001, "FrameRate", N_("FrameRate"), N_("FrameRate"), canonMvId, makerTags, unsignedShort, -1, printValue}, - {0x0002, "FrameCount", N_("FrameCount"), N_("FrameCount"), canonMvId, makerTags, unsignedShort, -1, printValue}, - {0x0004, "FrameCount", N_("FrameCount"), N_("FrameCount"), canonMvId, makerTags, unsignedLong, -1, printValue}, - {0x0006, "FrameRate", N_("FrameCount"), N_("FrameCount"), canonMvId, makerTags, unsignedRational, -1, printValue}, - {0x006a, "Duration", N_("Duration"), N_("Duration"), canonMvId, makerTags, unsignedLong, -1, printValue}, - {0x006c, "AudioBitrate", N_("Audio Bitrate"), N_("Audio Bitrate"), canonMvId, makerTags, unsignedLong, -1, + {0x0001, "FrameRate", N_("FrameRate"), N_("FrameRate"), IfdId::canonMvId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0002, "FrameCount", N_("FrameCount"), N_("FrameCount"), IfdId::canonMvId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0004, "FrameCount", N_("FrameCount"), N_("FrameCount"), IfdId::canonMvId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x006e, "AudioSampleRate", N_("Audio Sample Rate"), N_("Audio Sample Rate"), canonMvId, makerTags, unsignedLong, + {0x0006, "FrameRate", N_("FrameCount"), N_("FrameCount"), IfdId::canonMvId, SectionId::makerTags, unsignedRational, -1, printValue}, - {0x0070, "AudioChannels", N_("Audio Channels"), N_("Audio Channels"), canonMvId, makerTags, unsignedLong, -1, + {0x006a, "Duration", N_("Duration"), N_("Duration"), IfdId::canonMvId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0074, "VideoCodec", N_("Video Codec"), N_("Video Codec"), canonMvId, makerTags, asciiString, -1, printValue}, + {0x006c, "AudioBitrate", N_("Audio Bitrate"), N_("Audio Bitrate"), IfdId::canonMvId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x006e, "AudioSampleRate", N_("Audio Sample Rate"), N_("Audio Sample Rate"), IfdId::canonMvId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0070, "AudioChannels", N_("Audio Channels"), N_("Audio Channels"), IfdId::canonMvId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x0074, "VideoCodec", N_("Video Codec"), N_("Video Codec"), IfdId::canonMvId, SectionId::makerTags, asciiString, + -1, printValue}, }; const TagInfo* CanonMakerNote::tagListMv() { @@ -643,8 +691,8 @@ constexpr TagDetails canonMyColors[] = { // Canon My Colors Info Tag constexpr TagInfo CanonMakerNote::tagInfoMc_[] = { - {0x0002, "MyColorMode", N_("My Color Mode"), N_("My Color Mode"), canonMyColorID, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(canonMyColors)}, + {0x0002, "MyColorMode", N_("My Color Mode"), N_("My Color Mode"), IfdId::canonMyColorID, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(canonMyColors)}, }; const TagInfo* CanonMakerNote::tagListMc() { @@ -653,28 +701,28 @@ const TagInfo* CanonMakerNote::tagListMc() { // Canon FaceDetect 1 Info Tag constexpr TagInfo CanonMakerNote::tagInfoFcd1_[] = { - {0x0002, "FacesDetected", N_("Faces Detected"), N_("Faces Detected"), canonFcd1Id, makerTags, unsignedShort, -1, - printValue}, - {0x0003, "FacesDetectedFrameSize", N_("Faces Detected Frame Size"), N_("Faces Detected Frame Size"), canonFcd1Id, - makerTags, unsignedShort, -1, printValue}, - {0x0008, "Face1Position", N_("Face 1 Position"), N_("Face 1 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x000a, "Face2Position", N_("Face 2 Position"), N_("Face 2 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x000c, "Face3Position", N_("Face 3 Position"), N_("Face 3 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x000e, "Face4Position", N_("Face 4 Position"), N_("Face 4 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x0010, "Face5Position", N_("Face 5 Position"), N_("Face 5 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x0012, "Face6Position", N_("Face 6 Position"), N_("Face 6 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x0014, "Face7Position", N_("Face 7 Position"), N_("Face 7 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x0016, "Face8Position", N_("Face 8 Position"), N_("Face 8 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, - {0x0018, "Face9Position", N_("Face 9 Position"), N_("Face 9 Position"), canonFcd1Id, makerTags, signedShort, -1, - printValue}, + {0x0002, "FacesDetected", N_("Faces Detected"), N_("Faces Detected"), IfdId::canonFcd1Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0003, "FacesDetectedFrameSize", N_("Faces Detected Frame Size"), N_("Faces Detected Frame Size"), + IfdId::canonFcd1Id, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0008, "Face1Position", N_("Face 1 Position"), N_("Face 1 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x000a, "Face2Position", N_("Face 2 Position"), N_("Face 2 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x000c, "Face3Position", N_("Face 3 Position"), N_("Face 3 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x000e, "Face4Position", N_("Face 4 Position"), N_("Face 4 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0010, "Face5Position", N_("Face 5 Position"), N_("Face 5 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0012, "Face6Position", N_("Face 6 Position"), N_("Face 6 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0014, "Face7Position", N_("Face 7 Position"), N_("Face 7 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0016, "Face8Position", N_("Face 8 Position"), N_("Face 8 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0018, "Face9Position", N_("Face 9 Position"), N_("Face 9 Position"), IfdId::canonFcd1Id, SectionId::makerTags, + signedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListFcd1() { @@ -683,9 +731,10 @@ const TagInfo* CanonMakerNote::tagListFcd1() { // Canon FaceDetect 2 Info Tag constexpr TagInfo CanonMakerNote::tagInfoFcd2_[] = { - {0x0001, "FaceWidth", N_("Face Width"), N_("Faces Width"), canonFcd2Id, makerTags, unsignedByte, -1, printValue}, - {0x0002, "FacesDetected", N_("Faces Detected"), N_("Faces Detected"), canonFcd2Id, makerTags, unsignedByte, -1, - printValue}, + {0x0001, "FaceWidth", N_("Face Width"), N_("Faces Width"), IfdId::canonFcd2Id, SectionId::makerTags, unsignedByte, + -1, printValue}, + {0x0002, "FacesDetected", N_("Faces Detected"), N_("Faces Detected"), IfdId::canonFcd2Id, SectionId::makerTags, + unsignedByte, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListFcd2() { @@ -697,8 +746,8 @@ constexpr TagDetails canonContrastInfo[] = {{0x0, N_("Off")}, {0x8, N_("On")}, { // Canon Contrast Info Tag constexpr TagInfo CanonMakerNote::tagInfoCo_[] = { - {0x0004, "IntelligentContrast", N_("Intelligent Contrast"), N_("Intelligent Contrast"), canonContrastId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(canonContrastInfo)}, + {0x0004, "IntelligentContrast", N_("Intelligent Contrast"), N_("Intelligent Contrast"), IfdId::canonContrastId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(canonContrastInfo)}, }; const TagInfo* CanonMakerNote::tagListCo() { @@ -707,26 +756,26 @@ const TagInfo* CanonMakerNote::tagListCo() { // Canon WhiteBalance Info Tag constexpr TagInfo CanonMakerNote::tagInfoWbi_[] = { - {0x0002, "WB_GRGBLevelsAuto", N_("WB_G RGB Levels Auto"), N_("WB_G RGB Levels Auto"), canonWbId, makerTags, - unsignedLong, -1, printValue}, - {0x000a, "WB_GRGBLevelsDaylight", N_("WB_G RGB Levels Daylight"), N_("WB_G RGB Levels Daylight"), canonWbId, - makerTags, unsignedLong, -1, printValue}, - {0x0012, "WB_GRGBLevelsCloudy", N_("WB_G RGB Levels Cloudy"), N_("WB_G RGB Levels Cloudy"), canonWbId, makerTags, - unsignedLong, -1, printValue}, - {0x001a, "WB_GRGBLevelsTungsten", N_("WB_G RGB Levels Tungsten"), N_("WB_G RGB Levels Tungsten"), canonWbId, - makerTags, unsignedLong, -1, printValue}, + {0x0002, "WB_GRGBLevelsAuto", N_("WB_G RGB Levels Auto"), N_("WB_G RGB Levels Auto"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x000a, "WB_GRGBLevelsDaylight", N_("WB_G RGB Levels Daylight"), N_("WB_G RGB Levels Daylight"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0012, "WB_GRGBLevelsCloudy", N_("WB_G RGB Levels Cloudy"), N_("WB_G RGB Levels Cloudy"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x001a, "WB_GRGBLevelsTungsten", N_("WB_G RGB Levels Tungsten"), N_("WB_G RGB Levels Tungsten"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, {0x0022, "WB_GRGBLevelsFluorescent", N_("WB_G RGB Levels Fluorescent"), N_("WB_G RGB Levels Fluorescent"), - canonWbId, makerTags, unsignedLong, -1, printValue}, + IfdId::canonWbId, SectionId::makerTags, unsignedLong, -1, printValue}, {0x002a, "WB_GRGBLevelsFluorHigh", N_("WB_G RGB Levels Fluorescent High"), N_("WB_G RGB Levels Fluorescent High"), - canonWbId, makerTags, unsignedLong, -1, printValue}, - {0x0032, "WB_GRGBLevelsFlash", N_("WB_G RGB Levels Flash"), N_("WB_G RGB Levels Flash"), canonWbId, makerTags, - unsignedLong, -1, printValue}, - {0x003a, "WB_GRGBLevelsUnderwater", N_("WB_G RGB Levels Underwater"), N_("WB_G RGB Levels Underwater"), canonWbId, - makerTags, unsignedLong, -1, printValue}, - {0x0042, "WB_GRGBLevelsCustom1", N_("WB_G RGB Levels Custom 1"), N_("WB_G RGB Levels Custom 1"), canonWbId, - makerTags, unsignedLong, -1, printValue}, - {0x004a, "WB_GRGBLevelsCustom2", N_("WB_G RGB Levels Custom 2"), N_("WB_G RGB Levels Custom 2"), canonWbId, - makerTags, unsignedLong, -1, printValue}, + IfdId::canonWbId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0032, "WB_GRGBLevelsFlash", N_("WB_G RGB Levels Flash"), N_("WB_G RGB Levels Flash"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x003a, "WB_GRGBLevelsUnderwater", N_("WB_G RGB Levels Underwater"), N_("WB_G RGB Levels Underwater"), + IfdId::canonWbId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0042, "WB_GRGBLevelsCustom1", N_("WB_G RGB Levels Custom 1"), N_("WB_G RGB Levels Custom 1"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x004a, "WB_GRGBLevelsCustom2", N_("WB_G RGB Levels Custom 2"), N_("WB_G RGB Levels Custom 2"), IfdId::canonWbId, + SectionId::makerTags, unsignedLong, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListWbi() { @@ -735,8 +784,8 @@ const TagInfo* CanonMakerNote::tagListWbi() { // Canon FaceDetect 3 Info Tag constexpr TagInfo CanonMakerNote::tagInfoFcd3_[] = { - {0x0003, "FacesDetected", N_("Face Detected"), N_("Faces Detected"), canonFcd3Id, makerTags, unsignedShort, -1, - printValue}, + {0x0003, "FacesDetected", N_("Face Detected"), N_("Faces Detected"), IfdId::canonFcd3Id, SectionId::makerTags, + unsignedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListFcd3() { @@ -758,15 +807,16 @@ constexpr TagDetails canonAspectInfo[] = { // Canon Aspect Info Tag constexpr TagInfo CanonMakerNote::tagInfoAs_[] = { - {0x0000, "AspectRatio", N_("Aspect Ratio"), N_("Aspect Ratio"), canonAsId, makerTags, unsignedLong, -1, printValue}, - {0x0001, "CroppedImageWidth", N_("Cropped Image Width"), N_("Cropped Image Width"), canonAsId, makerTags, + {0x0000, "AspectRatio", N_("Aspect Ratio"), N_("Aspect Ratio"), IfdId::canonAsId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0002, "CroppedImageHeight", N_("Cropped Image Height"), N_("Cropped Image Height"), canonAsId, makerTags, - unsignedLong, -1, printValue}, - {0x0003, "CroppedImageLeft", N_("Cropped Image Left"), N_("Cropped Image Left"), canonAsId, makerTags, unsignedLong, - -1, printValue}, - {0x0004, "CroppedImageTop", N_("Cropped Image Top"), N_("Cropped Image Top"), canonAsId, makerTags, unsignedLong, - -1, printValue}, + {0x0001, "CroppedImageWidth", N_("Cropped Image Width"), N_("Cropped Image Width"), IfdId::canonAsId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0002, "CroppedImageHeight", N_("Cropped Image Height"), N_("Cropped Image Height"), IfdId::canonAsId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0003, "CroppedImageLeft", N_("Cropped Image Left"), N_("Cropped Image Left"), IfdId::canonAsId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0004, "CroppedImageTop", N_("Cropped Image Top"), N_("Cropped Image Top"), IfdId::canonAsId, + SectionId::makerTags, unsignedLong, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListAs() { @@ -775,26 +825,26 @@ const TagInfo* CanonMakerNote::tagListAs() { // Canon Color Balance Info Tag constexpr TagInfo CanonMakerNote::tagInfoCbi_[] = { - {0x0001, "WB_RGGBLevelsAuto", N_("WB_RGGB Levels Auto"), N_("WB_RGGB Levels Auto"), canonCbId, makerTags, - signedShort, -1, printValue}, - {0x0005, "WB_RGGBLevelsDaylight", N_("WB_RGGB Levels Daylight"), N_("WB_RGGB Levels Daylight"), canonCbId, - makerTags, signedShort, -1, printValue}, - {0x000d, "WB_RGGBLevelsShade", N_("WB_RGGB Levels Shade"), N_("WB_RGGB Levels Shade"), canonCbId, makerTags, - signedShort, -1, printValue}, - {0x001a, "WB_RGGBLevelsCloudy", N_("WB_RGGB Levels Cloudy"), N_("WB_RGGB Levels Cloudy"), canonCbId, makerTags, - signedShort, -1, printValue}, - {0x0011, "WB_RGGBLevelsTungsten", N_("WB_RGGB Levels Tungsten"), N_("WB_RGGB Levels Tungsten"), canonCbId, - makerTags, signedShort, -1, printValue}, - {0x0015, "WB_RGGBLevelsFluorescent", N_("WB_RGGB Levels Fluorescent"), N_("WB_RGGB Levels Fluorescent"), canonCbId, - makerTags, signedShort, -1, printValue}, - {0x0032, "WB_RGGBLevelsFlash", N_("WB_RGGB Levels Flash"), N_("WB_RGGB Levels Flash"), canonCbId, makerTags, - signedShort, -1, printValue}, + {0x0001, "WB_RGGBLevelsAuto", N_("WB_RGGB Levels Auto"), N_("WB_RGGB Levels Auto"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0005, "WB_RGGBLevelsDaylight", N_("WB_RGGB Levels Daylight"), N_("WB_RGGB Levels Daylight"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x000d, "WB_RGGBLevelsShade", N_("WB_RGGB Levels Shade"), N_("WB_RGGB Levels Shade"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x001a, "WB_RGGBLevelsCloudy", N_("WB_RGGB Levels Cloudy"), N_("WB_RGGB Levels Cloudy"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0011, "WB_RGGBLevelsTungsten", N_("WB_RGGB Levels Tungsten"), N_("WB_RGGB Levels Tungsten"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0015, "WB_RGGBLevelsFluorescent", N_("WB_RGGB Levels Fluorescent"), N_("WB_RGGB Levels Fluorescent"), + IfdId::canonCbId, SectionId::makerTags, signedShort, -1, printValue}, + {0x0032, "WB_RGGBLevelsFlash", N_("WB_RGGB Levels Flash"), N_("WB_RGGB Levels Flash"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, {0x001d, "WB_RGGBLevelsCustomBlackLevels", N_("WB_RGGB Levels Custom Black Levels"), - N_("WB_RGGB Levels Custom Black Levels"), canonCbId, makerTags, signedShort, -1, printValue}, - {0x0021, "WB_RGGBLevelsKelvin", N_("WB_RGGB Levels Kelvin"), N_("WB_RGGB Levels Kelvin"), canonCbId, makerTags, - signedShort, -1, printValue}, - {0x0025, "WB_RGGBBlackLevels", N_("WB_RGGB Black Levels"), N_("WB_RGGB Black Levels"), canonCbId, makerTags, - signedShort, -1, printValue}, + N_("WB_RGGB Levels Custom Black Levels"), IfdId::canonCbId, SectionId::makerTags, signedShort, -1, printValue}, + {0x0021, "WB_RGGBLevelsKelvin", N_("WB_RGGB Levels Kelvin"), N_("WB_RGGB Levels Kelvin"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0025, "WB_RGGBBlackLevels", N_("WB_RGGB Black Levels"), N_("WB_RGGB Black Levels"), IfdId::canonCbId, + SectionId::makerTags, signedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListCbi() { @@ -803,8 +853,8 @@ const TagInfo* CanonMakerNote::tagListCbi() { // Canon Flags Tag constexpr TagInfo CanonMakerNote::tagInfoFl_[] = { - {0x0001, "ModifiedParamFlag", N_("Modified Param Flag"), N_("Modified Param Flag"), canonFlId, makerTags, - signedShort, -1, printValue}, + {0x0001, "ModifiedParamFlag", N_("Modified Param Flag"), N_("Modified Param Flag"), IfdId::canonFlId, + SectionId::makerTags, signedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListFl() { @@ -820,28 +870,28 @@ constexpr TagDetails canonModifiedSharpnessFreq[] = {{0, N_("n/a")}, {1, N_ // Canon ModifiedInfo Tag constexpr TagInfo CanonMakerNote::tagInfoMo_[] = { - {0x0001, "ModifiedToneCurve", N_("Modified ToneCurve"), N_("Modified ToneCurve"), canonMoID, makerTags, signedShort, - -1, EXV_PRINT_TAG(canonModifiedToneCurve)}, - {0x0002, "ModifiedSharpness", N_("Modified Sharpness"), N_("Modified Sharpness"), canonMoID, makerTags, signedShort, - -1, EXV_PRINT_TAG(canonModifiedSharpnessFreq)}, - {0x0003, "ModifiedSharpnessFreq", N_("Modified Sharpness Freq"), N_("Modified Sharpness Freq"), canonMoID, - makerTags, signedShort, -1, printValue}, - {0x0004, "ModifiedSensorRedLevel", N_("Modified Sensor Red Level"), N_("Modified Sensor Red Level"), canonMoID, - makerTags, signedShort, -1, printValue}, - {0x0005, "ModifiedSensorBlueLevel", N_("Modified Sensor Blue Level"), N_("Modified Sensor Blue Level"), canonMoID, - makerTags, signedShort, -1, printValue}, - {0x0006, "ModifiedWhiteBalanceRed", N_("Modified White Balance Red"), N_("Modified White Balance Red"), canonMoID, - makerTags, signedShort, -1, printValue}, + {0x0001, "ModifiedToneCurve", N_("Modified ToneCurve"), N_("Modified ToneCurve"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonModifiedToneCurve)}, + {0x0002, "ModifiedSharpness", N_("Modified Sharpness"), N_("Modified Sharpness"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonModifiedSharpnessFreq)}, + {0x0003, "ModifiedSharpnessFreq", N_("Modified Sharpness Freq"), N_("Modified Sharpness Freq"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0004, "ModifiedSensorRedLevel", N_("Modified Sensor Red Level"), N_("Modified Sensor Red Level"), + IfdId::canonMoID, SectionId::makerTags, signedShort, -1, printValue}, + {0x0005, "ModifiedSensorBlueLevel", N_("Modified Sensor Blue Level"), N_("Modified Sensor Blue Level"), + IfdId::canonMoID, SectionId::makerTags, signedShort, -1, printValue}, + {0x0006, "ModifiedWhiteBalanceRed", N_("Modified White Balance Red"), N_("Modified White Balance Red"), + IfdId::canonMoID, SectionId::makerTags, signedShort, -1, printValue}, {0x0007, "ModifiedWhiteBalanceBlue", N_("Modified White Balance Blue"), N_("Modified White Balance Blue"), - canonMoID, makerTags, signedShort, -1, printValue}, - {0x0008, "ModifiedWhiteBalance", N_("Modified White Balance"), N_("Modified White Balance"), canonMoID, makerTags, - signedShort, -1, EXV_PRINT_TAG(canonSiWhiteBalance)}, - {0x0009, "ModifiedColorTemp", N_("Modified Color Temp"), N_("Modified Color Temp"), canonMoID, makerTags, - signedShort, -1, printValue}, - {0x000a, "ModifiedPictureStyle", N_("Modified Picture Style"), N_("Modified Picture Style"), canonMoID, makerTags, - signedShort, -1, EXV_PRINT_TAG(canonPictureStyle)}, - {0x000b, "ModifiedDigitalGain", N_("Modified Param Flag"), N_("Modified Param Flag"), canonMoID, makerTags, - signedShort, -1, printValue}, + IfdId::canonMoID, SectionId::makerTags, signedShort, -1, printValue}, + {0x0008, "ModifiedWhiteBalance", N_("Modified White Balance"), N_("Modified White Balance"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonSiWhiteBalance)}, + {0x0009, "ModifiedColorTemp", N_("Modified Color Temp"), N_("Modified Color Temp"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, printValue}, + {0x000a, "ModifiedPictureStyle", N_("Modified Picture Style"), N_("Modified Picture Style"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonPictureStyle)}, + {0x000b, "ModifiedDigitalGain", N_("Modified Param Flag"), N_("Modified Param Flag"), IfdId::canonMoID, + SectionId::makerTags, signedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListMo() { @@ -855,16 +905,16 @@ constexpr TagDetails canonPreviewQuality[] = { // Canon Preview Image Info Tag constexpr TagInfo CanonMakerNote::tagInfoPreI_[] = { - {0x0001, "PreviewQuality", N_("Preview Quality"), N_("Preview Quality"), canonPreID, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(canonPreviewQuality)}, - {0x0002, "PreviewImageLength", N_("Preview Image Length"), N_("Preview Image Length"), canonPreID, makerTags, - unsignedLong, -1, printValue}, - {0x0003, "PreviewImageWidth", N_("Preview Image Width"), N_("Preview Image Width"), canonPreID, makerTags, - unsignedLong, -1, printValue}, - {0x0004, "PreviewImageHeight", N_("Preview Image Height"), N_("Preview Image Height"), canonPreID, makerTags, - unsignedLong, -1, printValue}, - {0x0005, "PreviewImageStart", N_("Preview Image Start"), N_("Preview Image Start"), canonPreID, makerTags, - unsignedLong, -1, printValue}, + {0x0001, "PreviewQuality", N_("Preview Quality"), N_("Preview Quality"), IfdId::canonPreID, SectionId::makerTags, + unsignedLong, -1, EXV_PRINT_TAG(canonPreviewQuality)}, + {0x0002, "PreviewImageLength", N_("Preview Image Length"), N_("Preview Image Length"), IfdId::canonPreID, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0003, "PreviewImageWidth", N_("Preview Image Width"), N_("Preview Image Width"), IfdId::canonPreID, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0004, "PreviewImageHeight", N_("Preview Image Height"), N_("Preview Image Height"), IfdId::canonPreID, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0005, "PreviewImageStart", N_("Preview Image Start"), N_("Preview Image Start"), IfdId::canonPreID, + SectionId::makerTags, unsignedLong, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListPreI() { @@ -873,10 +923,12 @@ const TagInfo* CanonMakerNote::tagListPreI() { // Canon Color Info Tag constexpr TagInfo CanonMakerNote::tagInfoCi_[] = { - {0x0001, "Saturation", N_("Saturation"), N_("Saturation"), canonCiId, makerTags, signedShort, -1, printValue}, - {0x0002, "ColorTone", N_("Color Tone"), N_("Color Tone"), canonCiId, makerTags, signedShort, -1, printValue}, - {0x0003, "ColorSpace", N_("Color Space"), N_("Color Space"), canonCiId, makerTags, signedShort, -1, - EXV_PRINT_TAG(canonColorSpace)}, + {0x0001, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::canonCiId, SectionId::makerTags, signedShort, -1, + printValue}, + {0x0002, "ColorTone", N_("Color Tone"), N_("Color Tone"), IfdId::canonCiId, SectionId::makerTags, signedShort, -1, + printValue}, + {0x0003, "ColorSpace", N_("Color Space"), N_("Color Space"), IfdId::canonCiId, SectionId::makerTags, signedShort, + -1, EXV_PRINT_TAG(canonColorSpace)}, }; const TagInfo* CanonMakerNote::tagListCi() { @@ -889,12 +941,12 @@ constexpr TagDetails canonAFMicroAdjMode[] = { // Canon AFMicroAdj Info Tag constexpr TagInfo CanonMakerNote::tagInfoAfMiAdj_[] = { - {0x0001, "AFMicroAdjMode", N_("AFMicroAdjMode"), N_("AFMicroAdjMode"), canonAfMiAdjId, makerTags, signedLong, -1, - EXV_PRINT_TAG(canonAFMicroAdjMode)}, - {0x0002, "AFMicroAdjValue", N_("AF Micro Adj Value"), N_("AF Micro Adj Value"), canonAfMiAdjId, makerTags, - signedRational, -1, printValue}, + {0x0001, "AFMicroAdjMode", N_("AFMicroAdjMode"), N_("AFMicroAdjMode"), IfdId::canonAfMiAdjId, SectionId::makerTags, + signedLong, -1, EXV_PRINT_TAG(canonAFMicroAdjMode)}, + {0x0002, "AFMicroAdjValue", N_("AF Micro Adj Value"), N_("AF Micro Adj Value"), IfdId::canonAfMiAdjId, + SectionId::makerTags, signedRational, -1, printValue}, {0xffff, "(UnknownCanonAFMicroAdjTag)", "(UnknownCanonAFMicroAdjTag)", N_("Unknown Canon AFMicroAdj tag"), - canonAfMiAdjId, makerTags, signedShort, 1, printValue}}; + IfdId::canonAfMiAdjId, SectionId::makerTags, signedShort, 1, printValue}}; const TagInfo* CanonMakerNote::tagListAfMiAdj() { return tagInfoAfMiAdj_; @@ -902,24 +954,24 @@ const TagInfo* CanonMakerNote::tagListAfMiAdj() { // Canon VignettingCorr Tag constexpr TagInfo CanonMakerNote::tagInfoVigCor_[] = { - {0x0000, "VignettingCorrVersion", N_("Vignetting Corr Version"), N_("Vignetting Corr Version"), canonVigCorId, - makerTags, unsignedShort, -1, printValue}, - {0x0002, "PeripheralLighting", N_("Peripheral Lighting"), N_("Peripheral Lighting"), canonVigCorId, makerTags, - signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, - {0x0003, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion Correction"), canonVigCorId, makerTags, - signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, - {0x0004, "ChromaticAberrationCorr", N_("Chromatic Aberration Corr"), N_("Chromatic Aberration Corr"), canonVigCorId, - makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, - {0x0005, "ChromaticAberrationCorr", N_("Chromatic Aberration Corr"), N_("Chromatic Aberration Corr"), canonVigCorId, - makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, - {0x0006, "PeripheralLightingValue", N_("Peripheral Lighting Value"), N_("Peripheral Lighting Value"), canonVigCorId, - makerTags, signedShort, -1, printValue}, + {0x0000, "VignettingCorrVersion", N_("Vignetting Corr Version"), N_("Vignetting Corr Version"), + IfdId::canonVigCorId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0002, "PeripheralLighting", N_("Peripheral Lighting"), N_("Peripheral Lighting"), IfdId::canonVigCorId, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, + {0x0003, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion Correction"), IfdId::canonVigCorId, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, + {0x0004, "ChromaticAberrationCorr", N_("Chromatic Aberration Corr"), N_("Chromatic Aberration Corr"), + IfdId::canonVigCorId, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, + {0x0005, "ChromaticAberrationCorr", N_("Chromatic Aberration Corr"), N_("Chromatic Aberration Corr"), + IfdId::canonVigCorId, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(canonOffOn)}, + {0x0006, "PeripheralLightingValue", N_("Peripheral Lighting Value"), N_("Peripheral Lighting Value"), + IfdId::canonVigCorId, SectionId::makerTags, signedShort, -1, printValue}, {0x0009, "DistortionCorrectionValue", N_("Distortion Correction Value"), N_("Distortion Correction Value"), - canonVigCorId, makerTags, signedShort, -1, printValue}, - {0x000b, "OriginalImageWidth", N_("Original Image Width"), N_("Original Image Width"), canonVigCorId, makerTags, - signedShort, -1, printValue}, - {0x000c, "OriginalImageHeight", N_("Original Image Height"), N_("Original Image Height"), canonVigCorId, makerTags, - signedShort, -1, printValue}, + IfdId::canonVigCorId, SectionId::makerTags, signedShort, -1, printValue}, + {0x000b, "OriginalImageWidth", N_("Original Image Width"), N_("Original Image Width"), IfdId::canonVigCorId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x000c, "OriginalImageHeight", N_("Original Image Height"), N_("Original Image Height"), IfdId::canonVigCorId, + SectionId::makerTags, signedShort, -1, printValue}, }; const TagInfo* CanonMakerNote::tagListVigCor() { @@ -929,13 +981,13 @@ const TagInfo* CanonMakerNote::tagListVigCor() { // Canon VignettingCorr2 Tag constexpr TagInfo CanonMakerNote::tagInfoVigCor2_[] = { {0x0005, "PeripheralLightingSetting", N_("Peripheral Lighting Setting"), N_("Peripheral Lighting Setting"), - canonVigCor2Id, makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, + IfdId::canonVigCor2Id, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, {0x0006, "ChromaticAberrationSetting", N_("Chromatic Aberration Setting"), N_("Chromatic Aberration Setting"), - canonVigCor2Id, makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, + IfdId::canonVigCor2Id, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, {0x0007, "DistortionCorrectionSetting", N_("Distortion Correction Setting"), N_("Distortion Correction Setting"), - canonVigCor2Id, makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, + IfdId::canonVigCor2Id, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, {0xffff, "(UnknownVignettingCorr2Tag)", "(UnknownVignettingCorr2Tag)", N_("UnknownVignettingCorr2Tag Tag"), - canonVigCor2Id, makerTags, signedLong, 1, printValue} // important to add end of tag + IfdId::canonVigCor2Id, SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListVigCor2() { @@ -956,17 +1008,17 @@ constexpr TagDetails canonHighISONoiseReduction[] = { // Canon LightingOpt Tag constexpr TagInfo CanonMakerNote::tagInfoLiOp_[] = { {0x0001, "PeripheralIlluminationCorr", N_("Peripheral Lighting Setting"), N_("Peripheral Lighting Setting"), - canonLiOpId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, + IfdId::canonLiOpId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, {0x0002, "AutoLightingOptimizer", N_("Chromatic Aberration Setting"), N_("Chromatic Aberration Setting"), - canonLiOpId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonAutoLightingOptimizer)}, + IfdId::canonLiOpId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAutoLightingOptimizer)}, {0x0003, "HighlightTonePriority", N_("Distortion Correction Setting"), N_("Distortion Correction Setting"), - canonLiOpId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, + IfdId::canonLiOpId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOffOn)}, {0x0004, "LongExposureNoiseReduction", N_("Distortion Correction Setting"), N_("Distortion Correction Setting"), - canonLiOpId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonLongExposureNoiseReduction)}, + IfdId::canonLiOpId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonLongExposureNoiseReduction)}, {0x0005, "HighISONoiseReduction", N_("Distortion Correction Setting"), N_("Distortion Correction Setting"), - canonLiOpId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonHighISONoiseReduction)}, + IfdId::canonLiOpId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonHighISONoiseReduction)}, {0xffff, "(UnknownLightingOptimizationTag)", "(UnknownLightingOptimizationTag)", - N_("UnknownLightingOptimizationTag Selection Tag"), canonLiOpId, makerTags, signedLong, 1, + N_("UnknownLightingOptimizationTag Selection Tag"), IfdId::canonLiOpId, SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; @@ -976,10 +1028,10 @@ const TagInfo* CanonMakerNote::tagListLiOp() { // Canon LensInfo Tag constexpr TagInfo CanonMakerNote::tagInfoLe_[] = { - {0x0000, "LensSerialNumber", N_("Lens Seria lNumber"), N_("Lens Serial Number"), canonLeId, makerTags, asciiString, - -1, printValue}, - {0xffff, "(UnkownCanonLensInfoTag)", "(UnkownCanonLensInfoTag)", N_("UnkownCanonLensInfoTag"), canonLeId, makerTags, - undefined, 1, printValue} // important to add end of tag + {0x0000, "LensSerialNumber", N_("Lens Seria lNumber"), N_("Lens Serial Number"), IfdId::canonLeId, + SectionId::makerTags, asciiString, -1, printValue}, + {0xffff, "(UnkownCanonLensInfoTag)", "(UnkownCanonLensInfoTag)", N_("UnkownCanonLensInfoTag"), IfdId::canonLeId, + SectionId::makerTags, undefined, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListLe() { @@ -993,10 +1045,10 @@ constexpr TagDetails canonAmbienceSelection[] = {{0, N_("Standard")}, {1, N_("Vi // Canon Ambience Tag constexpr TagInfo CanonMakerNote::tagInfoAm_[] = { - {0x0001, "AmbienceSelection", N_("Ambience Selection"), N_("Ambience Selection"), canonAmId, makerTags, signedLong, - -1, EXV_PRINT_TAG(canonAmbienceSelection)}, - {0xffff, "(AmbienceSelectionTag)", "(AmbienceSelectionTag)", N_("UAmbience Selection Tag"), canonAmId, makerTags, - signedLong, 1, printValue} // important to add end of tag + {0x0001, "AmbienceSelection", N_("Ambience Selection"), N_("Ambience Selection"), IfdId::canonAmId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAmbienceSelection)}, + {0xffff, "(AmbienceSelectionTag)", "(AmbienceSelectionTag)", N_("UAmbience Selection Tag"), IfdId::canonAmId, + SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListAm() { @@ -1012,14 +1064,14 @@ constexpr TagDetails canonMultiExposureControl[] = { // Canon MultiExp Tag constexpr TagInfo CanonMakerNote::tagInfoMe_[] = { - {0x0001, "MultiExposure", N_("Multi Exposure"), N_("Multi Exposure"), canonMeId, makerTags, signedLong, -1, - EXV_PRINT_TAG(canonMultiExposure)}, - {0x0002, "MultiExposureControl", N_("Multi Exposure Control"), N_("Multi Exposure Control"), canonMeId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonMultiExposureControl)}, - {0x0003, "MultiExposureShots", N_("Multi Exposure Shots"), N_("Multi Exposure Shots"), canonMeId, makerTags, + {0x0001, "MultiExposure", N_("Multi Exposure"), N_("Multi Exposure"), IfdId::canonMeId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonMultiExposure)}, - {0xffff, "(UnknownMultiExposureTag)", "(UnknownMultiExposureTag)", N_("UnknownMultiExposureTag"), canonMeId, - makerTags, signedLong, 1, printValue} // important to add end of tag + {0x0002, "MultiExposureControl", N_("Multi Exposure Control"), N_("Multi Exposure Control"), IfdId::canonMeId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonMultiExposureControl)}, + {0x0003, "MultiExposureShots", N_("Multi Exposure Shots"), N_("Multi Exposure Shots"), IfdId::canonMeId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonMultiExposure)}, + {0xffff, "(UnknownMultiExposureTag)", "(UnknownMultiExposureTag)", N_("UnknownMultiExposureTag"), IfdId::canonMeId, + SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListMe() { @@ -1034,28 +1086,28 @@ constexpr TagDetails canonMiniatureFilterOrientation[] = {{0, N_("Horizontal")}, // Canon Filter Info Tag constexpr TagInfo CanonMakerNote::tagInfoFil_[] = { - {0x0101, "GrainyBWFilter", N_("Grainy BW Filter"), N_("Grainy BW Filter"), canonFilId, makerTags, asciiString, -1, - EXV_PRINT_TAG(canonFilterInfo)}, - {0x0201, "SoftFocusFilter", N_("Soft Focus Filter"), N_("Soft Focus Filter"), canonFilId, makerTags, asciiString, - -1, EXV_PRINT_TAG(canonFilterInfo)}, - {0x0301, "ToyCameraFilter", N_("Toy Camera Filter"), N_("Toy Camera Filter"), canonFilId, makerTags, asciiString, - -1, EXV_PRINT_TAG(canonFilterInfo)}, - {0x0401, "MiniatureFilter", N_("Miniature Filter"), N_("Miniature Filter"), canonFilId, makerTags, asciiString, -1, - EXV_PRINT_TAG(canonFilterInfo)}, + {0x0101, "GrainyBWFilter", N_("Grainy BW Filter"), N_("Grainy BW Filter"), IfdId::canonFilId, SectionId::makerTags, + asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0x0201, "SoftFocusFilter", N_("Soft Focus Filter"), N_("Soft Focus Filter"), IfdId::canonFilId, + SectionId::makerTags, asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0x0301, "ToyCameraFilter", N_("Toy Camera Filter"), N_("Toy Camera Filter"), IfdId::canonFilId, + SectionId::makerTags, asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0x0401, "MiniatureFilter", N_("Miniature Filter"), N_("Miniature Filter"), IfdId::canonFilId, SectionId::makerTags, + asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, {0x0402, "MiniatureFilterOrientation", N_("Miniature Filter Orientation"), N_("Miniature Filter Orientation"), - canonFilId, makerTags, asciiString, -1, EXV_PRINT_TAG(canonMiniatureFilterOrientation)}, - {0x0403, "MiniatureFilterPosition", N_("Miniature Filter Position"), N_("Miniature Filter Position"), canonFilId, - makerTags, asciiString, -1, printValue}, - {0x0404, "MiniatureFilterParameter", N_("Miniature Filter Parameter"), N_("Miniature Filter Parameter"), canonFilId, - makerTags, asciiString, -1, printValue}, - {0x0501, "FisheyeFilter", N_("Fisheye Filter"), N_("Fisheye Filter"), canonFilId, makerTags, asciiString, -1, - EXV_PRINT_TAG(canonFilterInfo)}, - {0x0601, "PaintingFilter", N_("Painting Filter"), N_("Painting Filter"), canonFilId, makerTags, asciiString, -1, - EXV_PRINT_TAG(canonFilterInfo)}, - {0x0701, "WatercolorFilter", N_("Watercolor Filter"), N_("Watercolor Filter"), canonFilId, makerTags, asciiString, - -1, EXV_PRINT_TAG(canonFilterInfo)}, - {0xffff, "(UnknownFilterTag)", "(UnknownFilterTag)", N_("UnknownFilterTag"), canonFilId, makerTags, signedLong, 1, - printValue} // important to add end of tag + IfdId::canonFilId, SectionId::makerTags, asciiString, -1, EXV_PRINT_TAG(canonMiniatureFilterOrientation)}, + {0x0403, "MiniatureFilterPosition", N_("Miniature Filter Position"), N_("Miniature Filter Position"), + IfdId::canonFilId, SectionId::makerTags, asciiString, -1, printValue}, + {0x0404, "MiniatureFilterParameter", N_("Miniature Filter Parameter"), N_("Miniature Filter Parameter"), + IfdId::canonFilId, SectionId::makerTags, asciiString, -1, printValue}, + {0x0501, "FisheyeFilter", N_("Fisheye Filter"), N_("Fisheye Filter"), IfdId::canonFilId, SectionId::makerTags, + asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0x0601, "PaintingFilter", N_("Painting Filter"), N_("Painting Filter"), IfdId::canonFilId, SectionId::makerTags, + asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0x0701, "WatercolorFilter", N_("Watercolor Filter"), N_("Watercolor Filter"), IfdId::canonFilId, + SectionId::makerTags, asciiString, -1, EXV_PRINT_TAG(canonFilterInfo)}, + {0xffff, "(UnknownFilterTag)", "(UnknownFilterTag)", N_("UnknownFilterTag"), IfdId::canonFilId, + SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListFil() { @@ -1074,11 +1126,12 @@ constexpr TagDetails canonHdrEffect[] = {{0, N_("Natural")}, // Canon HDR Info Tag constexpr TagInfo CanonMakerNote::tagInfoHdr_[] = { - {0x0001, "HDR", N_("HDR"), N_("HDR"), canonHdrId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonHdr)}, - {0x0002, "HDREffect", N_("HDR Effect"), N_("HDR Effect"), canonHdrId, makerTags, signedLong, -1, + {0x0001, "HDR", N_("HDR"), N_("HDR"), IfdId::canonHdrId, SectionId::makerTags, signedLong, -1, + EXV_PRINT_TAG(canonHdr)}, + {0x0002, "HDREffect", N_("HDR Effect"), N_("HDR Effect"), IfdId::canonHdrId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonHdrEffect)}, - {0xffff, "(UnknownHDRTag)", "(UnknownHDRTag)", N_("Unknown Canon HDR Tag"), canonHdrId, makerTags, signedLong, 1, - printValue}}; + {0xffff, "(UnknownHDRTag)", "(UnknownHDRTag)", N_("Unknown Canon HDR Tag"), IfdId::canonHdrId, SectionId::makerTags, + signedLong, 1, printValue}}; const TagInfo* CanonMakerNote::tagListHdr() { return tagInfoHdr_; @@ -1157,46 +1210,46 @@ constexpr TagDetails canonInitialAFPointInServo[] = { // Canon AFConfig Tags constexpr TagInfo CanonMakerNote::tagInfoAfC_[] = { - {0x0001, "AFConfigTool", N_("AF Config Tool"), N_("AF Config Tool"), canonAfCId, makerTags, signedLong, -1, - printValue}, - {0x0002, "AFTrackingSensitivity", N_("AF Tracking Sensitivity"), N_("AFTrackingSensitivity"), canonAfCId, makerTags, + {0x0001, "AFConfigTool", N_("AF Config Tool"), N_("AF Config Tool"), IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, printValue}, - {0x0003, "AFAccelDecelTracking", N_("AF Accel Decel Tracking"), N_("AF Accel Decel Tracking"), canonAfCId, - makerTags, signedLong, -1, printValue}, - {0x0004, "AFPointSwitching", N_("AF PointS witching"), N_("AF Point Switching"), canonAfCId, makerTags, signedLong, - -1, printValue}, - {0x0005, "AIServoFirstImage", N_("AI Servo First Image"), N_("AI Servo First Image"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonAIServoFirstImage)}, - {0x0006, "AIServoSecondImage", N_("AI Servo Second Image"), N_("AI Servo Second Image"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonAIServoSecondImage)}, - {0x0007, "USMLensElectronicMF", N_("USM Lens Electronic MF"), N_("USM Lens Electronic MF"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonUSMLensElectronicMF)}, - {0x0008, "AFAssistBeam", N_("AF Assist Beam"), N_("AF Assist Beam"), canonAfCId, makerTags, signedLong, -1, - EXV_PRINT_TAG(canonAFAssistBeam)}, - {0x0009, "OneShotAFRelease", N_("One Shot AF Release"), N_("One Shot AF Release"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonOneShotAFRelease)}, - {0x000a, "AutoAFPointSelEOSiTRAF", N_("Auto AF Point Sel EOS iTRAF"), N_("Auto AF Point Sel EOS iTRAF"), canonAfCId, - makerTags, signedLong, -1, EXV_PRINT_TAG(canonAutoAFPointSelEOSiTRAF)}, + {0x0002, "AFTrackingSensitivity", N_("AF Tracking Sensitivity"), N_("AFTrackingSensitivity"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, printValue}, + {0x0003, "AFAccelDecelTracking", N_("AF Accel Decel Tracking"), N_("AF Accel Decel Tracking"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, printValue}, + {0x0004, "AFPointSwitching", N_("AF PointS witching"), N_("AF Point Switching"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, printValue}, + {0x0005, "AIServoFirstImage", N_("AI Servo First Image"), N_("AI Servo First Image"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAIServoFirstImage)}, + {0x0006, "AIServoSecondImage", N_("AI Servo Second Image"), N_("AI Servo Second Image"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAIServoSecondImage)}, + {0x0007, "USMLensElectronicMF", N_("USM Lens Electronic MF"), N_("USM Lens Electronic MF"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonUSMLensElectronicMF)}, + {0x0008, "AFAssistBeam", N_("AF Assist Beam"), N_("AF Assist Beam"), IfdId::canonAfCId, SectionId::makerTags, + signedLong, -1, EXV_PRINT_TAG(canonAFAssistBeam)}, + {0x0009, "OneShotAFRelease", N_("One Shot AF Release"), N_("One Shot AF Release"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOneShotAFRelease)}, + {0x000a, "AutoAFPointSelEOSiTRAF", N_("Auto AF Point Sel EOS iTRAF"), N_("Auto AF Point Sel EOS iTRAF"), + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAutoAFPointSelEOSiTRAF)}, {0x000b, "LensDriveWhenAFImpossible", N_("Lens Drive When AF Impossible"), N_("Lens Drive When AF Impossible"), - canonAfCId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonLensDriveWhenAFImpossible)}, + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonLensDriveWhenAFImpossible)}, {0x000c, "SelectAFAreaSelectionMode", N_("Select AF Area Selection Mode"), N_("Select AF Area Selection Mode"), - canonAfCId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonSelectAFAreaSelectionMode)}, - {0x000d, "AFAreaSelectionMethod", N_("AF Area Selection Method"), N_("AF Area Selection Method"), canonAfCId, - makerTags, signedLong, -1, EXV_PRINT_TAG(canonAFAreaSelectionMethod)}, - {0x000e, "OrientationLinkedAF", N_("Orientation Linked AF"), N_("Orientation Linked AF"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonOrientationLinkedAF)}, + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonSelectAFAreaSelectionMode)}, + {0x000d, "AFAreaSelectionMethod", N_("AF Area Selection Method"), N_("AF Area Selection Method"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAFAreaSelectionMethod)}, + {0x000e, "OrientationLinkedAF", N_("Orientation Linked AF"), N_("Orientation Linked AF"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonOrientationLinkedAF)}, {0x000f, "ManualAFPointSelPattern", N_("Manual AF Point Sel Pattern"), N_("Manual AF Point Sel Pattern"), - canonAfCId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonManualAFPointSelPattern)}, + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonManualAFPointSelPattern)}, {0x0010, "AFPointDisplayDuringFocus", N_("AF Point Display During Focus"), N_("AF Point Display During Focus"), - canonAfCId, makerTags, signedLong, -1, EXV_PRINT_TAG(canonAFPointDisplayDuringFocus)}, - {0x0011, "VFDisplayIllumination", N_("VF Display Illumination"), N_("VF Display Illumination"), canonAfCId, - makerTags, signedLong, -1, EXV_PRINT_TAG(canonAVFDisplayIllumination)}, - {0x0012, "AFStatusViewfinder", N_("AF Status Viewfinder"), N_("AF Status Viewfinder"), canonAfCId, makerTags, - signedLong, -1, EXV_PRINT_TAG(canonAFStatusViewfinder)}, - {0x0013, "InitialAFPointInServo", N_("Initial AF Point In Servo"), N_("Initial AF Point In Servo"), canonAfCId, - makerTags, signedLong, -1, EXV_PRINT_TAG(canonInitialAFPointInServo)}, - {0xffff, "(UnknownCanonAFTag)", "(UnknownCanonAFTag)", N_("UnknownCanonAFTag"), canonAfCId, makerTags, signedLong, - 1, printValue} // important to add end of tag + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAFPointDisplayDuringFocus)}, + {0x0011, "VFDisplayIllumination", N_("VF Display Illumination"), N_("VF Display Illumination"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAVFDisplayIllumination)}, + {0x0012, "AFStatusViewfinder", N_("AF Status Viewfinder"), N_("AF Status Viewfinder"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonAFStatusViewfinder)}, + {0x0013, "InitialAFPointInServo", N_("Initial AF Point In Servo"), N_("Initial AF Point In Servo"), + IfdId::canonAfCId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(canonInitialAFPointInServo)}, + {0xffff, "(UnknownCanonAFTag)", "(UnknownCanonAFTag)", N_("UnknownCanonAFTag"), IfdId::canonAfCId, + SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListAfC() { @@ -1205,12 +1258,12 @@ const TagInfo* CanonMakerNote::tagListAfC() { // Canon RawBurstInfo Info Tag constexpr TagInfo CanonMakerNote::tagInfoRawB_[] = { - {0x0001, "RawBurstImageNum", N_("Raw Burst Image Num"), N_("Raw Burst Image Num"), canonRawBId, makerTags, - unsignedLong, -1, printValue}, - {0x0002, "RawBurstImageCount", N_("Raw Burst Image Count"), N_("Raw Burst Image Count"), canonRawBId, makerTags, - unsignedLong, -1, printValue}, - {0xffff, "(UnknownRawBurstTag)", "(UnknownRawBurstTag)", N_("UnknownRawBurstTag"), canonRawBId, makerTags, - signedLong, 1, printValue} // important to add end of tag + {0x0001, "RawBurstImageNum", N_("Raw Burst Image Num"), N_("Raw Burst Image Num"), IfdId::canonRawBId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0002, "RawBurstImageCount", N_("Raw Burst Image Count"), N_("Raw Burst Image Count"), IfdId::canonRawBId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0xffff, "(UnknownRawBurstTag)", "(UnknownRawBurstTag)", N_("UnknownRawBurstTag"), IfdId::canonRawBId, + SectionId::makerTags, signedLong, 1, printValue} // important to add end of tag }; const TagInfo* CanonMakerNote::tagListRawB() { @@ -1926,84 +1979,90 @@ constexpr TagDetails canonCsSRAWQuality[] = {{0, N_("n/a")}, {1, N_("sRAW1 (mRAW // Canon Camera Settings Tag Info constexpr TagInfo CanonMakerNote::tagInfoCs_[] = { - {0x0001, "Macro", N_("Macro"), N_("Macro mode"), canonCsId, makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsMacro)}, - {0x0002, "Selftimer", N_("Selftimer"), N_("Self timer"), canonCsId, makerTags, signedShort, 1, printCs0x0002}, - {0x0003, "Quality", N_("Quality"), N_("Quality"), canonCsId, makerTags, signedShort, 1, + {0x0001, "Macro", N_("Macro"), N_("Macro mode"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, + EXV_PRINT_TAG(canonCsMacro)}, + {0x0002, "Selftimer", N_("Selftimer"), N_("Self timer"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, + printCs0x0002}, + {0x0003, "Quality", N_("Quality"), N_("Quality"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsQuality)}, - {0x0004, "FlashMode", N_("Flash Mode"), N_("Flash mode setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsFlashMode)}, - {0x0005, "DriveMode", N_("Drive Mode"), N_("Drive mode setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsDriveMode)}, - {0x0006, "0x0006", "0x0006", N_("Unknown"), canonCsId, makerTags, unsignedShort, 1, printValue}, - {0x0007, "FocusMode", N_("Focus Mode"), N_("Focus mode setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsFocusMode)}, - {0x0008, "0x0008", "0x0008", N_("Unknown"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x0009, "RecordMode", "RecordMode", N_("Record Mode"), canonCsId, makerTags, signedShort, 1, + {0x0004, "FlashMode", N_("Flash Mode"), N_("Flash mode setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsFlashMode)}, + {0x0005, "DriveMode", N_("Drive Mode"), N_("Drive mode setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsDriveMode)}, + {0x0006, "0x0006", "0x0006", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0007, "FocusMode", N_("Focus Mode"), N_("Focus mode setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsFocusMode)}, + {0x0008, "0x0008", "0x0008", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, + {0x0009, "RecordMode", "RecordMode", N_("Record Mode"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsRecordMode)}, - {0x000a, "ImageSize", N_("Image Size"), N_("Image size"), canonCsId, makerTags, signedShort, 1, + {0x000a, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsImageSize)}, - {0x000b, "EasyMode", N_("Easy Mode"), N_("Easy shooting mode"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsEasyMode)}, - {0x000c, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsDigitalZoom)}, - {0x000d, "Contrast", N_("Contrast"), N_("Contrast setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsLnh)}, - {0x000e, "Saturation", N_("Saturation"), N_("Saturation setting"), canonCsId, makerTags, signedShort, 1, + {0x000b, "EasyMode", N_("Easy Mode"), N_("Easy shooting mode"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonCsEasyMode)}, + {0x000c, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonCsDigitalZoom)}, + {0x000d, "Contrast", N_("Contrast"), N_("Contrast setting"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsLnh)}, - {0x000f, "Sharpness", N_("Sharpness"), N_("Sharpness setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsLnh)}, - {0x0010, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsISOSpeed)}, - {0x0011, "MeteringMode", N_("Metering Mode"), N_("Metering mode setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsMeteringMode)}, - {0x0012, "FocusType", N_("Focus Type"), N_("Focus type setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsFocusType)}, - {0x0013, "AFPoint", N_("AF Point"), N_("AF point selected"), canonCsId, makerTags, signedShort, 1, + {0x000e, "Saturation", N_("Saturation"), N_("Saturation setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsLnh)}, + {0x000f, "Sharpness", N_("Sharpness"), N_("Sharpness setting"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonCsLnh)}, + {0x0010, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsISOSpeed)}, + {0x0011, "MeteringMode", N_("Metering Mode"), N_("Metering mode setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsMeteringMode)}, + {0x0012, "FocusType", N_("Focus Type"), N_("Focus type setting"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsFocusType)}, + {0x0013, "AFPoint", N_("AF Point"), N_("AF point selected"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsAfPoint)}, - {0x0014, "ExposureProgram", N_("Exposure Program"), N_("Exposure mode setting"), canonCsId, makerTags, signedShort, - 1, EXV_PRINT_TAG(canonCsExposureProgram)}, - {0x0015, "0x0015", "0x0015", N_("Unknown"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x0016, "LensType", N_("Lens Type"), N_("Lens type"), canonCsId, makerTags, signedShort, 1, printCsLensType}, + {0x0014, "ExposureProgram", N_("Exposure Program"), N_("Exposure mode setting"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsExposureProgram)}, + {0x0015, "0x0015", "0x0015", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, + {0x0016, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, + printCsLensType}, {0x0017, "Lens", N_("Lens"), - N_("'long' and 'short' focal length of lens (in 'focal units') and 'focal units' per mm"), canonCsId, makerTags, - unsignedShort, 3, printCsLens}, - {0x0018, "ShortFocal", N_("Short Focal"), N_("Short focal"), canonCsId, makerTags, unsignedShort, 1, printValue}, - {0x0019, "FocalUnits", N_("Focal Units"), N_("Focal units"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x001a, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), canonCsId, makerTags, signedShort, 1, - printSi0x0015}, - {0x001b, "MinAperture", N_("Min Aperture"), N_("Min aperture"), canonCsId, makerTags, signedShort, 1, - printSi0x0015}, - {0x001c, "FlashActivity", N_("Flash Activity"), N_("Flash activity"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsFlashActivity)}, - {0x001d, "FlashDetails", N_("Flash Details"), N_("Flash details"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG_BITMASK(canonCsFlashDetails)}, - {0x001e, "0x001e", "0x001e", N_("Unknown"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x001f, "0x001f", "0x001f", N_("Unknown"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x0020, "FocusContinuous", N_("Focus Continuous"), N_("Focus continuous setting"), canonCsId, makerTags, - signedShort, 1, EXV_PRINT_TAG(canonCsFocusContinuous)}, - {0x0021, "AESetting", N_("AESetting"), N_("AE setting"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsAESetting)}, - {0x0022, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), canonCsId, makerTags, - signedShort, 1, EXV_PRINT_TAG(canonCsImageStabilization)}, - {0x0023, "DisplayAperture", N_("Display Aperture"), N_("Display aperture"), canonCsId, makerTags, signedShort, 1, - printValue}, - {0x0024, "ZoomSourceWidth", N_("Zoom Source Width"), N_("Zoom source width"), canonCsId, makerTags, signedShort, 1, + N_("'long' and 'short' focal length of lens (in 'focal units') and 'focal units' per mm"), IfdId::canonCsId, + SectionId::makerTags, unsignedShort, 3, printCsLens}, + {0x0018, "ShortFocal", N_("Short Focal"), N_("Short focal"), IfdId::canonCsId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x0019, "FocalUnits", N_("Focal Units"), N_("Focal units"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, - {0x0025, "ZoomTargetWidth", N_("Zoom Target Width"), N_("Zoom target width"), canonCsId, makerTags, signedShort, 1, + {0x001a, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, printSi0x0015}, + {0x001b, "MinAperture", N_("Min Aperture"), N_("Min aperture"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, printSi0x0015}, + {0x001c, "FlashActivity", N_("Flash Activity"), N_("Flash activity"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsFlashActivity)}, + {0x001d, "FlashDetails", N_("Flash Details"), N_("Flash details"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG_BITMASK(canonCsFlashDetails)}, + {0x001e, "0x001e", "0x001e", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, + {0x001f, "0x001f", "0x001f", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, + {0x0020, "FocusContinuous", N_("Focus Continuous"), N_("Focus continuous setting"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsFocusContinuous)}, + {0x0021, "AESetting", N_("AESetting"), N_("AE setting"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, + EXV_PRINT_TAG(canonCsAESetting)}, + {0x0022, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsImageStabilization)}, + {0x0023, "DisplayAperture", N_("Display Aperture"), N_("Display aperture"), IfdId::canonCsId, SectionId::makerTags, + signedShort, 1, printValue}, + {0x0024, "ZoomSourceWidth", N_("Zoom Source Width"), N_("Zoom source width"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0025, "ZoomTargetWidth", N_("Zoom Target Width"), N_("Zoom target width"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0026, "0x0026", "0x0026", N_("Unknown"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, + {0x0027, "SpotMeteringMode", N_("Spot Metering Mode"), N_("Spot metering mode"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsSpotMeteringMode)}, + {0x0028, "PhotoEffect", N_("Photo Effect"), N_("Photo effect"), IfdId::canonCsId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonCsPhotoEffect)}, + {0x0029, "ManualFlashOutput", N_("Manual Flash Output"), N_("Manual flash output"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsSRAWQuality)}, + {0x002a, "ColorTone", N_("Color Tone"), N_("Color tone"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, printValue}, - {0x0026, "0x0026", "0x0026", N_("Unknown"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x0027, "SpotMeteringMode", N_("Spot Metering Mode"), N_("Spot metering mode"), canonCsId, makerTags, signedShort, - 1, EXV_PRINT_TAG(canonCsSpotMeteringMode)}, - {0x0028, "PhotoEffect", N_("Photo Effect"), N_("Photo effect"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsPhotoEffect)}, - {0x0029, "ManualFlashOutput", N_("Manual Flash Output"), N_("Manual flash output"), canonCsId, makerTags, + {0x002e, "SRAWQuality", N_("SRAW Quality Tone"), N_("SRAW quality"), IfdId::canonCsId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonCsSRAWQuality)}, - {0x002a, "ColorTone", N_("Color Tone"), N_("Color tone"), canonCsId, makerTags, signedShort, 1, printValue}, - {0x002e, "SRAWQuality", N_("SRAW Quality Tone"), N_("SRAW quality"), canonCsId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsSRAWQuality)}, // End of list marker - {0xffff, "(UnknownCanonCsTag)", "(UnknownCanonCsTag)", N_("Unknown Canon Camera Settings 1 tag"), canonCsId, - makerTags, signedShort, 1, printValue}, + {0xffff, "(UnknownCanonCsTag)", "(UnknownCanonCsTag)", N_("Unknown Canon Camera Settings 1 tag"), IfdId::canonCsId, + SectionId::makerTags, signedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListCs() { @@ -2040,62 +2099,66 @@ constexpr TagDetails selfTimer2[] = {{65535, "n/a"}, {0, "Selftimer 2s"}, {1, "S // Canon Shot Info Tag constexpr TagInfo CanonMakerNote::tagInfoSi_[] = { - {0x0001, "AutoISO", N_("AutoISO"), N_("AutoISO"), canonSiId, makerTags, unsignedShort, 1, printSi0x0001}, - {0x0002, "ISOSpeed", N_("ISO Speed Used"), N_("ISO speed used"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0002}, - {0x0003, "MeasuredEV", N_("Measured EV"), N_("Measured EV"), canonSiId, makerTags, unsignedShort, 1, printSi0x0003}, - {0x0004, "TargetAperture", N_("Target Aperture"), N_("Target Aperture"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0015}, - {0x0005, "TargetShutterSpeed", N_("Target Shutter Speed"), N_("Target shutter speed"), canonSiId, makerTags, - unsignedShort, 1, printSi0x0016}, - {0x0006, "ExposureCompensation", "Exposure Compensation", N_("Exposure Compensation"), canonSiId, makerTags, + {0x0001, "AutoISO", N_("AutoISO"), N_("AutoISO"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, + printSi0x0001}, + {0x0002, "ISOSpeed", N_("ISO Speed Used"), N_("ISO speed used"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0002}, + {0x0003, "MeasuredEV", N_("Measured EV"), N_("Measured EV"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, + 1, printSi0x0003}, + {0x0004, "TargetAperture", N_("Target Aperture"), N_("Target Aperture"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0015}, + {0x0005, "TargetShutterSpeed", N_("Target Shutter Speed"), N_("Target shutter speed"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, printSi0x0016}, + {0x0006, "ExposureCompensation", "Exposure Compensation", N_("Exposure Compensation"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance setting"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(canonSiWhiteBalance)}, + {0x0008, "SlowShutter", N_("Slow Shutter"), N_("Slow shutter"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(slowShutter)}, + {0x0009, "Sequence", N_("Sequence"), N_("Sequence number (if in a continuous burst)"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, printSi0x0009}, + {0x000a, "OpticalZoomCode", "Optical Zoom Code", N_("Optical Zoom Code"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance setting"), canonSiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(canonSiWhiteBalance)}, - {0x0008, "SlowShutter", N_("Slow Shutter"), N_("Slow shutter"), canonSiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(slowShutter)}, - {0x0009, "Sequence", N_("Sequence"), N_("Sequence number (if in a continuous burst)"), canonSiId, makerTags, - unsignedShort, 1, printSi0x0009}, - {0x000a, "OpticalZoomCode", "Optical Zoom Code", N_("Optical Zoom Code"), canonSiId, makerTags, unsignedShort, 1, - printValue}, - {0x000b, "0x000b", "0x000b", N_("Unknown"), canonSiId, makerTags, unsignedShort, 1, printValue}, - {0x000c, "CameraTemperature", N_("Camera Temperature"), N_("Camera temperature"), canonSiId, makerTags, signedShort, - 1, printSi0x000c}, - {0x000d, "FlashGuideNumber", N_("Flash Guide Number"), N_("Flash guide number"), canonSiId, makerTags, - unsignedShort, 1, printSi0x000d}, - {0x000e, "AFPointUsed", N_("AF Point Used"), N_("AF point used"), canonSiId, makerTags, unsignedShort, 1, - printSi0x000e}, - {0x000f, "FlashBias", N_("Flash Bias"), N_("Flash bias"), canonSiId, makerTags, unsignedShort, 1, + {0x000b, "0x000b", "0x000b", N_("Unknown"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000c, "CameraTemperature", N_("Camera Temperature"), N_("Camera temperature"), IfdId::canonSiId, + SectionId::makerTags, signedShort, 1, printSi0x000c}, + {0x000d, "FlashGuideNumber", N_("Flash Guide Number"), N_("Flash guide number"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, printSi0x000d}, + {0x000e, "AFPointUsed", N_("AF Point Used"), N_("AF point used"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x000e}, + {0x000f, "FlashBias", N_("Flash Bias"), N_("Flash bias"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(canonSiFlashBias)}, - {0x0010, "AutoExposureBracketing", N_("Auto Exposure Bracketing"), N_("Auto exposure bracketing"), canonSiId, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(autoExposureBracketing)}, - {0x0011, "AEBBracketValue", "AEB Bracket Value", N_("AEB Bracket Value"), canonSiId, makerTags, unsignedShort, 1, - printValue}, - {0x0012, "ControlMode", "Control Mode", N_("Control Mode"), canonSiId, makerTags, unsignedShort, 1, printValue}, - {0x0013, "SubjectDistance", N_("Subject Distance"), N_("Subject distance"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0013}, - {0x0014, "0x0014", "0x0014", N_("Unknown"), canonSiId, makerTags, unsignedShort, 1, printValue}, - {0x0015, "ApertureValue", N_("Aperture Value"), N_("Aperture"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0015}, - {0x0016, "ShutterSpeedValue", N_("Shutter Speed Value"), N_("Shutter speed"), canonSiId, makerTags, unsignedShort, - 1, printSi0x0016}, - {0x0017, "MeasuredEV2", N_("Measured EV 2"), N_("Measured EV 2"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0017}, - {0x0018, "BulbDuration", N_("Bulb Duration"), N_("Bulb duration"), canonSiId, makerTags, unsignedShort, 1, - printSi0x0018}, - {0x0019, "0x0019", "0x0019", N_("Unknown"), canonSiId, makerTags, unsignedShort, 1, printValue}, - {0x001a, "CameraType", N_("Camera Type"), N_("Camera type"), canonSiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(cameraType)}, - {0x001b, "AutoRotate", N_("Auto Rotate"), N_("Auto rotate"), canonSiId, makerTags, signedShort, 1, + {0x0010, "AutoExposureBracketing", N_("Auto Exposure Bracketing"), N_("Auto exposure bracketing"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(autoExposureBracketing)}, + {0x0011, "AEBBracketValue", "AEB Bracket Value", N_("AEB Bracket Value"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0012, "ControlMode", "Control Mode", N_("Control Mode"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x0013, "SubjectDistance", N_("Subject Distance"), N_("Subject distance"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0013}, + {0x0014, "0x0014", "0x0014", N_("Unknown"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0015, "ApertureValue", N_("Aperture Value"), N_("Aperture"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0015}, + {0x0016, "ShutterSpeedValue", N_("Shutter Speed Value"), N_("Shutter speed"), IfdId::canonSiId, + SectionId::makerTags, unsignedShort, 1, printSi0x0016}, + {0x0017, "MeasuredEV2", N_("Measured EV 2"), N_("Measured EV 2"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0017}, + {0x0018, "BulbDuration", N_("Bulb Duration"), N_("Bulb duration"), IfdId::canonSiId, SectionId::makerTags, + unsignedShort, 1, printSi0x0018}, + {0x0019, "0x0019", "0x0019", N_("Unknown"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x001a, "CameraType", N_("Camera Type"), N_("Camera type"), IfdId::canonSiId, SectionId::makerTags, unsignedShort, + 1, EXV_PRINT_TAG(cameraType)}, + {0x001b, "AutoRotate", N_("Auto Rotate"), N_("Auto rotate"), IfdId::canonSiId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(autoRotate)}, - {0x001c, "NDFilter", N_("ND Filter"), N_("ND filter"), canonSiId, makerTags, signedShort, 1, + {0x001c, "NDFilter", N_("ND Filter"), N_("ND filter"), IfdId::canonSiId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(ndRotate)}, - {0x001d, "SelfTimer2", N_("Self Timer 2"), N_("Self timer2"), canonSiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(selfTimer2)}, - {0x0021, "FlashOutput", N_("Flash Output"), N_("Flash output"), canonSiId, makerTags, signedShort, 1, printValue}, + {0x001d, "SelfTimer2", N_("Self Timer 2"), N_("Self timer2"), IfdId::canonSiId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(selfTimer2)}, + {0x0021, "FlashOutput", N_("Flash Output"), N_("Flash output"), IfdId::canonSiId, SectionId::makerTags, signedShort, + 1, printValue}, // End of list marker - {0xffff, "(UnknownCanonCsTag)", "(UnknownCanonCsTag)", N_("Unknown Canon Camera Settings 1 tag"), canonCsId, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownCanonCsTag)", "(UnknownCanonCsTag)", N_("Unknown Canon Camera Settings 1 tag"), IfdId::canonCsId, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListSi() { @@ -2111,13 +2174,13 @@ constexpr TagDetails canonPaDirection[] = {{0, N_("Left to right")}, // Canon Panorama Info constexpr TagInfo CanonMakerNote::tagInfoPa_[] = { - {0x0002, "PanoramaFrame", N_("Panorama Frame"), N_("Panorama frame number"), canonPaId, makerTags, unsignedShort, 1, - printValue}, - {0x0005, "PanoramaDirection", N_("Panorama Direction"), N_("Panorama direction"), canonPaId, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(canonPaDirection)}, - // End of list marker - {0xffff, "(UnknownCanonCs2Tag)", "(UnknownCanonCs2Tag)", N_("Unknown Canon Panorama tag"), canonPaId, makerTags, + {0x0002, "PanoramaFrame", N_("Panorama Frame"), N_("Panorama frame number"), IfdId::canonPaId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0005, "PanoramaDirection", N_("Panorama Direction"), N_("Panorama direction"), IfdId::canonPaId, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(canonPaDirection)}, + // End of list marker + {0xffff, "(UnknownCanonCs2Tag)", "(UnknownCanonCs2Tag)", N_("Unknown Canon Panorama tag"), IfdId::canonPaId, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListPa() { @@ -2126,38 +2189,39 @@ const TagInfo* CanonMakerNote::tagListPa() { // Canon Custom Function Tag Info constexpr TagInfo CanonMakerNote::tagInfoCf_[] = { - {0x0001, "NoiseReduction", N_("Noise Reduction"), N_("Long exposure noise reduction"), canonCfId, makerTags, + {0x0001, "NoiseReduction", N_("Noise Reduction"), N_("Long exposure noise reduction"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0002, "ShutterAeLock", N_("Shutter Ae Lock"), N_("Shutter/AE lock buttons"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0003, "MirrorLockup", N_("Mirror Lockup"), N_("Mirror lockup"), IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0002, "ShutterAeLock", N_("Shutter Ae Lock"), N_("Shutter/AE lock buttons"), canonCfId, makerTags, unsignedShort, + {0x0004, "ExposureLevelIncrements", N_("Exposure Level Increments"), N_("Tv/Av and exposure level"), + IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0005, "AFAssist", N_("AF Assist"), N_("AF assist light"), IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0003, "MirrorLockup", N_("Mirror Lockup"), N_("Mirror lockup"), canonCfId, makerTags, unsignedShort, 1, - printValue}, - {0x0004, "ExposureLevelIncrements", N_("Exposure Level Increments"), N_("Tv/Av and exposure level"), canonCfId, - makerTags, unsignedShort, 1, printValue}, - {0x0005, "AFAssist", N_("AF Assist"), N_("AF assist light"), canonCfId, makerTags, unsignedShort, 1, printValue}, - {0x0006, "FlashSyncSpeedAv", N_("Flash Sync Speed Av"), N_("Shutter speed in Av mode"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x0007, "AEBSequence", N_("AEB Sequence"), N_("AEB sequence/auto cancellation"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x0008, "ShutterCurtainSync", N_("Shutter Curtain Sync"), N_("Shutter curtain sync"), canonCfId, makerTags, + {0x0006, "FlashSyncSpeedAv", N_("Flash Sync Speed Av"), N_("Shutter speed in Av mode"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0007, "AEBSequence", N_("AEB Sequence"), N_("AEB sequence/auto cancellation"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0008, "ShutterCurtainSync", N_("Shutter Curtain Sync"), N_("Shutter curtain sync"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0009, "LensAFStopButton", N_("Lens AF Stop Button"), N_("Lens AF stop button Fn. Switch"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000a, "FillFlashAutoReduction", N_("Fill Flash Auto Reduction"), N_("Auto reduction of fill flash"), + IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000b, "MenuButtonReturn", N_("Menu Button Return"), N_("Menu button return position"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000c, "SetButtonFunction", N_("Set Button Function"), N_("SET button func. when shooting"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000d, "SensorCleaning", N_("Sensor Cleaning"), N_("Sensor cleaning"), IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0009, "LensAFStopButton", N_("Lens AF Stop Button"), N_("Lens AF stop button Fn. Switch"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x000a, "FillFlashAutoReduction", N_("Fill Flash Auto Reduction"), N_("Auto reduction of fill flash"), canonCfId, - makerTags, unsignedShort, 1, printValue}, - {0x000b, "MenuButtonReturn", N_("Menu Button Return"), N_("Menu button return position"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x000c, "SetButtonFunction", N_("Set Button Function"), N_("SET button func. when shooting"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x000d, "SensorCleaning", N_("Sensor Cleaning"), N_("Sensor cleaning"), canonCfId, makerTags, unsignedShort, 1, - printValue}, - {0x000e, "SuperimposedDisplay", N_("Superimposed Display"), N_("Superimposed display"), canonCfId, makerTags, - unsignedShort, 1, printValue}, - {0x000f, "ShutterReleaseNoCFCard", N_("Shutter Release No CF Card"), N_("Shutter Release W/O CF Card"), canonCfId, - makerTags, unsignedShort, 1, printValue}, + {0x000e, "SuperimposedDisplay", N_("Superimposed Display"), N_("Superimposed display"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x000f, "ShutterReleaseNoCFCard", N_("Shutter Release No CF Card"), N_("Shutter Release W/O CF Card"), + IfdId::canonCfId, SectionId::makerTags, unsignedShort, 1, printValue}, // End of list marker - {0xffff, "(UnknownCanonCfTag)", "(UnknownCanonCfTag)", N_("Unknown Canon Custom Function tag"), canonCfId, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownCanonCfTag)", "(UnknownCanonCfTag)", N_("Unknown Canon Custom Function tag"), IfdId::canonCfId, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListCf() { @@ -2177,19 +2241,21 @@ constexpr TagDetailsBitmask canonPiAFPointsUsed20D[] = { // Canon Picture Info Tag constexpr TagInfo CanonMakerNote::tagInfoPi_[] = { - {0x0002, "ImageWidth", N_("Image Width"), N_("Image width"), canonPiId, makerTags, unsignedShort, 1, printValue}, - {0x0003, "ImageHeight", N_("Image Height"), N_("Image height"), canonPiId, makerTags, unsignedShort, 1, printValue}, - {0x0004, "ImageWidthAsShot", N_("Image Width As Shot"), N_("Image width (as shot)"), canonPiId, makerTags, - unsignedShort, 1, printValue}, - {0x0005, "ImageHeightAsShot", N_("Image Height As Shot"), N_("Image height (as shot)"), canonPiId, makerTags, + {0x0002, "ImageWidth", N_("Image Width"), N_("Image width"), IfdId::canonPiId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x0003, "ImageHeight", N_("Image Height"), N_("Image height"), IfdId::canonPiId, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0016, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), canonPiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG_BITMASK(canonPiAFPointsUsed)}, - {0x001a, "AFPointsUsed20D", N_("AF Points Used 20D"), N_("AF points used (20D)"), canonPiId, makerTags, - unsignedShort, 1, EXV_PRINT_TAG_BITMASK(canonPiAFPointsUsed20D)}, + {0x0004, "ImageWidthAsShot", N_("Image Width As Shot"), N_("Image width (as shot)"), IfdId::canonPiId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0005, "ImageHeightAsShot", N_("Image Height As Shot"), N_("Image height (as shot)"), IfdId::canonPiId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0016, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), IfdId::canonPiId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG_BITMASK(canonPiAFPointsUsed)}, + {0x001a, "AFPointsUsed20D", N_("AF Points Used 20D"), N_("AF points used (20D)"), IfdId::canonPiId, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG_BITMASK(canonPiAFPointsUsed20D)}, // End of list marker - {0xffff, "(UnknownCanonPiTag)", "(UnknownCanonPiTag)", N_("Unknown Canon Picture Info tag"), canonPiId, makerTags, - unsignedShort, 1, printValue}, + {0xffff, "(UnknownCanonPiTag)", "(UnknownCanonPiTag)", N_("Unknown Canon Picture Info tag"), IfdId::canonPiId, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListPi() { @@ -2264,45 +2330,45 @@ constexpr TagDetails canonRFLensType[] = {{0, N_("n/a")}, // Canon File Info Tag constexpr TagInfo CanonMakerNote::tagInfoFi_[] = { - {0x0001, "FileNumber", N_("File Number"), N_("File Number"), canonFiId, makerTags, unsignedLong, 1, - printFiFileNumber}, - {0x0003, "BracketMode", N_("Bracket Mode"), N_("Bracket Mode"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonBracketMode)}, - {0x0004, "BracketValue", N_("Bracket Value"), N_("Bracket Value"), canonFiId, makerTags, signedShort, 1, - printValue}, - {0x0005, "BracketShotNumber", N_("Bracket Shot Number"), N_("Bracket Shot Number"), canonFiId, makerTags, - signedShort, 1, printValue}, - {0x0006, "RawJpgQuality", N_("Raw Jpg Quality"), N_("Raw Jpg Quality"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonCsQuality)}, - {0x0007, "RawJpgSize", N_("Raw Jpg Size"), N_("Raw Jpg Size"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonRawJpgSize)}, - {0x0008, "NoiseReduction", N_("Noise Reduction"), N_("Noise Reduction"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonNoiseReduction)}, - {0x0009, "WBBracketMode", N_("WB Bracket Mode"), N_("WB Bracket Mode"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonWBBracketMode)}, - {0x000c, "WBBracketValueAB", N_("WB Bracket Value AB"), N_("WB Bracket Value AB"), canonFiId, makerTags, - signedShort, 1, printValue}, - {0x000d, "WBBracketValueGM", N_("WB Bracket Value GM"), N_("WB Bracket Value GM"), canonFiId, makerTags, - signedShort, 1, printValue}, - {0x000e, "FilterEffect", N_("Filter Effect"), N_("Filter Effect"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonFilterEffect)}, - {0x000f, "ToningEffect", N_("Toning Effect"), N_("Toning Effect"), canonFiId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonToningEffect)}, - {0x0010, "MacroMagnification", N_("Macro Magnification"), N_("Macro magnification"), canonFiId, makerTags, + {0x0001, "FileNumber", N_("File Number"), N_("File Number"), IfdId::canonFiId, SectionId::makerTags, unsignedLong, + 1, printFiFileNumber}, + {0x0003, "BracketMode", N_("Bracket Mode"), N_("Bracket Mode"), IfdId::canonFiId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonBracketMode)}, + {0x0004, "BracketValue", N_("Bracket Value"), N_("Bracket Value"), IfdId::canonFiId, SectionId::makerTags, signedShort, 1, printValue}, - {0x0013, "LiveViewShooting", N_("Live View Shooting"), N_("Live view shooting"), canonFiId, makerTags, signedShort, - 1, EXV_PRINT_TAG(canonOffOn)}, - {0x0014, "FocusDistanceUpper", N_("Focus Distance Upper"), N_("Focus Distance Upper"), canonFiId, makerTags, - unsignedShort, 1, printFiFocusDistance}, - {0x0015, "FocusDistanceLower", N_("Focus Distance Lower"), N_("Focus Distance Lower"), canonFiId, makerTags, - unsignedShort, 1, printFiFocusDistance}, - {0x0019, "FlashExposureLock", N_("Flash Exposure Lock"), N_("Flash exposure lock"), canonFiId, makerTags, - signedShort, 1, EXV_PRINT_TAG(canonOffOn)}, - {0x003D, "RFLensType", N_("RF Lens Type"), N_("RF Lens Type"), canonFiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(canonRFLensType)}, + {0x0005, "BracketShotNumber", N_("Bracket Shot Number"), N_("Bracket Shot Number"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0006, "RawJpgQuality", N_("Raw Jpg Quality"), N_("Raw Jpg Quality"), IfdId::canonFiId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonCsQuality)}, + {0x0007, "RawJpgSize", N_("Raw Jpg Size"), N_("Raw Jpg Size"), IfdId::canonFiId, SectionId::makerTags, signedShort, + 1, EXV_PRINT_TAG(canonRawJpgSize)}, + {0x0008, "NoiseReduction", N_("Noise Reduction"), N_("Noise Reduction"), IfdId::canonFiId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonNoiseReduction)}, + {0x0009, "WBBracketMode", N_("WB Bracket Mode"), N_("WB Bracket Mode"), IfdId::canonFiId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonWBBracketMode)}, + {0x000c, "WBBracketValueAB", N_("WB Bracket Value AB"), N_("WB Bracket Value AB"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x000d, "WBBracketValueGM", N_("WB Bracket Value GM"), N_("WB Bracket Value GM"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x000e, "FilterEffect", N_("Filter Effect"), N_("Filter Effect"), IfdId::canonFiId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonFilterEffect)}, + {0x000f, "ToningEffect", N_("Toning Effect"), N_("Toning Effect"), IfdId::canonFiId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonToningEffect)}, + {0x0010, "MacroMagnification", N_("Macro Magnification"), N_("Macro magnification"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0013, "LiveViewShooting", N_("Live View Shooting"), N_("Live view shooting"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonOffOn)}, + {0x0014, "FocusDistanceUpper", N_("Focus Distance Upper"), N_("Focus Distance Upper"), IfdId::canonFiId, + SectionId::makerTags, unsignedShort, 1, printFiFocusDistance}, + {0x0015, "FocusDistanceLower", N_("Focus Distance Lower"), N_("Focus Distance Lower"), IfdId::canonFiId, + SectionId::makerTags, unsignedShort, 1, printFiFocusDistance}, + {0x0019, "FlashExposureLock", N_("Flash Exposure Lock"), N_("Flash exposure lock"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonOffOn)}, + {0x003D, "RFLensType", N_("RF Lens Type"), N_("RF Lens Type"), IfdId::canonFiId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(canonRFLensType)}, // End of list marker - {0xffff, "(UnknownCanonFiTag)", "(UnknownCanonFiTag)", N_("Unknown Canon File Info tag"), canonFiId, makerTags, - signedShort, 1, printValue}, + {0xffff, "(UnknownCanonFiTag)", "(UnknownCanonFiTag)", N_("Unknown Canon File Info tag"), IfdId::canonFiId, + SectionId::makerTags, signedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListFi() { @@ -2318,30 +2384,34 @@ constexpr TagDetails canonSharpnessFrequency[] = {{0, N_("n/a")}, {1, N_("L // Canon Processing Info Tag constexpr TagInfo CanonMakerNote::tagInfoPr_[] = { - {0x0001, "ToneCurve", N_("ToneCurve"), N_("Tone curve"), canonPrId, makerTags, signedShort, 1, + {0x0001, "ToneCurve", N_("ToneCurve"), N_("Tone curve"), IfdId::canonPrId, SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonToneCurve)}, - {0x0002, "Sharpness", N_("Sharpness"), N_("Sharpness"), canonPrId, makerTags, signedShort, 1, printValue}, - {0x0003, "SharpnessFrequency", N_("SharpnessFrequency"), N_("Sharpness frequency"), canonPrId, makerTags, - signedShort, 1, EXV_PRINT_TAG(canonSharpnessFrequency)}, - {0x0004, "SensorRedLevel", N_("SensorRedLevel"), N_("Sensor red level"), canonPrId, makerTags, signedShort, 1, - printValue}, - {0x0005, "SensorBlueLevel", N_("SensorBlueLevel"), N_("Sensor blue level"), canonPrId, makerTags, signedShort, 1, - printValue}, - {0x0006, "WhiteBalanceRed", N_("WhiteBalanceRed"), N_("White balance red"), canonPrId, makerTags, signedShort, 1, + {0x0002, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::canonPrId, SectionId::makerTags, signedShort, 1, printValue}, - {0x0007, "WhiteBalanceBlue", N_("WhiteBalanceBlue"), N_("White balance blue"), canonPrId, makerTags, signedShort, 1, + {0x0003, "SharpnessFrequency", N_("SharpnessFrequency"), N_("Sharpness frequency"), IfdId::canonPrId, + SectionId::makerTags, signedShort, 1, EXV_PRINT_TAG(canonSharpnessFrequency)}, + {0x0004, "SensorRedLevel", N_("SensorRedLevel"), N_("Sensor red level"), IfdId::canonPrId, SectionId::makerTags, + signedShort, 1, printValue}, + {0x0005, "SensorBlueLevel", N_("SensorBlueLevel"), N_("Sensor blue level"), IfdId::canonPrId, SectionId::makerTags, + signedShort, 1, printValue}, + {0x0006, "WhiteBalanceRed", N_("WhiteBalanceRed"), N_("White balance red"), IfdId::canonPrId, SectionId::makerTags, + signedShort, 1, printValue}, + {0x0007, "WhiteBalanceBlue", N_("WhiteBalanceBlue"), N_("White balance blue"), IfdId::canonPrId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0008, "WhiteBalance", N_("WhiteBalance"), N_("White balance"), IfdId::canonPrId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonSiWhiteBalance)}, + {0x0009, "ColorTemperature", N_("ColorTemperature"), N_("Color Temperature"), IfdId::canonPrId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x000a, "PictureStyle", N_("PictureStyle"), N_("Picture style"), IfdId::canonPrId, SectionId::makerTags, + signedShort, 1, EXV_PRINT_TAG(canonPictureStyle)}, + {0x000b, "DigitalGain", N_("DigitalGain"), N_("Digital gain"), IfdId::canonPrId, SectionId::makerTags, signedShort, + 1, printValue}, + {0x000c, "WBShiftAB", N_("WBShiftAB"), N_("WBShift AB"), IfdId::canonPrId, SectionId::makerTags, signedShort, 1, printValue}, - {0x0008, "WhiteBalance", N_("WhiteBalance"), N_("White balance"), canonPrId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonSiWhiteBalance)}, - {0x0009, "ColorTemperature", N_("ColorTemperature"), N_("Color Temperature"), canonPrId, makerTags, signedShort, 1, + {0x000d, "WBShiftGM", N_("WBShiftGM"), N_("WB Shift GM"), IfdId::canonPrId, SectionId::makerTags, signedShort, 1, printValue}, - {0x000a, "PictureStyle", N_("PictureStyle"), N_("Picture style"), canonPrId, makerTags, signedShort, 1, - EXV_PRINT_TAG(canonPictureStyle)}, - {0x000b, "DigitalGain", N_("DigitalGain"), N_("Digital gain"), canonPrId, makerTags, signedShort, 1, printValue}, - {0x000c, "WBShiftAB", N_("WBShiftAB"), N_("WBShift AB"), canonPrId, makerTags, signedShort, 1, printValue}, - {0x000d, "WBShiftGM", N_("WBShiftGM"), N_("WB Shift GM"), canonPrId, makerTags, signedShort, 1, printValue}, - {0xffff, "(UnknownCanonPrTag)", "(UnknownCanonPrTag)", N_("Unknown Canon Processing Info tag"), canonPrId, - makerTags, signedShort, 1, printValue}, + {0xffff, "(UnknownCanonPrTag)", "(UnknownCanonPrTag)", N_("Unknown Canon Processing Info tag"), IfdId::canonPrId, + SectionId::makerTags, signedShort, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListPr() { @@ -2389,14 +2459,14 @@ constexpr TagDetails canonTimeZoneCity[] = { // Canon Time Info Tag constexpr TagInfo CanonMakerNote::tagInfoTi_[] = { - {0x0001, "TimeZone", N_("Time zone offset"), N_("Time zone offset in minutes"), canonTiId, makerTags, signedLong, 1, - printValue}, - {0x0002, "TimeZoneCity", N_("Time zone city"), N_("Time zone city"), canonTiId, makerTags, signedLong, 1, - EXV_PRINT_TAG(canonTimeZoneCity)}, - {0x0003, "DaylightSavings", N_("Daylight Savings"), N_("Daylight Saving Time"), canonTiId, makerTags, signedLong, 1, - printValue}, - {0xffff, "(UnknownCanonTiTag)", "(UnknownCanonTiTag)", N_("Unknown Canon Time Info tag"), canonTiId, makerTags, - signedLong, 1, printValue}, + {0x0001, "TimeZone", N_("Time zone offset"), N_("Time zone offset in minutes"), IfdId::canonTiId, + SectionId::makerTags, signedLong, 1, printValue}, + {0x0002, "TimeZoneCity", N_("Time zone city"), N_("Time zone city"), IfdId::canonTiId, SectionId::makerTags, + signedLong, 1, EXV_PRINT_TAG(canonTimeZoneCity)}, + {0x0003, "DaylightSavings", N_("Daylight Savings"), N_("Daylight Saving Time"), IfdId::canonTiId, + SectionId::makerTags, signedLong, 1, printValue}, + {0xffff, "(UnknownCanonTiTag)", "(UnknownCanonTiTag)", N_("Unknown Canon Time Info tag"), IfdId::canonTiId, + SectionId::makerTags, signedLong, 1, printValue}, }; const TagInfo* CanonMakerNote::tagListTi() { diff --git a/src/casiomn_int.cpp b/src/casiomn_int.cpp index bf297d8d..f182c3f5 100644 --- a/src/casiomn_int.cpp +++ b/src/casiomn_int.cpp @@ -80,43 +80,45 @@ constexpr TagDetails casioCCDSensitivity[] = { // Casio MakerNote Tag Info constexpr TagInfo CasioMakerNote::tagInfo_[] = { - {0x0001, "RecodingMode", N_("RecodingMode"), N_("Recording Mode"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioRecordingMode)}, - {0x0002, "Quality", N_("Quality"), N_("Quality"), casioId, makerTags, unsignedShort, -1, + {0x0001, "RecodingMode", N_("RecodingMode"), N_("Recording Mode"), IfdId::casioId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casioRecordingMode)}, + {0x0002, "Quality", N_("Quality"), N_("Quality"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioQuality)}, - {0x0003, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), casioId, makerTags, unsignedShort, -1, + {0x0003, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioFocusMode)}, - {0x0004, "FlashMode", N_("Flash Mode"), N_("Flash Mode"), casioId, makerTags, unsignedShort, -1, + {0x0004, "FlashMode", N_("Flash Mode"), N_("Flash Mode"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioFlashMode)}, - {0x0005, "FlashIntensity", N_("Flash Intensity"), N_("Flash Intensity"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioFlashIntensity)}, - {0x0006, "ObjectDistance", N_("Object Distance"), N_("Distance to object"), casioId, makerTags, unsignedLong, -1, - print0x0006}, - {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance settings"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioWhiteBalance)}, - {0x000a, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), casioId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(casioDigitalZoom)}, - {0x000b, "Sharpness", N_("Sharpness"), N_("Sharpness"), casioId, makerTags, unsignedShort, -1, + {0x0005, "FlashIntensity", N_("Flash Intensity"), N_("Flash Intensity"), IfdId::casioId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casioFlashIntensity)}, + {0x0006, "ObjectDistance", N_("Object Distance"), N_("Distance to object"), IfdId::casioId, SectionId::makerTags, + unsignedLong, -1, print0x0006}, + {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance settings"), IfdId::casioId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casioWhiteBalance)}, + {0x000a, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), IfdId::casioId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(casioDigitalZoom)}, + {0x000b, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioSharpness)}, - {0x000c, "Contrast", N_("Contrast"), N_("Contrast"), casioId, makerTags, unsignedShort, -1, + {0x000c, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioContrast)}, - {0x000d, "Saturation", N_("Saturation"), N_("Saturation"), casioId, makerTags, unsignedShort, -1, + {0x000d, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casioSaturation)}, - {0x0014, "ISO", N_("ISO"), N_("ISO"), casioId, makerTags, unsignedShort, -1, printValue}, - {0x0015, "FirmwareDate", N_("Firmware date"), N_("Firmware date"), casioId, makerTags, asciiString, -1, - print0x0015}, - {0x0016, "Enhancement", N_("Enhancement"), N_("Enhancement"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioEnhancement)}, - {0x0017, "ColorFilter", N_("Color Filter"), N_("Color Filter"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioColorFilter)}, - {0x0018, "AFPoint", N_("AF Point"), N_("AF Point"), casioId, makerTags, unsignedShort, -1, printValue}, - {0x0019, "FlashIntensity2", N_("Flash Intensity"), N_("Flash Intensity"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioFlashIntensity2)}, - {0x0020, "CCDSensitivity", N_("CCDSensitivity"), N_("CCDSensitivity"), casioId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casioCCDSensitivity)}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), casioId, makerTags, undefined, -1, printValue}, - {0xffff, "(UnknownCasioMakerNoteTag)", "(UnknownCasioMakerNoteTag)", N_("Unknown CasioMakerNote tag"), casioId, - makerTags, asciiString, -1, printValue}, + {0x0014, "ISO", N_("ISO"), N_("ISO"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0015, "FirmwareDate", N_("Firmware date"), N_("Firmware date"), IfdId::casioId, SectionId::makerTags, + asciiString, -1, print0x0015}, + {0x0016, "Enhancement", N_("Enhancement"), N_("Enhancement"), IfdId::casioId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(casioEnhancement)}, + {0x0017, "ColorFilter", N_("Color Filter"), N_("Color Filter"), IfdId::casioId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(casioColorFilter)}, + {0x0018, "AFPoint", N_("AF Point"), N_("AF Point"), IfdId::casioId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0019, "FlashIntensity2", N_("Flash Intensity"), N_("Flash Intensity"), IfdId::casioId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casioFlashIntensity2)}, + {0x0020, "CCDSensitivity", N_("CCDSensitivity"), N_("CCDSensitivity"), IfdId::casioId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casioCCDSensitivity)}, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::casioId, SectionId::makerTags, undefined, -1, + printValue}, + {0xffff, "(UnknownCasioMakerNoteTag)", "(UnknownCasioMakerNoteTag)", N_("Unknown CasioMakerNote tag"), + IfdId::casioId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* CasioMakerNote::tagList() { @@ -273,98 +275,105 @@ constexpr TagDetails casio2VideoQuality[] = { // Casio2 MakerNote Tag Info constexpr TagInfo Casio2MakerNote::tagInfo_[] = { - {0x0002, "PreviewImageSize", N_("Preview Image Size"), N_("Preview Image Size"), casio2Id, makerTags, unsignedShort, - -1, printValue}, - {0x0003, "PreviewImageLength", N_("Preview Image Length"), N_("Preview Image Length"), casio2Id, makerTags, - unsignedLong, -1, printValue}, - {0x0004, "PreviewImageStart", N_("Preview Image Start"), N_("Preview Image Start"), casio2Id, makerTags, - unsignedLong, -1, printValue}, - {0x0008, "QualityMode", N_("Quality Mode"), N_("Quality Mode"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2QualityMode)}, - {0x0009, "ImageSize", N_("Image Size"), N_("Image Size"), casio2Id, makerTags, unsignedShort, -1, + {0x0002, "PreviewImageSize", N_("Preview Image Size"), N_("Preview Image Size"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0003, "PreviewImageLength", N_("Preview Image Length"), N_("Preview Image Length"), IfdId::casio2Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0004, "PreviewImageStart", N_("Preview Image Start"), N_("Preview Image Start"), IfdId::casio2Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0008, "QualityMode", N_("Quality Mode"), N_("Quality Mode"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2QualityMode)}, + {0x0009, "ImageSize", N_("Image Size"), N_("Image Size"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2ImageSize)}, - {0x000d, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), casio2Id, makerTags, unsignedShort, -1, + {0x000d, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2FocusMode)}, - {0x0014, "ISOSpeed", N_("ISO Speed"), N_("ISO Speed"), casio2Id, makerTags, unsignedShort, -1, + {0x0014, "ISOSpeed", N_("ISO Speed"), N_("ISO Speed"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2IsoSpeed)}, - {0x0019, "WhiteBalance", N_("White Balance"), N_("White Balance Setting"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2WhiteBalance)}, - {0x001d, "FocalLength", N_("Focal Length"), N_("Focal Length"), casio2Id, makerTags, unsignedRational, -1, - printValue}, - {0x001f, "Saturation", N_("Saturation"), N_("Saturation"), casio2Id, makerTags, unsignedShort, -1, + {0x0019, "WhiteBalance", N_("White Balance"), N_("White Balance Setting"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2WhiteBalance)}, + {0x001d, "FocalLength", N_("Focal Length"), N_("Focal Length"), IfdId::casio2Id, SectionId::makerTags, + unsignedRational, -1, printValue}, + {0x001f, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2Saturation)}, - {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), casio2Id, makerTags, unsignedShort, -1, + {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2Contrast)}, - {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), casio2Id, makerTags, unsignedShort, -1, + {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2Sharpness)}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), casio2Id, makerTags, undefined, -1, printValue}, - {0x2000, "PreviewImage", N_("Preview Image"), N_("Preview Image"), casio2Id, makerTags, undefined, -1, printValue}, - {0x2001, "FirmwareDate", N_("Firmware Date"), N_("Firmware Date"), casio2Id, makerTags, asciiString, -1, - print0x2001}, - {0x2011, "WhiteBalanceBias", N_("White Balance Bias"), N_("White Balance Bias"), casio2Id, makerTags, unsignedShort, - -1, printValue}, - {0x2012, "WhiteBalance2", N_("White Balance"), N_("White Balance Setting"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2WhiteBalance2)}, - {0x2021, "AFPointPosition", N_("AF Point Position"), N_("AF Point Position"), casio2Id, makerTags, unsignedShort, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x2000, "PreviewImage", N_("Preview Image"), N_("Preview Image"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, printValue}, - {0x2022, "ObjectDistance", N_("Object Distance"), N_("Object Distance"), casio2Id, makerTags, unsignedLong, -1, - print0x2022}, - {0x2034, "FlashDistance", N_("Flash Distance"), N_("Flash Distance"), casio2Id, makerTags, unsignedShort, -1, + {0x2001, "FirmwareDate", N_("Firmware Date"), N_("Firmware Date"), IfdId::casio2Id, SectionId::makerTags, + asciiString, -1, print0x2001}, + {0x2011, "WhiteBalanceBias", N_("White Balance Bias"), N_("White Balance Bias"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x2012, "WhiteBalance2", N_("White Balance"), N_("White Balance Setting"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2WhiteBalance2)}, + {0x2021, "AFPointPosition", N_("AF Point Position"), N_("AF Point Position"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x2022, "ObjectDistance", N_("Object Distance"), N_("Object Distance"), IfdId::casio2Id, SectionId::makerTags, + unsignedLong, -1, print0x2022}, + {0x2034, "FlashDistance", N_("Flash Distance"), N_("Flash Distance"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x2076, "SpecialEffectMode", N_("Special Effect Mode"), N_("Special Effect Mode"), IfdId::casio2Id, + SectionId::makerTags, unsignedByte, -1, printValue}, + {0x2089, "FaceInfo", N_("Face Info"), N_("Face Info"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, printValue}, - {0x2076, "SpecialEffectMode", N_("Special Effect Mode"), N_("Special Effect Mode"), casio2Id, makerTags, + {0x211c, "FacesDetected", N_("Faces detected"), N_("Faces detected"), IfdId::casio2Id, SectionId::makerTags, unsignedByte, -1, printValue}, - {0x2089, "FaceInfo", N_("Face Info"), N_("Face Info"), casio2Id, makerTags, undefined, -1, printValue}, - {0x211c, "FacesDetected", N_("Faces detected"), N_("Faces detected"), casio2Id, makerTags, unsignedByte, -1, - printValue}, - {0x3000, "RecordMode", N_("Record Mode"), N_("Record Mode"), casio2Id, makerTags, unsignedShort, -1, printValue}, - {0x3001, "ReleaseMode", N_("Release Mode"), N_("Release Mode"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2ReleaseMode)}, - {0x3002, "Quality", N_("Quality"), N_("Quality"), casio2Id, makerTags, unsignedShort, -1, + {0x3000, "RecordMode", N_("Record Mode"), N_("Record Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x3001, "ReleaseMode", N_("Release Mode"), N_("Release Mode"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2ReleaseMode)}, + {0x3002, "Quality", N_("Quality"), N_("Quality"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2Quality)}, - {0x3003, "FocusMode2", N_("Focus Mode2"), N_("Focus Mode2"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2FocusMode2)}, - {0x3006, "HometownCity", N_("Home town city"), N_("Home town city"), casio2Id, makerTags, asciiString, -1, - printValue}, - {0x3007, "BestShotMode", N_("Best Shot Mode"), N_("Best Shot Mode"), casio2Id, makerTags, unsignedShort, -1, - printValue}, - {0x3008, "AutoISO", N_("Auto ISO"), N_("Auto ISO"), casio2Id, makerTags, unsignedShort, -1, + {0x3003, "FocusMode2", N_("Focus Mode2"), N_("Focus Mode2"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(casio2FocusMode2)}, + {0x3006, "HometownCity", N_("Home town city"), N_("Home town city"), IfdId::casio2Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x3007, "BestShotMode", N_("Best Shot Mode"), N_("Best Shot Mode"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x3008, "AutoISO", N_("Auto ISO"), N_("Auto ISO"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2AutoISO)}, - {0x3009, "AFMode", N_("AF Mode"), N_("AF Mode"), casio2Id, makerTags, unsignedShort, -1, + {0x3009, "AFMode", N_("AF Mode"), N_("AF Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2AFMode)}, - {0x3011, "Sharpness2", N_("Sharpness"), N_("Sharpness"), casio2Id, makerTags, undefined, -1, printValue}, - {0x3012, "Contrast2", N_("Contrast"), N_("Contrast"), casio2Id, makerTags, undefined, -1, printValue}, - {0x3013, "Saturation2", N_("Saturation"), N_("Saturation"), casio2Id, makerTags, undefined, -1, printValue}, - {0x3014, "ISO", N_("ISO"), N_("ISO"), casio2Id, makerTags, unsignedShort, -1, printValue}, - {0x3015, "ColorMode", N_("Color Mode"), N_("Color Mode"), casio2Id, makerTags, unsignedShort, -1, + {0x3011, "Sharpness2", N_("Sharpness"), N_("Sharpness"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x3012, "Contrast2", N_("Contrast"), N_("Contrast"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x3013, "Saturation2", N_("Saturation"), N_("Saturation"), IfdId::casio2Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x3014, "ISO", N_("ISO"), N_("ISO"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x3015, "ColorMode", N_("Color Mode"), N_("Color Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2ColorMode)}, - {0x3016, "Enhancement", N_("Enhancement"), N_("Enhancement"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2Enhancement)}, - {0x3017, "ColorFilter", N_("Color Filter"), N_("Color Filter"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2ColorFilter)}, - {0x301b, "ArtMode", N_("Art Mode"), N_("Art Mode"), casio2Id, makerTags, unsignedShort, -1, + {0x3016, "Enhancement", N_("Enhancement"), N_("Enhancement"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(casio2Enhancement)}, + {0x3017, "ColorFilter", N_("Color Filter"), N_("Color Filter"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2ColorFilter)}, + {0x301b, "ArtMode", N_("Art Mode"), N_("Art Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2ArtMode)}, - {0x301c, "SequenceNumber", N_("Sequence Number"), N_("Sequence Number"), casio2Id, makerTags, unsignedShort, -1, - printValue}, - {0x3020, "ImageStabilization", N_("Image Stabilization"), N_("Image Stabilization"), casio2Id, makerTags, - unsignedShort, -1, printValue}, - {0x302a, "LightingMode", N_("Lighting Mode"), N_("Lighting Mode"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2LightingMode)}, - {0x302b, "PortraitRefiner", N_("Portrait Refiner"), N_("Portrait Refiner settings"), casio2Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(casio2PortraitRefiner)}, - {0x3030, "SpecialEffectLevel", N_("Special Effect Level"), N_("Special Effect Level"), casio2Id, makerTags, + {0x301c, "SequenceNumber", N_("Sequence Number"), N_("Sequence Number"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x3031, "SpecialEffectSetting", N_("Special Effect Setting"), N_("Special Effect Setting"), casio2Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(casio2SpecialEffectSetting)}, - {0x3103, "DriveMode", N_("Drive Mode"), N_("Drive Mode"), casio2Id, makerTags, unsignedShort, -1, + {0x3020, "ImageStabilization", N_("Image Stabilization"), N_("Image Stabilization"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x302a, "LightingMode", N_("Lighting Mode"), N_("Lighting Mode"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2LightingMode)}, + {0x302b, "PortraitRefiner", N_("Portrait Refiner"), N_("Portrait Refiner settings"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2PortraitRefiner)}, + {0x3030, "SpecialEffectLevel", N_("Special Effect Level"), N_("Special Effect Level"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x3031, "SpecialEffectSetting", N_("Special Effect Setting"), N_("Special Effect Setting"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2SpecialEffectSetting)}, + {0x3103, "DriveMode", N_("Drive Mode"), N_("Drive Mode"), IfdId::casio2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(casio2DriveMode)}, - {0x310b, "ArtModeParameters", N_("Art Mode Parameters"), N_("Art Mode Parameters"), casio2Id, makerTags, undefined, - -1, printValue}, - {0x4001, "CaptureFrameRate", N_("Capture Frame Rate"), N_("Capture Frame Rate"), casio2Id, makerTags, unsignedShort, - -1, printValue}, - {0x4003, "VideoQuality", N_("Video Quality"), N_("Video Quality"), casio2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(casio2VideoQuality)}, - {0xffff, "(UnknownCasio2MakerNoteTag)", "(UnknownCasio2MakerNoteTag)", N_("Unknown Casio2MakerNote tag"), casio2Id, - makerTags, asciiString, -1, printValue}, + {0x310b, "ArtModeParameters", N_("Art Mode Parameters"), N_("Art Mode Parameters"), IfdId::casio2Id, + SectionId::makerTags, undefined, -1, printValue}, + {0x4001, "CaptureFrameRate", N_("Capture Frame Rate"), N_("Capture Frame Rate"), IfdId::casio2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x4003, "VideoQuality", N_("Video Quality"), N_("Video Quality"), IfdId::casio2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(casio2VideoQuality)}, + {0xffff, "(UnknownCasio2MakerNoteTag)", "(UnknownCasio2MakerNoteTag)", N_("Unknown Casio2MakerNote tag"), + IfdId::casio2Id, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* Casio2MakerNote::tagList() { diff --git a/src/cr2header_int.cpp b/src/cr2header_int.cpp index a44ae382..02cd0884 100644 --- a/src/cr2header_int.cpp +++ b/src/cr2header_int.cpp @@ -52,7 +52,7 @@ DataBuf Cr2Header::write() const { bool Cr2Header::isImageTag(uint16_t tag, IfdId group, const PrimaryGroups* /*pPrimaryGroups*/) const { // CR2 image tags are all IFD2 and IFD3 tags - if (group == ifd2Id || group == ifd3Id) + if (group == IfdId::ifd2Id || group == IfdId::ifd3Id) return true; // ...and any (IFD0) tag that is in the TIFF image tags list return isTiffImageTag(tag, group); diff --git a/src/cr2image.cpp b/src/cr2image.cpp index f77adebe..d3bc13cd 100644 --- a/src/cr2image.cpp +++ b/src/cr2image.cpp @@ -112,7 +112,7 @@ WriteMethod Cr2Parser::encode(BasicIo& io, const byte* pData, size_t size, ByteO // Delete IFDs which do not occur in TIFF images static constexpr auto filteredIfds = std::array{ - panaRawId, + IfdId::panaRawId, }; for (auto&& filteredIfd : filteredIfds) { #ifdef EXIV2_DEBUG_MESSAGES diff --git a/src/crwimage_int.cpp b/src/crwimage_int.cpp index ebc7e7e8..9b724030 100644 --- a/src/crwimage_int.cpp +++ b/src/crwimage_int.cpp @@ -78,31 +78,31 @@ namespace Exiv2::Internal { const CrwMapping CrwMap::crwMapping_[] = { // CrwTag CrwDir Size ExifTag IfdId decodeFct encodeFct // ------ ------ ---- ------- ----- --------- --------- - CrwMapping(0x0805, 0x300a, 0, 0, canonId, decode0x0805, encode0x0805), - CrwMapping(0x080a, 0x2807, 0, 0, canonId, decode0x080a, encode0x080a), - CrwMapping(0x080b, 0x3004, 0, 0x0007, canonId, decodeBasic, encodeBasic), - CrwMapping(0x0810, 0x2807, 0, 0x0009, canonId, decodeBasic, encodeBasic), - CrwMapping(0x0815, 0x2804, 0, 0x0006, canonId, decodeBasic, encodeBasic), - CrwMapping(0x1029, 0x300b, 0, 0x0002, canonId, decodeBasic, encodeBasic), - CrwMapping(0x102a, 0x300b, 0, 0x0004, canonId, decodeArray, encodeArray), - CrwMapping(0x102d, 0x300b, 0, 0x0001, canonId, decodeArray, encodeArray), - CrwMapping(0x1033, 0x300b, 0, 0x000f, canonId, decodeArray, encodeArray), - CrwMapping(0x1038, 0x300b, 0, 0x0012, canonId, decodeArray, encodeArray), - CrwMapping(0x10a9, 0x300b, 0, 0x00a9, canonId, decodeBasic, encodeBasic), + CrwMapping(0x0805, 0x300a, 0, 0, IfdId::canonId, decode0x0805, encode0x0805), + CrwMapping(0x080a, 0x2807, 0, 0, IfdId::canonId, decode0x080a, encode0x080a), + CrwMapping(0x080b, 0x3004, 0, 0x0007, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x0810, 0x2807, 0, 0x0009, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x0815, 0x2804, 0, 0x0006, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x1029, 0x300b, 0, 0x0002, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x102a, 0x300b, 0, 0x0004, IfdId::canonId, decodeArray, encodeArray), + CrwMapping(0x102d, 0x300b, 0, 0x0001, IfdId::canonId, decodeArray, encodeArray), + CrwMapping(0x1033, 0x300b, 0, 0x000f, IfdId::canonId, decodeArray, encodeArray), + CrwMapping(0x1038, 0x300b, 0, 0x0012, IfdId::canonId, decodeArray, encodeArray), + CrwMapping(0x10a9, 0x300b, 0, 0x00a9, IfdId::canonId, decodeBasic, encodeBasic), // Mapped to Exif.Photo.ColorSpace instead (see below) - // CrwMapping(0x10b4, 0x300b, 0, 0x00b4, canonId, decodeBasic, encodeBasic), - CrwMapping(0x10b4, 0x300b, 0, 0xa001, exifId, decodeBasic, encodeBasic), - CrwMapping(0x10b5, 0x300b, 0, 0x00b5, canonId, decodeBasic, encodeBasic), - CrwMapping(0x10c0, 0x300b, 0, 0x00c0, canonId, decodeBasic, encodeBasic), - CrwMapping(0x10c1, 0x300b, 0, 0x00c1, canonId, decodeBasic, encodeBasic), - CrwMapping(0x1807, 0x3002, 0, 0x9206, exifId, decodeBasic, encodeBasic), - CrwMapping(0x180b, 0x3004, 0, 0x000c, canonId, decodeBasic, encodeBasic), - CrwMapping(0x180e, 0x300a, 0, 0x9003, exifId, decode0x180e, encode0x180e), - CrwMapping(0x1810, 0x300a, 0, 0xa002, exifId, decode0x1810, encode0x1810), - CrwMapping(0x1817, 0x300a, 4, 0x0008, canonId, decodeBasic, encodeBasic), - // CrwMapping(0x1818, 0x3002, 0, 0x9204, exifId, decodeBasic, encodeBasic), - CrwMapping(0x183b, 0x300b, 0, 0x0015, canonId, decodeBasic, encodeBasic), - CrwMapping(0x2008, 0x0000, 0, 0, ifd1Id, decode0x2008, encode0x2008), + // CrwMapping(0x10b4, 0x300b, 0, 0x00b4, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x10b4, 0x300b, 0, 0xa001, IfdId::exifId, decodeBasic, encodeBasic), + CrwMapping(0x10b5, 0x300b, 0, 0x00b5, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x10c0, 0x300b, 0, 0x00c0, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x10c1, 0x300b, 0, 0x00c1, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x1807, 0x3002, 0, 0x9206, IfdId::exifId, decodeBasic, encodeBasic), + CrwMapping(0x180b, 0x3004, 0, 0x000c, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x180e, 0x300a, 0, 0x9003, IfdId::exifId, decode0x180e, encode0x180e), + CrwMapping(0x1810, 0x300a, 0, 0xa002, IfdId::exifId, decode0x1810, encode0x1810), + CrwMapping(0x1817, 0x300a, 4, 0x0008, IfdId::canonId, decodeBasic, encodeBasic), + // CrwMapping(0x1818, 0x3002, 0, 0x9204, IfdId::exifId, decodeBasic, encodeBasic), + CrwMapping(0x183b, 0x300b, 0, 0x0015, IfdId::canonId, decodeBasic, encodeBasic), + CrwMapping(0x2008, 0x0000, 0, 0, IfdId::ifd1Id, decode0x2008, encode0x2008), }; // CrwMap::crwMapping_[] /* @@ -698,19 +698,19 @@ void CrwMap::decodeArray(const CiffComponent& ciffComponent, const CrwMapping* p int64_t aperture = 0; int64_t shutterSpeed = 0; - IfdId ifdId = ifdIdNotSet; + IfdId ifdId = IfdId::ifdIdNotSet; switch (pCrwMapping->tag_) { case 0x0001: - ifdId = canonCsId; + ifdId = IfdId::canonCsId; break; case 0x0004: - ifdId = canonSiId; + ifdId = IfdId::canonSiId; break; case 0x000f: - ifdId = canonCfId; + ifdId = IfdId::canonCfId; break; case 0x0012: - ifdId = canonPiId; + ifdId = IfdId::canonPiId; break; } @@ -725,18 +725,18 @@ void CrwMap::decodeArray(const CiffComponent& ciffComponent, const CrwMapping* p uint16_t n = 1; ExifKey key(c, groupName); UShortValue value; - if (ifdId == canonCsId && c == 23 && component_size >= 52) + if (ifdId == IfdId::canonCsId && c == 23 && component_size >= 52) n = 3; value.read(ciffComponent.pData() + c * 2, n * 2, byteOrder); image.exifData().add(key, &value); - if (ifdId == canonSiId && c == 21) + if (ifdId == IfdId::canonSiId && c == 21) aperture = value.toInt64(); - if (ifdId == canonSiId && c == 22) + if (ifdId == IfdId::canonSiId && c == 22) shutterSpeed = value.toInt64(); c += n; } - if (ifdId == canonSiId) { + if (ifdId == IfdId::canonSiId) { // Exif.Photo.FNumber float f = fnumber(canonEv(aperture)); auto [r, s] = floatToRationalCast(f); @@ -912,19 +912,19 @@ void CrwMap::encode0x080a(const Image& image, const CrwMapping* pCrwMapping, Cif } void CrwMap::encodeArray(const Image& image, const CrwMapping* pCrwMapping, CiffHeader* pHead) { - IfdId ifdId = ifdIdNotSet; + IfdId ifdId = IfdId::ifdIdNotSet; switch (pCrwMapping->tag_) { case 0x0001: - ifdId = canonCsId; + ifdId = IfdId::canonCsId; break; case 0x0004: - ifdId = canonSiId; + ifdId = IfdId::canonSiId; break; case 0x000f: - ifdId = canonCfId; + ifdId = IfdId::canonCfId; break; case 0x0012: - ifdId = canonPiId; + ifdId = IfdId::canonPiId; break; } DataBuf buf = packIfdId(image.exifData(), ifdId, pHead->byteOrder()); diff --git a/src/exif.cpp b/src/exif.cpp index 2bd23026..867a2ded 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -296,8 +296,8 @@ uint16_t Exifdatum::tag() const { return key_ ? key_->tag() : 0xffff; } -int Exifdatum::ifdId() const { - return key_ ? key_->ifdId() : ifdIdNotSet; +IfdId Exifdatum::ifdId() const { + return key_ ? key_->ifdId() : IfdId::ifdIdNotSet; } const char* Exifdatum::ifdName() const { @@ -430,7 +430,7 @@ void ExifThumb::setJpegThumbnail(const byte* buf, size_t size) { } void ExifThumb::erase() { - eraseIfd(exifData_, ifd1Id); + eraseIfd(exifData_, IfdId::ifd1Id); } Exifdatum& ExifData::operator[](const std::string& key) { @@ -544,8 +544,9 @@ WriteMethod ExifParser::encode(Blob& blob, const byte* pData, size_t size, ByteO // Delete IFDs which do not occur in JPEGs static constexpr auto filteredIfds = std::array{ - subImage1Id, subImage2Id, subImage3Id, subImage4Id, subImage5Id, subImage6Id, subImage7Id, - subImage8Id, subImage9Id, subThumb1Id, panaRawId, ifd2Id, ifd3Id, + IfdId::subImage1Id, IfdId::subImage2Id, IfdId::subImage3Id, IfdId::subImage4Id, IfdId::subImage5Id, + IfdId::subImage6Id, IfdId::subImage7Id, IfdId::subImage8Id, IfdId::subImage9Id, IfdId::subThumb1Id, + IfdId::panaRawId, IfdId::ifd2Id, IfdId::ifd3Id, }; for (auto&& filteredIfd : filteredIfds) { #ifdef EXIV2_DEBUG_MESSAGES diff --git a/src/fujimn_int.cpp b/src/fujimn_int.cpp index cd11bb17..fbfae47d 100644 --- a/src/fujimn_int.cpp +++ b/src/fujimn_int.cpp @@ -140,106 +140,115 @@ constexpr TagDetails fujiDRangePriorityFixed[] = {{1, N_("Weak")}, {2, N_("Stron // Fujifilm MakerNote Tag Info constexpr TagInfo FujiMakerNote::tagInfo_[] = { - {0x0000, "Version", N_("Version"), N_("Fujifilm Makernote version"), fujiId, makerTags, undefined, -1, printValue}, + {0x0000, "Version", N_("Version"), N_("Fujifilm Makernote version"), IfdId::fujiId, SectionId::makerTags, undefined, + -1, printValue}, {0x0010, "SerialNumber", N_("Serial Number"), N_("This number is unique, and contains the date of manufacture, " "but is not the same as the number printed on the camera body."), - fujiId, makerTags, asciiString, -1, printValue}, - {0x1000, "Quality", N_("Quality"), N_("Image quality setting"), fujiId, makerTags, asciiString, -1, printValue}, - {0x1001, N_("Sharpness"), N_("Sharpness"), N_("Sharpness setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiSharpness)}, - {0x1002, "WhiteBalance", N_("White Balance"), N_("White balance setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiWhiteBalance)}, - {0x1003, "Color", N_("Color"), N_("Chroma saturation setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiColor)}, - {0x1004, "Tone", N_("Tone"), N_("Tone (contrast) setting"), fujiId, makerTags, unsignedShort, -1, + IfdId::fujiId, SectionId::makerTags, asciiString, -1, printValue}, + {0x1000, "Quality", N_("Quality"), N_("Image quality setting"), IfdId::fujiId, SectionId::makerTags, asciiString, + -1, printValue}, + {0x1001, N_("Sharpness"), N_("Sharpness"), N_("Sharpness setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiSharpness)}, + {0x1002, "WhiteBalance", N_("White Balance"), N_("White balance setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiWhiteBalance)}, + {0x1003, "Color", N_("Color"), N_("Chroma saturation setting"), IfdId::fujiId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(fujiColor)}, + {0x1004, "Tone", N_("Tone"), N_("Tone (contrast) setting"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiTone)}, - {0x1010, "FlashMode", N_("Flash Mode"), N_("Flash firing mode setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiFlashMode)}, - {0x1011, "FlashStrength", N_("Flash Strength"), N_("Flash firing strength compensation setting"), fujiId, makerTags, - signedRational, -1, printValue}, - {0x1020, "Macro", N_("Macro"), N_("Macro mode setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiOffOn)}, - {0x1021, "FocusMode", N_("Focus Mode"), N_("Focusing mode setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiFocusMode)}, - {0x1022, "0x1022", "0x1022", N_("Unknown"), fujiId, makerTags, unsignedShort, -1, printValue}, - {0x1030, "SlowSync", N_("Slow Sync"), N_("Slow synchro mode setting"), fujiId, makerTags, unsignedShort, -1, + {0x1010, "FlashMode", N_("Flash Mode"), N_("Flash firing mode setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiFlashMode)}, + {0x1011, "FlashStrength", N_("Flash Strength"), N_("Flash firing strength compensation setting"), IfdId::fujiId, + SectionId::makerTags, signedRational, -1, printValue}, + {0x1020, "Macro", N_("Macro"), N_("Macro mode setting"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiOffOn)}, - {0x1031, "PictureMode", N_("Picture Mode"), N_("Picture mode setting"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiPictureMode)}, - {0x1032, "0x1032", "0x1032", N_("Unknown"), fujiId, makerTags, unsignedShort, -1, printValue}, - {0x1040, "ShadowTone", N_("Shadow Tone"), N_("Shadow tone"), fujiId, makerTags, signedLong, -1, - EXV_PRINT_TAG(fujiSHTone)}, - {0x1041, "HighlightTone", N_("Highlight Tone"), N_("Highlight tone"), fujiId, makerTags, signedLong, -1, + {0x1021, "FocusMode", N_("Focus Mode"), N_("Focusing mode setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiFocusMode)}, + {0x1022, "0x1022", "0x1022", N_("Unknown"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1030, "SlowSync", N_("Slow Sync"), N_("Slow synchro mode setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiOffOn)}, + {0x1031, "PictureMode", N_("Picture Mode"), N_("Picture mode setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiPictureMode)}, + {0x1032, "0x1032", "0x1032", N_("Unknown"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1040, "ShadowTone", N_("Shadow Tone"), N_("Shadow tone"), IfdId::fujiId, SectionId::makerTags, signedLong, -1, EXV_PRINT_TAG(fujiSHTone)}, - {0x104d, "CropMode", N_("Crop Mode"), N_("Crop mode"), fujiId, makerTags, unsignedShort, -1, + {0x1041, "HighlightTone", N_("Highlight Tone"), N_("Highlight tone"), IfdId::fujiId, SectionId::makerTags, + signedLong, -1, EXV_PRINT_TAG(fujiSHTone)}, + {0x104d, "CropMode", N_("Crop Mode"), N_("Crop mode"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiCropMode)}, - {0x1100, "Continuous", N_("Continuous"), N_("Continuous shooting or auto bracketing setting"), fujiId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(fujiContinuous)}, - {0x1101, "SequenceNumber", N_("Sequence Number"), N_("Sequence number"), fujiId, makerTags, unsignedShort, -1, - printValue}, - {0x1200, "0x1200", "0x1200", N_("Unknown"), fujiId, makerTags, unsignedShort, -1, printValue}, - {0x1210, "FinePixColor", N_("FinePix Color"), N_("Fuji FinePix color setting"), fujiId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(fujiFinePixColor)}, - {0x1300, "BlurWarning", N_("Blur Warning"), N_("Blur warning status"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiOffOn)}, - {0x1301, "FocusWarning", N_("Focus Warning"), N_("Auto Focus warning status"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiOffOn)}, - {0x1302, "ExposureWarning", N_("Exposure Warning"), N_("Auto exposure warning status"), fujiId, makerTags, + {0x1100, "Continuous", N_("Continuous"), N_("Continuous shooting or auto bracketing setting"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiContinuous)}, + {0x1101, "SequenceNumber", N_("Sequence Number"), N_("Sequence number"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x1200, "0x1200", "0x1200", N_("Unknown"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1210, "FinePixColor", N_("FinePix Color"), N_("Fuji FinePix color setting"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiFinePixColor)}, + {0x1300, "BlurWarning", N_("Blur Warning"), N_("Blur warning status"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiOffOn)}, + {0x1301, "FocusWarning", N_("Focus Warning"), N_("Auto Focus warning status"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiOffOn)}, - {0x1400, "DynamicRange", N_("Dynamic Range"), N_("Dynamic range"), fujiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(fujiDynamicRange)}, - {0x1401, "FilmMode", N_("Film Mode"), N_("Film mode"), fujiId, makerTags, unsignedShort, -1, + {0x1302, "ExposureWarning", N_("Exposure Warning"), N_("Auto exposure warning status"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiOffOn)}, + {0x1400, "DynamicRange", N_("Dynamic Range"), N_("Dynamic range"), IfdId::fujiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(fujiDynamicRange)}, + {0x1401, "FilmMode", N_("Film Mode"), N_("Film mode"), IfdId::fujiId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiFilmMode)}, - {0x1402, "DynamicRangeSetting", N_("Dynamic Range Setting"), N_("Dynamic range settings"), fujiId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(fujiDynamicRangeSetting)}, - {0x1403, "DevelopmentDynamicRange", N_("Development Dynamic Range"), N_("Development dynamic range"), fujiId, - makerTags, unsignedShort, -1, printValue}, - {0x1404, "MinFocalLength", N_("Minimum Focal Length"), N_("Minimum focal length"), fujiId, makerTags, - unsignedRational, -1, printValue}, - {0x1405, "MaxFocalLength", N_("Maximum Focal Length"), N_("Maximum focal length"), fujiId, makerTags, - unsignedRational, -1, printValue}, + {0x1402, "DynamicRangeSetting", N_("Dynamic Range Setting"), N_("Dynamic range settings"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiDynamicRangeSetting)}, + {0x1403, "DevelopmentDynamicRange", N_("Development Dynamic Range"), N_("Development dynamic range"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1404, "MinFocalLength", N_("Minimum Focal Length"), N_("Minimum focal length"), IfdId::fujiId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x1405, "MaxFocalLength", N_("Maximum Focal Length"), N_("Maximum focal length"), IfdId::fujiId, + SectionId::makerTags, unsignedRational, -1, printValue}, {0x1406, "MaxApertureAtMinFocal", N_("Maximum Aperture at Minimum Focal"), N_("Maximum aperture at minimum focal"), - fujiId, makerTags, unsignedRational, -1, printValue}, + IfdId::fujiId, SectionId::makerTags, unsignedRational, -1, printValue}, {0x1407, "MaxApertureAtMaxFocal", N_("Maximum Aperture at Maximum Focal"), N_("Maximum aperture at maximum focal"), - fujiId, makerTags, unsignedRational, -1, printValue}, - {0x1431, "Rating", N_("Rating"), N_("Rating"), fujiId, makerTags, unsignedLong, -1, printValue}, - {0x1443, "DRangePriority", N_("D Range Priority"), N_("Dynamic range priority"), fujiId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(fujiDRangePriority)}, - {0x1444, "DRangePriorityFixed", N_("D Range Priority Fixed"), N_("Dynamic range priority fixed"), fujiId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(fujiDRangePriorityFixed)}, - {0x1445, "DRangePriorityAuto", N_("D Range Priority Auto"), N_("Dynamic range priority auto"), fujiId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(fujiDRangePriorityAuto)}, - {0x8000, "FileSource", N_("File Source"), N_("File source"), fujiId, makerTags, asciiString, -1, printValue}, - {0x8002, "OrderNumber", N_("Order Number"), N_("Order number"), fujiId, makerTags, unsignedLong, -1, printValue}, - {0x8003, "FrameNumber", N_("Frame Number"), N_("Frame number"), fujiId, makerTags, unsignedShort, -1, printValue}, + IfdId::fujiId, SectionId::makerTags, unsignedRational, -1, printValue}, + {0x1431, "Rating", N_("Rating"), N_("Rating"), IfdId::fujiId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1443, "DRangePriority", N_("D Range Priority"), N_("Dynamic range priority"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiDRangePriority)}, + {0x1444, "DRangePriorityFixed", N_("D Range Priority Fixed"), N_("Dynamic range priority fixed"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiDRangePriorityFixed)}, + {0x1445, "DRangePriorityAuto", N_("D Range Priority Auto"), N_("Dynamic range priority auto"), IfdId::fujiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiDRangePriorityAuto)}, + {0x8000, "FileSource", N_("File Source"), N_("File source"), IfdId::fujiId, SectionId::makerTags, asciiString, -1, + printValue}, + {0x8002, "OrderNumber", N_("Order Number"), N_("Order number"), IfdId::fujiId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x8003, "FrameNumber", N_("Frame Number"), N_("Frame number"), IfdId::fujiId, SectionId::makerTags, unsignedShort, + -1, printValue}, // #1402 - {0xf000, "FujiIFD", N_("FujiIFD"), N_("Fujifilm IFD"), fujiId, makerTags, undefined, -1, printValue}, - {0xf001, "RawImageFullWidth", N_("Raw Image Full Width"), N_("Raw Image Full Width"), fujiId, makerTags, undefined, + {0xf000, "FujiIFD", N_("FujiIFD"), N_("Fujifilm IFD"), IfdId::fujiId, SectionId::makerTags, undefined, -1, + printValue}, + {0xf001, "RawImageFullWidth", N_("Raw Image Full Width"), N_("Raw Image Full Width"), IfdId::fujiId, + SectionId::makerTags, undefined, -1, printValue}, + {0xf002, "RawImageFullHeight", N_("Raw Image Full Height"), N_("Raw Image Full Height"), IfdId::fujiId, + SectionId::makerTags, undefined, -1, printValue}, + {0xf003, "BitsPerSample", N_("Bits Per Sample"), N_("Bits Per Sample"), IfdId::fujiId, SectionId::makerTags, + undefined, -1, printValue}, + {0xf007, "StripOffsets", N_("Strip Offsets"), N_("Strip Offsets"), IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, - {0xf002, "RawImageFullHeight", N_("Raw Image Full Height"), N_("Raw Image Full Height"), fujiId, makerTags, + {0xf008, "StripByteCounts", N_("Strip Byte Counts"), N_("Strip Byte Counts"), IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, - {0xf003, "BitsPerSample", N_("Bits Per Sample"), N_("Bits Per Sample"), fujiId, makerTags, undefined, -1, + {0xf00a, "BlackLevel", N_("Black Level"), N_("Black Level"), IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, - {0xf007, "StripOffsets", N_("Strip Offsets"), N_("Strip Offsets"), fujiId, makerTags, undefined, -1, printValue}, - {0xf008, "StripByteCounts", N_("Strip Byte Counts"), N_("Strip Byte Counts"), fujiId, makerTags, undefined, -1, - printValue}, - {0xf00a, "BlackLevel", N_("Black Level"), N_("Black Level"), fujiId, makerTags, undefined, -1, printValue}, - {0xf00b, "GeometricDistortionParams", N_("Geometric Distortion Params"), N_("Geometric Distortion Params"), fujiId, - makerTags, undefined, -1, printValue}, - {0xf00c, "WB_GRBLevelsStandard", N_("WB GRB Levels Standard"), N_("WB GRB Levels Standard"), fujiId, makerTags, + {0xf00b, "GeometricDistortionParams", N_("Geometric Distortion Params"), N_("Geometric Distortion Params"), + IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, + {0xf00c, "WB_GRBLevelsStandard", N_("WB GRB Levels Standard"), N_("WB GRB Levels Standard"), IfdId::fujiId, + SectionId::makerTags, undefined, -1, printValue}, + {0xf00d, "WB_GRBLevelsAuto", N_("WB GRB Levels Auto"), N_("WB GRB Levels Auto"), IfdId::fujiId, + SectionId::makerTags, undefined, -1, printValue}, + {0xf00e, "WB_GRBLevels", N_("WB GRB Levels"), N_("WB GRB Levels"), IfdId::fujiId, SectionId::makerTags, undefined, + -1, printValue}, + {0xf00f, "ChromaticAberrationParams", N_("Chromatic Aberration Params"), N_("Chromatic Aberration Params"), + IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, + {0xf010, "VignettingParams", N_("Vignetting Params"), N_("Vignetting Params"), IfdId::fujiId, SectionId::makerTags, undefined, -1, printValue}, - {0xf00d, "WB_GRBLevelsAuto", N_("WB GRB Levels Auto"), N_("WB GRB Levels Auto"), fujiId, makerTags, undefined, -1, - printValue}, - {0xf00e, "WB_GRBLevels", N_("WB GRB Levels"), N_("WB GRB Levels"), fujiId, makerTags, undefined, -1, printValue}, - {0xf00f, "ChromaticAberrationParams", N_("Chromatic Aberration Params"), N_("Chromatic Aberration Params"), fujiId, - makerTags, undefined, -1, printValue}, - {0xf010, "VignettingParams", N_("Vignetting Params"), N_("Vignetting Params"), fujiId, makerTags, undefined, -1, - printValue}, // End of list marker - {0xffff, "(UnknownFujiMakerNoteTag)", "(UnknownFujiMakerNoteTag)", N_("Unknown FujiMakerNote tag"), fujiId, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownFujiMakerNoteTag)", "(UnknownFujiMakerNoteTag)", N_("Unknown FujiMakerNote tag"), IfdId::fujiId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* FujiMakerNote::tagList() { diff --git a/src/makernote_int.cpp b/src/makernote_int.cpp index a47a7302..c0263959 100644 --- a/src/makernote_int.cpp +++ b/src/makernote_int.cpp @@ -89,33 +89,33 @@ std::string readExiv2Config(const std::string& section, const std::string& value } const TiffMnRegistry TiffMnCreator::registry_[] = { - {"Canon", canonId, newIfdMn, newIfdMn2}, - {"FOVEON", sigmaId, newSigmaMn, newSigmaMn2}, - {"FUJI", fujiId, newFujiMn, newFujiMn2}, - {"KONICA MINOLTA", minoltaId, newIfdMn, newIfdMn2}, - {"Minolta", minoltaId, newIfdMn, newIfdMn2}, - {"NIKON", ifdIdNotSet, newNikonMn, nullptr}, // mnGroup_ is not used - {"OLYMPUS", ifdIdNotSet, newOlympusMn, nullptr}, // mnGroup_ is not used - {"OM Digital", olympus2Id, newOMSystemMn, newOMSystemMn2}, - {"Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2}, - {"PENTAX", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used - {"RICOH", ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used - {"SAMSUNG", samsung2Id, newSamsungMn, newSamsungMn2}, - {"SIGMA", sigmaId, newSigmaMn, newSigmaMn2}, - {"SONY", ifdIdNotSet, newSonyMn, nullptr}, // mnGroup_ is not used - {"CASIO", ifdIdNotSet, newCasioMn, nullptr}, // mnGroup_ is not used + {"Canon", IfdId::canonId, newIfdMn, newIfdMn2}, + {"FOVEON", IfdId::sigmaId, newSigmaMn, newSigmaMn2}, + {"FUJI", IfdId::fujiId, newFujiMn, newFujiMn2}, + {"KONICA MINOLTA", IfdId::minoltaId, newIfdMn, newIfdMn2}, + {"Minolta", IfdId::minoltaId, newIfdMn, newIfdMn2}, + {"NIKON", IfdId::ifdIdNotSet, newNikonMn, nullptr}, // mnGroup_ is not used + {"OLYMPUS", IfdId::ifdIdNotSet, newOlympusMn, nullptr}, // mnGroup_ is not used + {"OM Digital", IfdId::olympus2Id, newOMSystemMn, newOMSystemMn2}, + {"Panasonic", IfdId::panasonicId, newPanasonicMn, newPanasonicMn2}, + {"PENTAX", IfdId::ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used + {"RICOH", IfdId::ifdIdNotSet, newPentaxMn, nullptr}, // mnGroup_ is not used + {"SAMSUNG", IfdId::samsung2Id, newSamsungMn, newSamsungMn2}, + {"SIGMA", IfdId::sigmaId, newSigmaMn, newSigmaMn2}, + {"SONY", IfdId::ifdIdNotSet, newSonyMn, nullptr}, // mnGroup_ is not used + {"CASIO", IfdId::ifdIdNotSet, newCasioMn, nullptr}, // mnGroup_ is not used // Entries below are only used for lookup by group - {"-", nikon1Id, nullptr, newIfdMn2}, - {"-", nikon2Id, nullptr, newNikon2Mn2}, - {"-", nikon3Id, nullptr, newNikon3Mn2}, - {"-", sony1Id, nullptr, newSony1Mn2}, - {"-", sony2Id, nullptr, newSony2Mn2}, - {"-", olympusId, nullptr, newOlympusMn2}, - {"-", olympus2Id, nullptr, newOlympus2Mn2}, - {"-", pentaxId, nullptr, newPentaxMn2}, - {"-", pentaxDngId, nullptr, newPentaxDngMn2}, - {"-", casioId, nullptr, newIfdMn2}, - {"-", casio2Id, nullptr, newCasio2Mn2}, + {"-", IfdId::nikon1Id, nullptr, newIfdMn2}, + {"-", IfdId::nikon2Id, nullptr, newNikon2Mn2}, + {"-", IfdId::nikon3Id, nullptr, newNikon3Mn2}, + {"-", IfdId::sony1Id, nullptr, newSony1Mn2}, + {"-", IfdId::sony2Id, nullptr, newSony2Mn2}, + {"-", IfdId::olympusId, nullptr, newOlympusMn2}, + {"-", IfdId::olympus2Id, nullptr, newOlympus2Mn2}, + {"-", IfdId::pentaxId, nullptr, newPentaxMn2}, + {"-", IfdId::pentaxDngId, nullptr, newPentaxDngMn2}, + {"-", IfdId::casioId, nullptr, newIfdMn2}, + {"-", IfdId::casio2Id, nullptr, newCasio2Mn2}, }; bool TiffMnRegistry::operator==(const std::string& key) const { @@ -648,12 +648,12 @@ TiffComponent* newOlympusMn(uint16_t tag, IfdId group, IfdId /*mnGroup*/, const // Require at least the header and an IFD with 1 entry if (size < OlympusMnHeader::sizeOfSignature() + 18) return nullptr; - return newOlympusMn2(tag, group, olympusId); + return newOlympusMn2(tag, group, IfdId::olympusId); } // Require at least the header and an IFD with 1 entry if (size < Olympus2MnHeader::sizeOfSignature() + 18) return nullptr; - return newOlympus2Mn2(tag, group, olympus2Id); + return newOlympus2Mn2(tag, group, IfdId::olympus2Id); } TiffComponent* newOlympusMn2(uint16_t tag, IfdId group, IfdId mnGroup) { @@ -695,7 +695,7 @@ TiffComponent* newNikonMn(uint16_t tag, IfdId group, IfdId /*mnGroup*/, const by // Require at least an IFD with 1 entry if (size < 18) return nullptr; - return newIfdMn2(tag, group, nikon1Id); + return newIfdMn2(tag, group, IfdId::nikon1Id); } // If the "Nikon" string is not followed by a TIFF header, we assume // Nikon2 format @@ -704,13 +704,13 @@ TiffComponent* newNikonMn(uint16_t tag, IfdId group, IfdId /*mnGroup*/, const by // Require at least the header and an IFD with 1 entry if (size < Nikon2MnHeader::sizeOfSignature() + 18) return nullptr; - return newNikon2Mn2(tag, group, nikon2Id); + return newNikon2Mn2(tag, group, IfdId::nikon2Id); } // Else we have a Nikon3 makernote // Require at least the header and an IFD with 1 entry if (size < Nikon3MnHeader::sizeOfSignature() + 18) return nullptr; - return newNikon3Mn2(tag, group, nikon3Id); + return newNikon3Mn2(tag, group, IfdId::nikon3Id); } TiffComponent* newNikon2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) { @@ -739,13 +739,13 @@ TiffComponent* newPentaxMn(uint16_t tag, IfdId group, IfdId /*mnGroup*/, const b // Require at least the header and an IFD with 1 entry if (size < PentaxDngMnHeader::sizeOfSignature() + 18) return nullptr; - return newPentaxDngMn2(tag, group, (tag == 0xc634 ? pentaxDngId : pentaxId)); + return newPentaxDngMn2(tag, group, (tag == 0xc634 ? IfdId::pentaxDngId : IfdId::pentaxId)); } if (size > 4 && std::string(reinterpret_cast(pData), 4) == std::string("AOC\0", 4)) { // Require at least the header and an IFD with 1 entry if (size < PentaxMnHeader::sizeOfSignature() + 18) return nullptr; - return newPentaxMn2(tag, group, pentaxId); + return newPentaxMn2(tag, group, IfdId::pentaxId); } return nullptr; } @@ -765,7 +765,7 @@ TiffComponent* newSamsungMn(uint16_t tag, IfdId group, IfdId mnGroup, const byte // Require at least the header and an IFD with 1 entry if (size < PentaxMnHeader::sizeOfSignature() + 18) return nullptr; - return newPentaxMn2(tag, group, pentaxId); + return newPentaxMn2(tag, group, IfdId::pentaxId); } // Genuine Samsung camera: // Require at least an IFD with 1 entry @@ -797,12 +797,12 @@ TiffComponent* newSonyMn(uint16_t tag, IfdId group, IfdId /*mnGroup*/, const byt // Require at least an IFD with 1 entry if (size < 18) return nullptr; - return newSony2Mn2(tag, group, sony2Id); + return newSony2Mn2(tag, group, IfdId::sony2Id); } // Require at least the header and an IFD with 1 entry, but without a next pointer if (size < SonyMnHeader::sizeOfSignature() + 14) return nullptr; - return newSony1Mn2(tag, group, sony1Id); + return newSony1Mn2(tag, group, IfdId::sony1Id); } TiffComponent* newSony1Mn2(uint16_t tag, IfdId group, IfdId mnGroup) { @@ -816,12 +816,12 @@ TiffComponent* newSony2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) { TiffComponent* newCasioMn(uint16_t tag, IfdId group, IfdId /* mnGroup*/, const byte* pData, size_t size, ByteOrder /* byteOrder */) { if (size > 6 && std::string(reinterpret_cast(pData), 6) == std::string("QVC\0\0\0", 6)) { - return newCasio2Mn2(tag, group, casio2Id); + return newCasio2Mn2(tag, group, IfdId::casio2Id); }; // Require at least an IFD with 1 entry, but not necessarily a next pointer if (size < 14) return nullptr; - return newIfdMn2(tag, group, casioId); + return newIfdMn2(tag, group, IfdId::casioId); } TiffComponent* newCasio2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) { @@ -906,7 +906,7 @@ DataBuf nikonCrypt(uint16_t tag, const byte* pData, size_t size, TiffComponent* return buf; // Find Exif.Nikon3.ShutterCount - TiffFinder finder(0x00a7, nikon3Id); + TiffFinder finder(0x00a7, IfdId::nikon3Id); pRoot->accept(finder); auto te = dynamic_cast(finder.result()); if (!te || !te->pValue() || te->pValue()->count() == 0) @@ -914,7 +914,7 @@ DataBuf nikonCrypt(uint16_t tag, const byte* pData, size_t size, TiffComponent* auto count = te->pValue()->toUint32(); // Find Exif.Nikon3.SerialNumber - finder.init(0x001d, nikon3Id); + finder.init(0x001d, IfdId::nikon3Id); pRoot->accept(finder); te = dynamic_cast(finder.result()); if (!te || !te->pValue() || te->pValue()->count() == 0) @@ -968,9 +968,9 @@ int sonyMisc2bSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, // > First byte must be 9 or 12 or 13 or 15 or 16 and 4th byte must be 2 (deciphered) // Get the value from the image format that is being used - auto value = getExifValue(pRoot, 0x9404, Exiv2::sony1Id); + auto value = getExifValue(pRoot, 0x9404, Exiv2::IfdId::sony1Id); if (!value) { - value = getExifValue(pRoot, 0x9404, Exiv2::sony2Id); + value = getExifValue(pRoot, 0x9404, Exiv2::IfdId::sony2Id); if (!value) return -1; } @@ -995,9 +995,9 @@ int sonyMisc3cSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, // > first byte decoded: 62, 48, 215, 28, 106 respectively // Get the value from the image format that is being used - auto value = getExifValue(pRoot, 0x9400, Exiv2::sony1Id); + auto value = getExifValue(pRoot, 0x9400, Exiv2::IfdId::sony1Id); if (!value) { - value = getExifValue(pRoot, 0x9400, Exiv2::sony2Id); + value = getExifValue(pRoot, 0x9400, Exiv2::IfdId::sony2Id); if (!value) return -1; } @@ -1034,7 +1034,7 @@ const Exiv2::Value* getExifValue(Exiv2::Internal::TiffComponent* pRoot, const ui std::string getExifModel(Exiv2::Internal::TiffComponent* pRoot) { // Lookup the Exif.Image.Model tag - const auto value = getExifValue(pRoot, 0x0110, Exiv2::ifd0Id); + const auto value = getExifValue(pRoot, 0x0110, Exiv2::IfdId::ifd0Id); return (!value || value->count() == 0) ? std::string("") : static_cast(value->toString()); } diff --git a/src/minoltamn_int.cpp b/src/minoltamn_int.cpp index 2155cb1e..3e2412b0 100644 --- a/src/minoltamn_int.cpp +++ b/src/minoltamn_int.cpp @@ -35,78 +35,80 @@ constexpr TagDetails minoltaImageStabilization[] = {{1, N_("Off")}, {5, N_("On") // Minolta Tag Info constexpr TagInfo MinoltaMakerNote::tagInfo_[] = { - {0x0000, "Version", N_("Makernote Version"), N_("String 'MLT0' (not null terminated)"), minoltaId, makerTags, - undefined, -1, printValue}, + {0x0000, "Version", N_("Makernote Version"), N_("String 'MLT0' (not null terminated)"), IfdId::minoltaId, + SectionId::makerTags, undefined, -1, printValue}, {0x0001, "CameraSettingsStdOld", N_("Camera Settings (Std Old)"), - N_("Standard Camera settings (Old Camera models like D5, D7, S304, and S404)"), minoltaId, makerTags, undefined, - -1, printValue}, + N_("Standard Camera settings (Old Camera models like D5, D7, S304, and S404)"), IfdId::minoltaId, + SectionId::makerTags, undefined, -1, printValue}, {0x0003, "CameraSettingsStdNew", N_("Camera Settings (Std New)"), - N_("Standard Camera settings (New Camera Models like D7u, D7i, and D7hi)"), minoltaId, makerTags, undefined, -1, - printValue}, - {0x0004, "CameraSettings7D", N_("Camera Settings (7D)"), N_("Camera Settings (for Dynax 7D model)"), minoltaId, - makerTags, undefined, -1, printValue}, - {0x0018, "ImageStabilizationData", N_("Image Stabilization Data"), N_("Image stabilization data"), minoltaId, - makerTags, undefined, -1, printValue}, + N_("Standard Camera settings (New Camera Models like D7u, D7i, and D7hi)"), IfdId::minoltaId, SectionId::makerTags, + undefined, -1, printValue}, + {0x0004, "CameraSettings7D", N_("Camera Settings (7D)"), N_("Camera Settings (for Dynax 7D model)"), + IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue}, + {0x0018, "ImageStabilizationData", N_("Image Stabilization Data"), N_("Image stabilization data"), IfdId::minoltaId, + SectionId::makerTags, undefined, -1, printValue}, // TODO: Implement WB Info A100 tags decoding. - {0x0020, "WBInfoA100", N_("WB Info A100"), N_("White balance information for the Sony DSLR-A100"), minoltaId, - makerTags, undefined, -1, printValue}, + {0x0020, "WBInfoA100", N_("WB Info A100"), N_("White balance information for the Sony DSLR-A100"), IfdId::minoltaId, + SectionId::makerTags, undefined, -1, printValue}, - {0x0040, "CompressedImageSize", N_("Compressed Image Size"), N_("Compressed image size"), minoltaId, makerTags, - unsignedLong, -1, printValue}, - {0x0081, "Thumbnail", N_("Thumbnail"), N_("Jpeg thumbnail 640x480 pixels"), minoltaId, makerTags, undefined, -1, - printValue}, - {0x0088, "ThumbnailOffset", N_("Thumbnail Offset"), N_("Offset of the thumbnail"), minoltaId, makerTags, - unsignedLong, -1, printValue}, - {0x0089, "ThumbnailLength", N_("Thumbnail Length"), N_("Size of the thumbnail"), minoltaId, makerTags, unsignedLong, - -1, printValue}, - {0x0100, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), minoltaId, makerTags, unsignedLong, -1, + {0x0040, "CompressedImageSize", N_("Compressed Image Size"), N_("Compressed image size"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0081, "Thumbnail", N_("Thumbnail"), N_("Jpeg thumbnail 640x480 pixels"), IfdId::minoltaId, SectionId::makerTags, + undefined, -1, printValue}, + {0x0088, "ThumbnailOffset", N_("Thumbnail Offset"), N_("Offset of the thumbnail"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0089, "ThumbnailLength", N_("Thumbnail Length"), N_("Size of the thumbnail"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0100, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printMinoltaSonySceneMode}, // TODO: for A100, use Sony table from printMinoltaSonyColorMode(). - {0x0101, "ColorMode", N_("Color Mode"), N_("Color mode"), minoltaId, makerTags, unsignedLong, -1, + {0x0101, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(minoltaColorMode)}, - {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), minoltaId, makerTags, unsignedLong, -1, - printMinoltaSonyImageQuality}, + {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, + -1, printMinoltaSonyImageQuality}, // TODO: Tag 0x0103 : quality or image size (see ExifTool doc). - {0x0103, "0x0103", N_("0x0103"), N_("Unknown"), minoltaId, makerTags, unsignedLong, -1, printValue}, - - {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), minoltaId, - makerTags, signedRational, -1, print0x9204}, - {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), minoltaId, makerTags, unsignedLong, - -1, printMinoltaSonyTeleconverterModel}, - {0x0107, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), minoltaId, makerTags, - unsignedLong, -1, EXV_PRINT_TAG(minoltaImageStabilization)}, - {0x0109, "RawAndJpgRecording", N_("RAW+JPG Recording"), N_("RAW and JPG files recording"), minoltaId, makerTags, - unsignedLong, -1, printMinoltaSonyBoolValue}, - {0x010a, "ZoneMatching", N_("Zone Matching"), N_("Zone matching"), minoltaId, makerTags, unsignedLong, -1, - printMinoltaSonyZoneMatching}, - {0x010b, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), minoltaId, makerTags, unsignedLong, - -1, printValue}, - {0x010c, "LensID", N_("Lens ID"), N_("Lens identifier"), minoltaId, makerTags, unsignedLong, -1, + {0x0103, "0x0103", N_("0x0103"), N_("Unknown"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, + printValue}, + + {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), + IfdId::minoltaId, SectionId::makerTags, signedRational, -1, print0x9204}, + {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printMinoltaSonyTeleconverterModel}, + {0x0107, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(minoltaImageStabilization)}, + {0x0109, "RawAndJpgRecording", N_("RAW+JPG Recording"), N_("RAW and JPG files recording"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue}, + {0x010a, "ZoneMatching", N_("Zone Matching"), N_("Zone matching"), IfdId::minoltaId, SectionId::makerTags, + unsignedLong, -1, printMinoltaSonyZoneMatching}, + {0x010b, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x010c, "LensID", N_("Lens ID"), N_("Lens identifier"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyLensID}, {0x0111, "ColorCompensationFilter", N_("Color Compensation Filter"), - N_("Color Compensation Filter: negative is green, positive is magenta"), minoltaId, makerTags, unsignedLong, -1, - printValue}, - {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"), minoltaId, - makerTags, unsignedLong, -1, printValue}, + N_("Color Compensation Filter: negative is green, positive is magenta"), IfdId::minoltaId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"), + IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printValue}, {0x0113, "ImageStabilizationA100", N_("Image Stabilization A100"), N_("Image Stabilization for the Sony DSLR-A100"), - minoltaId, makerTags, unsignedLong, -1, printMinoltaSonyBoolValue}, + IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue}, // TODO: implement CameraSettingsA100 tags decoding. - {0x0114, "CameraSettings5D", N_("Camera Settings (5D)"), N_("Camera Settings (for Dynax 5D model)"), minoltaId, - makerTags, undefined, -1, printValue}, + {0x0114, "CameraSettings5D", N_("Camera Settings (5D)"), N_("Camera Settings (for Dynax 5D model)"), + IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue}, - {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), minoltaId, makerTags, unsignedLong, -1, - printMinoltaSonyWhiteBalanceStd}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), minoltaId, makerTags, undefined, -1, printValue}, + {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaId, SectionId::makerTags, + unsignedLong, -1, printMinoltaSonyWhiteBalanceStd}, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::minoltaId, SectionId::makerTags, undefined, + -1, printValue}, {0x0f00, "CameraSettingsZ1", N_("Camera Settings (Z1)"), N_("Camera Settings (for Z1, DImage X, and F100 models)"), - minoltaId, makerTags, undefined, -1, printValue}, + IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue}, // End of list marker {0xffff, "(UnknownMinoltaMakerNoteTag)", "(UnknownMinoltaMakerNoteTag)", N_("Unknown Minolta MakerNote tag"), - minoltaId, makerTags, asciiString, -1, printValue}, + IfdId::minoltaId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* MinoltaMakerNote::tagList() { @@ -296,107 +298,109 @@ std::ostream& MinoltaMakerNote::printMinoltaBrightnessStd(std::ostream& os, cons // Minolta Standard Camera Settings Tag Info (Old and New) constexpr TagInfo MinoltaMakerNote::tagInfoCsStd_[] = { - {0x0001, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaExposureModeStd)}, - {0x0002, "FlashMode", N_("Flash Mode"), N_("Flash mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFlashModeStd)}, - {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaWhiteBalanceStd)}, - {0x0004, "ImageSize", N_("Image Size"), N_("Image size"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaImageSizeStd)}, - {0x0005, "Quality", N_("Image Quality"), N_("Image quality"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaImageQualityStd)}, - {0x0006, "DriveMode", N_("Drive Mode"), N_("Drive mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaDriveModeStd)}, - {0x0007, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaMeteringModeStd)}, - {0x0008, "ISO", N_("ISO"), N_("ISO Value"), minoltaCsNewId, makerTags, unsignedLong, 1, + {0x0001, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaExposureModeStd)}, + {0x0002, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaFlashModeStd)}, + {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaWhiteBalanceStd)}, + {0x0004, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaImageSizeStd)}, + {0x0005, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaImageQualityStd)}, + {0x0006, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaDriveModeStd)}, + {0x0007, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaMeteringModeStd)}, + {0x0008, "ISO", N_("ISO"), N_("ISO Value"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printMinoltaExposureSpeedStd}, - {0x0009, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaExposureTimeStd}, - {0x000A, "FNumber", N_("FNumber"), N_("The F-Number"), minoltaCsNewId, makerTags, unsignedLong, 1, + {0x0009, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, printMinoltaExposureTimeStd}, + {0x000A, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printMinoltaFNumberStd}, - {0x000B, "MacroMode", N_("Macro Mode"), N_("Macro mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaSonyBoolValue}, - {0x000C, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaDigitalZoomStd)}, - {0x000D, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), minoltaCsNewId, - makerTags, unsignedLong, 1, printMinoltaExposureCompensationStd}, - {0x000E, "BracketStep", N_("Bracket Step"), N_("Bracket step"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaBracketStepStd)}, - {0x0010, "IntervalLength", N_("Interval Length"), N_("Interval length"), minoltaCsNewId, makerTags, unsignedLong, 1, - printValue}, - {0x0011, "IntervalNumber", N_("Interval Number"), N_("Interval number"), minoltaCsNewId, makerTags, unsignedLong, 1, - printValue}, - {0x0012, "FocalLength", N_("Focal Length"), N_("Focal length"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaFocalLengthStd}, - {0x0013, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), minoltaCsNewId, makerTags, unsignedLong, 1, - printValue}, - {0x0014, "FlashFired", N_("Flash Fired"), N_("Flash fired"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFlashFired)}, - {0x0015, "MinoltaDate", N_("Minolta Date"), N_("Minolta date"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaDateStd}, - {0x0016, "MinoltaTime", N_("Minolta Time"), N_("Minolta time"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaTimeStd}, - {0x0017, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), minoltaCsNewId, makerTags, unsignedLong, 1, - printValue}, - {0x001A, "FileNumberMemory", N_("File Number Memory"), N_("File number memory"), minoltaCsNewId, makerTags, - unsignedLong, 1, printMinoltaSonyBoolValue}, - {0x001B, "LastFileNumber", N_("Last Image Number"), N_("Last image number"), minoltaCsNewId, makerTags, + {0x000B, "MacroMode", N_("Macro Mode"), N_("Macro mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, printMinoltaSonyBoolValue}, + {0x000C, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaDigitalZoomStd)}, + {0x000D, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printMinoltaExposureCompensationStd}, + {0x000E, "BracketStep", N_("Bracket Step"), N_("Bracket step"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaBracketStepStd)}, + {0x0010, "IntervalLength", N_("Interval Length"), N_("Interval length"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x0011, "IntervalNumber", N_("Interval Number"), N_("Interval number"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x0012, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, printMinoltaFocalLengthStd}, + {0x0013, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue}, - {0x001C, "ColorBalanceRed", N_("Color Balance Red"), N_("Color balance red"), minoltaCsNewId, makerTags, - unsignedLong, 1, printMinoltaWhiteBalanceStd}, - {0x001D, "ColorBalanceGreen", N_("Color Balance Green"), N_("Color balance green"), minoltaCsNewId, makerTags, - unsignedLong, 1, printMinoltaWhiteBalanceStd}, - {0x001E, "ColorBalanceBlue", N_("Color Balance Blue"), N_("Color balance blue"), minoltaCsNewId, makerTags, - unsignedLong, 1, printMinoltaWhiteBalanceStd}, - {0x001F, "Saturation", N_("Saturation"), N_("Saturation"), minoltaCsNewId, makerTags, unsignedLong, 1, printValue}, - {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), minoltaCsNewId, makerTags, unsignedLong, 1, printValue}, - {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaSharpnessStd)}, - {0x0022, "SubjectProgram", N_("Subject Program"), N_("Subject program"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaSubjectProgramStd)}, - {0x0023, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), - minoltaCsNewId, makerTags, unsignedLong, 1, printMinoltaFlashExposureCompStd}, - {0x0024, "ISOSetting", N_("ISO Settings"), N_("ISO setting"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaISOSettingStd)}, - {0x0025, "MinoltaModel", N_("Minolta Model"), N_("Minolta model"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaModelStd)}, - {0x0026, "IntervalMode", N_("Interval Mode"), N_("Interval mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaIntervalModeStd)}, - {0x0027, "FolderName", N_("Folder Name"), N_("Folder name"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFolderNameStd)}, - {0x0028, "ColorMode", N_("ColorMode"), N_("ColorMode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaColorModeStd)}, - {0x0029, "ColorFilter", N_("Color Filter"), N_("Color filter"), minoltaCsNewId, makerTags, unsignedLong, 1, - printValue}, - {0x002A, "BWFilter", N_("Black and White Filter"), N_("Black and white filter"), minoltaCsNewId, makerTags, + {0x0014, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)}, + {0x0015, "MinoltaDate", N_("Minolta Date"), N_("Minolta date"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, printMinoltaDateStd}, + {0x0016, "MinoltaTime", N_("Minolta Time"), N_("Minolta time"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, printMinoltaTimeStd}, + {0x0017, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue}, - {0x002B, "Internal Flash", N_("Internal Flash"), N_("Internal Flash"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFlashFired)}, - {0x002C, "Brightness", N_("Brightness"), N_("Brightness"), minoltaCsNewId, makerTags, unsignedLong, 1, - printMinoltaBrightnessStd}, - {0x002D, "SpotFocusPointX", N_("Spot Focus Point X"), N_("Spot focus point X"), minoltaCsNewId, makerTags, + {0x001A, "FileNumberMemory", N_("File Number Memory"), N_("File number memory"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printMinoltaSonyBoolValue}, + {0x001B, "LastFileNumber", N_("Last Image Number"), N_("Last image number"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x001C, "ColorBalanceRed", N_("Color Balance Red"), N_("Color balance red"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd}, + {0x001D, "ColorBalanceGreen", N_("Color Balance Green"), N_("Color balance green"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd}, + {0x001E, "ColorBalanceBlue", N_("Color Balance Blue"), N_("Color balance blue"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd}, + {0x001F, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue}, - {0x002E, "SpotFocusPointY", N_("Spot Focus Point Y"), N_("Spot focus point Y"), minoltaCsNewId, makerTags, + {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, + printValue}, + {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaSharpnessStd)}, + {0x0022, "SubjectProgram", N_("Subject Program"), N_("Subject program"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(minoltaSubjectProgramStd)}, + {0x0023, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), + IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printMinoltaFlashExposureCompStd}, + {0x0024, "ISOSetting", N_("ISO Settings"), N_("ISO setting"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaISOSettingStd)}, + {0x0025, "MinoltaModel", N_("Minolta Model"), N_("Minolta model"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaModelStd)}, + {0x0026, "IntervalMode", N_("Interval Mode"), N_("Interval mode"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaIntervalModeStd)}, + {0x0027, "FolderName", N_("Folder Name"), N_("Folder name"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaFolderNameStd)}, + {0x0028, "ColorMode", N_("ColorMode"), N_("ColorMode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaColorModeStd)}, + {0x0029, "ColorFilter", N_("Color Filter"), N_("Color filter"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue}, - {0x002F, "WideFocusZone", N_("Wide Focus Zone"), N_("Wide focus zone"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaWideFocusZoneStd)}, - {0x0030, "FocusMode", N_("Focus Mode"), N_("Focus mode"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFocusModeStd)}, - {0x0031, "FocusArea", N_("Focus area"), N_("Focus area"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFocusAreaStd)}, - {0x0032, "DECPosition", N_("DEC Switch Position"), N_("DEC switch position"), minoltaCsNewId, makerTags, - unsignedLong, 1, EXV_PRINT_TAG(minoltaDECPositionStd)}, - {0x0033, "ColorProfile", N_("Color Profile"), N_("Color profile"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaColorProfileStd)}, - {0x0034, "DataImprint", N_("Data Imprint"), N_("Data Imprint"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaDataImprintStd)}, - {0x003F, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), minoltaCsNewId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFlashMeteringStd)}, + {0x002A, "BWFilter", N_("Black and White Filter"), N_("Black and white filter"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x002B, "Internal Flash", N_("Internal Flash"), N_("Internal Flash"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)}, + {0x002C, "Brightness", N_("Brightness"), N_("Brightness"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, printMinoltaBrightnessStd}, + {0x002D, "SpotFocusPointX", N_("Spot Focus Point X"), N_("Spot focus point X"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x002E, "SpotFocusPointY", N_("Spot Focus Point Y"), N_("Spot focus point Y"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x002F, "WideFocusZone", N_("Wide Focus Zone"), N_("Wide focus zone"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaWideFocusZoneStd)}, + {0x0030, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaFocusModeStd)}, + {0x0031, "FocusArea", N_("Focus area"), N_("Focus area"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, + 1, EXV_PRINT_TAG(minoltaFocusAreaStd)}, + {0x0032, "DECPosition", N_("DEC Switch Position"), N_("DEC switch position"), IfdId::minoltaCsNewId, + SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(minoltaDECPositionStd)}, + {0x0033, "ColorProfile", N_("Color Profile"), N_("Color profile"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaColorProfileStd)}, + {0x0034, "DataImprint", N_("Data Imprint"), N_("Data Imprint"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaDataImprintStd)}, + {0x003F, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), IfdId::minoltaCsNewId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashMeteringStd)}, // End of list marker {0xffff, "(UnknownMinoltaCsStdTag)", "(UnknownMinoltaCsStdTag)", N_("Unknown Minolta Camera Settings tag"), - minoltaCsNewId, makerTags, unsignedLong, 1, printValue}, + IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue}, }; const TagInfo* MinoltaMakerNote::tagListCsStd() { @@ -447,57 +451,62 @@ constexpr TagDetails minoltaRotation7D[] = { // Minolta Dynax 7D Camera Settings Tag Info constexpr TagInfo MinoltaMakerNote::tagInfoCs7D_[] = { - {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaExposureMode7D)}, - {0x0002, "ImageSize", N_("Image Size"), N_("Image size"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaImageSize7D)}, - {0x0003, "Quality", N_("Image Quality"), N_("Image quality"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaImageQuality7D)}, - {0x0004, "WhiteBalance", N_("White Balance"), N_("White balance"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaWhiteBalance7D)}, - {0x000E, "FocusMode", N_("Focus Mode"), N_("Focus mode"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaFocusMode7D)}, - {0x0010, "AFPoints", N_("AF Points"), N_("AF points"), minoltaCs7DId, makerTags, unsignedShort, 1, + {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaExposureMode7D)}, + {0x0002, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, + 1, EXV_PRINT_TAG(minoltaImageSize7D)}, + {0x0003, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaImageQuality7D)}, + {0x0004, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaWhiteBalance7D)}, + {0x000E, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, + 1, EXV_PRINT_TAG(minoltaFocusMode7D)}, + {0x0010, "AFPoints", N_("AF Points"), N_("AF points"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(minoltaAFPoints7D)}, - {0x0015, "FlashFired", N_("Flash Fired"), N_("Flash fired"), minoltaCs7DId, makerTags, unsignedLong, 1, - EXV_PRINT_TAG(minoltaFlashFired)}, - {0x0016, "FlashMode", N_("Flash Mode"), N_("Flash mode"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x001C, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaISOSetting7D)}, - {0x001E, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), minoltaCs7DId, makerTags, - signedShort, 1, printValue}, - {0x0025, "ColorSpace", N_("Color Space"), N_("Color space"), minoltaCs7DId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaColorSpace7D)}, - {0x0026, "Sharpness", N_("Sharpness"), N_("Sharpness"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x0027, "Contrast", N_("Contrast"), N_("Contrast"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x0028, "Saturation", N_("Saturation"), N_("Saturation"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x002D, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), minoltaCs7DId, - makerTags, unsignedShort, 1, printValue}, - {0x003F, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), minoltaCs7DId, makerTags, - signedShort, 1, printValue}, - {0x0040, "Hue", N_("Hue"), N_("Hue"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x0046, "Rotation", N_("Rotation"), N_("Rotation"), minoltaCs7DId, makerTags, unsignedShort, 1, + {0x0015, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)}, + {0x0016, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x001C, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaISOSetting7D)}, + {0x001E, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCs7DId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0025, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaColorSpace7D)}, + {0x0026, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x0027, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x0028, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x002D, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs7DId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x003F, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaCs7DId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0040, "Hue", N_("Hue"), N_("Hue"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0046, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(minoltaRotation7D)}, - {0x0047, "FNumber", N_("FNumber"), N_("The F-Number"), minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, - {0x0048, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), minoltaCs7DId, makerTags, unsignedShort, 1, + {0x0047, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0048, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, printValue}, // 0x004A is a duplicate than 0x002D. - {0x004A, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), minoltaCs7DId, - makerTags, unsignedShort, 1, printValue}, - {0x005E, "ImageNumber", N_("Image Number"), N_("Image number"), minoltaCs7DId, makerTags, unsignedShort, 1, - printValue}, - {0x0060, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), minoltaCs7DId, makerTags, unsignedShort, 1, - printMinoltaSonyBoolValue}, - // 0x0062 is a duplicate than 0x005E. - {0x0062, "ImageNumber", N_("Image Number"), N_("Image number"), minoltaCs7DId, makerTags, unsignedShort, 1, - printValue}, - {0x0071, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), minoltaCs7DId, makerTags, + {0x004A, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs7DId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x005E, "ImageNumber", N_("Image Number"), N_("Image number"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0060, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, - {0x0075, "ZoneMatchingOn", N_("Zone Matching On"), N_("Zone matching on"), minoltaCs7DId, makerTags, unsignedShort, - 1, printMinoltaSonyBoolValue}, + // 0x0062 is a duplicate than 0x005E. + {0x0062, "ImageNumber", N_("Image Number"), N_("Image number"), IfdId::minoltaCs7DId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0071, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaCs7DId, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x0075, "ZoneMatchingOn", N_("Zone Matching On"), N_("Zone matching on"), IfdId::minoltaCs7DId, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, // End of list marker {0xffff, "(UnknownMinoltaCs7DTag)", "(UnknownMinoltaCs7DTag)", N_("Unknown Minolta Camera Settings 7D tag"), - minoltaCs7DId, makerTags, unsignedShort, 1, printValue}, + IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* MinoltaMakerNote::tagListCs7D() { @@ -603,62 +612,66 @@ std::ostream& MinoltaMakerNote::printMinoltaExposureCompensation5D(std::ostream& // Minolta Dynax 5D Camera Settings Tag Info constexpr TagInfo MinoltaMakerNote::tagInfoCs5D_[] = { - {0x000A, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaExposureMode5D)}, - {0x000C, "ImageSize", N_("Image Size"), N_("Image size"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaImageSize5D)}, - {0x000D, "Quality", N_("Image Quality"), N_("Image quality"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaImageQuality5D)}, - {0x000E, "WhiteBalance", N_("White Balance"), N_("White balance"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaWhiteBalance5D)}, - {0x001A, "FocusPosition", N_("Focus Position"), N_("Focus position"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaFocusPosition5D)}, - {0x001B, "FocusArea", N_("Focus Area"), N_("Focus area"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaFocusArea5D)}, - {0x001F, "FlashFired", N_("Flash Fired"), N_("Flash fired"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaFlashFired)}, - {0x0025, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaMeteringMode5D)}, - {0x0026, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaISOSetting5D)}, - {0x002F, "ColorSpace", N_("Color Space"), N_("Color space"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaColorSpace5D)}, - {0x0030, "Sharpness", N_("Sharpness"), N_("Sharpness"), minoltaCs5DId, makerTags, unsignedShort, -1, printValue}, - {0x0031, "Contrast", N_("Contrast"), N_("Contrast"), minoltaCs5DId, makerTags, unsignedShort, -1, printValue}, - {0x0032, "Saturation", N_("Saturation"), N_("Saturation"), minoltaCs5DId, makerTags, unsignedShort, -1, printValue}, - {0x0035, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), minoltaCs5DId, makerTags, unsignedShort, -1, + {0x000A, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaExposureMode5D)}, + {0x000C, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(minoltaImageSize5D)}, + {0x000D, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaImageQuality5D)}, + {0x000E, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaWhiteBalance5D)}, + {0x001A, "FocusPosition", N_("Focus Position"), N_("Focus position"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaFocusPosition5D)}, + {0x001B, "FocusArea", N_("Focus Area"), N_("Focus area"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(minoltaFocusArea5D)}, + {0x001F, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaFlashFired)}, + {0x0025, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaMeteringMode5D)}, + {0x0026, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaISOSetting5D)}, + {0x002F, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaColorSpace5D)}, + {0x0030, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0031, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0036, "FNumber", N_("FNumber"), N_("The F-Number"), minoltaCs5DId, makerTags, unsignedShort, -1, printValue}, - {0x0037, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), minoltaCs5DId, - makerTags, unsignedShort, -1, printValue}, - {0x0038, "ExposureRevision", N_("Exposure Revision"), N_("Exposure revision"), minoltaCs5DId, makerTags, + {0x0032, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0035, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0048, "FocusMode", N_("Focus Mode"), N_("Focus mode"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaFocusModeStd)}, - {0x0049, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), minoltaCs5DId, makerTags, - signedShort, -1, printValue}, - {0x0050, "Rotation", N_("Rotation"), N_("Rotation"), minoltaCs5DId, makerTags, unsignedShort, -1, + {0x0036, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0037, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0038, "ExposureRevision", N_("Exposure Revision"), N_("Exposure revision"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0048, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(minoltaFocusModeStd)}, + {0x0049, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaCs5DId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0050, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(minoltaRotation5D)}, - {0x0053, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), minoltaCs5DId, makerTags, - unsignedShort, -1, printMinoltaExposureCompensation5D}, - {0x0054, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), minoltaCs5DId, - makerTags, unsignedShort, -1, printValue}, - {0x0065, "Rotation2", N_("Rotation2"), N_("Rotation2"), minoltaCs5DId, makerTags, unsignedShort, -1, - printMinoltaSonyRotation}, - {0x006E, "Color Temperature", N_("Color Temperature"), N_("Color Temperature"), minoltaCs5DId, makerTags, - signedShort, -1, printValue}, - {0x0071, "PictureFinish", N_("Picture Finish"), N_("Picture Finish"), minoltaCs5DId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(minoltaPictureFinish5D)}, - {0x0091, "ExposureManualBias", N_("Exposure Manual Bias"), N_("Exposure manual bias"), minoltaCs5DId, makerTags, - unsignedShort, -1, printMinoltaExposureManualBias5D}, - {0x009E, "AFMode", N_("AF Mode"), N_("AF mode"), minoltaCs5DId, makerTags, unsignedShort, -1, + {0x0053, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printMinoltaExposureCompensation5D}, + {0x0054, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0065, "Rotation2", N_("Rotation2"), N_("Rotation2"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, + -1, printMinoltaSonyRotation}, + {0x006E, "Color Temperature", N_("Color Temperature"), N_("Color Temperature"), IfdId::minoltaCs5DId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0071, "PictureFinish", N_("Picture Finish"), N_("Picture Finish"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(minoltaPictureFinish5D)}, + {0x0091, "ExposureManualBias", N_("Exposure Manual Bias"), N_("Exposure manual bias"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printMinoltaExposureManualBias5D}, + {0x009E, "AFMode", N_("AF Mode"), N_("AF mode"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(minoltaAFMode5D)}, - {0x00AE, "ImageNumber", N_("Image Number"), N_("Image number"), minoltaCs5DId, makerTags, unsignedShort, -1, - printValue}, - {0x00B0, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), minoltaCs5DId, makerTags, unsignedShort, - -1, printMinoltaSonyBoolValue}, - {0x00BD, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), minoltaCs5DId, makerTags, + {0x00AE, "ImageNumber", N_("Image Number"), N_("Image number"), IfdId::minoltaCs5DId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x00B0, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, printMinoltaSonyBoolValue}, + {0x00BD, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaCs5DId, + SectionId::makerTags, unsignedShort, -1, printMinoltaSonyBoolValue}, // From Xavier Raynaud: some notes on missing tags. // 0x0051 seems to be identical to FNumber (0x0036). An approx. relation between Tag value @@ -668,7 +681,7 @@ constexpr TagInfo MinoltaMakerNote::tagInfoCs5D_[] = { // End of list marker {0xFFFF, "(UnknownMinoltaCs5DTag)", "(UnknownMinoltaCs5DTag)", N_("Unknown Minolta Camera Settings 5D tag"), - minoltaCs5DId, makerTags, invalidTypeId, -1, printValue}, + IfdId::minoltaCs5DId, SectionId::makerTags, invalidTypeId, -1, printValue}, }; const TagInfo* MinoltaMakerNote::tagListCs5D() { @@ -827,169 +840,172 @@ constexpr TagDetails sonyBatteryLevelA100[] = { // Sony A100 Camera Settings Tag Info constexpr TagInfo MinoltaMakerNote::tagInfoCsA100_[] = { - {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaExposureMode5D)}, + {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaExposureMode5D)}, {0x0001, "ExposureCompensationSetting", N_("Exposure Compensation Setting"), N_("Exposure compensation setting"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, - {0x0005, "HighSpeedSync", N_("High Speed Sync"), N_("High speed sync"), sony1MltCsA100Id, makerTags, unsignedShort, - 1, printMinoltaSonyBoolValue}, - {0x0006, "ManualExposureTime", N_("Manual Exposure Time"), N_("Manual exposure time"), sony1MltCsA100Id, makerTags, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0005, "HighSpeedSync", N_("High Speed Sync"), N_("High speed sync"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x0006, "ManualExposureTime", N_("Manual Exposure Time"), N_("Manual exposure time"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0007, "ManualFNumber", N_("Manual FNumber"), N_("Manual FNumber"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0007, "ManualFNumber", N_("Manual FNumber"), N_("Manual FNumber"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printValue}, - {0x0008, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), sony1MltCsA100Id, makerTags, unsignedShort, 1, + {0x0008, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0009, "FNumber", N_("FNumber"), N_("FNumber"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, - {0x0009, "FNumber", N_("FNumber"), N_("FNumber"), sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, - {0x000A, "DriveMode2", N_("Drive Mode 2"), N_("Drive mode 2"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyDriveMode2A100)}, - {0x000B, "WhiteBalance", N_("White Balance"), N_("White balance"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaWhiteBalance5D)}, - {0x000C, "FocusMode", N_("Focus Mode"), N_("Focus mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyFocusModeA100)}, - {0x000D, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, - {0x000E, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printMinoltaSonyAFAreaMode}, - {0x000F, "FlashMode", N_("FlashMode"), N_("FlashMode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyFlashModeA100)}, + {0x000A, "DriveMode2", N_("Drive Mode 2"), N_("Drive mode 2"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyDriveMode2A100)}, + {0x000B, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaWhiteBalance5D)}, + {0x000C, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyFocusModeA100)}, + {0x000D, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, + {0x000E, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printMinoltaSonyAFAreaMode}, + {0x000F, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyFlashModeA100)}, {0x0010, "FlashExposureCompSetting", N_("Flash Exposure Comp Setting"), N_("Flash exposure compensation setting"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, - {0x0012, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyMeteringModeA100)}, - {0x0013, "ISOSetting", N_("ISO Setting"), N_("ISO setting"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printValue}, - {0x0014, "ZoneMatchingMode", N_("Zone Matching Mode"), N_("Zone Matching Mode"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyZoneMatchingModeA100)}, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0012, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringModeA100)}, + {0x0013, "ISOSetting", N_("ISO Setting"), N_("ISO setting"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0014, "ZoneMatchingMode", N_("Zone Matching Mode"), N_("Zone Matching Mode"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyZoneMatchingModeA100)}, {0x0015, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic range optimizer mode"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, - {0x0016, "ColorMode", N_("Color Mode"), N_("Color mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printMinoltaSonyColorMode}, - {0x0017, "ColorSpace", N_("Color Space"), N_("Color space"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyColorSpaceA100)}, - {0x0018, "Sharpness", N_("Sharpness"), N_("Sharpness"), sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, - {0x0019, "Contrast", N_("Contrast"), N_("Contrast"), sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, - {0x001A, "Saturation", N_("Saturation"), N_("Saturation"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printValue}, - {0x001C, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(minoltaFlashMeteringStd)}, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, + {0x0016, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printMinoltaSonyColorMode}, + {0x0017, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyColorSpaceA100)}, + {0x0018, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x0019, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x001A, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {0x001C, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(minoltaFlashMeteringStd)}, {0x001D, "PrioritySetupShutterRelease", N_("Priority Setup Shutter Release"), N_("Priority Setup Shutter Release"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease}, - {0x001E, "DriveMode", N_("Drive Mode"), N_("Drive mode"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyDriveModeA100)}, - {0x001F, "SelfTimerTime", N_("Self Timer Time"), N_("Self timer time"), sony1MltCsA100Id, makerTags, unsignedShort, - 1, EXV_PRINT_TAG(sonySelfTimerTimeA100)}, - {0x0020, "ContinuousBracketing", N_("Continuous Bracketing"), N_("Continuous bracketing"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyContinuousBracketingA100)}, - {0x0021, "SingleFrameBracketing", N_("Single Frame Bracketing"), N_("Single frame bracketing"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonySingleFrameBracketingA100)}, - {0x0022, "WhiteBalanceBracketing", N_("White Balance Bracketing"), N_("White balance bracketing"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceBracketingA100)}, - {0x0023, "WhiteBalanceSetting", N_("White Balance Setting"), N_("White balance setting"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceSettingA100)}, - {0x0024, "PresetWhiteBalance", N_("Preset White Balance"), N_("Preset white balance"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyPresetWhiteBalanceA100)}, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease}, + {0x001E, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyDriveModeA100)}, + {0x001F, "SelfTimerTime", N_("Self Timer Time"), N_("Self timer time"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonySelfTimerTimeA100)}, + {0x0020, "ContinuousBracketing", N_("Continuous Bracketing"), N_("Continuous bracketing"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyContinuousBracketingA100)}, + {0x0021, "SingleFrameBracketing", N_("Single Frame Bracketing"), N_("Single frame bracketing"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonySingleFrameBracketingA100)}, + {0x0022, "WhiteBalanceBracketing", N_("White Balance Bracketing"), N_("White balance bracketing"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceBracketingA100)}, + {0x0023, "WhiteBalanceSetting", N_("White Balance Setting"), N_("White balance setting"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceSettingA100)}, + {0x0024, "PresetWhiteBalance", N_("Preset White Balance"), N_("Preset white balance"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyPresetWhiteBalanceA100)}, {0x0025, "ColorTemperatureSetting", N_("Color Temperature Setting"), N_("Color temperature setting"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyColorTemperatureSettingA100)}, - {0x0026, "CustomWBSetting", N_("Custom WB Setting"), N_("Custom WB setting"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyCustomWBSettingA100)}, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyColorTemperatureSettingA100)}, + {0x0026, "CustomWBSetting", N_("Custom WB Setting"), N_("Custom WB setting"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCustomWBSettingA100)}, {0x0027, "DynamicRangeOptimizerSettings", N_("Dynamic Range Optimizer Settings"), - N_("Dynamic Range Optimizer Settings"), sony1MltCsA100Id, makerTags, unsignedShort, 1, + N_("Dynamic Range Optimizer Settings"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, - {0x0032, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, printValue}, - {0x0034, "CustomWBRedLevel", N_("Custom WB Red Level"), N_("Custom WB red level"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printValue}, - {0x0035, "CustomWBGreenLevel", N_("Custom WB Green Level"), N_("Custom WB green level"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, printValue}, - {0x0036, "CustomWBBlueLevel", N_("Custom WB Blue Level"), N_("CustomWB blue level"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printValue}, - {0x0037, "CustomWBError", N_("Custom WB Error"), N_("Custom WB Error"), sony1MltCsA100Id, makerTags, unsignedShort, - 1, EXV_PRINT_TAG(sonyCustomWBErrorA100)}, - {0x0038, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White balance fine tune"), sony1MltCsA100Id, - makerTags, signedShort, 1, printValue}, - {0x0039, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printValue}, + {0x0032, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0034, "CustomWBRedLevel", N_("Custom WB Red Level"), N_("Custom WB red level"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0035, "CustomWBGreenLevel", N_("Custom WB Green Level"), N_("Custom WB green level"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0036, "CustomWBBlueLevel", N_("Custom WB Blue Level"), N_("CustomWB blue level"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0037, "CustomWBError", N_("Custom WB Error"), N_("Custom WB Error"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCustomWBErrorA100)}, + {0x0038, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White balance fine tune"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, signedShort, 1, printValue}, + {0x0039, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, {0x003A, "ColorCompensationFilter", N_("Color Compensation Filter"), N_("Color compensation filter"), - sony1MltCsA100Id, makerTags, signedShort, 1, printValue}, - {0x003B, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), sony1MltCsA100Id, makerTags, unsignedShort, - 1, EXV_PRINT_TAG(sonyImageSizeA100)}, - {0x003C, "Quality", N_("Quality"), N_("Quality"), sony1MltCsA100Id, makerTags, unsignedShort, 1, + IfdId::sony1MltCsA100Id, SectionId::makerTags, signedShort, 1, printValue}, + {0x003B, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyImageSizeA100)}, + {0x003C, "Quality", N_("Quality"), N_("Quality"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyQualityCs}, - {0x003D, "InstantPlaybackTime", N_("Instant Playback Time"), N_("Instant playback time"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, printValue}, - {0x003E, "InstantPlaybackSetup", N_("Instant Playback Setup"), N_("Instant playback setup"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyInstantPlaybackSetupA100)}, - {0x003F, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), sony1MltCsA100Id, makerTags, unsignedShort, - 1, printMinoltaSonyBoolValue}, - {0x0040, "EyeStartAF", N_("Eye Start AF"), N_("Eye start AF"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printMinoltaSonyBoolInverseValue}, - {0x0041, "RedEyeReduction", N_("Red Eye Reduction"), N_("Red eye reduction"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printMinoltaSonyBoolValue}, - {0x0042, "FlashDefault", N_("Flash Default"), N_("Flash default"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyFlashDefaultA100)}, - {0x0043, "AutoBracketOrder", N_("Auto Bracket Order"), N_("Auto bracket order"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyAutoBracketOrderA100)}, - {0x0044, "FocusHoldButton", N_("Focus Hold Button"), N_("Focus hold button"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyFocusHoldButtonA100)}, - {0x0045, "AELButton", N_("AEL Button"), N_("AEL button"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyAELButtonA100)}, - {0x0046, "ControlDialSet", N_("Control Dial Set"), N_("Control dial set"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyControlDialSetA100)}, - {0x0047, "ExposureCompensationMode", N_("Exposure Compensation Mode"), N_("Exposure compensation mode"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureCompensationModeA100)}, - {0x0048, "AFAssist", N_("AF Assist"), N_("AF assist"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printMinoltaSonyBoolInverseValue}, - {0x0049, "CardShutterLock", N_("Card Shutter Lock"), N_("Card shutter lock"), sony1MltCsA100Id, makerTags, + {0x003D, "InstantPlaybackTime", N_("Instant Playback Time"), N_("Instant playback time"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x003E, "InstantPlaybackSetup", N_("Instant Playback Setup"), N_("Instant playback setup"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyInstantPlaybackSetupA100)}, + {0x003F, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x0040, "EyeStartAF", N_("Eye Start AF"), N_("Eye start AF"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue}, - {0x004A, "LensShutterLock", N_("Lens Shutter Lock"), N_("Lens shutter lock"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printMinoltaSonyBoolInverseValue}, - {0x004B, "AFAreaIllumination", N_("AF Area Illumination"), N_("AF area illumination"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyAFAreaIlluminationA100)}, - {0x004C, "MonitorDisplayOff", N_("Monitor Display Off"), N_("Monitor display off"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyMonitorDisplayOffA100)}, - {0x004D, "RecordDisplay", N_("Record Display"), N_("Record display"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyRecordDisplayA100)}, - {0x004E, "PlayDisplay", N_("Play Display"), N_("Play display"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyPlayDisplayA100)}, - {0x0050, "ExposureIndicator", N_("Exposure Indicator"), N_("Exposure indicator"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + {0x0041, "RedEyeReduction", N_("Red Eye Reduction"), N_("Red eye reduction"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x0042, "FlashDefault", N_("Flash Default"), N_("Flash default"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyFlashDefaultA100)}, + {0x0043, "AutoBracketOrder", N_("Auto Bracket Order"), N_("Auto bracket order"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAutoBracketOrderA100)}, + {0x0044, "FocusHoldButton", N_("Focus Hold Button"), N_("Focus hold button"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFocusHoldButtonA100)}, + {0x0045, "AELButton", N_("AEL Button"), N_("AEL button"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyAELButtonA100)}, + {0x0046, "ControlDialSet", N_("Control Dial Set"), N_("Control dial set"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyControlDialSetA100)}, + {0x0047, "ExposureCompensationMode", N_("Exposure Compensation Mode"), N_("Exposure compensation mode"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureCompensationModeA100)}, + {0x0048, "AFAssist", N_("AF Assist"), N_("AF assist"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, + 1, printMinoltaSonyBoolInverseValue}, + {0x0049, "CardShutterLock", N_("Card Shutter Lock"), N_("Card shutter lock"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue}, + {0x004A, "LensShutterLock", N_("Lens Shutter Lock"), N_("Lens shutter lock"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue}, + {0x004B, "AFAreaIllumination", N_("AF Area Illumination"), N_("AF area illumination"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAFAreaIlluminationA100)}, + {0x004C, "MonitorDisplayOff", N_("Monitor Display Off"), N_("Monitor display off"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMonitorDisplayOffA100)}, + {0x004D, "RecordDisplay", N_("Record Display"), N_("Record display"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyRecordDisplayA100)}, + {0x004E, "PlayDisplay", N_("Play Display"), N_("Play display"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyPlayDisplayA100)}, + {0x0050, "ExposureIndicator", N_("Exposure Indicator"), N_("Exposure indicator"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, {0x0051, "AELExposureIndicator", N_("AEL Exposure Indicator"), - N_("AEL exposure indicator (also indicates exposure for next shot when bracketing)"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + N_("AEL exposure indicator (also indicates exposure for next shot when bracketing)"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, {0x0052, "ExposureBracketingIndicatorLast", N_("Exposure Bracketing Indicator Last"), - N_("Exposure bracketing indicator last (indicator for last shot when bracketing)"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + N_("Exposure bracketing indicator last (indicator for last shot when bracketing)"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, {0x0053, "MeteringOffScaleIndicator", N_("Metering Off Scale Indicator"), - N_("Metering off scale indicator (two flashing triangles when under or over metering scale)"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringOffScaleIndicatorA100)}, - {0x0054, "FlashExposureIndicator", N_("Flash Exposure Indicator"), N_("Flash exposure indicator"), sony1MltCsA100Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + N_("Metering off scale indicator (two flashing triangles when under or over metering scale)"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringOffScaleIndicatorA100)}, + {0x0054, "FlashExposureIndicator", N_("Flash Exposure Indicator"), N_("Flash exposure indicator"), + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, {0x0055, "FlashExposureIndicatorNext", N_("Flash Exposure Indicator Next"), - N_("Flash exposure indicator next (indicator for next shot when bracketing)"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + N_("Flash exposure indicator next (indicator for next shot when bracketing)"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, {0x0056, "FlashExposureIndicatorLast", N_("Flash Exposure Indicator Last"), - N_("Flash exposure indicator last (indicator for last shot when bracketing)"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, - {0x0057, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, printMinoltaSonyBoolValue}, - {0x0058, "FocusModeSwitch", N_("Focus Mode Switch"), N_("Focus mode switch"), sony1MltCsA100Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(sonyFocusModeSwitchA100)}, - {0x0059, "FlashType", N_("Flash Type"), N_("Flash type"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyFlashTypeA100)}, - {0x005A, "Rotation", N_("Rotation"), N_("Rotation"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - printMinoltaSonyRotation}, - {0x004B, "AELock", N_("AE Lock"), N_("AE lock"), sony1MltCsA100Id, makerTags, unsignedShort, 1, + N_("Flash exposure indicator last (indicator for last shot when bracketing)"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)}, + {0x0057, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x0058, "FocusModeSwitch", N_("Focus Mode Switch"), N_("Focus mode switch"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFocusModeSwitchA100)}, + {0x0059, "FlashType", N_("Flash Type"), N_("Flash type"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyFlashTypeA100)}, + {0x005A, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, + 1, printMinoltaSonyRotation}, + {0x004B, "AELock", N_("AE Lock"), N_("AE lock"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, - {0x005E, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), sony1MltCsA100Id, makerTags, - unsignedLong, 1, printValue}, + {0x005E, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedLong, 1, printValue}, {0x005F, "ColorCompensationFilter", N_("Color Compensation Filter"), - N_("Color compensation filter: negative is green, positive is magenta"), sony1MltCsA100Id, makerTags, unsignedLong, - 1, printValue}, - {0x0060, "BatteryLevel", N_("Battery Level"), N_("Battery level"), sony1MltCsA100Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyBatteryLevelA100)}, + N_("Color compensation filter: negative is green, positive is magenta"), IfdId::sony1MltCsA100Id, + SectionId::makerTags, unsignedLong, 1, printValue}, + {0x0060, "BatteryLevel", N_("Battery Level"), N_("Battery level"), IfdId::sony1MltCsA100Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyBatteryLevelA100)}, // End of list marker {0xffff, "(UnknownSonyCsA100Tag)", "(UnknownSonyCsA100Tag)", N_("Unknown Sony Camera Settings A100 tag"), - sony1MltCsA100Id, makerTags, unsignedShort, 1, printValue}, + IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* MinoltaMakerNote::tagListCsA100() { diff --git a/src/nikonmn_int.cpp b/src/nikonmn_int.cpp index 2c525656..fce47e7e 100644 --- a/src/nikonmn_int.cpp +++ b/src/nikonmn_int.cpp @@ -111,34 +111,41 @@ constexpr TagDetails nikonHighISONoiseReduction[] = { // Nikon1 MakerNote Tag Info constexpr TagInfo Nikon1MakerNote::tagInfo_[] = { - {0x0001, "Version", N_("Version"), N_("Nikon Makernote version"), nikon1Id, makerTags, undefined, -1, printValue}, - {0x0002, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), nikon1Id, makerTags, unsignedShort, -1, print0x0002}, - {0x0003, "ColorMode", N_("Color Mode"), N_("Color mode"), nikon1Id, makerTags, asciiString, -1, printValue}, - {0x0004, "Quality", N_("Quality"), N_("Image quality setting"), nikon1Id, makerTags, asciiString, -1, printValue}, - {0x0005, "WhiteBalance", N_("White Balance"), N_("White balance"), nikon1Id, makerTags, asciiString, -1, - printValue}, - {0x0006, "Sharpening", N_("Sharpening"), N_("Image sharpening setting"), nikon1Id, makerTags, asciiString, -1, - printValue}, - {0x0007, "Focus", N_("Focus"), N_("Focus mode"), nikon1Id, makerTags, asciiString, -1, print0x0007}, - {0x0008, "FlashSetting", N_("Flash Setting"), N_("Flash setting"), nikon1Id, makerTags, asciiString, -1, + {0x0001, "Version", N_("Version"), N_("Nikon Makernote version"), IfdId::nikon1Id, SectionId::makerTags, undefined, + -1, printValue}, + {0x0002, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), IfdId::nikon1Id, SectionId::makerTags, unsignedShort, + -1, print0x0002}, + {0x0003, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::nikon1Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x000a, "0x000a", "0x000a", N_("Unknown"), nikon1Id, makerTags, unsignedRational, -1, printValue}, - {0x000f, "ISOSelection", N_("ISO Selection"), N_("ISO selection"), nikon1Id, makerTags, asciiString, -1, + {0x0004, "Quality", N_("Quality"), N_("Image quality setting"), IfdId::nikon1Id, SectionId::makerTags, asciiString, + -1, printValue}, + {0x0005, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::nikon1Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0006, "Sharpening", N_("Sharpening"), N_("Image sharpening setting"), IfdId::nikon1Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0007, "Focus", N_("Focus"), N_("Focus mode"), IfdId::nikon1Id, SectionId::makerTags, asciiString, -1, + print0x0007}, + {0x0008, "FlashSetting", N_("Flash Setting"), N_("Flash setting"), IfdId::nikon1Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x000a, "0x000a", "0x000a", N_("Unknown"), IfdId::nikon1Id, SectionId::makerTags, unsignedRational, -1, printValue}, - {0x0010, "DataDump", N_("Data Dump"), N_("Data dump"), nikon1Id, makerTags, undefined, -1, printValue}, - {0x0080, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), nikon1Id, makerTags, + {0x000f, "ISOSelection", N_("ISO Selection"), N_("ISO selection"), IfdId::nikon1Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0082, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), nikon1Id, makerTags, asciiString, - -1, printValue}, - {0x0085, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), nikon1Id, makerTags, unsignedRational, - -1, print0x0085}, - {0x0086, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), nikon1Id, makerTags, unsignedRational, -1, - print0x0086}, - {0x0088, "AFFocusPos", N_("AF Focus Position"), N_("AF focus position information"), nikon1Id, makerTags, undefined, - -1, print0x0088}, + {0x0010, "DataDump", N_("Data Dump"), N_("Data dump"), IfdId::nikon1Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x0080, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), IfdId::nikon1Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0082, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), IfdId::nikon1Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0085, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), IfdId::nikon1Id, SectionId::makerTags, + unsignedRational, -1, print0x0085}, + {0x0086, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), IfdId::nikon1Id, SectionId::makerTags, + unsignedRational, -1, print0x0086}, + {0x0088, "AFFocusPos", N_("AF Focus Position"), N_("AF focus position information"), IfdId::nikon1Id, + SectionId::makerTags, undefined, -1, print0x0088}, // End of list marker - {0xffff, "(UnknownNikon1MnTag)", "(UnknownNikon1MnTag)", N_("Unknown Nikon1MakerNote tag"), nikon1Id, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownNikon1MnTag)", "(UnknownNikon1MnTag)", N_("Unknown Nikon1MakerNote tag"), IfdId::nikon1Id, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* Nikon1MakerNote::tagList() { @@ -313,27 +320,28 @@ constexpr TagDetails nikon2WhiteBalance[] = {{0, N_("Auto")}, {1, N_("Pr // Nikon2 MakerNote Tag Info constexpr TagInfo Nikon2MakerNote::tagInfo_[] = { - {0x0002, "0x0002", "0x0002", N_("Unknown"), nikon2Id, makerTags, asciiString, -1, printValue}, - {0x0003, "Quality", N_("Quality"), N_("Image quality setting"), nikon2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikon2Quality)}, - {0x0004, "ColorMode", N_("Color Mode"), N_("Color mode"), nikon2Id, makerTags, unsignedShort, -1, + {0x0002, "0x0002", "0x0002", N_("Unknown"), IfdId::nikon2Id, SectionId::makerTags, asciiString, -1, printValue}, + {0x0003, "Quality", N_("Quality"), N_("Image quality setting"), IfdId::nikon2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikon2Quality)}, + {0x0004, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::nikon2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(nikon2ColorMode)}, - {0x0005, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), nikon2Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(nikon2ImageAdjustment)}, - {0x0006, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), nikon2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikon2IsoSpeed)}, - {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance"), nikon2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikon2WhiteBalance)}, - {0x0008, "Focus", N_("Focus Mode"), N_("Focus mode"), nikon2Id, makerTags, unsignedRational, -1, printValue}, - {0x0009, "0x0009", "0x0009", N_("Unknown"), nikon2Id, makerTags, asciiString, -1, printValue}, - {0x000a, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), nikon2Id, makerTags, unsignedRational, -1, - print0x000a}, - {0x000b, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), nikon2Id, makerTags, unsignedShort, - -1, printValue}, - {0x0f00, "0x0f00", "0x0f00", N_("Unknown"), nikon2Id, makerTags, unsignedLong, -1, printValue}, + {0x0005, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), IfdId::nikon2Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(nikon2ImageAdjustment)}, + {0x0006, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), IfdId::nikon2Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(nikon2IsoSpeed)}, + {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::nikon2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikon2WhiteBalance)}, + {0x0008, "Focus", N_("Focus Mode"), N_("Focus mode"), IfdId::nikon2Id, SectionId::makerTags, unsignedRational, -1, + printValue}, + {0x0009, "0x0009", "0x0009", N_("Unknown"), IfdId::nikon2Id, SectionId::makerTags, asciiString, -1, printValue}, + {0x000a, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), IfdId::nikon2Id, SectionId::makerTags, + unsignedRational, -1, print0x000a}, + {0x000b, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), IfdId::nikon2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0f00, "0x0f00", "0x0f00", N_("Unknown"), IfdId::nikon2Id, SectionId::makerTags, unsignedLong, -1, printValue}, // End of list marker - {0xffff, "(UnknownNikon2MnTag)", "(UnknownNikon2MnTag)", N_("Unknown Nikon2MakerNote tag"), nikon2Id, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownNikon2MnTag)", "(UnknownNikon2MnTag)", N_("Unknown Nikon2MakerNote tag"), IfdId::nikon2Id, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* Nikon2MakerNote::tagList() { @@ -359,158 +367,188 @@ std::ostream& Nikon2MakerNote::print0x000a(std::ostream& os, const Value& value, // Nikon3 MakerNote Tag Info constexpr TagInfo Nikon3MakerNote::tagInfo_[] = { - {0x0001, "Version", N_("Version"), N_("Nikon Makernote version"), nikon3Id, makerTags, undefined, -1, - printExifVersion}, - {0x0002, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), nikon3Id, makerTags, unsignedShort, -1, print0x0002}, - {0x0003, "ColorMode", N_("Color Mode"), N_("Color mode"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x0004, "Quality", N_("Quality"), N_("Image quality setting"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x0005, "WhiteBalance", N_("White Balance"), N_("White balance"), nikon3Id, makerTags, asciiString, -1, + {0x0001, "Version", N_("Version"), N_("Nikon Makernote version"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, printExifVersion}, + {0x0002, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), IfdId::nikon3Id, SectionId::makerTags, unsignedShort, + -1, print0x0002}, + {0x0003, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0006, "Sharpening", N_("Sharpening"), N_("Image sharpening setting"), nikon3Id, makerTags, asciiString, -1, - printValue}, - {0x0007, "Focus", N_("Focus"), N_("Focus mode"), nikon3Id, makerTags, asciiString, -1, print0x0007}, - {0x0008, "FlashSetting", N_("Flash Setting"), N_("Flash setting"), nikon3Id, makerTags, asciiString, -1, - printValue}, - {0x0009, "FlashDevice", N_("Flash Device"), N_("Flash device"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x000a, "0x000a", "0x000a", N_("Unknown"), nikon3Id, makerTags, unsignedRational, -1, printValue}, - {0x000b, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance bias"), nikon3Id, makerTags, signedShort, + {0x0004, "Quality", N_("Quality"), N_("Image quality setting"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x000c, "WB_RBLevels", N_("WB RB Levels"), N_("WB RB levels"), nikon3Id, makerTags, unsignedRational, -1, + {0x0005, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0006, "Sharpening", N_("Sharpening"), N_("Image sharpening setting"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0007, "Focus", N_("Focus"), N_("Focus mode"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, + print0x0007}, + {0x0008, "FlashSetting", N_("Flash Setting"), N_("Flash setting"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0009, "FlashDevice", N_("Flash Device"), N_("Flash device"), IfdId::nikon3Id, SectionId::makerTags, asciiString, + -1, printValue}, + {0x000a, "0x000a", "0x000a", N_("Unknown"), IfdId::nikon3Id, SectionId::makerTags, unsignedRational, -1, printValue}, - {0x000d, "ProgramShift", N_("Program Shift"), N_("Program shift"), nikon3Id, makerTags, undefined, -1, - EXV_PRINT_TAG(nikonFlashComp)}, - {0x000e, "ExposureDiff", N_("Exposure Difference"), N_("Exposure difference"), nikon3Id, makerTags, undefined, -1, - EXV_PRINT_TAG(nikonFlashComp)}, - {0x000f, "ISOSelection", N_("ISO Selection"), N_("ISO selection"), nikon3Id, makerTags, asciiString, -1, + {0x000b, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance bias"), IfdId::nikon3Id, + SectionId::makerTags, signedShort, -1, printValue}, + {0x000c, "WB_RBLevels", N_("WB RB Levels"), N_("WB RB levels"), IfdId::nikon3Id, SectionId::makerTags, + unsignedRational, -1, printValue}, + {0x000d, "ProgramShift", N_("Program Shift"), N_("Program shift"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, EXV_PRINT_TAG(nikonFlashComp)}, + {0x000e, "ExposureDiff", N_("Exposure Difference"), N_("Exposure difference"), IfdId::nikon3Id, + SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(nikonFlashComp)}, + {0x000f, "ISOSelection", N_("ISO Selection"), N_("ISO selection"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0010, "DataDump", N_("Data Dump"), N_("Data dump"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x0010, "DataDump", N_("Data Dump"), N_("Data dump"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0011, "Preview", N_("Pointer to a preview image"), N_("Offset to an IFD containing a preview image"), nikon3Id, - makerTags, undefined, -1, printValue}, - {0x0012, "FlashComp", N_("Flash Comp"), N_("Flash compensation setting"), nikon3Id, makerTags, undefined, -1, - EXV_PRINT_TAG(nikonFlashComp)}, - {0x0013, "ISOSettings", N_("ISO Settings"), N_("ISO setting"), nikon3Id, makerTags, unsignedShort, -1, - print0x0002}, // use 0x0002 print fct - {0x0016, "ImageBoundary", N_("Image Boundary"), N_("Image boundary"), nikon3Id, makerTags, unsignedShort, -1, + {0x0011, "Preview", N_("Pointer to a preview image"), N_("Offset to an IFD containing a preview image"), + IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x0012, "FlashComp", N_("Flash Comp"), N_("Flash compensation setting"), IfdId::nikon3Id, SectionId::makerTags, + undefined, -1, EXV_PRINT_TAG(nikonFlashComp)}, + {0x0013, "ISOSettings", N_("ISO Settings"), N_("ISO setting"), IfdId::nikon3Id, SectionId::makerTags, unsignedShort, + -1, print0x0002}, // use 0x0002 print fct + {0x0016, "ImageBoundary", N_("Image Boundary"), N_("Image boundary"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0017, "FlashExposureComp", "Flash Exposure Comp", N_("Flash exposure comp"), IfdId::nikon3Id, + SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(nikonFlashComp)}, + {0x0018, "FlashBracketComp", N_("Flash Bracket Comp"), N_("Flash bracket compensation applied"), IfdId::nikon3Id, + SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(nikonFlashComp)}, // use 0x0012 print fct + {0x0019, "ExposureBracketComp", N_("Exposure Bracket Comp"), N_("AE bracket compensation applied"), IfdId::nikon3Id, + SectionId::makerTags, signedRational, -1, printValue}, + {0x001a, "ImageProcessing", N_("Image Processing"), N_("Image processing"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x001b, "CropHiSpeed", N_("Crop High Speed"), N_("Crop high speed"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x001c, "ExposureTuning", N_("Exposure Tuning"), N_("Exposure tuning"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x001d, "SerialNumber", N_("Serial Number"), N_("Serial Number"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x001e, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::nikon3Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(nikonColorSpace)}, + {0x001f, "VRInfo", N_("VR Info"), N_("VR info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x0020, "ImageAuthentication", N_("Image Authentication"), N_("Image authentication"), IfdId::nikon3Id, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(nikonOffOn)}, + {0x0022, "ActiveDLighting", N_("ActiveD-Lighting"), N_("ActiveD-lighting"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikonActiveDLighting)}, + {0x0023, "PictureControl", N_("Picture Control"), N_(" Picture control"), IfdId::nikon3Id, SectionId::makerTags, + undefined, -1, printValue}, + {0x0024, "WorldTime", N_("World Time"), N_("World time"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x0017, "FlashExposureComp", "Flash Exposure Comp", N_("Flash exposure comp"), nikon3Id, makerTags, undefined, -1, - EXV_PRINT_TAG(nikonFlashComp)}, - {0x0018, "FlashBracketComp", N_("Flash Bracket Comp"), N_("Flash bracket compensation applied"), nikon3Id, - makerTags, undefined, -1, EXV_PRINT_TAG(nikonFlashComp)}, // use 0x0012 print fct - {0x0019, "ExposureBracketComp", N_("Exposure Bracket Comp"), N_("AE bracket compensation applied"), nikon3Id, - makerTags, signedRational, -1, printValue}, - {0x001a, "ImageProcessing", N_("Image Processing"), N_("Image processing"), nikon3Id, makerTags, asciiString, -1, + {0x0025, "ISOInfo", N_("ISO Info"), N_("ISO info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x001b, "CropHiSpeed", N_("Crop High Speed"), N_("Crop high speed"), nikon3Id, makerTags, unsignedShort, -1, + {0x002a, "VignetteControl", N_("Vignette Control"), N_("Vignette control"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikonOlnh)}, + {0x0034, "ShutterMode", N_("Shutter Mode"), N_("Shutter mode"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikonShutterModes)}, + {0x0037, "MechanicalShutterCount", N_("Mechanical Shutter Count"), N_("Mechanical shutter count"), IfdId::nikon3Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0080, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0081, "ToneComp", N_("Tone Compensation"), N_("Tone compensation"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0082, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0083, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::nikon3Id, SectionId::makerTags, unsignedByte, -1, + print0x0083}, + {0x0084, "Lens", N_("Lens"), N_("Lens"), IfdId::nikon3Id, SectionId::makerTags, unsignedRational, -1, print0x0084}, + {0x0085, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), IfdId::nikon3Id, SectionId::makerTags, + unsignedRational, -1, print0x0085}, + {0x0086, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), IfdId::nikon3Id, SectionId::makerTags, + unsignedRational, -1, print0x0086}, + {0x0087, "FlashMode", N_("Flash Mode"), N_("Mode of flash used"), IfdId::nikon3Id, SectionId::makerTags, + unsignedByte, -1, EXV_PRINT_TAG(nikonFlashMode)}, + {0x0088, "AFInfo", N_("AF Info"), N_("AF info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x0089, "ShootingMode", N_("Shooting Mode"), N_("Shooting mode"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, print0x0089}, + {0x008a, "AutoBracketRelease", N_("Auto Bracket Release"), N_("Auto bracket release"), IfdId::nikon3Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(nikonAutoBracketRelease)}, + {0x008b, "LensFStops", N_("Lens FStops"), N_("Lens FStops"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, + print0x008b}, + {0x008c, "ContrastCurve", N_("Contrast Curve"), N_("Contrast curve"), IfdId::nikon3Id, SectionId::makerTags, + undefined, -1, printValue}, + {0x008d, "ColorHue", N_("Color Hue"), N_("Color hue"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x001c, "ExposureTuning", N_("Exposure Tuning"), N_("Exposure tuning"), nikon3Id, makerTags, unsignedShort, -1, + {0x008f, "SceneMode", N_("Scene Mode"), N_("Scene mode"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x001d, "SerialNumber", N_("Serial Number"), N_("Serial Number"), nikon3Id, makerTags, asciiString, -1, + {0x0090, "LightSource", N_("Light Source"), N_("Light source"), IfdId::nikon3Id, SectionId::makerTags, asciiString, + -1, printValue}, + {0x0091, "ShotInfo", "Shot Info", N_("Shot info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x001e, "ColorSpace", N_("Color Space"), N_("Color space"), nikon3Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikonColorSpace)}, - {0x001f, "VRInfo", N_("VR Info"), N_("VR info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0020, "ImageAuthentication", N_("Image Authentication"), N_("Image authentication"), nikon3Id, makerTags, - unsignedByte, -1, EXV_PRINT_TAG(nikonOffOn)}, - {0x0022, "ActiveDLighting", N_("ActiveD-Lighting"), N_("ActiveD-lighting"), nikon3Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikonActiveDLighting)}, - {0x0023, "PictureControl", N_("Picture Control"), N_(" Picture control"), nikon3Id, makerTags, undefined, -1, + {0x0092, "HueAdjustment", N_("Hue Adjustment"), N_("Hue adjustment"), IfdId::nikon3Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0093, "NEFCompression", N_("NEF Compression"), N_("NEF compression"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(nikonNefCompression)}, + {0x0094, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::nikon3Id, SectionId::makerTags, signedShort, -1, printValue}, - {0x0024, "WorldTime", N_("World Time"), N_("World time"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0025, "ISOInfo", N_("ISO Info"), N_("ISO info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x002a, "VignetteControl", N_("Vignette Control"), N_("Vignette control"), nikon3Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikonOlnh)}, - {0x0034, "ShutterMode", N_("Shutter Mode"), N_("Shutter mode"), nikon3Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikonShutterModes)}, - {0x0037, "MechanicalShutterCount", N_("Mechanical Shutter Count"), N_("Mechanical shutter count"), nikon3Id, - makerTags, unsignedLong, -1, printValue}, - {0x0080, "ImageAdjustment", N_("Image Adjustment"), N_("Image adjustment setting"), nikon3Id, makerTags, + {0x0095, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0081, "ToneComp", N_("Tone Compensation"), N_("Tone compensation"), nikon3Id, makerTags, asciiString, -1, - printValue}, - {0x0082, "AuxiliaryLens", N_("Auxiliary Lens"), N_("Auxiliary lens (adapter)"), nikon3Id, makerTags, asciiString, + {0x0096, "LinearizationTable", N_("Linearization Table"), N_("Linearization table"), IfdId::nikon3Id, + SectionId::makerTags, undefined, -1, printValue}, + {0x0097, "ColorBalance", N_("Color Balance"), N_("Color balance"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, printValue}, + {0x0098, "LensData", N_("Lens Data"), N_("Lens data settings"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, printValue}, + {0x0099, "RawImageCenter", N_("Raw Image Center"), N_("Raw image center"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x009a, "SensorPixelSize", N_("Sensor Pixel Size"), N_("Sensor pixel size"), IfdId::nikon3Id, SectionId::makerTags, + unsignedRational, -1, print0x009a}, + {0x009b, "0x009b", "0x009b", N_("Unknown"), IfdId::nikon3Id, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x009c, "SceneAssist", N_("Scene Assist"), N_("Scene assist"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0083, "LensType", N_("Lens Type"), N_("Lens type"), nikon3Id, makerTags, unsignedByte, -1, print0x0083}, - {0x0084, "Lens", N_("Lens"), N_("Lens"), nikon3Id, makerTags, unsignedRational, -1, print0x0084}, - {0x0085, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), nikon3Id, makerTags, unsignedRational, - -1, print0x0085}, - {0x0086, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom setting"), nikon3Id, makerTags, unsignedRational, -1, - print0x0086}, - {0x0087, "FlashMode", N_("Flash Mode"), N_("Mode of flash used"), nikon3Id, makerTags, unsignedByte, -1, - EXV_PRINT_TAG(nikonFlashMode)}, - {0x0088, "AFInfo", N_("AF Info"), N_("AF info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0089, "ShootingMode", N_("Shooting Mode"), N_("Shooting mode"), nikon3Id, makerTags, unsignedShort, -1, - print0x0089}, - {0x008a, "AutoBracketRelease", N_("Auto Bracket Release"), N_("Auto bracket release"), nikon3Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(nikonAutoBracketRelease)}, - {0x008b, "LensFStops", N_("Lens FStops"), N_("Lens FStops"), nikon3Id, makerTags, undefined, -1, print0x008b}, - {0x008c, "ContrastCurve", N_("Contrast Curve"), N_("Contrast curve"), nikon3Id, makerTags, undefined, -1, + {0x009e, "RetouchHistory", N_("Retouch History"), N_("Retouch history"), IfdId::nikon3Id, SectionId::makerTags, + unsignedShort, -1, print0x009e}, + {0x009f, "0x009f", "0x009f", N_("Unknown"), IfdId::nikon3Id, SectionId::makerTags, signedShort, -1, printValue}, + {0x00a0, "SerialNO", N_("Serial NO"), N_("Camera serial number, usually starts with \"NO= \""), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x00a2, "ImageDataSize", N_("Image Data Size"), N_("Image data size"), IfdId::nikon3Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x00a3, "0x00a3", "0x00a3", N_("Unknown"), IfdId::nikon3Id, SectionId::makerTags, unsignedByte, -1, printValue}, + {0x00a5, "ImageCount", N_("Image Count"), N_("Image count"), IfdId::nikon3Id, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x00a6, "DeletedImageCount", N_("Deleted Image Count"), N_("Deleted image count"), IfdId::nikon3Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x00a7, "ShutterCount", N_("Shutter Count"), N_("Number of shots taken by camera"), IfdId::nikon3Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x00a8, "FlashInfo", "Flash Info", N_("Flash info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x008d, "ColorHue", N_("Color Hue"), N_("Color hue"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x008f, "SceneMode", N_("Scene Mode"), N_("Scene mode"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x0090, "LightSource", N_("Light Source"), N_("Light source"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x0091, "ShotInfo", "Shot Info", N_("Shot info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0092, "HueAdjustment", N_("Hue Adjustment"), N_("Hue adjustment"), nikon3Id, makerTags, signedShort, -1, + {0x00a9, "ImageOptimization", N_("Image Optimization"), N_("Image optimization"), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x00aa, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0093, "NEFCompression", N_("NEF Compression"), N_("NEF compression"), nikon3Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(nikonNefCompression)}, - {0x0094, "Saturation", N_("Saturation"), N_("Saturation"), nikon3Id, makerTags, signedShort, -1, printValue}, - {0x0095, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), nikon3Id, makerTags, asciiString, -1, + {0x00ab, "VariProgram", N_("Program Variation"), N_("Program variation"), IfdId::nikon3Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0x00ac, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x00ad, "AFResponse", N_("AF Response"), N_("AF response"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0096, "LinearizationTable", N_("Linearization Table"), N_("Linearization table"), nikon3Id, makerTags, undefined, + {0x00b0, "MultiExposure", "Multi Exposure", N_("Multi exposure"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, printValue}, + {0x00b1, "HighISONoiseReduction", N_("High ISO Noise Reduction"), N_("High ISO Noise Reduction"), IfdId::nikon3Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(nikonHighISONoiseReduction)}, + {0x00b3, "ToningEffect", "Toning Effect", N_("Toning effect"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0097, "ColorBalance", N_("Color Balance"), N_("Color balance"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0098, "LensData", N_("Lens Data"), N_("Lens data settings"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0099, "RawImageCenter", N_("Raw Image Center"), N_("Raw image center"), nikon3Id, makerTags, unsignedShort, -1, + {0x00b7, "AFInfo2", "AF Info 2", N_("AF info 2"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x00b8, "FileInfo", "File Info", N_("File info"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x009a, "SensorPixelSize", N_("Sensor Pixel Size"), N_("Sensor pixel size"), nikon3Id, makerTags, unsignedRational, - -1, print0x009a}, - {0x009b, "0x009b", "0x009b", N_("Unknown"), nikon3Id, makerTags, unsignedShort, -1, printValue}, - {0x009c, "SceneAssist", N_("Scene Assist"), N_("Scene assist"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x009e, "RetouchHistory", N_("Retouch History"), N_("Retouch history"), nikon3Id, makerTags, unsignedShort, -1, - print0x009e}, - {0x009f, "0x009f", "0x009f", N_("Unknown"), nikon3Id, makerTags, signedShort, -1, printValue}, - {0x00a0, "SerialNO", N_("Serial NO"), N_("Camera serial number, usually starts with \"NO= \""), nikon3Id, makerTags, - asciiString, -1, printValue}, - {0x00a2, "ImageDataSize", N_("Image Data Size"), N_("Image data size"), nikon3Id, makerTags, unsignedLong, -1, + {0x00b9, "AFTune", "AF Tune", N_("AF tune"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x00c3, "BarometerInfo", "Barometer Info", N_("Barometer Info"), IfdId::nikon3Id, SectionId::makerTags, signedLong, + -1, Nikon1MakerNote::printBarValue}, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x00a3, "0x00a3", "0x00a3", N_("Unknown"), nikon3Id, makerTags, unsignedByte, -1, printValue}, - {0x00a5, "ImageCount", N_("Image Count"), N_("Image count"), nikon3Id, makerTags, unsignedLong, -1, printValue}, - {0x00a6, "DeletedImageCount", N_("Deleted Image Count"), N_("Deleted image count"), nikon3Id, makerTags, - unsignedLong, -1, printValue}, - {0x00a7, "ShutterCount", N_("Shutter Count"), N_("Number of shots taken by camera"), nikon3Id, makerTags, - unsignedLong, -1, printValue}, - {0x00a8, "FlashInfo", "Flash Info", N_("Flash info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x00a9, "ImageOptimization", N_("Image Optimization"), N_("Image optimization"), nikon3Id, makerTags, asciiString, + // TODO: Add Capture Data decoding implementation. + {0x0e01, "CaptureData", N_("Capture Data"), N_("Capture data"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x00aa, "Saturation", N_("Saturation"), N_("Saturation"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x00ab, "VariProgram", N_("Program Variation"), N_("Program variation"), nikon3Id, makerTags, asciiString, -1, - printValue}, - {0x00ac, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), nikon3Id, makerTags, + {0x0e09, "CaptureVersion", N_("Capture Version"), N_("Capture version"), IfdId::nikon3Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x00ad, "AFResponse", N_("AF Response"), N_("AF response"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x00b0, "MultiExposure", "Multi Exposure", N_("Multi exposure"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x00b1, "HighISONoiseReduction", N_("High ISO Noise Reduction"), N_("High ISO Noise Reduction"), nikon3Id, - makerTags, unsignedShort, -1, EXV_PRINT_TAG(nikonHighISONoiseReduction)}, - {0x00b3, "ToningEffect", "Toning Effect", N_("Toning effect"), nikon3Id, makerTags, asciiString, -1, printValue}, - {0x00b7, "AFInfo2", "AF Info 2", N_("AF info 2"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x00b8, "FileInfo", "File Info", N_("File info"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x00b9, "AFTune", "AF Tune", N_("AF tune"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x00c3, "BarometerInfo", "Barometer Info", N_("Barometer Info"), nikon3Id, makerTags, signedLong, -1, - Nikon1MakerNote::printBarValue}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), nikon3Id, makerTags, undefined, -1, printValue}, - // TODO: Add Capture Data decoding implementation. - {0x0e01, "CaptureData", N_("Capture Data"), N_("Capture data"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0e09, "CaptureVersion", N_("Capture Version"), N_("Capture version"), nikon3Id, makerTags, asciiString, -1, - printValue}, // TODO: Add Capture Offsets decoding implementation. - {0x0e0e, "CaptureOffsets", N_("Capture Offsets"), N_("Capture offsets"), nikon3Id, makerTags, undefined, -1, + {0x0e0e, "CaptureOffsets", N_("Capture Offsets"), N_("Capture offsets"), IfdId::nikon3Id, SectionId::makerTags, + undefined, -1, printValue}, + {0x0e10, "ScanIFD", "Scan IFD", N_("Scan IFD"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, + {0x0e1d, "ICCProfile", "ICC Profile", N_("ICC profile"), IfdId::nikon3Id, SectionId::makerTags, undefined, -1, printValue}, - {0x0e10, "ScanIFD", "Scan IFD", N_("Scan IFD"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0e1d, "ICCProfile", "ICC Profile", N_("ICC profile"), nikon3Id, makerTags, undefined, -1, printValue}, - {0x0e1e, "CaptureOutput", "Capture Output", N_("Capture output"), nikon3Id, makerTags, undefined, -1, printValue}, + {0x0e1e, "CaptureOutput", "Capture Output", N_("Capture output"), IfdId::nikon3Id, SectionId::makerTags, undefined, + -1, printValue}, // End of list marker - {0xffff, "(UnknownNikon3MnTag)", "(UnknownNikon3MnTag)", N_("Unknown Nikon3MakerNote tag"), nikon3Id, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownNikon3MnTag)", "(UnknownNikon3MnTag)", N_("Unknown Nikon3MakerNote tag"), IfdId::nikon3Id, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* Nikon3MakerNote::tagList() { @@ -528,12 +566,13 @@ constexpr TagDetails nikonOnOff[] = {{1, N_("On")}, {2, N_("Off")}}; // Nikon3 Vibration Reduction Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoVr_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonVrId, makerTags, undefined, 4, printExifVersion}, - {4, "VibrationReduction", N_("Vibration Reduction"), N_("Vibration reduction"), nikonVrId, makerTags, unsignedByte, - 1, EXV_PRINT_TAG(nikonOnOff)}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonVrId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "VibrationReduction", N_("Vibration Reduction"), N_("Vibration reduction"), IfdId::nikonVrId, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOnOff)}, // End of list marker - {0xffff, "(UnknownNikonVrTag)", "(UnknownNikonVrTag)", N_("Unknown Nikon Vibration Reduction Tag"), nikonVrId, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonVrTag)", "(UnknownNikonVrTag)", N_("Unknown Nikon Vibration Reduction Tag"), + IfdId::nikonVrId, SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListVr() { @@ -555,27 +594,33 @@ constexpr TagDetails nikonToningEffect[] = {{0x80, N_("B&W")}, {0x81, N_( // Nikon3 Picture Control Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoPc_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonPcId, makerTags, undefined, 4, printExifVersion}, - {4, "Name", N_("Name"), N_("Name"), nikonPcId, makerTags, asciiString, 20, printValue}, - {24, "Base", N_("Base"), N_("Base"), nikonPcId, makerTags, asciiString, 20, printValue}, - {48, "Adjust", N_("Adjust"), N_("Adjust"), nikonPcId, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonAdjust)}, - {49, "QuickAdjust", N_("Quick Adjust"), N_("Quick adjust"), nikonPcId, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonPcId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "Name", N_("Name"), N_("Name"), IfdId::nikonPcId, SectionId::makerTags, asciiString, 20, printValue}, + {24, "Base", N_("Base"), N_("Base"), IfdId::nikonPcId, SectionId::makerTags, asciiString, 20, printValue}, + {48, "Adjust", N_("Adjust"), N_("Adjust"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, + EXV_PRINT_TAG(nikonAdjust)}, + {49, "QuickAdjust", N_("Quick Adjust"), N_("Quick adjust"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, + printPictureControl}, + {50, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, printPictureControl}, - {50, "Sharpness", N_("Sharpness"), N_("Sharpness"), nikonPcId, makerTags, unsignedByte, 1, printPictureControl}, - {51, "Contrast", N_("Contrast"), N_("Contrast"), nikonPcId, makerTags, unsignedByte, 1, printPictureControl}, - {52, "Brightness", N_("Brightness"), N_("Brightness"), nikonPcId, makerTags, unsignedByte, 1, printPictureControl}, - {53, "Saturation", N_("Saturation"), N_("Saturation"), nikonPcId, makerTags, unsignedByte, 1, printPictureControl}, - {54, "HueAdjustment", N_("Hue Adjustment"), N_("Hue adjustment"), nikonPcId, makerTags, unsignedByte, 1, + {51, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, printPictureControl}, - {55, "FilterEffect", N_("Filter Effect"), N_("Filter effect"), nikonPcId, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFilterEffect)}, - {56, "ToningEffect", N_("Toning Effect"), N_("Toning effect"), nikonPcId, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonToningEffect)}, - {57, "ToningSaturation", N_("Toning Saturation"), N_("Toning saturation"), nikonPcId, makerTags, unsignedByte, 1, + {52, "Brightness", N_("Brightness"), N_("Brightness"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, printPictureControl}, + {53, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, 1, + printPictureControl}, + {54, "HueAdjustment", N_("Hue Adjustment"), N_("Hue adjustment"), IfdId::nikonPcId, SectionId::makerTags, + unsignedByte, 1, printPictureControl}, + {55, "FilterEffect", N_("Filter Effect"), N_("Filter effect"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, + 1, EXV_PRINT_TAG(nikonFilterEffect)}, + {56, "ToningEffect", N_("Toning Effect"), N_("Toning effect"), IfdId::nikonPcId, SectionId::makerTags, unsignedByte, + 1, EXV_PRINT_TAG(nikonToningEffect)}, + {57, "ToningSaturation", N_("Toning Saturation"), N_("Toning saturation"), IfdId::nikonPcId, SectionId::makerTags, + unsignedByte, 1, printPictureControl}, // End of list marker - {0xffff, "(UnknownNikonPcTag)", "(UnknownNikonPcTag)", N_("Unknown Nikon Picture Control Tag"), nikonPcId, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonPcTag)", "(UnknownNikonPcTag)", N_("Unknown Nikon Picture Control Tag"), IfdId::nikonPcId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListPc() { @@ -587,15 +632,15 @@ constexpr TagDetails aftOnOff[] = {{0, N_("Off")}, {1, N_("On")}, {2, N_("On")}} // Nikon3 AF Fine Tune constexpr TagInfo Nikon3MakerNote::tagInfoAFT_[] = { - {0, "AFFineTune", N_("AF Fine Tune"), N_("AF fine tune"), nikonAFTId, makerTags, unsignedByte, 1, + {0, "AFFineTune", N_("AF Fine Tune"), N_("AF fine tune"), IfdId::nikonAFTId, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(aftOnOff)}, - {1, "AFFineTuneIndex", N_("AF Fine Tune Index"), N_("AF fine tune index"), nikonAFTId, makerTags, unsignedByte, 1, - printValue}, - {2, "AFFineTuneAdj", N_("AF Fine Tune Adjustment"), N_("AF fine tune adjustment"), nikonAFTId, makerTags, - signedByte, 1, printValue}, + {1, "AFFineTuneIndex", N_("AF Fine Tune Index"), N_("AF fine tune index"), IfdId::nikonAFTId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {2, "AFFineTuneAdj", N_("AF Fine Tune Adjustment"), N_("AF fine tune adjustment"), IfdId::nikonAFTId, + SectionId::makerTags, signedByte, 1, printValue}, // End of list marker - {0xffff, "(UnknownNikonAFTTag)", "(UnknownNikonAFTTag)", N_("Unknown Nikon AF Fine Tune Tag"), nikonAFTId, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonAFTTag)", "(UnknownNikonAFTTag)", N_("Unknown Nikon AF Fine Tune Tag"), IfdId::nikonAFTId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListAFT() { @@ -604,14 +649,15 @@ const TagInfo* Nikon3MakerNote::tagListAFT() { // Nikon3 World Time Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoWt_[] = { - {0, "Timezone", N_("Timezone"), N_("Timezone"), nikonWtId, makerTags, signedShort, 1, printTimeZone}, - {2, "DaylightSavings", N_("Daylight Savings"), N_("Daylight savings"), nikonWtId, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonYesNo)}, - {3, "DateDisplayFormat", N_("Date Display Format"), N_("Date display format"), nikonWtId, makerTags, unsignedByte, - 1, EXV_PRINT_TAG(nikonDateDisplayFormat)}, + {0, "Timezone", N_("Timezone"), N_("Timezone"), IfdId::nikonWtId, SectionId::makerTags, signedShort, 1, + printTimeZone}, + {2, "DaylightSavings", N_("Daylight Savings"), N_("Daylight savings"), IfdId::nikonWtId, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonYesNo)}, + {3, "DateDisplayFormat", N_("Date Display Format"), N_("Date display format"), IfdId::nikonWtId, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonDateDisplayFormat)}, // End of list marker - {0xffff, "(UnknownNikonWtTag)", "(UnknownNikonWtTag)", N_("Unknown Nikon World Time Tag"), nikonWtId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonWtTag)", "(UnknownNikonWtTag)", N_("Unknown Nikon World Time Tag"), IfdId::nikonWtId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListWt() { @@ -628,15 +674,15 @@ constexpr TagDetails nikonIsoExpansion[] = { // Nikon3 ISO Info Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoIi_[] = { - {0, "ISO", N_("ISO"), N_("ISO"), nikonIiId, makerTags, unsignedByte, 1, printIiIso}, - {4, "ISOExpansion", N_("ISO Expansion"), N_("ISO expansion"), nikonIiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(nikonIsoExpansion)}, - {6, "ISO2", N_("ISO 2"), N_("ISO 2"), nikonIiId, makerTags, unsignedByte, 1, printIiIso}, - {10, "ISOExpansion2", N_("ISO Expansion 2"), N_("ISO expansion 2"), nikonIiId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(nikonIsoExpansion)}, + {0, "ISO", N_("ISO"), N_("ISO"), IfdId::nikonIiId, SectionId::makerTags, unsignedByte, 1, printIiIso}, + {4, "ISOExpansion", N_("ISO Expansion"), N_("ISO expansion"), IfdId::nikonIiId, SectionId::makerTags, unsignedShort, + 1, EXV_PRINT_TAG(nikonIsoExpansion)}, + {6, "ISO2", N_("ISO 2"), N_("ISO 2"), IfdId::nikonIiId, SectionId::makerTags, unsignedByte, 1, printIiIso}, + {10, "ISOExpansion2", N_("ISO Expansion 2"), N_("ISO expansion 2"), IfdId::nikonIiId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(nikonIsoExpansion)}, // End of list marker - {0xffff, "(UnknownNikonIiTag)", "(UnknownNikonIiTag)", N_("Unknown Nikon Iso Info Tag"), nikonIiId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonIiTag)", "(UnknownNikonIiTag)", N_("Unknown Nikon Iso Info Tag"), IfdId::nikonIiId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListIi() { @@ -662,14 +708,15 @@ constexpr TagDetailsBitmask nikonAfPointsInFocus[] = { // Nikon3 Auto Focus Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoAf_[] = { - {0, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAfId, makerTags, unsignedByte, 1, + {0, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), IfdId::nikonAfId, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonAfAreaMode)}, - {1, "AFPoint", N_("AF Point"), N_("AF point"), nikonAfId, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonAfPoint)}, - {2, "AFPointsInFocus", N_("AF Points In Focus"), N_("AF points in focus"), nikonAfId, makerTags, unsignedShort, 1, - printAfPointsInFocus}, + {1, "AFPoint", N_("AF Point"), N_("AF point"), IfdId::nikonAfId, SectionId::makerTags, unsignedByte, 1, + EXV_PRINT_TAG(nikonAfPoint)}, + {2, "AFPointsInFocus", N_("AF Points In Focus"), N_("AF points in focus"), IfdId::nikonAfId, SectionId::makerTags, + unsignedShort, 1, printAfPointsInFocus}, // End of list marker - {0xffff, "(UnknownNikonAfTag)", "(UnknownNikonAfTag)", N_("Unknown Nikon Auto Focus Tag"), nikonAfId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonAfTag)", "(UnknownNikonAfTag)", N_("Unknown Nikon Auto Focus Tag"), IfdId::nikonAfId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListAf() { @@ -684,32 +731,35 @@ constexpr TagDetails nikonPhaseDetectAF[] = { // Nikon3 Auto Focus Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoAf21_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonAf21Id, makerTags, undefined, 4, printExifVersion}, - {4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), nikonAf21Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonOffOn)}, - {5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAf21Id, makerTags, unsignedByte, 1, printValue}, - {6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), nikonAf21Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonPhaseDetectAF)}, - {7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), nikonAf21Id, makerTags, unsignedByte, 1, - printValue}, - {8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), nikonAf21Id, makerTags, unsignedByte, 7, - printValue}, - {16, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), nikonAf21Id, makerTags, unsignedShort, 1, - printValue}, - {18, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), nikonAf21Id, makerTags, unsignedShort, 1, - printValue}, - {20, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), nikonAf21Id, makerTags, unsignedShort, - 1, printValue}, - {22, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), nikonAf21Id, makerTags, unsignedShort, - 1, printValue}, - {24, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), nikonAf21Id, makerTags, unsignedShort, 1, printValue}, - {26, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), nikonAf21Id, makerTags, unsignedShort, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonAf21Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), IfdId::nikonAf21Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)}, + {5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), IfdId::nikonAf21Id, SectionId::makerTags, unsignedByte, 1, printValue}, - {28, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), nikonAf21Id, - makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonYesNo)}, + {6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonPhaseDetectAF)}, + {7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedByte, 1, printValue}, + {8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedByte, 7, printValue}, + {16, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {18, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {20, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), IfdId::nikonAf21Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {22, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), IfdId::nikonAf21Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {24, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {26, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), IfdId::nikonAf21Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {28, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), + IfdId::nikonAf21Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonYesNo)}, // End of list marker - {0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), nikonAf21Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), IfdId::nikonAf21Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListAf21() { @@ -718,32 +768,35 @@ const TagInfo* Nikon3MakerNote::tagListAf21() { // Nikon3 Auto Focus Tag Info Version 1.01 https://github.com/Exiv2/exiv2/pull/900 constexpr TagInfo Nikon3MakerNote::tagInfoAf22_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonAf22Id, makerTags, undefined, 4, printExifVersion}, - {4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), nikonAf22Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonOffOn)}, - {5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAf22Id, makerTags, unsignedByte, 1, printValue}, - {6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), nikonAf22Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonPhaseDetectAF)}, - {7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), nikonAf22Id, makerTags, unsignedByte, 1, - printValue}, - {8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), nikonAf22Id, makerTags, unsignedByte, 7, - printValue}, - {70, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), nikonAf22Id, makerTags, unsignedShort, 1, - printValue}, - {72, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), nikonAf22Id, makerTags, unsignedShort, 1, - printValue}, - {74, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), nikonAf22Id, makerTags, unsignedShort, - 1, printValue}, - {76, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), nikonAf22Id, makerTags, unsignedShort, - 1, printValue}, - {78, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), nikonAf22Id, makerTags, unsignedShort, 1, printValue}, - {80, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), nikonAf22Id, makerTags, unsignedShort, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonAf22Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), IfdId::nikonAf22Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)}, + {5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), IfdId::nikonAf22Id, SectionId::makerTags, unsignedByte, 1, printValue}, - {82, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), nikonAf22Id, - makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonYesNo)}, + {6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonPhaseDetectAF)}, + {7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedByte, 1, printValue}, + {8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedByte, 7, printValue}, + {70, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {72, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {74, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), IfdId::nikonAf22Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {76, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), IfdId::nikonAf22Id, + SectionId::makerTags, unsignedShort, 1, printValue}, + {78, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {80, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), IfdId::nikonAf22Id, SectionId::makerTags, + unsignedShort, 1, printValue}, + {82, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), + IfdId::nikonAf22Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonYesNo)}, // End of list marker - {0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), nikonAf22Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), IfdId::nikonAf22Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListAf22() { @@ -752,13 +805,15 @@ const TagInfo* Nikon3MakerNote::tagListAf22() { // Nikon3 File Info Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoFi_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonFiId, makerTags, undefined, 4, printExifVersion}, - {6, "DirectoryNumber", N_("Directory Number"), N_("Directory number"), nikonFiId, makerTags, unsignedShort, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonFiId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {6, "DirectoryNumber", N_("Directory Number"), N_("Directory number"), IfdId::nikonFiId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {8, "FileNumber", N_("File Number"), N_("File number"), IfdId::nikonFiId, SectionId::makerTags, unsignedShort, 1, printValue}, - {8, "FileNumber", N_("File Number"), N_("File number"), nikonFiId, makerTags, unsignedShort, 1, printValue}, // End of list marker - {0xffff, "(UnknownNikonFiTag)", "(UnknownNikonFiTag)", N_("Unknown Nikon File Info Tag"), nikonFiId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonFiTag)", "(UnknownNikonFiTag)", N_("Unknown Nikon File Info Tag"), IfdId::nikonFiId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListFi() { @@ -771,16 +826,17 @@ constexpr TagDetails nikonMultiExposureMode[] = { // Nikon3 Multi Exposure Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoMe_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonMeId, makerTags, undefined, 4, printExifVersion}, - {4, "MultiExposureMode", N_("Multi Exposure Mode"), N_("Multi exposure mode"), nikonMeId, makerTags, unsignedLong, - 1, EXV_PRINT_TAG(nikonMultiExposureMode)}, - {8, "MultiExposureShots", N_("Multi Exposure Shots"), N_("Multi exposure shots"), nikonMeId, makerTags, - unsignedLong, 1, printValue}, - {12, "MultiExposureAutoGain", N_("Multi Exposure Auto Gain"), N_("Multi exposure auto gain"), nikonMeId, makerTags, - unsignedLong, 1, EXV_PRINT_TAG(nikonOffOn)}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonMeId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "MultiExposureMode", N_("Multi Exposure Mode"), N_("Multi exposure mode"), IfdId::nikonMeId, + SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(nikonMultiExposureMode)}, + {8, "MultiExposureShots", N_("Multi Exposure Shots"), N_("Multi exposure shots"), IfdId::nikonMeId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {12, "MultiExposureAutoGain", N_("Multi Exposure Auto Gain"), N_("Multi exposure auto gain"), IfdId::nikonMeId, + SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(nikonOffOn)}, // End of list marker - {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), nikonMeId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), IfdId::nikonMeId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListMe() { @@ -833,29 +889,30 @@ constexpr TagDetails nikonFlashColorFilter[] = {{0, N_("None")}, {1, N_("FL-GL1 // Nikon3 Flash Info 1 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoFl1_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonFl1Id, makerTags, undefined, 4, printExifVersion}, - {4, "FlashSource", N_("Flash Source"), N_("Flash source"), nikonFl1Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonFl1Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "FlashSource", N_("Flash Source"), N_("Flash source"), IfdId::nikonFl1Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashSource)}, - {5, "0x0005", N_("0x0005"), N_("Unknown"), nikonFl1Id, makerTags, unsignedByte, 1, printValue}, - {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), nikonFl1Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, - {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), nikonFl1Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, - {11, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), nikonFl1Id, makerTags, unsignedByte, 1, - printFlashFocalLength}, - {12, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), nikonFl1Id, makerTags, - unsignedByte, 1, printRepeatingFlashRate}, - {13, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), nikonFl1Id, makerTags, - unsignedByte, 1, printRepeatingFlashCount}, - {14, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), nikonFl1Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFlashGNDistance)}, - {15, "FlashGroupAControlMode", N_("Flash Group A Control Mode"), N_("Flash group a control mode"), nikonFl1Id, - makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, - {16, "FlashGroupBControlMode", N_("Flash Group B Control Mode"), N_("Flash group b control mode"), nikonFl1Id, - makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, + {5, "0x0005", N_("0x0005"), N_("Unknown"), IfdId::nikonFl1Id, SectionId::makerTags, unsignedByte, 1, printValue}, + {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, + {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, + {11, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedByte, 1, printFlashFocalLength}, + {12, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashRate}, + {13, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashCount}, + {14, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), IfdId::nikonFl1Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonFlashGNDistance)}, + {15, "FlashGroupAControlMode", N_("Flash Group A Control Mode"), N_("Flash group a control mode"), + IfdId::nikonFl1Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, + {16, "FlashGroupBControlMode", N_("Flash Group B Control Mode"), N_("Flash group b control mode"), + IfdId::nikonFl1Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, // End of list marker - {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), nikonFl1Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), IfdId::nikonFl1Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListFl1() { @@ -864,25 +921,26 @@ const TagInfo* Nikon3MakerNote::tagListFl1() { // Nikon3 Flash Info 2 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoFl2_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonFl2Id, makerTags, undefined, 4, printExifVersion}, - {4, "FlashSource", N_("Flash Source"), N_("Flash source"), nikonFl2Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonFl2Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "FlashSource", N_("Flash Source"), N_("Flash source"), IfdId::nikonFl2Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashSource)}, - {5, "0x0005", N_("0x0005"), N_("Unknown"), nikonFl2Id, makerTags, unsignedByte, 1, printValue}, - {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), nikonFl2Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, - {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), nikonFl2Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, - {12, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), nikonFl2Id, makerTags, unsignedByte, 1, - printFlashFocalLength}, - {13, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), nikonFl2Id, makerTags, - unsignedByte, 1, printRepeatingFlashRate}, - {14, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), nikonFl2Id, makerTags, - unsignedByte, 1, printRepeatingFlashCount}, - {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), nikonFl2Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFlashGNDistance)}, + {5, "0x0005", N_("0x0005"), N_("Unknown"), IfdId::nikonFl2Id, SectionId::makerTags, unsignedByte, 1, printValue}, + {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, + {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, + {12, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedByte, 1, printFlashFocalLength}, + {13, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashRate}, + {14, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashCount}, + {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), IfdId::nikonFl2Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonFlashGNDistance)}, // End of list marker - {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), nikonFl2Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), IfdId::nikonFl2Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListFl2() { @@ -891,26 +949,27 @@ const TagInfo* Nikon3MakerNote::tagListFl2() { // Nikon3 Flash Info 3 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoFl3_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonFl3Id, makerTags, undefined, 4, printExifVersion}, - {4, "FlashSource", N_("Flash Source"), N_("Flash source"), nikonFl3Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonFl3Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "FlashSource", N_("Flash Source"), N_("Flash source"), IfdId::nikonFl3Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashSource)}, - {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), nikonFl3Id, makerTags, - unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, - {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), nikonFl3Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, - {12, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), nikonFl3Id, makerTags, unsignedByte, 1, - printFlashFocalLength}, - {13, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), nikonFl3Id, makerTags, - unsignedByte, 1, printRepeatingFlashRate}, - {14, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), nikonFl3Id, makerTags, - unsignedByte, 1, printRepeatingFlashCount}, - {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), nikonFl3Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFlashGNDistance)}, - {16, "FlashColorFilter", N_("Flash Color Filter"), N_("Flash color filter"), nikonFl3Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFlashColorFilter)}, + {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, + {8, "ExternalFlashFlags", N_("External Flash Flags"), N_("External flash flags"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonExternalFlashFlags)}, + {12, "FlashFocalLength", N_("Flash Focal Length"), N_("Flash focal length"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, printFlashFocalLength}, + {13, "RepeatingFlashRate", N_("Repeating Flash Rate"), N_("Repeating flash rate"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashRate}, + {14, "RepeatingFlashCount", N_("Repeating Flash Count"), N_("Repeating flash count"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashCount}, + {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), IfdId::nikonFl3Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonFlashGNDistance)}, + {16, "FlashColorFilter", N_("Flash Color Filter"), N_("Flash color filter"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashColorFilter)}, // End of list marker - {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), nikonFl3Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonMeTag)", "(UnknownNikonMeTag)", N_("Unknown Nikon Multi Exposure Tag"), IfdId::nikonFl3Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListFl3() { @@ -919,44 +978,45 @@ const TagInfo* Nikon3MakerNote::tagListFl3() { // Nikon3 Flash Info 7 (0107 and 0108) Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoFl7_[] = { - {0, "Version", N_("Version"), N_("Flash info version"), nikonFl7Id, makerTags, undefined, 4, printExifVersion}, - {4, "FlashSource", N_("Flash source"), N_("The type of flash used (if any)"), nikonFl7Id, makerTags, unsignedByte, - 1, EXV_PRINT_TAG(nikonFlashSource)}, - {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware version"), nikonFl7Id, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, - {8, "ExternalFlashData1", N_("External flash data"), N_("External flash data"), nikonFl7Id, makerTags, unsignedByte, - 1, printExternalFlashData1}, - {9, "ExternalFlashData2", N_("External flash ready state"), N_("External flash ready state"), nikonFl7Id, makerTags, - unsignedByte, 1, printExternalFlashData2}, - {10, "FlashCompensation", N_("Flash compensation"), N_("Flash compensation"), nikonFl7Id, makerTags, signedByte, 1, - printFlashCompensation}, - {12, "FlashFocalLength", N_("Flash focal length"), N_("Flash focal length"), nikonFl7Id, makerTags, unsignedByte, 1, - printFlashFocalLength}, - {13, "RepeatingFlashRate", N_("Repeating flash rate"), N_("Repeating flash rate"), nikonFl7Id, makerTags, - unsignedByte, 1, printRepeatingFlashRate}, - {14, "RepeatingFlashCount", N_("Repeating flash count"), N_("Repeating flash count"), nikonFl7Id, makerTags, - unsignedByte, 1, printRepeatingFlashCount}, - {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), nikonFl7Id, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(nikonFlashGNDistance)}, - {17, "FlashGroupAControlData", N_("Flash group A control data"), N_("Flash group A control data"), nikonFl7Id, - makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, - {18, "FlashGroupBCControlData", N_("Flash group B/C control data"), N_("Flash group B/C control data"), nikonFl7Id, - makerTags, unsignedByte, 1, printFlashGroupBCControlData}, + {0, "Version", N_("Version"), N_("Flash info version"), IfdId::nikonFl7Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "FlashSource", N_("Flash source"), N_("The type of flash used (if any)"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashSource)}, + {6, "ExternalFlashFirmware", N_("External Flash Firmware"), N_("External flash firmware version"), + IfdId::nikonFl7Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(nikonFlashFirmware)}, + {8, "ExternalFlashData1", N_("External flash data"), N_("External flash data"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printExternalFlashData1}, + {9, "ExternalFlashData2", N_("External flash ready state"), N_("External flash ready state"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printExternalFlashData2}, + {10, "FlashCompensation", N_("Flash compensation"), N_("Flash compensation"), IfdId::nikonFl7Id, + SectionId::makerTags, signedByte, 1, printFlashCompensation}, + {12, "FlashFocalLength", N_("Flash focal length"), N_("Flash focal length"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printFlashFocalLength}, + {13, "RepeatingFlashRate", N_("Repeating flash rate"), N_("Repeating flash rate"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashRate}, + {14, "RepeatingFlashCount", N_("Repeating flash count"), N_("Repeating flash count"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printRepeatingFlashCount}, + {15, "FlashGNDistance", N_("Flash GN Distance"), N_("Flash GN distance"), IfdId::nikonFl7Id, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(nikonFlashGNDistance)}, + {17, "FlashGroupAControlData", N_("Flash group A control data"), N_("Flash group A control data"), + IfdId::nikonFl7Id, SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonFlashControlMode)}, + {18, "FlashGroupBCControlData", N_("Flash group B/C control data"), N_("Flash group B/C control data"), + IfdId::nikonFl7Id, SectionId::makerTags, unsignedByte, 1, printFlashGroupBCControlData}, {40, "FlashGroupAData", N_("Flash group A data"), N_("Depending upon FlashGroupAControlData, either the FlashGroupACompensation value or the FlashGroupAOutput " "value"), - nikonFl7Id, makerTags, unsignedByte, 1, printFlashGroupAData}, + IfdId::nikonFl7Id, SectionId::makerTags, unsignedByte, 1, printFlashGroupAData}, {41, "FlashGroupBData", N_("Flash group B data"), N_("Depending upon FlashGroupBCControlData, either the FlashGroupBCompensation value or the FlashGroupBOutput " "value"), - nikonFl7Id, makerTags, unsignedByte, 1, printFlashGroupBData}, + IfdId::nikonFl7Id, SectionId::makerTags, unsignedByte, 1, printFlashGroupBData}, {42, "FlashGroupCData", N_("Flash group C data"), N_("Depending upon FlashGroupBCControlData, either the FlashGroupCCompensation value or the FlashGroupCOutput " "value"), - nikonFl7Id, makerTags, unsignedByte, 1, printFlashGroupCData}, + IfdId::nikonFl7Id, SectionId::makerTags, unsignedByte, 1, printFlashGroupCData}, // End of list marker - {0xffff, "(UnknownNikonFl7Tag)", "(UnknownNikonFl7Tag)", N_("Unknown Nikon Flash Info 7 Tag"), nikonFl7Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonFl7Tag)", "(UnknownNikonFl7Tag)", N_("Unknown Nikon Flash Info 7 Tag"), IfdId::nikonFl7Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListFl7() { @@ -965,11 +1025,13 @@ const TagInfo* Nikon3MakerNote::tagListFl7() { // Nikon3 Shot Info D80 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoSi1_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonSi1Id, makerTags, unsignedByte, 4, printExifVersion}, - {586, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), nikonSi1Id, makerTags, unsignedLong, 1, printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonSi1Id, SectionId::makerTags, unsignedByte, 4, + printExifVersion}, + {586, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), IfdId::nikonSi1Id, SectionId::makerTags, + unsignedLong, 1, printValue}, // End of list marker - {0xffff, "(UnknownNikonSi1Tag)", "(UnknownNikonSi1Tag)", N_("Unknown Nikon Shot Info D80 Tag"), nikonSi1Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonSi1Tag)", "(UnknownNikonSi1Tag)", N_("Unknown Nikon Shot Info D80 Tag"), IfdId::nikonSi1Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListSi1() { @@ -978,12 +1040,15 @@ const TagInfo* Nikon3MakerNote::tagListSi1() { // Nikon3 Shot Info D40 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoSi2_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonSi2Id, makerTags, unsignedByte, 4, printExifVersion}, - {582, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), nikonSi2Id, makerTags, unsignedLong, 1, printValue}, - {738, "FlashLevel", N_("Flash Level"), N_("Flash level"), nikonSi2Id, makerTags, unsignedByte, 1, printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonSi2Id, SectionId::makerTags, unsignedByte, 4, + printExifVersion}, + {582, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), IfdId::nikonSi2Id, SectionId::makerTags, + unsignedLong, 1, printValue}, + {738, "FlashLevel", N_("Flash Level"), N_("Flash level"), IfdId::nikonSi2Id, SectionId::makerTags, unsignedByte, 1, + printValue}, // End of list marker - {0xffff, "(UnknownNikonSi2Tag)", "(UnknownNikonSi2Tag)", N_("Unknown Nikon Shot Info D40 Tag"), nikonSi2Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonSi2Tag)", "(UnknownNikonSi2Tag)", N_("Unknown Nikon Shot Info D40 Tag"), IfdId::nikonSi2Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListSi2() { @@ -1002,14 +1067,16 @@ constexpr TagDetails nikonAfFineTuneAdj1[] = { // Nikon3 Shot Info D300 (a) Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoSi3_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonSi3Id, makerTags, unsignedByte, 4, printExifVersion}, - {604, "ISO", N_("ISO"), N_("ISO"), nikonSi3Id, makerTags, unsignedByte, 1, printIiIso}, - {633, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), nikonSi3Id, makerTags, unsignedLong, 1, printValue}, - {721, "AFFineTuneAdj", N_("AF Fine Tune Adj"), N_("AF fine tune adj"), nikonSi3Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(nikonAfFineTuneAdj1)}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonSi3Id, SectionId::makerTags, unsignedByte, 4, + printExifVersion}, + {604, "ISO", N_("ISO"), N_("ISO"), IfdId::nikonSi3Id, SectionId::makerTags, unsignedByte, 1, printIiIso}, + {633, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), IfdId::nikonSi3Id, SectionId::makerTags, + unsignedLong, 1, printValue}, + {721, "AFFineTuneAdj", N_("AF Fine Tune Adj"), N_("AF fine tune adj"), IfdId::nikonSi3Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(nikonAfFineTuneAdj1)}, // End of list marker - {0xffff, "(UnknownNikonSi3Tag)", "(UnknownNikonSi3Tag)", N_("Unknown Nikon Shot Info D300 (a) Tag"), nikonSi3Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonSi3Tag)", "(UnknownNikonSi3Tag)", N_("Unknown Nikon Shot Info D300 (a) Tag"), + IfdId::nikonSi3Id, SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListSi3() { @@ -1028,14 +1095,16 @@ constexpr TagDetails nikonAfFineTuneAdj2[] = { // Nikon3 Shot Info D300 (b) Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoSi4_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonSi4Id, makerTags, unsignedByte, 4, printExifVersion}, - {613, "ISO", N_("ISO"), N_("ISO"), nikonSi4Id, makerTags, unsignedByte, 1, printIiIso}, - {644, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), nikonSi4Id, makerTags, unsignedLong, 1, printValue}, - {732, "AFFineTuneAdj", N_("AF Fine Tune Adj"), N_("AF fine tune adj"), nikonSi4Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(nikonAfFineTuneAdj2)}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonSi4Id, SectionId::makerTags, unsignedByte, 4, + printExifVersion}, + {613, "ISO", N_("ISO"), N_("ISO"), IfdId::nikonSi4Id, SectionId::makerTags, unsignedByte, 1, printIiIso}, + {644, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), IfdId::nikonSi4Id, SectionId::makerTags, + unsignedLong, 1, printValue}, + {732, "AFFineTuneAdj", N_("AF Fine Tune Adj"), N_("AF fine tune adj"), IfdId::nikonSi4Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(nikonAfFineTuneAdj2)}, // End of list marker - {0xffff, "(UnknownNikonSi4Tag)", "(UnknownNikonSi4Tag)", N_("Unknown Nikon Shot Info D300 (b) Tag"), nikonSi4Id, - makerTags, unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonSi4Tag)", "(UnknownNikonSi4Tag)", N_("Unknown Nikon Shot Info D300 (b) Tag"), + IfdId::nikonSi4Id, SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListSi4() { @@ -1050,24 +1119,26 @@ constexpr TagDetails nikonOffOn3[] = {{0x0, N_("n/a")}, {0xc, N_("Off")}, {0xf, // Nikon3 Shot Info Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoSi5_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonSi5Id, makerTags, unsignedByte, 4, printExifVersion}, - {106, "ShutterCount1", N_("Shutter Count 1"), N_("Shutter count 1"), nikonSi5Id, makerTags, unsignedLong, 1, - printValue}, - {110, "DeletedImageCount", N_("Deleted Image Count"), N_("Deleted image count"), nikonSi5Id, makerTags, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonSi5Id, SectionId::makerTags, unsignedByte, 4, + printExifVersion}, + {106, "ShutterCount1", N_("Shutter Count 1"), N_("Shutter count 1"), IfdId::nikonSi5Id, SectionId::makerTags, + unsignedLong, 1, printValue}, + {110, "DeletedImageCount", N_("Deleted Image Count"), N_("Deleted image count"), IfdId::nikonSi5Id, + SectionId::makerTags, unsignedLong, 1, printValue}, + {117, "VibrationReduction", N_("Vibration Reduction"), N_("Vibration reduction"), IfdId::nikonSi5Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn2)}, + {130, "VibrationReduction1", N_("Vibration Reduction 1"), N_("Vibration reduction 1"), IfdId::nikonSi5Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)}, + {343, "ShutterCount2", N_("Shutter Count 2"), N_("Shutter count 2"), IfdId::nikonSi5Id, SectionId::makerTags, + undefined, 2, printValue}, + {430, "VibrationReduction2", N_("Vibration Reduction 2"), N_("Vibration reduction 2"), IfdId::nikonSi5Id, + SectionId::makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn3)}, + {598, "ISO", N_("ISO"), N_("ISO"), IfdId::nikonSi5Id, SectionId::makerTags, unsignedByte, 1, printIiIso}, + {630, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), IfdId::nikonSi5Id, SectionId::makerTags, unsignedLong, 1, printValue}, - {117, "VibrationReduction", N_("Vibration Reduction"), N_("Vibration reduction"), nikonSi5Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn2)}, - {130, "VibrationReduction1", N_("Vibration Reduction 1"), N_("Vibration reduction 1"), nikonSi5Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)}, - {343, "ShutterCount2", N_("Shutter Count 2"), N_("Shutter count 2"), nikonSi5Id, makerTags, undefined, 2, - printValue}, - {430, "VibrationReduction2", N_("Vibration Reduction 2"), N_("Vibration reduction 2"), nikonSi5Id, makerTags, - unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn3)}, - {598, "ISO", N_("ISO"), N_("ISO"), nikonSi5Id, makerTags, unsignedByte, 1, printIiIso}, - {630, "ShutterCount", N_("Shutter Count"), N_("Shutter count"), nikonSi5Id, makerTags, unsignedLong, 1, printValue}, // End of list marker - {0xffff, "(UnknownNikonSi5Tag)", "(UnknownNikonSi5Tag)", N_("Unknown Nikon Shot Info Tag"), nikonSi5Id, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonSi5Tag)", "(UnknownNikonSi5Tag)", N_("Unknown Nikon Shot Info Tag"), IfdId::nikonSi5Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListSi5() { @@ -1076,12 +1147,13 @@ const TagInfo* Nikon3MakerNote::tagListSi5() { // Nikon3 Color Balance 1 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb1_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb1Id, makerTags, undefined, 4, printExifVersion}, - {36, "WB_RBGGLevels", N_("WB RBGG Levels"), N_("WB RBGG levels"), nikonCb1Id, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb1Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {36, "WB_RBGGLevels", N_("WB RBGG Levels"), N_("WB RBGG levels"), IfdId::nikonCb1Id, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb1Tag)", "(UnknownNikonCb1Tag)", N_("Unknown Nikon Color Balance 1 Tag"), nikonCb1Id, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb1Tag)", "(UnknownNikonCb1Tag)", N_("Unknown Nikon Color Balance 1 Tag"), IfdId::nikonCb1Id, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb1() { @@ -1090,12 +1162,13 @@ const TagInfo* Nikon3MakerNote::tagListCb1() { // Nikon3 Color Balance 2 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb2_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb2Id, makerTags, undefined, 4, printExifVersion}, - {5, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), nikonCb2Id, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb2Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {5, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), IfdId::nikonCb2Id, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb2Tag)", "(UnknownNikonCb2Tag)", N_("Unknown Nikon Color Balance 2 Tag"), nikonCb2Id, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb2Tag)", "(UnknownNikonCb2Tag)", N_("Unknown Nikon Color Balance 2 Tag"), IfdId::nikonCb2Id, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb2() { @@ -1104,12 +1177,13 @@ const TagInfo* Nikon3MakerNote::tagListCb2() { // Nikon3 Color Balance 2a Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb2a_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb2aId, makerTags, undefined, 4, printExifVersion}, - {9, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), nikonCb2aId, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb2aId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {9, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), IfdId::nikonCb2aId, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb2aTag)", "(UnknownNikonCb2aTag)", N_("Unknown Nikon Color Balance 2a Tag"), nikonCb2aId, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb2aTag)", "(UnknownNikonCb2aTag)", N_("Unknown Nikon Color Balance 2a Tag"), + IfdId::nikonCb2aId, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb2a() { @@ -1118,12 +1192,13 @@ const TagInfo* Nikon3MakerNote::tagListCb2a() { // Nikon3 Color Balance 2b Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb2b_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb2bId, makerTags, undefined, 4, printExifVersion}, - {145, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), nikonCb2bId, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb2bId, SectionId::makerTags, undefined, 4, + printExifVersion}, + {145, "WB_RGGBLevels", N_("WB RGGB Levels"), N_("WB RGGB levels"), IfdId::nikonCb2bId, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb2bTag)", "(UnknownNikonCb2bTag)", N_("Unknown Nikon Color Balance 2b Tag"), nikonCb2bId, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb2bTag)", "(UnknownNikonCb2bTag)", N_("Unknown Nikon Color Balance 2b Tag"), + IfdId::nikonCb2bId, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb2b() { @@ -1132,12 +1207,13 @@ const TagInfo* Nikon3MakerNote::tagListCb2b() { // Nikon3 Color Balance 3 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb3_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb3Id, makerTags, undefined, 4, printExifVersion}, - {10, "WB_RGBGLevels", N_("WB RGBG Levels"), N_("WB RGBG levels"), nikonCb3Id, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb3Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {10, "WB_RGBGLevels", N_("WB RGBG Levels"), N_("WB RGBG levels"), IfdId::nikonCb3Id, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb3Tag)", "(UnknownNikonCb3Tag)", N_("Unknown Nikon Color Balance 3 Tag"), nikonCb3Id, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb3Tag)", "(UnknownNikonCb3Tag)", N_("Unknown Nikon Color Balance 3 Tag"), IfdId::nikonCb3Id, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb3() { @@ -1146,12 +1222,13 @@ const TagInfo* Nikon3MakerNote::tagListCb3() { // Nikon3 Color Balance 4 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoCb4_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonCb4Id, makerTags, undefined, 4, printExifVersion}, - {147, "WB_GRBGLevels", N_("WB GRBG Levels"), N_("WB GRBG levels"), nikonCb4Id, makerTags, unsignedShort, 4, - printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonCb4Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {147, "WB_GRBGLevels", N_("WB GRBG Levels"), N_("WB GRBG levels"), IfdId::nikonCb4Id, SectionId::makerTags, + unsignedShort, 4, printValue}, // End of list marker - {0xffff, "(UnknownNikonCb4Tag)", "(UnknownNikonCb4Tag)", N_("Unknown Nikon Color Balance 4 Tag"), nikonCb4Id, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownNikonCb4Tag)", "(UnknownNikonCb4Tag)", N_("Unknown Nikon Color Balance 4 Tag"), IfdId::nikonCb4Id, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListCb4() { @@ -1160,22 +1237,25 @@ const TagInfo* Nikon3MakerNote::tagListCb4() { // Nikon3 Lens Data 1 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoLd1_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonLd1Id, makerTags, undefined, 4, printExifVersion}, - {6, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), nikonLd1Id, makerTags, unsignedByte, 1, - printLensId1}, - {7, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), nikonLd1Id, makerTags, unsignedByte, 1, printFStops}, - {8, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), nikonLd1Id, makerTags, unsignedByte, 1, - printFocal}, - {9, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), nikonLd1Id, makerTags, unsignedByte, 1, - printFocal}, - {10, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), nikonLd1Id, - makerTags, unsignedByte, 1, printAperture}, - {11, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), nikonLd1Id, - makerTags, unsignedByte, 1, printAperture}, - {12, "MCUVersion", N_("MCU Version"), N_("MCU version"), nikonLd1Id, makerTags, unsignedByte, 1, printValue}, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonLd1Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {6, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), IfdId::nikonLd1Id, SectionId::makerTags, + unsignedByte, 1, printLensId1}, + {7, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), IfdId::nikonLd1Id, SectionId::makerTags, unsignedByte, 1, + printFStops}, + {8, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), IfdId::nikonLd1Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {9, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), IfdId::nikonLd1Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {10, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), IfdId::nikonLd1Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, + {11, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), IfdId::nikonLd1Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, + {12, "MCUVersion", N_("MCU Version"), N_("MCU version"), IfdId::nikonLd1Id, SectionId::makerTags, unsignedByte, 1, + printValue}, // End of list marker - {0xffff, "(UnknownNikonLd1Tag)", "(UnknownNikonLd1Tag)", N_("Unknown Nikon Lens Data 1 Tag"), nikonLd1Id, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonLd1Tag)", "(UnknownNikonLd1Tag)", N_("Unknown Nikon Lens Data 1 Tag"), IfdId::nikonLd1Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListLd1() { @@ -1184,32 +1264,37 @@ const TagInfo* Nikon3MakerNote::tagListLd1() { // Nikon3 Lens Data 2 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoLd2_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonLd2Id, makerTags, undefined, 4, printExifVersion}, - {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), nikonLd2Id, makerTags, unsignedByte, - 1, printExitPupilPosition}, - {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), nikonLd2Id, makerTags, unsignedByte, 1, printAperture}, - {8, "FocusPosition", N_("Focus Position"), N_("Focus position"), nikonLd2Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonLd2Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), IfdId::nikonLd2Id, + SectionId::makerTags, unsignedByte, 1, printExitPupilPosition}, + {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), IfdId::nikonLd2Id, SectionId::makerTags, unsignedByte, 1, + printAperture}, + {8, "FocusPosition", N_("Focus Position"), N_("Focus position"), IfdId::nikonLd2Id, SectionId::makerTags, + unsignedByte, 1, printValue}, + {9, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::nikonLd2Id, SectionId::makerTags, + unsignedByte, 1, printFocusDistance}, + {10, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::nikonLd2Id, SectionId::makerTags, unsignedByte, + 1, printFocal}, + {11, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), IfdId::nikonLd2Id, SectionId::makerTags, + unsignedByte, 1, printLensId2}, + {12, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), IfdId::nikonLd2Id, SectionId::makerTags, unsignedByte, 1, + printFStops}, + {13, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), IfdId::nikonLd2Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {14, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), IfdId::nikonLd2Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {15, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), IfdId::nikonLd2Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, + {16, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), IfdId::nikonLd2Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, + {17, "MCUVersion", N_("MCU Version"), N_("MCU version"), IfdId::nikonLd2Id, SectionId::makerTags, unsignedByte, 1, printValue}, - {9, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), nikonLd2Id, makerTags, unsignedByte, 1, - printFocusDistance}, - {10, "FocalLength", N_("Focal Length"), N_("Focal length"), nikonLd2Id, makerTags, unsignedByte, 1, printFocal}, - {11, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), nikonLd2Id, makerTags, unsignedByte, 1, - printLensId2}, - {12, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), nikonLd2Id, makerTags, unsignedByte, 1, printFStops}, - {13, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), nikonLd2Id, makerTags, unsignedByte, 1, - printFocal}, - {14, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), nikonLd2Id, makerTags, unsignedByte, 1, - printFocal}, - {15, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), nikonLd2Id, - makerTags, unsignedByte, 1, printAperture}, - {16, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), nikonLd2Id, - makerTags, unsignedByte, 1, printAperture}, - {17, "MCUVersion", N_("MCU Version"), N_("MCU version"), nikonLd2Id, makerTags, unsignedByte, 1, printValue}, - {18, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), nikonLd2Id, makerTags, - unsignedByte, 1, printAperture}, + {18, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), IfdId::nikonLd2Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, // End of list marker - {0xffff, "(UnknownNikonLd2Tag)", "(UnknownNikonLd2Tag)", N_("Unknown Nikon Lens Data 2 Tag"), nikonLd2Id, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonLd2Tag)", "(UnknownNikonLd2Tag)", N_("Unknown Nikon Lens Data 2 Tag"), IfdId::nikonLd2Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListLd2() { @@ -1218,32 +1303,37 @@ const TagInfo* Nikon3MakerNote::tagListLd2() { // Nikon3 Lens Data 3 Tag Info constexpr TagInfo Nikon3MakerNote::tagInfoLd3_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonLd3Id, makerTags, undefined, 4, printExifVersion}, - {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), nikonLd3Id, makerTags, unsignedByte, - 1, printExitPupilPosition}, - {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), nikonLd3Id, makerTags, unsignedByte, 1, printAperture}, - {8, "FocusPosition", N_("Focus Position"), N_("Focus position"), nikonLd3Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonLd3Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), IfdId::nikonLd3Id, + SectionId::makerTags, unsignedByte, 1, printExitPupilPosition}, + {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, 1, + printAperture}, + {8, "FocusPosition", N_("Focus Position"), N_("Focus position"), IfdId::nikonLd3Id, SectionId::makerTags, + unsignedByte, 1, printValue}, + {10, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::nikonLd3Id, SectionId::makerTags, + unsignedByte, 1, printFocusDistance}, + {11, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, + 1, printFocal}, + {12, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), IfdId::nikonLd3Id, SectionId::makerTags, + unsignedByte, 1, printLensId3}, + {13, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, 1, + printFStops}, + {14, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), IfdId::nikonLd3Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {15, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), IfdId::nikonLd3Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {16, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal length"), + IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, 1, printAperture}, + {17, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal length"), + IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, 1, printAperture}, + {18, "MCUVersion", N_("MCU Version"), N_("MCU version"), IfdId::nikonLd3Id, SectionId::makerTags, unsignedByte, 1, printValue}, - {10, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), nikonLd3Id, makerTags, unsignedByte, 1, - printFocusDistance}, - {11, "FocalLength", N_("Focal Length"), N_("Focal length"), nikonLd3Id, makerTags, unsignedByte, 1, printFocal}, - {12, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), nikonLd3Id, makerTags, unsignedByte, 1, - printLensId3}, - {13, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), nikonLd3Id, makerTags, unsignedByte, 1, printFStops}, - {14, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), nikonLd3Id, makerTags, unsignedByte, 1, - printFocal}, - {15, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), nikonLd3Id, makerTags, unsignedByte, 1, - printFocal}, - {16, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal length"), nikonLd3Id, - makerTags, unsignedByte, 1, printAperture}, - {17, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal length"), nikonLd3Id, - makerTags, unsignedByte, 1, printAperture}, - {18, "MCUVersion", N_("MCU Version"), N_("MCU version"), nikonLd3Id, makerTags, unsignedByte, 1, printValue}, - {19, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), nikonLd3Id, makerTags, - unsignedByte, 1, printAperture}, + {19, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), IfdId::nikonLd3Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, // End of list marker - {0xffff, "(UnknownNikonLd3Tag)", "(UnknownNikonLd3Tag)", N_("Unknown Nikon Lens Data 3 Tag"), nikonLd3Id, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonLd3Tag)", "(UnknownNikonLd3Tag)", N_("Unknown Nikon Lens Data 3 Tag"), IfdId::nikonLd3Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListLd3() { @@ -1253,39 +1343,47 @@ const TagInfo* Nikon3MakerNote::tagListLd3() { // Nikon3 Lens Data 4 Tag Info // based on https://exiftool.org/TagNames/Nikon.html#LensData0800 constexpr TagInfo Nikon3MakerNote::tagInfoLd4_[] = { - {0, "Version", N_("Version"), N_("Version"), nikonLd4Id, makerTags, undefined, 4, printExifVersion}, - {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), nikonLd4Id, makerTags, unsignedByte, - 1, printExitPupilPosition}, - {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), nikonLd4Id, makerTags, unsignedByte, 1, printAperture}, - {9, "FocusPosition", N_("Focus Position"), N_("Focus position"), nikonLd4Id, makerTags, unsignedByte, 1, + {0, "Version", N_("Version"), N_("Version"), IfdId::nikonLd4Id, SectionId::makerTags, undefined, 4, + printExifVersion}, + {4, "ExitPupilPosition", N_("Exit Pupil Position"), N_("Exit pupil position"), IfdId::nikonLd4Id, + SectionId::makerTags, unsignedByte, 1, printExitPupilPosition}, + {5, "AFAperture", N_("AF Aperture"), N_("AF aperture"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, 1, + printAperture}, + {9, "FocusPosition", N_("Focus Position"), N_("Focus position"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printValue}, + {11, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printFocusDistance}, + {12, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, + 1, printFocal}, + {13, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printLensId4}, + {14, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, 1, + printFStops}, + {15, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {16, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printFocal}, + {17, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal length"), + IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, 1, printAperture}, + {18, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal length"), + IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, 1, printAperture}, + {19, "MCUVersion", N_("MCU Version"), N_("MCU version"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedByte, 1, printValue}, - {11, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), nikonLd4Id, makerTags, unsignedByte, 1, - printFocusDistance}, - {12, "FocalLength", N_("Focal Length"), N_("Focal length"), nikonLd4Id, makerTags, unsignedByte, 1, printFocal}, - {13, "LensIDNumber", N_("Lens ID Number"), N_("Lens ID number"), nikonLd4Id, makerTags, unsignedByte, 1, - printLensId4}, - {14, "LensFStops", N_("Lens F-Stops"), N_("Lens F-stops"), nikonLd4Id, makerTags, unsignedByte, 1, printFStops}, - {15, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), nikonLd4Id, makerTags, unsignedByte, 1, - printFocal}, - {16, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), nikonLd4Id, makerTags, unsignedByte, 1, - printFocal}, - {17, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal length"), nikonLd4Id, - makerTags, unsignedByte, 1, printAperture}, - {18, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal length"), nikonLd4Id, - makerTags, unsignedByte, 1, printAperture}, - {19, "MCUVersion", N_("MCU Version"), N_("MCU version"), nikonLd4Id, makerTags, unsignedByte, 1, printValue}, - {20, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), nikonLd4Id, makerTags, - unsignedByte, 1, printAperture}, - {48, "LensID", N_("LensID"), N_("Lens ID"), nikonLd4Id, makerTags, unsignedShort, 1, printLensId4ZMount}, - {54, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), nikonLd4Id, makerTags, unsignedShort, 1, + {20, "EffectiveMaxAperture", N_("Effective Max Aperture"), N_("Effective max aperture"), IfdId::nikonLd4Id, + SectionId::makerTags, unsignedByte, 1, printAperture}, + {48, "LensID", N_("LensID"), N_("Lens ID"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedShort, 1, + printLensId4ZMount}, + {54, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedShort, + 1, printApertureLd4}, + {56, "FNumber", N_("F-Number"), N_("F-Number"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedShort, 1, printApertureLd4}, - {56, "FNumber", N_("F-Number"), N_("F-Number"), nikonLd4Id, makerTags, unsignedShort, 1, printApertureLd4}, - {60, "FocalLength", N_("Focal Length"), N_("Focal length"), nikonLd4Id, makerTags, unsignedShort, 1, printFocalLd4}, - {79, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), nikonLd4Id, makerTags, unsignedByte, 1, - printFocusDistance}, + {60, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::nikonLd4Id, SectionId::makerTags, unsignedShort, + 1, printFocalLd4}, + {79, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::nikonLd4Id, SectionId::makerTags, + unsignedByte, 1, printFocusDistance}, // End of list marker - {0xffff, "(UnknownNikonLd4Tag)", "(UnknownNikonLd4Tag)", N_("Unknown Nikon Lens Data 3 Tag"), nikonLd4Id, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownNikonLd4Tag)", "(UnknownNikonLd4Tag)", N_("Unknown Nikon Lens Data 3 Tag"), IfdId::nikonLd4Id, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* Nikon3MakerNote::tagListLd4() { diff --git a/src/olympusmn_int.cpp b/src/olympusmn_int.cpp index aa6c393d..9b2abffd 100644 --- a/src/olympusmn_int.cpp +++ b/src/olympusmn_int.cpp @@ -104,164 +104,180 @@ constexpr TagInfo OlympusMakerNote::tagInfo_[] = { /* TODO: add Minolta makenotes tags here (0x0000-0x0103). See Exiftool database.*/ - {0x0000, "0x0000", "0x0000", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x0100, "ThumbnailImage", N_("Thumbnail Image"), N_("Thumbnail image"), olympusId, makerTags, undefined, -1, - printValue}, - - {0x0104, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), olympusId, makerTags, - asciiString, -1, printValue}, - {0x0200, "SpecialMode", N_("Special Mode"), N_("Picture taking mode"), olympusId, makerTags, unsignedLong, -1, - print0x0200}, - {0x0201, "Quality", N_("Quality"), N_("Image quality setting"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusQuality)}, - {0x0202, "Macro", N_("Macro"), N_("Macro mode"), olympusId, makerTags, unsignedShort, -1, + {0x0000, "0x0000", "0x0000", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0100, "ThumbnailImage", N_("Thumbnail Image"), N_("Thumbnail image"), IfdId::olympusId, SectionId::makerTags, + undefined, -1, printValue}, + + {0x0104, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), IfdId::olympusId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0200, "SpecialMode", N_("Special Mode"), N_("Picture taking mode"), IfdId::olympusId, SectionId::makerTags, + unsignedLong, -1, print0x0200}, + {0x0201, "Quality", N_("Quality"), N_("Image quality setting"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusQuality)}, + {0x0202, "Macro", N_("Macro"), N_("Macro mode"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusMacro)}, - {0x0203, "BWMode", N_("Black & White Mode"), N_("Black and white mode"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x0204, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom ratio"), olympusId, makerTags, unsignedRational, -1, - print0x0204}, - {0x0205, "FocalPlaneDiagonal", N_("Focal Plane Diagonal"), N_("Focal plane diagonal"), olympusId, makerTags, - unsignedRational, -1, printValue}, - {0x0206, "LensDistortionParams", N_("Lens Distortion Parameters"), N_("Lens distortion parameters"), olympusId, - makerTags, signedShort, -1, printValue}, - {0x0207, "CameraType", N_("Camera Type"), N_("Camera type"), olympusId, makerTags, asciiString, -1, printValue}, - {0x0208, "PictureInfo", N_("Picture Info"), N_("ASCII format data such as [PictureInfo]"), olympusId, makerTags, - asciiString, -1, printValue}, - {0x0209, "CameraID", N_("Camera ID"), N_("Camera ID data"), olympusId, makerTags, asciiString, -1, print0x0209}, - {0x020b, "ImageWidth", N_("Image Width"), N_("Image width"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x020c, "ImageHeight", N_("Image Height"), N_("Image height"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x020d, "Software", N_("Software"), N_("Software"), olympusId, makerTags, asciiString, -1, printValue}, - {0x0280, "PreviewImage", N_("Preview Image"), N_("Preview image"), olympusId, makerTags, unsignedByte, -1, - printValue}, - {0x0300, "PreCaptureFrames", N_("Pre Capture Frames"), N_("Pre-capture frames"), olympusId, makerTags, - unsignedShort, -1, printValue}, - {0x0301, "WhiteBoard", N_("White Board"), N_("White board"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x0302, "OneTouchWB", N_("One Touch WB"), N_("One touch white balance"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOneTouchWb)}, - {0x0303, "WhiteBalanceBracket", N_("White Balance Bracket"), N_("White balance bracket"), olympusId, makerTags, - unsignedShort, -1, printValue}, - {0x0304, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance bias"), olympusId, makerTags, + {0x0203, "BWMode", N_("Black & White Mode"), N_("Black and white mode"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0204, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom ratio"), IfdId::olympusId, SectionId::makerTags, + unsignedRational, -1, print0x0204}, + {0x0205, "FocalPlaneDiagonal", N_("Focal Plane Diagonal"), N_("Focal plane diagonal"), IfdId::olympusId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x0206, "LensDistortionParams", N_("Lens Distortion Parameters"), N_("Lens distortion parameters"), + IfdId::olympusId, SectionId::makerTags, signedShort, -1, printValue}, + {0x0207, "CameraType", N_("Camera Type"), N_("Camera type"), IfdId::olympusId, SectionId::makerTags, asciiString, + -1, printValue}, + {0x0208, "PictureInfo", N_("Picture Info"), N_("ASCII format data such as [PictureInfo]"), IfdId::olympusId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0209, "CameraID", N_("Camera ID"), N_("Camera ID data"), IfdId::olympusId, SectionId::makerTags, asciiString, -1, + print0x0209}, + {0x020b, "ImageWidth", N_("Image Width"), N_("Image width"), IfdId::olympusId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x020c, "ImageHeight", N_("Image Height"), N_("Image height"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0403, "SceneMode", N_("Scene Mode"), N_("Scene mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusSceneMode)}, - {0x0404, "Firmware", N_("Firmware"), N_("Firmware"), olympusId, makerTags, asciiString, -1, printValue}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), olympusId, makerTags, undefined, -1, printValue}, - {0x0f00, "DataDump1", N_("Data Dump 1"), N_("Various camera settings 1"), olympusId, makerTags, undefined, -1, + {0x020d, "Software", N_("Software"), N_("Software"), IfdId::olympusId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0f01, "DataDump2", N_("Data Dump 2"), N_("Various camera settings 2"), olympusId, makerTags, undefined, -1, - printValue}, - {0x1000, "ShutterSpeed", N_("Shutter Speed"), N_("Shutter speed value"), olympusId, makerTags, signedRational, -1, - printValue}, - {0x1001, "ISOSpeed", N_("ISO Speed"), N_("ISO speed value"), olympusId, makerTags, signedRational, -1, printValue}, - {0x1002, "ApertureValue", N_("Aperture Value"), N_("Aperture value"), olympusId, makerTags, signedRational, -1, - printValue}, - {0x1003, "Brightness", N_("Brightness"), N_("Brightness value"), olympusId, makerTags, signedRational, -1, - printValue}, - {0x1004, "FlashMode", N_("Flash Mode"), N_("Flash mode"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x1005, "FlashDevice", N_("Flash Device"), N_("Flash device"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusFlashDevice)}, - {0x1006, "Bracket", N_("Bracket"), N_("Exposure compensation value"), olympusId, makerTags, signedRational, -1, - printValue}, - {0x1007, "SensorTemperature", N_("Sensor Temperature"), N_("Sensor temperature"), olympusId, makerTags, signedShort, + {0x0280, "PreviewImage", N_("Preview Image"), N_("Preview image"), IfdId::olympusId, SectionId::makerTags, + unsignedByte, -1, printValue}, + {0x0300, "PreCaptureFrames", N_("Pre Capture Frames"), N_("Pre-capture frames"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0301, "WhiteBoard", N_("White Board"), N_("White board"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1008, "LensTemperature", N_("Lens Temperature"), N_("Lens temperature"), olympusId, makerTags, signedShort, -1, + {0x0302, "OneTouchWB", N_("One Touch WB"), N_("One touch white balance"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOneTouchWb)}, + {0x0303, "WhiteBalanceBracket", N_("White Balance Bracket"), N_("White balance bracket"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0304, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance bias"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0403, "SceneMode", N_("Scene Mode"), N_("Scene mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusSceneMode)}, + {0x0404, "Firmware", N_("Firmware"), N_("Firmware"), IfdId::olympusId, SectionId::makerTags, asciiString, -1, printValue}, - {0x1009, "LightCondition", N_("Light Condition"), N_("Light condition"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x100a, "FocusRange", N_("Focus Range"), N_("Focus range"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusFocusRange)}, - {0x100b, "FocusMode", N_("Focus Mode"), N_("Focus mode"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusFocusMode)}, - {0x100c, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), olympusId, makerTags, unsignedRational, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::olympusId, SectionId::makerTags, undefined, -1, printValue}, - {0x100d, "Zoom", N_("Zoom"), N_("Zoom step count"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x100e, "MacroFocus", N_("Macro Focus"), N_("Macro focus step count"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x100f, "SharpnessFactor", N_("Sharpness Factor"), N_("Sharpness factor"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusSharpness)}, - {0x1010, "FlashChargeLevel", N_("Flash Charge Level"), N_("Flash charge level"), olympusId, makerTags, + {0x0f00, "DataDump1", N_("Data Dump 1"), N_("Various camera settings 1"), IfdId::olympusId, SectionId::makerTags, + undefined, -1, printValue}, + {0x0f01, "DataDump2", N_("Data Dump 2"), N_("Various camera settings 2"), IfdId::olympusId, SectionId::makerTags, + undefined, -1, printValue}, + {0x1000, "ShutterSpeed", N_("Shutter Speed"), N_("Shutter speed value"), IfdId::olympusId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x1001, "ISOSpeed", N_("ISO Speed"), N_("ISO speed value"), IfdId::olympusId, SectionId::makerTags, signedRational, + -1, printValue}, + {0x1002, "ApertureValue", N_("Aperture Value"), N_("Aperture value"), IfdId::olympusId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x1003, "Brightness", N_("Brightness"), N_("Brightness value"), IfdId::olympusId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x1004, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, + EXV_PRINT_TAG(olympusOffOn)}, + {0x1005, "FlashDevice", N_("Flash Device"), N_("Flash device"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusFlashDevice)}, + {0x1006, "Bracket", N_("Bracket"), N_("Exposure compensation value"), IfdId::olympusId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x1007, "SensorTemperature", N_("Sensor Temperature"), N_("Sensor temperature"), IfdId::olympusId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x1008, "LensTemperature", N_("Lens Temperature"), N_("Lens temperature"), IfdId::olympusId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x1009, "LightCondition", N_("Light Condition"), N_("Light condition"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1011, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x1012, "BlackLevel", N_("BlackLevel"), N_("Black level"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1013, "0x1013", "0x1013", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1014, "0x1014", "0x1014", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1015, "WhiteBalance", N_("White Balance"), N_("White balance mode"), olympusId, makerTags, unsignedShort, -1, - print0x1015}, - {0x1016, "0x1016", "0x1016", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1017, "RedBalance", N_("Red Balance"), N_("Red balance"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1018, "BlueBalance", N_("Blue Balance"), N_("Blue balance"), olympusId, makerTags, unsignedShort, -1, + {0x100a, "FocusRange", N_("Focus Range"), N_("Focus range"), IfdId::olympusId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusFocusRange)}, + {0x100b, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, + EXV_PRINT_TAG(olympusFocusMode)}, + {0x100c, "FocusDistance", N_("Focus Distance"), N_("Manual focus distance"), IfdId::olympusId, SectionId::makerTags, + unsignedRational, -1, printValue}, + {0x100d, "Zoom", N_("Zoom"), N_("Zoom step count"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1019, "ColorMatrixNumber", N_("Color Matrix Number"), N_("Color matrix number"), olympusId, makerTags, + {0x100e, "MacroFocus", N_("Macro Focus"), N_("Macro focus step count"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x101a, "SerialNumber2", N_("Serial Number 2"), N_("Serial number 2"), olympusId, makerTags, asciiString, -1, - printValue}, - {0x101b, "0x101b", "0x101b", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x101c, "0x101c", "0x101c", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x101d, "0x101d", "0x101d", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x101e, "0x101e", "0x101e", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x101f, "0x101f", "0x101f", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1020, "0x1020", "0x1020", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1021, "0x1021", "0x1021", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1022, "0x1022", "0x1022", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1023, "FlashBias", N_("Flash Bias"), N_("Flash exposure compensation"), olympusId, makerTags, signedRational, -1, - printValue}, - {0x1024, "0x1024", "0x1024", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1025, "0x1025", "0x1025", N_("Unknown"), olympusId, makerTags, signedRational, -1, printValue}, - {0x1026, "ExternalFlashBounce", N_("External Flash Bounce"), N_("External flash bounce"), olympusId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x1027, "ExternalFlashZoom", N_("External Flash Zoom"), N_("External flash zoom"), olympusId, makerTags, + {0x100f, "SharpnessFactor", N_("Sharpness Factor"), N_("Sharpness factor"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusSharpness)}, + {0x1010, "FlashChargeLevel", N_("Flash Charge Level"), N_("Flash charge level"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1011, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x1012, "BlackLevel", N_("BlackLevel"), N_("Black level"), IfdId::olympusId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x1013, "0x1013", "0x1013", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1014, "0x1014", "0x1014", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1015, "WhiteBalance", N_("White Balance"), N_("White balance mode"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, print0x1015}, + {0x1016, "0x1016", "0x1016", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1017, "RedBalance", N_("Red Balance"), N_("Red balance"), IfdId::olympusId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x1018, "BlueBalance", N_("Blue Balance"), N_("Blue balance"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1028, "ExternalFlashMode", N_("External Flash Mode"), N_("External flash mode"), olympusId, makerTags, + {0x1019, "ColorMatrixNumber", N_("Color Matrix Number"), N_("Color matrix number"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x101a, "SerialNumber2", N_("Serial Number 2"), N_("Serial number 2"), IfdId::olympusId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x101b, "0x101b", "0x101b", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x101c, "0x101c", "0x101c", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x101d, "0x101d", "0x101d", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x101e, "0x101e", "0x101e", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x101f, "0x101f", "0x101f", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1020, "0x1020", "0x1020", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1021, "0x1021", "0x1021", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1022, "0x1022", "0x1022", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1023, "FlashBias", N_("Flash Bias"), N_("Flash exposure compensation"), IfdId::olympusId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x1024, "0x1024", "0x1024", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1025, "0x1025", "0x1025", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, signedRational, -1, printValue}, + {0x1026, "ExternalFlashBounce", N_("External Flash Bounce"), N_("External flash bounce"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x1027, "ExternalFlashZoom", N_("External Flash Zoom"), N_("External flash zoom"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1028, "ExternalFlashMode", N_("External Flash Mode"), N_("External flash mode"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1029, "Contrast", N_("Contrast"), N_("Contrast setting"), IfdId::olympusId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusContrast)}, + {0x102a, "SharpnessFactor", N_("Sharpness Factor"), N_("Sharpness factor"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1029, "Contrast", N_("Contrast"), N_("Contrast setting"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusContrast)}, - {0x102a, "SharpnessFactor", N_("Sharpness Factor"), N_("Sharpness factor"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x102b, "ColorControl", N_("Color Control"), N_("Color control"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x102c, "ValidBits", N_("ValidBits"), N_("Valid bits"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x102d, "CoringFilter", N_("CoringFilter"), N_("Coring filter"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x102e, "ImageWidth", N_("Image Width"), N_("Image width"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x102f, "ImageHeight", N_("Image Height"), N_("Image height"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1030, "0x1030", "0x1030", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1031, "0x1031", "0x1031", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1032, "0x1032", "0x1032", N_("Unknown"), olympusId, makerTags, unsignedShort, -1, printValue}, - {0x1033, "0x1033", "0x1033", N_("Unknown"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x1034, "CompressionRatio", N_("Compression Ratio"), N_("Compression ratio"), olympusId, makerTags, - unsignedRational, -1, printValue}, - {0x1035, "Thumbnail", N_("Thumbnail"), N_("Preview image embedded"), olympusId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x1036, "ThumbnailOffset", N_("Thumbnail Offset"), N_("Offset of the preview image"), olympusId, makerTags, - unsignedLong, -1, printValue}, - {0x1037, "ThumbnailLength", N_("Thumbnail Length"), N_("Size of the preview image"), olympusId, makerTags, - unsignedLong, -1, printValue}, - {0x1039, "CCDScanMode", N_("CCD Scan Mode"), N_("CCD scan mode"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusCCDScanMode)}, - {0x103a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), olympusId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x103b, "InfinityLensStep", N_("Infinity Lens Step"), N_("Infinity lens step"), olympusId, makerTags, + {0x102b, "ColorControl", N_("Color Control"), N_("Color control"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x103c, "NearLensStep", N_("Near Lens Step"), N_("Near lens step"), olympusId, makerTags, unsignedShort, -1, - printValue}, - {0x2010, "Equipment", N_("Equipment Info"), N_("Camera equipment sub-IFD"), olympusId, makerTags, unsignedLong, -1, + {0x102c, "ValidBits", N_("ValidBits"), N_("Valid bits"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x2020, "CameraSettings", N_("Camera Settings"), N_("Camera Settings sub-IFD"), olympusId, makerTags, unsignedLong, - -1, printValue}, - {0x2030, "RawDevelopment", N_("Raw Development"), N_("Raw development sub-IFD"), olympusId, makerTags, unsignedLong, + {0x102d, "CoringFilter", N_("CoringFilter"), N_("Coring filter"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x102e, "ImageWidth", N_("Image Width"), N_("Image width"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x2031, "RawDevelopment2", N_("Raw Development 2"), N_("Raw development 2 sub-IFD"), olympusId, makerTags, + {0x102f, "ImageHeight", N_("Image Height"), N_("Image height"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x2040, "ImageProcessing", N_("Image Processing"), N_("Image processing sub-IFD"), olympusId, makerTags, + {0x1030, "0x1030", "0x1030", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1031, "0x1031", "0x1031", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1032, "0x1032", "0x1032", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1033, "0x1033", "0x1033", N_("Unknown"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1034, "CompressionRatio", N_("Compression Ratio"), N_("Compression ratio"), IfdId::olympusId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x1035, "Thumbnail", N_("Thumbnail"), N_("Preview image embedded"), IfdId::olympusId, SectionId::makerTags, + unsignedLong, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x1036, "ThumbnailOffset", N_("Thumbnail Offset"), N_("Offset of the preview image"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1037, "ThumbnailLength", N_("Thumbnail Length"), N_("Size of the preview image"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1039, "CCDScanMode", N_("CCD Scan Mode"), N_("CCD scan mode"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusCCDScanMode)}, + {0x103a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x103b, "InfinityLensStep", N_("Infinity Lens Step"), N_("Infinity lens step"), IfdId::olympusId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x103c, "NearLensStep", N_("Near Lens Step"), N_("Near lens step"), IfdId::olympusId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x2010, "Equipment", N_("Equipment Info"), N_("Camera equipment sub-IFD"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x2050, "FocusInfo", N_("Focus Info"), N_("Focus sub-IFD"), olympusId, makerTags, unsignedLong, -1, printValue}, - {0x3000, "RawInfo", N_("Raw Info"), N_("Raw sub-IFD"), olympusId, makerTags, unsignedLong, -1, printValue}, + {0x2020, "CameraSettings", N_("Camera Settings"), N_("Camera Settings sub-IFD"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x2030, "RawDevelopment", N_("Raw Development"), N_("Raw development sub-IFD"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x2031, "RawDevelopment2", N_("Raw Development 2"), N_("Raw development 2 sub-IFD"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x2040, "ImageProcessing", N_("Image Processing"), N_("Image processing sub-IFD"), IfdId::olympusId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x2050, "FocusInfo", N_("Focus Info"), N_("Focus sub-IFD"), IfdId::olympusId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x3000, "RawInfo", N_("Raw Info"), N_("Raw sub-IFD"), IfdId::olympusId, SectionId::makerTags, unsignedLong, -1, + printValue}, // End of list marker {0xffff, "(UnknownOlympusMakerNoteTag)", "(UnknownOlympusMakerNoteTag)", N_("Unknown OlympusMakerNote tag"), - olympusId, makerTags, asciiString, -1, printValue}, + IfdId::olympusId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagList() { @@ -397,112 +413,117 @@ constexpr TagDetails olympusImageStabilization[] = { {0, N_("Off")}, {1, N_("On, Mode 1")}, {2, N_("On, Mode 2")}, {3, N_("On, Mode 3")}}; constexpr TagInfo OlympusMakerNote::tagInfoCs_[] = { - {0x0000, "CameraSettingsVersion", N_("Camera Settings Version"), N_("Camera settings version"), olympusCsId, - makerTags, undefined, -1, printExifVersion}, - {0x0100, "PreviewImageValid", N_("PreviewImage Valid"), N_("Preview image valid"), olympusCsId, makerTags, - unsignedLong, -1, EXV_PRINT_TAG(olympusNoYes)}, - {0x0101, "PreviewImageStart", N_("PreviewImage Start"), N_("Preview image start"), olympusCsId, makerTags, - unsignedLong, -1, printValue}, - {0x0102, "PreviewImageLength", N_("PreviewImage Length"), N_("Preview image length"), olympusCsId, makerTags, - unsignedLong, -1, printValue}, - {0x0200, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusExposureMode)}, - {0x0201, "AELock", N_("AE Lock"), N_("Auto exposure lock"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x0202, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusMeteringMode)}, - {0x0203, "ExposureShift", N_("Exposure Shift"), N_("Exposure shift"), olympusCsId, makerTags, signedRational, -1, - printValue}, - {0x0300, "MacroMode", N_("Macro Mode"), N_("Macro mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusMacroMode)}, - {0x0301, "FocusMode", N_("Focus Mode"), N_("Focus mode"), olympusCsId, makerTags, unsignedShort, -1, printCs0x0301}, - {0x0302, "FocusProcess", N_("Focus Process"), N_("Focus process"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusFocusProcess)}, - {0x0303, "AFSearch", N_("AF Search"), N_("AF search"), olympusCsId, makerTags, unsignedShort, -1, + {0x0000, "CameraSettingsVersion", N_("Camera Settings Version"), N_("Camera settings version"), IfdId::olympusCsId, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0100, "PreviewImageValid", N_("PreviewImage Valid"), N_("Preview image valid"), IfdId::olympusCsId, + SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(olympusNoYes)}, + {0x0101, "PreviewImageStart", N_("PreviewImage Start"), N_("Preview image start"), IfdId::olympusCsId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0102, "PreviewImageLength", N_("PreviewImage Length"), N_("Preview image length"), IfdId::olympusCsId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0200, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusExposureMode)}, + {0x0201, "AELock", N_("AE Lock"), N_("Auto exposure lock"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0202, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusMeteringMode)}, + {0x0203, "ExposureShift", N_("Exposure Shift"), N_("Exposure shift"), IfdId::olympusCsId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x0300, "MacroMode", N_("Macro Mode"), N_("Macro mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusMacroMode)}, + {0x0301, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, printCs0x0301}, + {0x0302, "FocusProcess", N_("Focus Process"), N_("Focus process"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusFocusProcess)}, + {0x0303, "AFSearch", N_("AF Search"), N_("AF search"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusAFSearch)}, - {0x0304, "AFAreas", N_("AF Areas"), N_("AF areas"), olympusCsId, makerTags, unsignedLong, -1, printValue}, - {0x0305, "AFPointSelected", N_("AFPointSelected"), N_("AFPointSelected"), olympusCsId, makerTags, signedRational, - -1, printValue}, - {0x0307, "AFFineTuneAdj", N_("AF Fine Tune Adjust"), N_("AF fine tune adjust"), olympusCsId, makerTags, signedShort, - -1, printValue}, - {0x0400, "FlashMode", N_("Flash Mode"), N_("Flash mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG_BITMASK(olympusFlashMode)}, - {0x0401, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation"), olympusCsId, - makerTags, signedRational, -1, printValue}, - {0x0403, "FlashRemoteControl", N_("Flash Remote Control"), N_("Flash remote control"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusFlashRemoteControl)}, - {0x0404, "FlashControlMode", N_("Flash Control Mode"), N_("Flash control mode"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusFlashControlMode)}, - {0x0405, "FlashIntensity", N_("Flash Intensity"), N_("Flash intensity"), olympusCsId, makerTags, signedRational, -1, + {0x0304, "AFAreas", N_("AF Areas"), N_("AF areas"), IfdId::olympusCsId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0406, "ManualFlashStrength", N_("Manual Flash Strength"), N_("Manual flash strength"), olympusCsId, makerTags, + {0x0305, "AFPointSelected", N_("AFPointSelected"), N_("AFPointSelected"), IfdId::olympusCsId, SectionId::makerTags, signedRational, -1, printValue}, - {0x0500, "WhiteBalance", N_("White Balance 2"), N_("White balance 2"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusWhiteBalance)}, - {0x0501, "WhiteBalanceTemperature", N_("White Balance Temperature"), N_("White balance temperature"), olympusCsId, - makerTags, unsignedShort, -1, printValue}, - {0x0502, "WhiteBalanceBracket", N_("White Balance Bracket"), N_("White balance bracket"), olympusCsId, makerTags, - signedShort, -1, printValue}, - {0x0503, "CustomSaturation", N_("Custom Saturation"), N_("Custom saturation"), olympusCsId, makerTags, signedShort, - -1, printValue}, - {0x0504, "ModifiedSaturation", N_("Modified Saturation"), N_("Modified saturation"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusModifiedSaturation)}, - {0x0505, "ContrastSetting", N_("Contrast Setting"), N_("Contrast setting"), olympusCsId, makerTags, signedShort, -1, - printValue}, - {0x0506, "SharpnessSetting", N_("Sharpness Setting"), N_("Sharpness setting"), olympusCsId, makerTags, signedShort, - -1, printValue}, - {0x0507, "ColorSpace", N_("Color Space"), N_("Color space"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusColorSpace)}, - {0x0509, "SceneMode", N_("Scene Mode"), N_("Scene mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusSceneMode)}, - {0x050a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, - {0x050b, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion correction"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x050c, "ShadingCompensation", N_("Shading Compensation"), N_("Shading compensation"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x050d, "CompressionFactor", N_("Compression Factor"), N_("Compression factor"), olympusCsId, makerTags, - unsignedRational, -1, printValue}, - {0x050f, "Gradation", N_("Gradation"), N_("Gradation"), olympusCsId, makerTags, signedShort, -1, print0x050f}, - {0x0520, "PictureMode", N_("Picture Mode"), N_("Picture mode"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusPictureMode)}, - {0x0521, "PictureModeSaturation", N_("Picture Mode Saturation"), N_("Picture mode saturation"), olympusCsId, - makerTags, signedShort, -1, printValue}, - {0x0522, "PictureModeHue", N_("Picture Mode Hue"), N_("Picture mode hue"), olympusCsId, makerTags, unsignedShort, - -1, printValue}, - {0x0523, "PictureModeContrast", N_("Picture Mode Contrast"), N_("Picture mode contrast"), olympusCsId, makerTags, - signedShort, -1, printValue}, - {0x0524, "PictureModeSharpness", N_("Picture Mode Sharpness"), N_("Picture mode sharpness"), olympusCsId, makerTags, - signedShort, -1, printValue}, - {0x0525, "PictureModeBWFilter", N_("Picture Mode BW Filter"), N_("Picture mode BW filter"), olympusCsId, makerTags, - signedShort, -1, EXV_PRINT_TAG(olympusPictureModeBWFilter)}, - {0x0526, "PictureModeTone", N_("Picture Mode Tone"), N_("Picture mode tone"), olympusCsId, makerTags, signedShort, - -1, EXV_PRINT_TAG(olympusPictureModeTone)}, - {0x0527, "NoiseFilter", N_("Noise Filter"), N_("Noise filter"), olympusCsId, makerTags, signedShort, -1, - print0x0527}, - {0x0529, "ArtFilter", N_("Art Filter"), N_("Art filter"), olympusCsId, makerTags, unsignedShort, -1, print0x0529}, - {0x052c, "MagicFilter", N_("Magic Filter"), N_("Magic filter"), olympusCsId, makerTags, unsignedShort, -1, - print0x0529}, - {0x0600, "DriveMode", N_("Drive Mode"), N_("Drive mode"), olympusCsId, makerTags, unsignedShort, -1, printValue}, - {0x0601, "PanoramaMode", N_("Panorama Mode"), N_("Panorama mode"), olympusCsId, makerTags, unsignedShort, -1, - printValue}, - {0x0603, "Quality", N_("Image Quality 2"), N_("Image quality 2"), olympusCsId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusCsQuality)}, - {0x0604, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), olympusCsId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusImageStabilization)}, - {0x0900, "ManometerPressure", N_("Manometer Pressure"), N_("Manometer pressure"), olympusCsId, makerTags, + {0x0307, "AFFineTuneAdj", N_("AF Fine Tune Adjust"), N_("AF fine tune adjust"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0400, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG_BITMASK(olympusFlashMode)}, + {0x0401, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation"), + IfdId::olympusCsId, SectionId::makerTags, signedRational, -1, printValue}, + {0x0403, "FlashRemoteControl", N_("Flash Remote Control"), N_("Flash remote control"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusFlashRemoteControl)}, + {0x0404, "FlashControlMode", N_("Flash Control Mode"), N_("Flash control mode"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusFlashControlMode)}, + {0x0405, "FlashIntensity", N_("Flash Intensity"), N_("Flash intensity"), IfdId::olympusCsId, SectionId::makerTags, + signedRational, -1, printValue}, + {0x0406, "ManualFlashStrength", N_("Manual Flash Strength"), N_("Manual flash strength"), IfdId::olympusCsId, + SectionId::makerTags, signedRational, -1, printValue}, + {0x0500, "WhiteBalance", N_("White Balance 2"), N_("White balance 2"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusWhiteBalance)}, + {0x0501, "WhiteBalanceTemperature", N_("White Balance Temperature"), N_("White balance temperature"), + IfdId::olympusCsId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0502, "WhiteBalanceBracket", N_("White Balance Bracket"), N_("White balance bracket"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0503, "CustomSaturation", N_("Custom Saturation"), N_("Custom saturation"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0504, "ModifiedSaturation", N_("Modified Saturation"), N_("Modified saturation"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusModifiedSaturation)}, + {0x0505, "ContrastSetting", N_("Contrast Setting"), N_("Contrast setting"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0506, "SharpnessSetting", N_("Sharpness Setting"), N_("Sharpness setting"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0507, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusColorSpace)}, + {0x0509, "SceneMode", N_("Scene Mode"), N_("Scene mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusSceneMode)}, + {0x050a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, + {0x050b, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion correction"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x050c, "ShadingCompensation", N_("Shading Compensation"), N_("Shading compensation"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x050d, "CompressionFactor", N_("Compression Factor"), N_("Compression factor"), IfdId::olympusCsId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x050f, "Gradation", N_("Gradation"), N_("Gradation"), IfdId::olympusCsId, SectionId::makerTags, signedShort, -1, + print0x050f}, + {0x0520, "PictureMode", N_("Picture Mode"), N_("Picture mode"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusPictureMode)}, + {0x0521, "PictureModeSaturation", N_("Picture Mode Saturation"), N_("Picture mode saturation"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0522, "PictureModeHue", N_("Picture Mode Hue"), N_("Picture mode hue"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0901, "ManometerReading", N_("Manometer Reading"), N_("Manometer reading"), olympusCsId, makerTags, signedLong, + {0x0523, "PictureModeContrast", N_("Picture Mode Contrast"), N_("Picture mode contrast"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0524, "PictureModeSharpness", N_("Picture Mode Sharpness"), N_("Picture mode sharpness"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0525, "PictureModeBWFilter", N_("Picture Mode BW Filter"), N_("Picture mode BW filter"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(olympusPictureModeBWFilter)}, + {0x0526, "PictureModeTone", N_("Picture Mode Tone"), N_("Picture mode tone"), IfdId::olympusCsId, + SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(olympusPictureModeTone)}, + {0x0527, "NoiseFilter", N_("Noise Filter"), N_("Noise filter"), IfdId::olympusCsId, SectionId::makerTags, + signedShort, -1, print0x0527}, + {0x0529, "ArtFilter", N_("Art Filter"), N_("Art filter"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, + -1, print0x0529}, + {0x052c, "MagicFilter", N_("Magic Filter"), N_("Magic filter"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, print0x0529}, + {0x0600, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0902, "ExtendedWBDetect", N_("Extended WB Detect"), N_("Extended WB detect"), olympusCsId, makerTags, + {0x0601, "PanoramaMode", N_("Panorama Mode"), N_("Panorama mode"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0603, "Quality", N_("Image Quality 2"), N_("Image quality 2"), IfdId::olympusCsId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusCsQuality)}, + {0x0604, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusImageStabilization)}, + {0x0900, "ManometerPressure", N_("Manometer Pressure"), N_("Manometer pressure"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0901, "ManometerReading", N_("Manometer Reading"), N_("Manometer reading"), IfdId::olympusCsId, + SectionId::makerTags, signedLong, -1, printValue}, + {0x0902, "ExtendedWBDetect", N_("Extended WB Detect"), N_("Extended WB detect"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0903, "LevelGaugeRoll", N_("Level Gauge Roll"), N_("Level gauge roll"), IfdId::olympusCsId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x0903, "LevelGaugeRoll", N_("Level Gauge Roll"), N_("Level gauge roll"), olympusCsId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x0904, "LevelGaugePitch", N_("Level Gauge Pitch"), N_("Level gauge pitch"), olympusCsId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0904, "LevelGaugePitch", N_("Level Gauge Pitch"), N_("Level gauge pitch"), IfdId::olympusCsId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, // End of list marker - {0xffff, "(UnknownOlympusCsTag)", "(UnknownOlympusCsTag)", N_("Unknown OlympusCs tag"), olympusCsId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusCsTag)", "(UnknownOlympusCsTag)", N_("Unknown OlympusCs tag"), IfdId::olympusCsId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListCs() { @@ -519,55 +540,59 @@ constexpr TagDetails olympusEqFlashModel[] = { }; constexpr TagInfo OlympusMakerNote::tagInfoEq_[] = { - {0x0000, "EquipmentVersion", N_("Equipment Version"), N_("Equipment version"), olympusEqId, makerTags, undefined, - -1, printExifVersion}, - {0x0100, "CameraType", N_("Camera Type"), N_("Camera type"), olympusEqId, makerTags, asciiString, -1, printValue}, - {0x0101, "SerialNumber", N_("Serial Number"), N_("Serial number"), olympusEqId, makerTags, asciiString, -1, - printValue}, - {0x0102, "InternalSerialNumber", N_("Internal Serial Number"), N_("Internal serial number"), olympusEqId, makerTags, - asciiString, -1, printValue}, - {0x0103, "FocalPlaneDiagonal", N_("Focal Plane Diagonal"), N_("Focal plane diagonal"), olympusEqId, makerTags, - unsignedRational, -1, printValue}, - {0x0104, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), olympusEqId, makerTags, - unsignedLong, -1, printValue}, - {0x0201, "LensType", N_("Lens Type"), N_("Lens type"), olympusEqId, makerTags, unsignedByte, -1, print0x0201}, - {0x0202, "LensSerialNumber", N_("Lens Serial Number"), N_("Lens serial number"), olympusEqId, makerTags, - asciiString, -1, printValue}, - {0x0203, "LensModel", N_("Lens Model"), N_("Lens model"), olympusEqId, makerTags, asciiString, -1, printValue}, - {0x0204, "LensFirmwareVersion", N_("Lens Firmware Version"), N_("Lens firmware version"), olympusEqId, makerTags, - unsignedLong, -1, printValue}, - {0x0205, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), olympusEqId, - makerTags, unsignedShort, -1, printValue}, - {0x0206, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), olympusEqId, - makerTags, unsignedShort, -1, printValue}, - {0x0207, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), olympusEqId, makerTags, unsignedShort, - -1, printValue}, - {0x0208, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), olympusEqId, makerTags, unsignedShort, + {0x0000, "EquipmentVersion", N_("Equipment Version"), N_("Equipment version"), IfdId::olympusEqId, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0100, "CameraType", N_("Camera Type"), N_("Camera type"), IfdId::olympusEqId, SectionId::makerTags, asciiString, -1, printValue}, - {0x020a, "MaxApertureAtCurrentFocal", N_("Max Aperture At Current Focal"), N_("Max aperture at current focal"), - olympusEqId, makerTags, unsignedShort, -1, printValue}, - {0x020b, "LensProperties", N_("Lens Properties"), N_("Lens properties"), olympusEqId, makerTags, unsignedShort, -1, - printValue}, - {0x0301, "Extender", N_("Extender"), N_("Extender"), olympusEqId, makerTags, unsignedByte, -1, printEq0x0301}, - {0x0302, "ExtenderSerialNumber", N_("Extender Serial Number"), N_("Extender serial number"), olympusEqId, makerTags, + {0x0101, "SerialNumber", N_("Serial Number"), N_("Serial number"), IfdId::olympusEqId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0303, "ExtenderModel", N_("Extender Model"), N_("Extender model"), olympusEqId, makerTags, asciiString, -1, - printValue}, - {0x0304, "ExtenderFirmwareVersion", N_("Extender Firmware Version"), N_("Extender firmwareversion"), olympusEqId, - makerTags, unsignedLong, -1, printValue}, - {0x0403, "ConversionLens", N_("Conversion Lens"), N_("Conversion lens"), olympusEqId, makerTags, asciiString, -1, + {0x0102, "InternalSerialNumber", N_("Internal Serial Number"), N_("Internal serial number"), IfdId::olympusEqId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0103, "FocalPlaneDiagonal", N_("Focal Plane Diagonal"), N_("Focal plane diagonal"), IfdId::olympusEqId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x0104, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), IfdId::olympusEqId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0201, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::olympusEqId, SectionId::makerTags, unsignedByte, -1, + print0x0201}, + {0x0202, "LensSerialNumber", N_("Lens Serial Number"), N_("Lens serial number"), IfdId::olympusEqId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0203, "LensModel", N_("Lens Model"), N_("Lens model"), IfdId::olympusEqId, SectionId::makerTags, asciiString, -1, printValue}, - {0x1000, "FlashType", N_("Flash Type"), N_("Flash type"), olympusEqId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusEqFlashType)}, - {0x1001, "FlashModel", N_("Flash Model"), N_("Flash model"), olympusEqId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusEqFlashModel)}, - {0x1002, "FlashFirmwareVersion", N_("Flash Firmware Version"), N_("Flash firmware version"), olympusEqId, makerTags, - unsignedLong, -1, printValue}, - {0x1003, "FlashSerialNumber", N_("FlashSerialNumber"), N_("FlashSerialNumber"), olympusEqId, makerTags, asciiString, - -1, printValue}, - // End of list marker - {0xffff, "(UnknownOlympusEqTag)", "(UnknownOlympusEqTag)", N_("Unknown OlympusEq tag"), olympusEqId, makerTags, + {0x0204, "LensFirmwareVersion", N_("Lens Firmware Version"), N_("Lens firmware version"), IfdId::olympusEqId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0205, "MaxApertureAtMinFocal", N_("Max Aperture At Min Focal"), N_("Max aperture at min focal"), + IfdId::olympusEqId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0206, "MaxApertureAtMaxFocal", N_("Max Aperture At Max Focal"), N_("Max aperture at max focal"), + IfdId::olympusEqId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0207, "MinFocalLength", N_("Min Focal Length"), N_("Min focal length"), IfdId::olympusEqId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0208, "MaxFocalLength", N_("Max Focal Length"), N_("Max focal length"), IfdId::olympusEqId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x020a, "MaxApertureAtCurrentFocal", N_("Max Aperture At Current Focal"), N_("Max aperture at current focal"), + IfdId::olympusEqId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x020b, "LensProperties", N_("Lens Properties"), N_("Lens properties"), IfdId::olympusEqId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0301, "Extender", N_("Extender"), N_("Extender"), IfdId::olympusEqId, SectionId::makerTags, unsignedByte, -1, + printEq0x0301}, + {0x0302, "ExtenderSerialNumber", N_("Extender Serial Number"), N_("Extender serial number"), IfdId::olympusEqId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0303, "ExtenderModel", N_("Extender Model"), N_("Extender model"), IfdId::olympusEqId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0304, "ExtenderFirmwareVersion", N_("Extender Firmware Version"), N_("Extender firmwareversion"), + IfdId::olympusEqId, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0403, "ConversionLens", N_("Conversion Lens"), N_("Conversion lens"), IfdId::olympusEqId, SectionId::makerTags, asciiString, -1, printValue}, + {0x1000, "FlashType", N_("Flash Type"), N_("Flash type"), IfdId::olympusEqId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusEqFlashType)}, + {0x1001, "FlashModel", N_("Flash Model"), N_("Flash model"), IfdId::olympusEqId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusEqFlashModel)}, + {0x1002, "FlashFirmwareVersion", N_("Flash Firmware Version"), N_("Flash firmware version"), IfdId::olympusEqId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x1003, "FlashSerialNumber", N_("FlashSerialNumber"), N_("FlashSerialNumber"), IfdId::olympusEqId, + SectionId::makerTags, asciiString, -1, printValue}, + // End of list marker + {0xffff, "(UnknownOlympusEqTag)", "(UnknownOlympusEqTag)", N_("Unknown OlympusEq tag"), IfdId::olympusEqId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListEq() { @@ -592,36 +617,37 @@ constexpr TagDetailsBitmask olympusRdSettings[] = {{0x0001, N_("WB Color Temp")} {0x0080, N_("High Function")}, {0x0100, N_("Noise Reduction")}}; constexpr TagInfo OlympusMakerNote::tagInfoRd_[] = { - {0x0000, "RawDevVersion", N_("Raw Development Version"), N_("Raw development version"), olympusRdId, makerTags, - undefined, -1, printExifVersion}, - {0x0100, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), olympusRdId, makerTags, - signedRational, -1, printValue}, - {0x0101, "WhiteBalanceValue", N_("White Balance Value"), N_("White balance value"), olympusRdId, makerTags, - unsignedShort, -1, printValue}, - {0x0102, "WBFineAdjustment", N_("WB Fine Adjustment"), N_("WB fine adjustment"), olympusRdId, makerTags, + {0x0000, "RawDevVersion", N_("Raw Development Version"), N_("Raw development version"), IfdId::olympusRdId, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0100, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), IfdId::olympusRdId, + SectionId::makerTags, signedRational, -1, printValue}, + {0x0101, "WhiteBalanceValue", N_("White Balance Value"), N_("White balance value"), IfdId::olympusRdId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0102, "WBFineAdjustment", N_("WB Fine Adjustment"), N_("WB fine adjustment"), IfdId::olympusRdId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0103, "GrayPoint", N_("Gray Point"), N_("Gray point"), IfdId::olympusRdId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0104, "SaturationEmphasis", N_("Saturation Emphasis"), N_("Saturation emphasis"), IfdId::olympusRdId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0105, "MemoryColorEmphasis", N_("Memory Color Emphasis"), N_("Memory color emphasis"), IfdId::olympusRdId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0106, "ContrastValue", N_("Contrast Value"), N_("Contrast value"), IfdId::olympusRdId, SectionId::makerTags, signedShort, -1, printValue}, - {0x0103, "GrayPoint", N_("Gray Point"), N_("Gray point"), olympusRdId, makerTags, unsignedShort, -1, printValue}, - {0x0104, "SaturationEmphasis", N_("Saturation Emphasis"), N_("Saturation emphasis"), olympusRdId, makerTags, + {0x0107, "SharpnessValue", N_("Sharpness Value"), N_("Sharpness value"), IfdId::olympusRdId, SectionId::makerTags, signedShort, -1, printValue}, - {0x0105, "MemoryColorEmphasis", N_("Memory Color Emphasis"), N_("Memory color emphasis"), olympusRdId, makerTags, - unsignedShort, -1, printValue}, - {0x0106, "ContrastValue", N_("Contrast Value"), N_("Contrast value"), olympusRdId, makerTags, signedShort, -1, - printValue}, - {0x0107, "SharpnessValue", N_("Sharpness Value"), N_("Sharpness value"), olympusRdId, makerTags, signedShort, -1, - printValue}, - {0x0108, "ColorSpace", N_("Color Space"), N_("Color space"), olympusRdId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRdColorSpace)}, - {0x0109, "Engine", N_("Engine"), N_("Engine"), olympusRdId, makerTags, unsignedShort, -1, + {0x0108, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::olympusRdId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRdColorSpace)}, + {0x0109, "Engine", N_("Engine"), N_("Engine"), IfdId::olympusRdId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusRdEngine)}, - {0x010a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), olympusRdId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, - {0x010b, "EditStatus", N_("Edit Status"), N_("Edit status"), olympusRdId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRdEditStatus)}, - {0x010c, "Settings", N_("Settings"), N_("Settings"), olympusRdId, makerTags, unsignedShort, -1, + {0x010a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::olympusRdId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, + {0x010b, "EditStatus", N_("Edit Status"), N_("Edit status"), IfdId::olympusRdId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRdEditStatus)}, + {0x010c, "Settings", N_("Settings"), N_("Settings"), IfdId::olympusRdId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG_BITMASK(olympusRdSettings)}, // End of list marker - {0xffff, "(UnknownOlympusRdTag)", "(UnknownOlympusRdTag)", N_("Unknown OlympusRd tag"), olympusRdId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusRdTag)", "(UnknownOlympusRdTag)", N_("Unknown OlympusRd tag"), IfdId::olympusRdId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListRd() { @@ -650,52 +676,55 @@ constexpr TagDetails olympusRd2PMPictureTone[] = { {1, N_("Neutral")}, {2, N_("Sepia")}, {3, N_("Blue")}, {4, N_("Purple")}, {5, N_("Green")}}; constexpr TagInfo OlympusMakerNote::tagInfoRd2_[] = { - {0x0000, "RawDev2Version", N_("Raw Development 2 Version"), N_("Raw development 2 version"), olympusRd2Id, - makerTags, undefined, -1, printExifVersion}, - {0x0100, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), olympusRd2Id, makerTags, - signedRational, -1, printValue}, - {0x0101, "WhiteBalance", N_("White Balance"), N_("White balance"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRd2WhiteBalance)}, - {0x0102, "WhiteBalanceValue", N_("White Balance Value"), N_("White balance value"), olympusRd2Id, makerTags, - unsignedShort, -1, printValue}, - {0x0103, "WBFineAdjustment", N_("WB Fine Adjustment"), N_("White balance fine adjustment"), olympusRd2Id, makerTags, + {0x0000, "RawDev2Version", N_("Raw Development 2 Version"), N_("Raw development 2 version"), IfdId::olympusRd2Id, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0100, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), IfdId::olympusRd2Id, + SectionId::makerTags, signedRational, -1, printValue}, + {0x0101, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRd2WhiteBalance)}, + {0x0102, "WhiteBalanceValue", N_("White Balance Value"), N_("White balance value"), IfdId::olympusRd2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0103, "WBFineAdjustment", N_("WB Fine Adjustment"), N_("White balance fine adjustment"), IfdId::olympusRd2Id, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0104, "GrayPoint", N_("Gray Point"), N_("Gray point"), IfdId::olympusRd2Id, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0105, "ContrastValue", N_("Contrast Value"), N_("Contrast value"), IfdId::olympusRd2Id, SectionId::makerTags, signedShort, -1, printValue}, - {0x0104, "GrayPoint", N_("Gray Point"), N_("Gray point"), olympusRd2Id, makerTags, unsignedShort, -1, printValue}, - {0x0105, "ContrastValue", N_("Contrast Value"), N_("Contrast value"), olympusRd2Id, makerTags, signedShort, -1, - printValue}, - {0x0106, "SharpnessValue", N_("Sharpness Value"), N_("Sharpness value"), olympusRd2Id, makerTags, signedShort, -1, - printValue}, - {0x0107, "SaturationEmphasis", N_("Saturation Emphasis"), N_("Saturation emphasis"), olympusRd2Id, makerTags, + {0x0106, "SharpnessValue", N_("Sharpness Value"), N_("Sharpness value"), IfdId::olympusRd2Id, SectionId::makerTags, signedShort, -1, printValue}, - {0x0108, "MemoryColorEmphasis", N_("Memory Color Emphasis"), N_("Memory color emphasis"), olympusRd2Id, makerTags, - unsignedShort, -1, printValue}, - {0x0109, "ColorSpace", N_("Color Space"), N_("Color space"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRd2ColorSpace)}, - {0x010a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, - {0x010b, "Engine", N_("Engine"), N_("Engine"), olympusRd2Id, makerTags, unsignedShort, -1, + {0x0107, "SaturationEmphasis", N_("Saturation Emphasis"), N_("Saturation emphasis"), IfdId::olympusRd2Id, + SectionId::makerTags, signedShort, -1, printValue}, + {0x0108, "MemoryColorEmphasis", N_("Memory Color Emphasis"), N_("Memory color emphasis"), IfdId::olympusRd2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0109, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRd2ColorSpace)}, + {0x010a, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, + {0x010b, "Engine", N_("Engine"), N_("Engine"), IfdId::olympusRd2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusRd2Engine)}, - {0x010c, "PictureMode", N_("Picture Mode"), N_("Picture mode"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRd2PictureMode)}, - {0x010d, "PMSaturation", N_("PM Saturation"), N_("Picture mode saturation"), olympusRd2Id, makerTags, signedShort, - -1, printValue}, - {0x010e, "PMContrast", N_("PM Contrast"), N_("Picture mode contrast"), olympusRd2Id, makerTags, signedShort, -1, - printValue}, - {0x010f, "PMSharpness", N_("PM Sharpness"), N_("Picture mode sharpness"), olympusRd2Id, makerTags, signedShort, -1, + {0x010c, "PictureMode", N_("Picture Mode"), N_("Picture mode"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRd2PictureMode)}, + {0x010d, "PMSaturation", N_("PM Saturation"), N_("Picture mode saturation"), IfdId::olympusRd2Id, + SectionId::makerTags, signedShort, -1, printValue}, + {0x010e, "PMContrast", N_("PM Contrast"), N_("Picture mode contrast"), IfdId::olympusRd2Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x010f, "PMSharpness", N_("PM Sharpness"), N_("Picture mode sharpness"), IfdId::olympusRd2Id, SectionId::makerTags, + signedShort, -1, printValue}, + {0x0110, "PM_BWFilter", N_("PM BW Filter"), N_("PM BW filter"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRd2PM_BWFilter)}, + {0x0111, "PMPictureTone", N_("PM Picture Tone"), N_("PM picture tone"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRd2PMPictureTone)}, + {0x0112, "Gradation", N_("Gradation"), N_("Gradation"), IfdId::olympusRd2Id, SectionId::makerTags, signedShort, -1, printValue}, - {0x0110, "PM_BWFilter", N_("PM BW Filter"), N_("PM BW filter"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRd2PM_BWFilter)}, - {0x0111, "PMPictureTone", N_("PM Picture Tone"), N_("PM picture tone"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRd2PMPictureTone)}, - {0x0112, "Gradation", N_("Gradation"), N_("Gradation"), olympusRd2Id, makerTags, signedShort, -1, printValue}, - {0x0113, "Saturation", N_("Saturation"), N_("Saturation"), olympusRd2Id, makerTags, signedShort, -1, printValue}, - {0x0119, "AutoGradation", N_("Auto Gradation"), N_("Auto gradation"), olympusRd2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x0120, "PMNoiseFilter", N_("PM Noise Filter"), N_("Picture mode noise filter"), olympusRd2Id, makerTags, - unsignedShort, -1, printValue}, + {0x0113, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::olympusRd2Id, SectionId::makerTags, signedShort, + -1, printValue}, + {0x0119, "AutoGradation", N_("Auto Gradation"), N_("Auto gradation"), IfdId::olympusRd2Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0120, "PMNoiseFilter", N_("PM Noise Filter"), N_("Picture mode noise filter"), IfdId::olympusRd2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, // End of list marker - {0xffff, "(UnknownOlympusRd2Tag)", "(UnknownOlympusRd2Tag)", N_("Unknown OlympusRd2 tag"), olympusRd2Id, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusRd2Tag)", "(UnknownOlympusRd2Tag)", N_("Unknown OlympusRd2 tag"), IfdId::olympusRd2Id, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListRd2() { @@ -711,102 +740,111 @@ constexpr TagDetails olympusIpAspectRatio[] = {{1, "4:3"}, {2, "3:2"}, {3, "16:9 {6, "7:6"}, {7, "6:5"}, {8, "7:5"}, {9, "3:4"}}; constexpr TagInfo OlympusMakerNote::tagInfoIp_[] = { - {0x0000, "ImageProcessingVersion", N_("Image Processing Version"), N_("Image processing version"), olympusIpId, - makerTags, undefined, -1, printExifVersion}, - {0x0100, "WB_RBLevels", N_("WB RB Levels"), N_("WB RB levels"), olympusIpId, makerTags, unsignedShort, -1, - printValue}, - {0x0102, "WB_RBLevels3000K", N_("WB RB Levels 3000K"), N_("WB RB levels 3000K"), olympusIpId, makerTags, + {0x0000, "ImageProcessingVersion", N_("Image Processing Version"), N_("Image processing version"), + IfdId::olympusIpId, SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0100, "WB_RBLevels", N_("WB RB Levels"), N_("WB RB levels"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0103, "WB_RBLevels3300K", N_("WB RB Levels 3300K"), N_("WB RB levels 3300K"), olympusIpId, makerTags, + {0x0102, "WB_RBLevels3000K", N_("WB RB Levels 3000K"), N_("WB RB levels 3000K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0103, "WB_RBLevels3300K", N_("WB RB Levels 3300K"), N_("WB RB levels 3300K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0104, "WB_RBLevels3600K", N_("WB RB Levels 3600K"), N_("WB RB levels 3600K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0105, "WB_RBLevels3900K", N_("WB RB Levels 3900K"), N_("WB RB levels 3900K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0106, "WB_RBLevels4000K", N_("WB RB Levels 4000K"), N_("WB RB levels 4000K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0107, "WB_RBLevels4300K", N_("WB RB Levels 4300K"), N_("WB RB levels 4300K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0108, "WB_RBLevels4500K", N_("WB RB Levels 4500K"), N_("WB RB levels 4500K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0109, "WB_RBLevels4800K", N_("WB RB Levels 4800K"), N_("WB RB levels 4800K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010a, "WB_RBLevels5300K", N_("WB RB Levels 5300K"), N_("WB RB levels 5300K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010b, "WB_RBLevels6000K", N_("WB RB Levels 6000K"), N_("WB RB levels 6000K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010c, "WB_RBLevels6600K", N_("WB RB Levels 6600K"), N_("WB RB levels 6600K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010d, "WB_RBLevels7500K", N_("WB RB Levels 7500K"), N_("WB RB levels 7500K"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010e, "WB_RBLevelsCWB1", N_("WB RB Levels CWB1"), N_("WB RB levels CWB1"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x010f, "WB_RBLevelsCWB2", N_("WB RB Levels CWB2"), N_("WB RB levels CWB2"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0110, "WB_RBLevelsCWB3", N_("WB RB Levels CWB3"), N_("WB RB levels CWB3"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0111, "WB_RBLevelsCWB4", N_("WB RB Levels CWB4"), N_("WB RB levels CWB4"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0113, "WB_GLevel3000K", N_("WB G Level 3000K"), N_("WB G level 3000K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0104, "WB_RBLevels3600K", N_("WB RB Levels 3600K"), N_("WB RB levels 3600K"), olympusIpId, makerTags, + {0x0114, "WB_GLevel3300K", N_("WB G Level 3300K"), N_("WB G level 3300K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0105, "WB_RBLevels3900K", N_("WB RB Levels 3900K"), N_("WB RB levels 3900K"), olympusIpId, makerTags, + {0x0115, "WB_GLevel3600K", N_("WB G Level 3600K"), N_("WB G level 3600K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0106, "WB_RBLevels4000K", N_("WB RB Levels 4000K"), N_("WB RB levels 4000K"), olympusIpId, makerTags, + {0x0116, "WB_GLevel3900K", N_("WB G Level 3900K"), N_("WB G level 3900K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0107, "WB_RBLevels4300K", N_("WB RB Levels 4300K"), N_("WB RB levels 4300K"), olympusIpId, makerTags, + {0x0117, "WB_GLevel4000K", N_("WB G Level 4000K"), N_("WB G level 4000K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0108, "WB_RBLevels4500K", N_("WB RB Levels 4500K"), N_("WB RB levels 4500K"), olympusIpId, makerTags, + {0x0118, "WB_GLevel4300K", N_("WB G Level 4300K"), N_("WB G level 4300K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0109, "WB_RBLevels4800K", N_("WB RB Levels 4800K"), N_("WB RB levels 4800K"), olympusIpId, makerTags, + {0x0119, "WB_GLevel4500K", N_("WB G Level 4500K"), N_("WB G level 4500K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x010a, "WB_RBLevels5300K", N_("WB RB Levels 5300K"), N_("WB RB levels 5300K"), olympusIpId, makerTags, + {0x011a, "WB_GLevel4800K", N_("WB G Level 4800K"), N_("WB G level 4800K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x010b, "WB_RBLevels6000K", N_("WB RB Levels 6000K"), N_("WB RB levels 6000K"), olympusIpId, makerTags, + {0x011b, "WB_GLevel5300K", N_("WB G Level 5300K"), N_("WB G level 5300K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x010c, "WB_RBLevels6600K", N_("WB RB Levels 6600K"), N_("WB RB levels 6600K"), olympusIpId, makerTags, + {0x011c, "WB_GLevel6000K", N_("WB G Level 6000K"), N_("WB G level 6000K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x010d, "WB_RBLevels7500K", N_("WB RB Levels 7500K"), N_("WB RB levels 7500K"), olympusIpId, makerTags, + {0x011d, "WB_GLevel6600K", N_("WB G Level 6600K"), N_("WB G level 6600K"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x010e, "WB_RBLevelsCWB1", N_("WB RB Levels CWB1"), N_("WB RB levels CWB1"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x010f, "WB_RBLevelsCWB2", N_("WB RB Levels CWB2"), N_("WB RB levels CWB2"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0110, "WB_RBLevelsCWB3", N_("WB RB Levels CWB3"), N_("WB RB levels CWB3"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0111, "WB_RBLevelsCWB4", N_("WB RB Levels CWB4"), N_("WB RB levels CWB4"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0113, "WB_GLevel3000K", N_("WB G Level 3000K"), N_("WB G level 3000K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0114, "WB_GLevel3300K", N_("WB G Level 3300K"), N_("WB G level 3300K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0115, "WB_GLevel3600K", N_("WB G Level 3600K"), N_("WB G level 3600K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0116, "WB_GLevel3900K", N_("WB G Level 3900K"), N_("WB G level 3900K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0117, "WB_GLevel4000K", N_("WB G Level 4000K"), N_("WB G level 4000K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0118, "WB_GLevel4300K", N_("WB G Level 4300K"), N_("WB G level 4300K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x0119, "WB_GLevel4500K", N_("WB G Level 4500K"), N_("WB G level 4500K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x011a, "WB_GLevel4800K", N_("WB G Level 4800K"), N_("WB G level 4800K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x011b, "WB_GLevel5300K", N_("WB G Level 5300K"), N_("WB G level 5300K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x011c, "WB_GLevel6000K", N_("WB G Level 6000K"), N_("WB G level 6000K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x011d, "WB_GLevel6600K", N_("WB G Level 6600K"), N_("WB G level 6600K"), olympusIpId, makerTags, unsignedShort, - -1, printValue}, - {0x011e, "WB_GLevel7500K", N_("WB G Level 7500K"), N_("WB G level 7500K"), olympusIpId, makerTags, unsignedShort, + {0x011e, "WB_GLevel7500K", N_("WB G Level 7500K"), N_("WB G level 7500K"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x011f, "WB_GLevel", N_("WB G Level"), N_("WB G level"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x011f, "WB_GLevel", N_("WB G Level"), N_("WB G level"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0200, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), olympusIpId, makerTags, unsignedShort, -1, - printValue}, - {0x0300, "Enhancer", N_("Enhancer"), N_("Enhancer"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0301, "EnhancerValues", N_("Enhancer Values"), N_("Enhancer values"), olympusIpId, makerTags, unsignedShort, -1, - printValue}, - {0x0310, "CoringFilter", N_("Coring Filter"), N_("Coring filter"), olympusIpId, makerTags, unsignedShort, -1, + {0x0200, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0300, "Enhancer", N_("Enhancer"), N_("Enhancer"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0311, "CoringValues", N_("Coring Values"), N_("Coring values"), olympusIpId, makerTags, unsignedShort, -1, + {0x0301, "EnhancerValues", N_("Enhancer Values"), N_("Enhancer values"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0310, "CoringFilter", N_("Coring Filter"), N_("Coring filter"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0311, "CoringValues", N_("Coring Values"), N_("Coring values"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0600, "BlackLevel", N_("Black Level"), N_("Black level"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0610, "GainBase", N_("Gain Base"), N_("Gain base"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0600, "BlackLevel", N_("Black Level"), N_("Black level"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0610, "GainBase", N_("Gain Base"), N_("Gain base"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0611, "ValidBits", N_("Valid Bits"), N_("Valid bits"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0612, "CropLeft", N_("Crop Left"), N_("Crop left"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0613, "CropTop", N_("Crop Top"), N_("Crop top"), olympusIpId, makerTags, unsignedShort, -1, printValue}, - {0x0614, "CropWidth", N_("Crop Width"), N_("Crop width"), olympusIpId, makerTags, unsignedLong, -1, printValue}, - {0x0615, "CropHeight", N_("Crop Height"), N_("Crop height"), olympusIpId, makerTags, unsignedLong, -1, printValue}, - {0x1010, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), olympusIpId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, - {0x1011, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion correction"), olympusIpId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x1012, "ShadingCompensation", N_("Shading Compensation"), N_("Shading compensation"), olympusIpId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, - {0x101c, "MultipleExposureMode", N_("Multiple Exposure Mode"), N_("Multiple exposure mode"), olympusIpId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusIpMultipleExposureMode)}, - {0x1112, "AspectRatio", N_("Aspect Ratio"), N_("Aspect ratio"), olympusIpId, makerTags, unsignedByte, -1, - EXV_PRINT_TAG(olympusIpAspectRatio)}, - {0x1113, "AspectFrame", N_("Aspect Frame"), N_("Aspect frame"), olympusIpId, makerTags, unsignedShort, -1, + {0x0611, "ValidBits", N_("Valid Bits"), N_("Valid bits"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0612, "CropLeft", N_("Crop Left"), N_("Crop left"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x1200, "FaceDetect", N_("Face Detect"), N_("Face detect"), olympusIpId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x1201, "FaceDetectArea", N_("Face Detect Area"), N_("Face detect area"), olympusIpId, makerTags, signedShort, -1, + {0x0613, "CropTop", N_("Crop Top"), N_("Crop top"), IfdId::olympusIpId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0614, "CropWidth", N_("Crop Width"), N_("Crop width"), IfdId::olympusIpId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x0615, "CropHeight", N_("Crop Height"), N_("Crop height"), IfdId::olympusIpId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x1010, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG_BITMASK(olympusNoiseReduction)}, + {0x1011, "DistortionCorrection", N_("Distortion Correction"), N_("Distortion correction"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x1012, "ShadingCompensation", N_("Shading Compensation"), N_("Shading compensation"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x101c, "MultipleExposureMode", N_("Multiple Exposure Mode"), N_("Multiple exposure mode"), IfdId::olympusIpId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusIpMultipleExposureMode)}, + {0x1112, "AspectRatio", N_("Aspect Ratio"), N_("Aspect ratio"), IfdId::olympusIpId, SectionId::makerTags, + unsignedByte, -1, EXV_PRINT_TAG(olympusIpAspectRatio)}, + {0x1113, "AspectFrame", N_("Aspect Frame"), N_("Aspect frame"), IfdId::olympusIpId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x1200, "FaceDetect", N_("Face Detect"), N_("Face detect"), IfdId::olympusIpId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x1201, "FaceDetectArea", N_("Face Detect Area"), N_("Face detect area"), IfdId::olympusIpId, SectionId::makerTags, + signedShort, -1, printValue}, // End of list marker - {0xffff, "(UnknownOlympusIpTag)", "(UnknownOlympusIpTag)", N_("Unknown OlympusIp tag"), olympusIpId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusIpTag)", "(UnknownOlympusIpTag)", N_("Unknown OlympusIp tag"), IfdId::olympusIpId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListIp() { @@ -817,45 +855,47 @@ const TagInfo* OlympusMakerNote::tagListIp() { constexpr TagDetails olympusFiExternalFlashBounce[] = {{0, N_("Bounce or Off")}, {1, N_("Direct")}}; constexpr TagInfo OlympusMakerNote::tagInfoFi_[] = { - {0x0000, "FocusInfoVersion", N_("Focus Info Version"), N_("Focus info version"), olympusFiId, makerTags, undefined, - -1, printExifVersion}, - {0x0209, "AutoFocus", N_("Auto Focus"), N_("Auto focus"), olympusFiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x0210, "SceneDetect", N_("Scene Detect"), N_("Scene detect"), olympusFiId, makerTags, unsignedShort, -1, - printValue}, - {0x0211, "SceneArea", N_("Scene Area"), N_("Scene area"), olympusFiId, makerTags, unsignedLong, -1, printValue}, - {0x0212, "SceneDetectData", N_("Scene Detect Data"), N_("Scene detect data"), olympusFiId, makerTags, unsignedLong, - -1, printValue}, - {0x0300, "ZoomStepCount", N_("Zoom Step Count"), N_("Zoom step count"), olympusFiId, makerTags, unsignedShort, -1, - printValue}, - {0x0301, "FocusStepCount", N_("Focus Step Count"), N_("Focus step count"), olympusFiId, makerTags, unsignedShort, + {0x0000, "FocusInfoVersion", N_("Focus Info Version"), N_("Focus info version"), IfdId::olympusFiId, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x0209, "AutoFocus", N_("Auto Focus"), N_("Auto focus"), IfdId::olympusFiId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x0210, "SceneDetect", N_("Scene Detect"), N_("Scene detect"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0211, "SceneArea", N_("Scene Area"), N_("Scene area"), IfdId::olympusFiId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0303, "FocusStepInfinity", N_("Focus Step Infinity"), N_("Focus step infinity"), olympusFiId, makerTags, + {0x0212, "SceneDetectData", N_("Scene Detect Data"), N_("Scene detect data"), IfdId::olympusFiId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0300, "ZoomStepCount", N_("Zoom Step Count"), N_("Zoom step count"), IfdId::olympusFiId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0304, "FocusStepNear", N_("Focus Step Near"), N_("Focus step near"), olympusFiId, makerTags, unsignedShort, -1, - printValue}, - {0x0305, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), olympusFiId, makerTags, unsignedRational, -1, - print0x0305}, - {0x0308, "AFPoint", N_("AF Point"), N_("AF point"), olympusFiId, makerTags, unsignedShort, -1, print0x0308}, - {0x1201, "ExternalFlash", N_("External Flash"), N_("External flash"), olympusFiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, + {0x0301, "FocusStepCount", N_("Focus Step Count"), N_("Focus step count"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0303, "FocusStepInfinity", N_("Focus Step Infinity"), N_("Focus step infinity"), IfdId::olympusFiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0304, "FocusStepNear", N_("Focus Step Near"), N_("Focus step near"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0305, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::olympusFiId, SectionId::makerTags, + unsignedRational, -1, print0x0305}, + {0x0308, "AFPoint", N_("AF Point"), N_("AF point"), IfdId::olympusFiId, SectionId::makerTags, unsignedShort, -1, + print0x0308}, + {0x1201, "ExternalFlash", N_("External Flash"), N_("External flash"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, {0x1203, "ExternalFlashGuideNumber", N_("External Flash Guide Number"), N_("External flash guide number"), - olympusFiId, makerTags, signedRational, -1, printValue}, - {0x1204, "ExternalFlashBounce", N_("External Flash Bounce"), N_("External flash bounce"), olympusFiId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(olympusFiExternalFlashBounce)}, - {0x1205, "ExternalFlashZoom", N_("External Flash Zoom"), N_("External flash zoom"), olympusFiId, makerTags, - unsignedRational, -1, printValue}, - {0x1208, "InternalFlash", N_("Internal Flash"), N_("Internal flash"), olympusFiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusOffOn)}, - {0x1209, "ManualFlash", N_("Manual Flash"), N_("Manual flash"), olympusFiId, makerTags, unsignedShort, -1, - print0x1209}, - {0x1500, "SensorTemperature", N_("Sensor Temperature"), N_("Sensor temperature"), olympusFiId, makerTags, - signedShort, -1, printValue}, - {0x1600, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), olympusFiId, makerTags, - unsignedLong, -1, printValue}, + IfdId::olympusFiId, SectionId::makerTags, signedRational, -1, printValue}, + {0x1204, "ExternalFlashBounce", N_("External Flash Bounce"), N_("External flash bounce"), IfdId::olympusFiId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(olympusFiExternalFlashBounce)}, + {0x1205, "ExternalFlashZoom", N_("External Flash Zoom"), N_("External flash zoom"), IfdId::olympusFiId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x1208, "InternalFlash", N_("Internal Flash"), N_("Internal flash"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusOffOn)}, + {0x1209, "ManualFlash", N_("Manual Flash"), N_("Manual flash"), IfdId::olympusFiId, SectionId::makerTags, + unsignedShort, -1, print0x1209}, + {0x1500, "SensorTemperature", N_("Sensor Temperature"), N_("Sensor temperature"), IfdId::olympusFiId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x1600, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::olympusFiId, + SectionId::makerTags, unsignedLong, -1, printValue}, // End of list marker - {0xffff, "(UnknownOlympusFiTag)", "(UnknownOlympusFiTag)", N_("Unknown OlympusFi tag"), olympusFiId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusFiTag)", "(UnknownOlympusFiTag)", N_("Unknown OlympusFi tag"), IfdId::olympusFiId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListFi() { @@ -863,11 +903,11 @@ const TagInfo* OlympusMakerNote::tagListFi() { } constexpr TagInfo OlympusMakerNote::tagInfoFe_[] = { - {0x0100, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), olympusFe1Id, makerTags, - asciiString, -1, printValue}, + {0x0100, "BodyFirmwareVersion", N_("Body Firmware Version"), N_("Body firmware version"), IfdId::olympusFe1Id, + SectionId::makerTags, asciiString, -1, printValue}, // End of list marker - {0xffff, "(UnknownOlympusFeTag)", "(UnknownOlympusFeTag)", N_("Unknown OlympusFe tag"), olympusFe1Id, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusFeTag)", "(UnknownOlympusFeTag)", N_("Unknown OlympusFe tag"), IfdId::olympusFe1Id, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListFe() { @@ -889,74 +929,81 @@ constexpr TagDetails olympusRiLightSource[] = {{0, N_("Unknown")}, {512, N_("Custom 1-4")}}; constexpr TagInfo OlympusMakerNote::tagInfoRi_[] = { - {0x0000, "RawInfoVersion", N_("Raw Info Version"), N_("Raw info version"), olympusRiId, makerTags, undefined, -1, - printValue}, - {0x0100, "WB_RBLevelsUsed", N_("WB_RB Levels Used"), N_("WB_RB levels used"), olympusRiId, makerTags, unsignedShort, - -1, printValue}, - {0x0110, "WB_RBLevelsAuto", N_("WB_RB Levels Auto"), N_("WB_RB levels auto"), olympusRiId, makerTags, unsignedShort, - -1, printValue}, - {0x0120, "WB_RBLevelsShade", N_("WB_RB Levels Shade"), N_("WB_RB levels shade"), olympusRiId, makerTags, - unsignedShort, -1, printValue}, - {0x0121, "WB_RBLevelsCloudy", N_("WB_RB Levels Cloudy"), N_("WB_RB levels cloudy"), olympusRiId, makerTags, - unsignedShort, -1, printValue}, - {0x0122, "WB_RBLevelsFineWeather", N_("WB_RB Levels Fine Weather"), N_("WB_RB levels fine weather"), olympusRiId, - makerTags, unsignedShort, -1, printValue}, - {0x0123, "WB_RBLevelsTungsten", N_("WB_RB Levels Tungsten"), N_("WB_RB levels tungsten"), olympusRiId, makerTags, - unsignedShort, -1, printValue}, + {0x0000, "RawInfoVersion", N_("Raw Info Version"), N_("Raw info version"), IfdId::olympusRiId, SectionId::makerTags, + undefined, -1, printValue}, + {0x0100, "WB_RBLevelsUsed", N_("WB_RB Levels Used"), N_("WB_RB levels used"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0110, "WB_RBLevelsAuto", N_("WB_RB Levels Auto"), N_("WB_RB levels auto"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0120, "WB_RBLevelsShade", N_("WB_RB Levels Shade"), N_("WB_RB levels shade"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0121, "WB_RBLevelsCloudy", N_("WB_RB Levels Cloudy"), N_("WB_RB levels cloudy"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0122, "WB_RBLevelsFineWeather", N_("WB_RB Levels Fine Weather"), N_("WB_RB levels fine weather"), + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0123, "WB_RBLevelsTungsten", N_("WB_RB Levels Tungsten"), N_("WB_RB levels tungsten"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, {0x0124, "WB_RBLevelsEveningSunlight", N_("WB_RB Levels Evening Sunlight"), N_("WB_RB levels evening sunlight"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, {0x0130, "WB_RBLevelsDaylightFluor", N_("WB_RB Levels Daylight Fluor"), N_("WB_RB levels daylight fluor"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, {0x0131, "WB_RBLevelsDayWhiteFluor", N_("WB_RB Levels Day White Fluor"), N_("WB_RB levels day white fluor"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, {0x0132, "WB_RBLevelsCoolWhiteFluor", N_("WB_RB Levels Cool White Fluor"), N_("WB_RB levels cool white fluor"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, {0x0133, "WB_RBLevelsWhiteFluorescent", N_("WB_RB Levels White Fluorescent"), N_("WB_RB levels white fluorescent"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, - {0x0200, "ColorMatrix2", N_("Color Matrix2"), N_("Color matrix 2"), olympusRiId, makerTags, unsignedShort, -1, - printValue}, - {0x0310, "CoringFilter", N_("Coring Filter"), N_("Coring filter"), olympusRiId, makerTags, unsignedShort, -1, - printValue}, - {0x0311, "CoringValues", N_("Coring Values"), N_("Coring values"), olympusRiId, makerTags, unsignedShort, -1, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0200, "ColorMatrix2", N_("Color Matrix2"), N_("Color matrix 2"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0310, "CoringFilter", N_("Coring Filter"), N_("Coring filter"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0311, "CoringValues", N_("Coring Values"), N_("Coring values"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0600, "BlackLevel2", N_("Black Level 2"), N_("Black level 2"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x0601, "YCbCrCoefficients", N_("YCbCr Coefficients"), N_("YCbCr coefficients"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0611, "ValidPixelDepth", N_("Valid Pixel Depth"), N_("Valid pixel depth"), IfdId::olympusRiId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0612, "CropLeft", N_("Crop Left"), N_("Crop left"), IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0600, "BlackLevel2", N_("Black Level 2"), N_("Black level 2"), olympusRiId, makerTags, unsignedShort, -1, + {0x0613, "CropTop", N_("Crop Top"), N_("Crop top"), IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0601, "YCbCrCoefficients", N_("YCbCr Coefficients"), N_("YCbCr coefficients"), olympusRiId, makerTags, - unsignedShort, -1, printValue}, - {0x0611, "ValidPixelDepth", N_("Valid Pixel Depth"), N_("Valid pixel depth"), olympusRiId, makerTags, unsignedShort, + {0x0614, "CropWidth", N_("Crop Width"), N_("Crop width"), IfdId::olympusRiId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x0612, "CropLeft", N_("Crop Left"), N_("Crop left"), olympusRiId, makerTags, unsignedShort, -1, printValue}, - {0x0613, "CropTop", N_("Crop Top"), N_("Crop top"), olympusRiId, makerTags, unsignedShort, -1, printValue}, - {0x0614, "CropWidth", N_("Crop Width"), N_("Crop width"), olympusRiId, makerTags, unsignedLong, -1, printValue}, - {0x0615, "CropHeight", N_("Crop Height"), N_("Crop height"), olympusRiId, makerTags, unsignedLong, -1, printValue}, - {0x1000, "LightSource", N_("Light Source"), N_("Light source"), olympusRiId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(olympusRiLightSource)}, - {0x1001, "WhiteBalanceComp", N_("White Balance Comp"), N_("White balance comp"), olympusRiId, makerTags, - signedShort, -1, printValue}, - {0x1010, "SaturationSetting", N_("Saturation Setting"), N_("Saturation setting"), olympusRiId, makerTags, - signedShort, -1, printValue}, - {0x1011, "HueSetting", N_("Hue Setting"), N_("Hue setting"), olympusRiId, makerTags, signedShort, -1, printValue}, - {0x1012, "ContrastSetting", N_("Contrast Setting"), N_("Contrast setting"), olympusRiId, makerTags, signedShort, -1, - printValue}, - {0x1013, "SharpnessSetting", N_("Sharpness Setting"), N_("Sharpness setting"), olympusRiId, makerTags, signedShort, + {0x0615, "CropHeight", N_("Crop Height"), N_("Crop height"), IfdId::olympusRiId, SectionId::makerTags, unsignedLong, -1, printValue}, - {0x2000, "CMExposureCompensation", N_("CM Exposure Compensation"), N_("CM exposure compensation"), olympusRiId, - makerTags, signedRational, -1, printValue}, - {0x2001, "CMWhiteBalance", N_("CM White Balance"), N_("CM white balance"), olympusRiId, makerTags, unsignedShort, + {0x1000, "LightSource", N_("Light Source"), N_("Light source"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(olympusRiLightSource)}, + {0x1001, "WhiteBalanceComp", N_("White Balance Comp"), N_("White balance comp"), IfdId::olympusRiId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x1010, "SaturationSetting", N_("Saturation Setting"), N_("Saturation setting"), IfdId::olympusRiId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x1011, "HueSetting", N_("Hue Setting"), N_("Hue setting"), IfdId::olympusRiId, SectionId::makerTags, signedShort, -1, printValue}, - {0x2002, "CMWhiteBalanceComp", N_("CM White Balance Comp"), N_("CM white balance comp"), olympusRiId, makerTags, - signedShort, -1, printValue}, + {0x1012, "ContrastSetting", N_("Contrast Setting"), N_("Contrast setting"), IfdId::olympusRiId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x1013, "SharpnessSetting", N_("Sharpness Setting"), N_("Sharpness setting"), IfdId::olympusRiId, + SectionId::makerTags, signedShort, -1, printValue}, + {0x2000, "CMExposureCompensation", N_("CM Exposure Compensation"), N_("CM exposure compensation"), + IfdId::olympusRiId, SectionId::makerTags, signedRational, -1, printValue}, + {0x2001, "CMWhiteBalance", N_("CM White Balance"), N_("CM white balance"), IfdId::olympusRiId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x2002, "CMWhiteBalanceComp", N_("CM White Balance Comp"), N_("CM white balance comp"), IfdId::olympusRiId, + SectionId::makerTags, signedShort, -1, printValue}, {0x2010, "CMWhiteBalanceGrayPoint", N_("CM White Balance Gray Point"), N_("CM white balance gray point"), - olympusRiId, makerTags, unsignedShort, -1, printValue}, - {0x2020, "CMSaturation", N_("CM Saturation"), N_("CM saturation"), olympusRiId, makerTags, signedShort, -1, - printValue}, - {0x2021, "CMHue", N_("CM Hue"), N_("CM hue"), olympusRiId, makerTags, signedShort, -1, printValue}, - {0x2022, "CMContrast", N_("CM Contrast"), N_("CM contrast"), olympusRiId, makerTags, signedShort, -1, printValue}, - {0x2023, "CMSharpness", N_("CM Sharpness"), N_("CM sharpness"), olympusRiId, makerTags, signedShort, -1, + IfdId::olympusRiId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x2020, "CMSaturation", N_("CM Saturation"), N_("CM saturation"), IfdId::olympusRiId, SectionId::makerTags, + signedShort, -1, printValue}, + {0x2021, "CMHue", N_("CM Hue"), N_("CM hue"), IfdId::olympusRiId, SectionId::makerTags, signedShort, -1, printValue}, + {0x2022, "CMContrast", N_("CM Contrast"), N_("CM contrast"), IfdId::olympusRiId, SectionId::makerTags, signedShort, + -1, printValue}, + {0x2023, "CMSharpness", N_("CM Sharpness"), N_("CM sharpness"), IfdId::olympusRiId, SectionId::makerTags, + signedShort, -1, printValue}, // End of list marker - {0xffff, "(UnknownOlympusRiTag)", "(UnknownOlympusRiTag)", N_("Unknown OlympusRi tag"), olympusRiId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownOlympusRiTag)", "(UnknownOlympusRiTag)", N_("Unknown OlympusRi tag"), IfdId::olympusRiId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* OlympusMakerNote::tagListRi() { diff --git a/src/orfimage.cpp b/src/orfimage.cpp index 6e5e0809..a284c5fc 100644 --- a/src/orfimage.cpp +++ b/src/orfimage.cpp @@ -126,7 +126,7 @@ WriteMethod OrfParser::encode(BasicIo& io, const byte* pData, size_t size, ByteO // Delete IFDs which do not occur in TIFF images static constexpr auto filteredIfds = { - panaRawId, + IfdId::panaRawId, }; for (auto&& filteredIfd : filteredIfds) { #ifdef EXIV2_DEBUG_MESSAGES diff --git a/src/panasonicmn_int.cpp b/src/panasonicmn_int.cpp index 39bd01e5..16482c6b 100644 --- a/src/panasonicmn_int.cpp +++ b/src/panasonicmn_int.cpp @@ -257,192 +257,216 @@ constexpr TagDetails panasonicFlashFired[] = {{1, N_("No")}, {2, N_("Yes")}}; // Panasonic MakerNote Tag Info constexpr TagInfo PanasonicMakerNote::tagInfo_[] = { - {0x0001, "Quality", N_("Quality"), N_("Image Quality"), panasonicId, makerTags, unsignedShort, -1, + {0x0001, "Quality", N_("Quality"), N_("Image Quality"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicQuality)}, - {0x0002, "FirmwareVersion", N_("Firmware Version"), N_("Firmware version"), panasonicId, makerTags, undefined, -1, + {0x0002, "FirmwareVersion", N_("Firmware Version"), N_("Firmware version"), IfdId::panasonicId, + SectionId::makerTags, undefined, -1, printValue}, + {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance setting"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicWhiteBalance)}, + {0x0004, "0x0004", "0x0004", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance setting"), panasonicId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(panasonicWhiteBalance)}, - {0x0004, "0x0004", "0x0004", N_("Unknown"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0007, "FocusMode", N_("Focus Mode"), N_("Focus mode"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicFocusMode)}, - {0x000f, "AFMode", N_("AF Mode"), N_("AF mode"), panasonicId, makerTags, unsignedByte, -1, print0x000f}, - {0x001a, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), panasonicId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(panasonicImageStabilizer)}, - {0x001c, "Macro", N_("Macro"), N_("Macro mode"), panasonicId, makerTags, unsignedShort, -1, + {0x0007, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(panasonicFocusMode)}, + {0x000f, "AFMode", N_("AF Mode"), N_("AF mode"), IfdId::panasonicId, SectionId::makerTags, unsignedByte, -1, + print0x000f}, + {0x001a, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicImageStabilizer)}, + {0x001c, "Macro", N_("Macro"), N_("Macro mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicMacro)}, - {0x001f, "ShootingMode", N_("Shooting Mode"), N_("Shooting mode"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicShootingMode)}, - {0x0020, "Audio", N_("Audio"), N_("Audio"), panasonicId, makerTags, unsignedShort, -1, + {0x001f, "ShootingMode", N_("Shooting Mode"), N_("Shooting mode"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicShootingMode)}, + {0x0020, "Audio", N_("Audio"), N_("Audio"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicAudio)}, - {0x0021, "DataDump", N_("Data Dump"), N_("Data dump"), panasonicId, makerTags, undefined, -1, printValue}, - {0x0022, "0x0022", "0x0022", N_("Unknown"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0023, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance adjustment"), panasonicId, makerTags, - signedShort, -1, print0x0023}, - {0x0024, "FlashBias", N_("FlashBias"), N_("Flash bias"), panasonicId, makerTags, signedShort, -1, printValue}, + {0x0021, "DataDump", N_("Data Dump"), N_("Data dump"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printValue}, + {0x0022, "0x0022", "0x0022", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0023, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance adjustment"), IfdId::panasonicId, + SectionId::makerTags, signedShort, -1, print0x0023}, + {0x0024, "FlashBias", N_("FlashBias"), N_("Flash bias"), IfdId::panasonicId, SectionId::makerTags, signedShort, -1, + printValue}, {0x0025, "InternalSerialNumber", N_("Internal Serial Number"), N_("This number is unique, and contains the date of manufacture, but is not the same as the number printed " "on " "the camera body."), - panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x0026, "ExifVersion", "Exif Version", N_("Exif version"), panasonicId, makerTags, undefined, -1, + IfdId::panasonicId, SectionId::makerTags, undefined, -1, printPanasonicText}, + {0x0026, "ExifVersion", "Exif Version", N_("Exif version"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, printExifVersion}, - {0x0027, "0x0027", "0x0027", N_("Unknown"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0028, "ColorEffect", N_("Color Effect"), N_("Color effect"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicColorEffect)}, + {0x0027, "0x0027", "0x0027", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x0028, "ColorEffect", N_("Color Effect"), N_("Color effect"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicColorEffect)}, {0x0029, "TimeSincePowerOn", "Time since Power On", - N_("Time in 1/100 s from when the camera was powered on to when the image is written to memory card"), panasonicId, - makerTags, unsignedLong, -1, print0x0029}, - {0x002a, "BurstMode", N_("Burst Mode"), N_("Burst mode"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicBurstMode)}, - {0x002b, "SequenceNumber", N_("Sequence Number"), N_("Sequence number"), panasonicId, makerTags, unsignedLong, -1, + N_("Time in 1/100 s from when the camera was powered on to when the image is written to memory card"), + IfdId::panasonicId, SectionId::makerTags, unsignedLong, -1, print0x0029}, + {0x002a, "BurstMode", N_("Burst Mode"), N_("Burst mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(panasonicBurstMode)}, + {0x002b, "SequenceNumber", N_("Sequence Number"), N_("Sequence number"), IfdId::panasonicId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x002c, "Contrast", N_("Contrast"), N_("Contrast setting"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicContrast)}, + {0x002d, "NoiseReduction", N_("NoiseReduction"), N_("Noise reduction"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicNoiseReduction)}, + {0x002e, "SelfTimer", N_("Self Timer"), N_("Self timer"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(panasonicSelfTimer)}, + {0x002f, "0x002f", "0x002f", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x002c, "Contrast", N_("Contrast"), N_("Contrast setting"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicContrast)}, - {0x002d, "NoiseReduction", N_("NoiseReduction"), N_("Noise reduction"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicNoiseReduction)}, - {0x002e, "SelfTimer", N_("Self Timer"), N_("Self timer"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicSelfTimer)}, - {0x002f, "0x002f", "0x002f", N_("Unknown"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0030, "Rotation", N_("Rotation"), N_("Rotation"), panasonicId, makerTags, unsignedShort, -1, + {0x0030, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicRotation)}, - {0x0031, "AFAssistLamp", N_("AF Assist Lamp"), N_("AF Assist Lamp"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicAFAssistLamp)}, - {0x0032, "ColorMode", N_("Color Mode"), N_("Color mode"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicColorMode)}, - {0x0033, "BabyAge1", N_("Baby Age 1"), N_("Baby (or pet) age 1"), panasonicId, makerTags, asciiString, -1, - print0x0033}, - {0x0034, "OpticalZoomMode", N_("Optical Zoom Mode"), N_("Optical zoom mode"), panasonicId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(panasonicOpticalZoomMode)}, - {0x0035, "ConversionLens", N_("Conversion Lens"), N_("Conversion lens"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicConversionLens)}, - {0x0036, "TravelDay", N_("Travel Day"), N_("Travel day"), panasonicId, makerTags, unsignedShort, -1, print0x0036}, - {0x0039, "Contrast", N_("Contrast"), N_("Contrast"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x003a, "WorldTimeLocation", N_("World Time Location"), N_("World time location"), panasonicId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(panasonicWorldTimeLocation)}, - {0x003b, "TextStamp1", N_("Text Stamp 1"), N_("Text Stamp 1"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicTextStamp)}, - {0x003c, "ProgramISO", N_("Program ISO"), N_("Program ISO"), panasonicId, makerTags, unsignedShort, -1, - print0x003c}, - {0x003d, "AdvancedSceneType", N_("Advanced Scene Type"), N_("Advanced Scene Type"), panasonicId, makerTags, + {0x0031, "AFAssistLamp", N_("AF Assist Lamp"), N_("AF Assist Lamp"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicAFAssistLamp)}, + {0x0032, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(panasonicColorMode)}, + {0x0033, "BabyAge1", N_("Baby Age 1"), N_("Baby (or pet) age 1"), IfdId::panasonicId, SectionId::makerTags, + asciiString, -1, print0x0033}, + {0x0034, "OpticalZoomMode", N_("Optical Zoom Mode"), N_("Optical zoom mode"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicOpticalZoomMode)}, + {0x0035, "ConversionLens", N_("Conversion Lens"), N_("Conversion lens"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicConversionLens)}, + {0x0036, "TravelDay", N_("Travel Day"), N_("Travel day"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, print0x0036}, + {0x0039, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, + printValue}, + {0x003a, "WorldTimeLocation", N_("World Time Location"), N_("World time location"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicWorldTimeLocation)}, + {0x003b, "TextStamp1", N_("Text Stamp 1"), N_("Text Stamp 1"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)}, + {0x003c, "ProgramISO", N_("Program ISO"), N_("Program ISO"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, print0x003c}, + {0x003d, "AdvancedSceneType", N_("Advanced Scene Type"), N_("Advanced Scene Type"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x003e, "TextStamp2", N_("Text Stamp 2"), N_("Text Stamp 2"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)}, + {0x003f, "FacesDetected", N_("Faces detected"), N_("Faces detected"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x003e, "TextStamp2", N_("Text Stamp 2"), N_("Text Stamp 2"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicTextStamp)}, - {0x003f, "FacesDetected", N_("Faces detected"), N_("Faces detected"), panasonicId, makerTags, unsignedShort, -1, + {0x0040, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, printValue}, + {0x0041, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue}, - {0x0040, "Saturation", N_("Saturation"), N_("Saturation"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0041, "Sharpness", N_("Sharpness"), N_("Sharpness"), panasonicId, makerTags, unsignedShort, -1, printValue}, - {0x0042, "FilmMode", N_("Film Mode"), N_("Film mode"), panasonicId, makerTags, unsignedShort, -1, + {0x0042, "FilmMode", N_("Film Mode"), N_("Film mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicFilmMode)}, - {0x0044, "ColorTempKelvin", N_("Color Temp Kelvin"), N_("Color Temperature in Kelvin"), panasonicId, makerTags, - unsignedShort, -1, printValue}, - {0x0045, "BracketSettings", N_("Bracket Settings"), N_("Bracket Settings"), panasonicId, makerTags, unsignedShort, - -1, EXV_PRINT_TAG(panasonicBracketSettings)}, - {0x0046, "WBAdjustAB", N_("WB Adjust AB"), N_("WB adjust AB. Positive is a shift toward blue."), panasonicId, - makerTags, unsignedShort, -1, printValue}, - {0x0047, "WBAdjustGM", N_("WB Adjust GM"), N_("WBAdjustGM. Positive is a shift toward green."), panasonicId, - makerTags, unsignedShort, -1, printValue}, - {0x0048, "FlashCurtain", N_("Flash Curtain"), N_("Flash Curtain"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicFlashCurtain)}, + {0x0044, "ColorTempKelvin", N_("Color Temp Kelvin"), N_("Color Temperature in Kelvin"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0045, "BracketSettings", N_("Bracket Settings"), N_("Bracket Settings"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicBracketSettings)}, + {0x0046, "WBAdjustAB", N_("WB Adjust AB"), N_("WB adjust AB. Positive is a shift toward blue."), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0047, "WBAdjustGM", N_("WB Adjust GM"), N_("WBAdjustGM. Positive is a shift toward green."), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0048, "FlashCurtain", N_("Flash Curtain"), N_("Flash Curtain"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashCurtain)}, {0x0049, "LongShutterNoiseReduction", N_("Long Shutter Noise Reduction"), N_("Long Shutter Noise Reduction"), - panasonicId, makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicLongShutterNoiseReduction)}, - {0x004b, "ImageWidth", N_("Image width"), N_("Image width"), panasonicId, makerTags, unsignedLong, -1, printValue}, - {0x004c, "ImageHeight", N_("Image height"), N_("Image height"), panasonicId, makerTags, unsignedLong, -1, - printValue}, - {0x004d, "AFPointPosition", N_("AF Point Position"), N_("AF Point Position"), panasonicId, makerTags, - unsignedRational, -1, printValue}, - {0x004e, "FaceDetInfo", N_("Face detection info"), N_("Face detection info"), panasonicId, makerTags, undefined, -1, + IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicLongShutterNoiseReduction)}, + {0x004b, "ImageWidth", N_("Image width"), N_("Image width"), IfdId::panasonicId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x004c, "ImageHeight", N_("Image height"), N_("Image height"), IfdId::panasonicId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x004d, "AFPointPosition", N_("AF Point Position"), N_("AF Point Position"), IfdId::panasonicId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x004e, "FaceDetInfo", N_("Face detection info"), N_("Face detection info"), IfdId::panasonicId, + SectionId::makerTags, undefined, -1, printValue}, + {0x0051, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::panasonicId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0051, "LensType", N_("Lens Type"), N_("Lens type"), panasonicId, makerTags, asciiString, -1, printValue}, - {0x0052, "LensSerialNumber", N_("Lens Serial Number"), N_("Lens serial number"), panasonicId, makerTags, + {0x0052, "LensSerialNumber", N_("Lens Serial Number"), N_("Lens serial number"), IfdId::panasonicId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0053, "AccessoryType", N_("Accessory Type"), N_("Accessory type"), IfdId::panasonicId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0053, "AccessoryType", N_("Accessory Type"), N_("Accessory type"), panasonicId, makerTags, asciiString, -1, - printValue}, - {0x0054, "AccessorySerialNumber", N_("Accessory Serial Number"), N_("Accessory Serial Number"), panasonicId, - makerTags, asciiString, -1, printValue}, - {0x0059, "Transform1", N_("Transform 1"), N_("Transform 1"), panasonicId, makerTags, undefined, -1, printValue}, - {0x005d, "IntelligentExposure", N_("Intelligent Exposure"), N_("Intelligent Exposure"), panasonicId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentExposure)}, - {0x0060, "LensFirmwareVersion", N_("Firmware Version of the Lens"), N_("Firmware Version of the Lens"), panasonicId, - makerTags, undefined, -1, printValue}, - {0x0061, "FaceRecInfo", N_("Face recognition info"), N_("Face recognition info"), panasonicId, makerTags, undefined, + {0x0054, "AccessorySerialNumber", N_("Accessory Serial Number"), N_("Accessory Serial Number"), IfdId::panasonicId, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0059, "Transform1", N_("Transform 1"), N_("Transform 1"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, printValue}, - {0x0062, "FlashWarning", N_("Flash Warning"), N_("Flash warning"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicFlashWarning)}, - {0x0065, "Title", N_("Title"), N_("Title"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x0066, "BabyName", N_("Baby Name"), N_("Baby name (or pet name)"), panasonicId, makerTags, undefined, -1, + {0x005d, "IntelligentExposure", N_("Intelligent Exposure"), N_("Intelligent Exposure"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentExposure)}, + {0x0060, "LensFirmwareVersion", N_("Firmware Version of the Lens"), N_("Firmware Version of the Lens"), + IfdId::panasonicId, SectionId::makerTags, undefined, -1, printValue}, + {0x0061, "FaceRecInfo", N_("Face recognition info"), N_("Face recognition info"), IfdId::panasonicId, + SectionId::makerTags, undefined, -1, printValue}, + {0x0062, "FlashWarning", N_("Flash Warning"), N_("Flash warning"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashWarning)}, + {0x0065, "Title", N_("Title"), N_("Title"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, printPanasonicText}, - {0x0067, "Location", N_("Location"), N_("Location"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x0069, "Country", N_("Country"), N_("Country"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x006b, "State", N_("State"), N_("State"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x006d, "City", N_("City"), N_("City"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x006f, "Landmark", N_("Landmark"), N_("Landmark"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x0070, "IntelligentResolution", N_("Intelligent resolution"), N_("Intelligent resolution"), panasonicId, - makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicIntelligentResolution)}, - {0x0077, "BurstSpeed", N_("Burst Speed"), N_("Burst Speed in pictures per second"), panasonicId, makerTags, - unsignedShort, -1, printValue}, - {0x0079, "IntelligentDRange", N_("Intelligent Dynamic Range"), N_("Intelligent Dynamic Range"), panasonicId, - makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentDRange)}, - {0x007c, "ClearRetouch", N_("Clear Retouch"), N_("Clear Retouch"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicClearRetouch)}, - {0x0080, "City2", N_("City2"), N_("City2"), panasonicId, makerTags, undefined, -1, printPanasonicText}, - {0x0086, "ManometerPressure", N_("Manometer Pressure"), N_("Manometer pressure"), panasonicId, makerTags, - unsignedShort, -1, printPressure}, - {0x0089, "PhotoStyle", N_("Photo style"), N_("Photo style"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicPhotoStyle)}, - {0x008a, "ShadingCompensation", N_("Shading Compensation"), N_("Shading Compensation"), panasonicId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(panasonicShadingCompensation)}, - {0x008c, "AccelerometerZ", N_("Accelerometer Z"), N_("positive is acceleration upwards"), panasonicId, makerTags, - unsignedShort, -1, printAccelerometer}, - {0x008d, "AccelerometerX", N_("Accelerometer X"), N_("positive is acceleration to the left"), panasonicId, - makerTags, unsignedShort, -1, printAccelerometer}, - {0x008e, "AccelerometerY", N_("Accelerometer Y"), N_("positive is acceleration backwards"), panasonicId, makerTags, - unsignedShort, -1, printAccelerometer}, - {0x008f, "CameraOrientation", N_("Camera Orientation"), N_("Camera Orientation"), panasonicId, makerTags, - unsignedByte, -1, EXV_PRINT_TAG(panasonicCameraOrientation)}, - {0x0090, "RollAngle", N_("Roll Angle"), N_("degress of clockwise camera rotation"), panasonicId, makerTags, - unsignedShort, -1, printRollAngle}, - {0x0091, "PitchAngle", N_("Pitch Angle"), N_("degress of upwards camera tilt"), panasonicId, makerTags, - unsignedShort, -1, printPitchAngle}, - {0x0093, "SweepPanoramaDirection", N_("Sweep Panorama Direction"), N_("Sweep Panorama Direction"), panasonicId, - makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicSweepPanoramaDirection)}, - {0x0094, "PanoramaFieldOfView", N_("Field of View of Panorama"), N_("Field of View of Panorama"), panasonicId, - makerTags, unsignedShort, -1, printValue}, - {0x0096, "TimerRecording", N_("Timer Recording"), N_("Timer Recording"), panasonicId, makerTags, unsignedByte, -1, - EXV_PRINT_TAG(panasonicTimerRecording)}, - {0x009d, "InternalNDFilter", N_("Internal ND Filter"), N_("Internal ND Filter"), panasonicId, makerTags, - unsignedRational, -1, printValue}, - {0x009e, "HDR", N_("HDR"), N_("HDR"), panasonicId, makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicHDR)}, - {0x009f, "ShutterType", N_("Shutter Type"), N_("Shutter Type"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicShutterType)}, - {0x00a3, "ClearRetouchValue", N_("Clear Retouch Value"), N_("Clear Retouch Value"), panasonicId, makerTags, - unsignedRational, -1, printValue}, - {0x00ab, "TouchAE", N_("TouchAE"), N_("TouchAE"), panasonicId, makerTags, unsignedShort, -1, + {0x0066, "BabyName", N_("Baby Name"), N_("Baby name (or pet name)"), IfdId::panasonicId, SectionId::makerTags, + undefined, -1, printPanasonicText}, + {0x0067, "Location", N_("Location"), N_("Location"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x0069, "Country", N_("Country"), N_("Country"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x006b, "State", N_("State"), N_("State"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x006d, "City", N_("City"), N_("City"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x006f, "Landmark", N_("Landmark"), N_("Landmark"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x0070, "IntelligentResolution", N_("Intelligent resolution"), N_("Intelligent resolution"), IfdId::panasonicId, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicIntelligentResolution)}, + {0x0077, "BurstSpeed", N_("Burst Speed"), N_("Burst Speed in pictures per second"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0079, "IntelligentDRange", N_("Intelligent Dynamic Range"), N_("Intelligent Dynamic Range"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentDRange)}, + {0x007c, "ClearRetouch", N_("Clear Retouch"), N_("Clear Retouch"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicClearRetouch)}, + {0x0080, "City2", N_("City2"), N_("City2"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, + printPanasonicText}, + {0x0086, "ManometerPressure", N_("Manometer Pressure"), N_("Manometer pressure"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printPressure}, + {0x0089, "PhotoStyle", N_("Photo style"), N_("Photo style"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicPhotoStyle)}, + {0x008a, "ShadingCompensation", N_("Shading Compensation"), N_("Shading Compensation"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicShadingCompensation)}, + {0x008c, "AccelerometerZ", N_("Accelerometer Z"), N_("positive is acceleration upwards"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printAccelerometer}, + {0x008d, "AccelerometerX", N_("Accelerometer X"), N_("positive is acceleration to the left"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printAccelerometer}, + {0x008e, "AccelerometerY", N_("Accelerometer Y"), N_("positive is acceleration backwards"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printAccelerometer}, + {0x008f, "CameraOrientation", N_("Camera Orientation"), N_("Camera Orientation"), IfdId::panasonicId, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicCameraOrientation)}, + {0x0090, "RollAngle", N_("Roll Angle"), N_("degress of clockwise camera rotation"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printRollAngle}, + {0x0091, "PitchAngle", N_("Pitch Angle"), N_("degress of upwards camera tilt"), IfdId::panasonicId, + SectionId::makerTags, unsignedShort, -1, printPitchAngle}, + {0x0093, "SweepPanoramaDirection", N_("Sweep Panorama Direction"), N_("Sweep Panorama Direction"), + IfdId::panasonicId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicSweepPanoramaDirection)}, + {0x0094, "PanoramaFieldOfView", N_("Field of View of Panorama"), N_("Field of View of Panorama"), + IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0096, "TimerRecording", N_("Timer Recording"), N_("Timer Recording"), IfdId::panasonicId, SectionId::makerTags, + unsignedByte, -1, EXV_PRINT_TAG(panasonicTimerRecording)}, + {0x009d, "InternalNDFilter", N_("Internal ND Filter"), N_("Internal ND Filter"), IfdId::panasonicId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x009e, "HDR", N_("HDR"), N_("HDR"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, + EXV_PRINT_TAG(panasonicHDR)}, + {0x009f, "ShutterType", N_("Shutter Type"), N_("Shutter Type"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicShutterType)}, + {0x00a3, "ClearRetouchValue", N_("Clear Retouch Value"), N_("Clear Retouch Value"), IfdId::panasonicId, + SectionId::makerTags, unsignedRational, -1, printValue}, + {0x00ab, "TouchAE", N_("TouchAE"), N_("TouchAE"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicTouchAE)}, - {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), panasonicId, makerTags, undefined, -1, printValue}, - {0x4449, "0x4449", "0x4449", N_("Unknown"), panasonicId, makerTags, undefined, -1, printValue}, - {0x8000, "MakerNoteVersion", N_("MakerNote Version"), N_("MakerNote version"), panasonicId, makerTags, undefined, - -1, printExifVersion}, - {0x8001, "SceneMode", N_("Scene Mode"), N_("Scene mode"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicShootingMode)}, - {0x8004, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), panasonicId, makerTags, unsignedShort, -1, - printValue}, - {0x8005, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), panasonicId, makerTags, unsignedShort, -1, - printValue}, - {0x8006, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), panasonicId, makerTags, unsignedShort, -1, - printValue}, - {0x8007, "FlashFired", N_("Flash Fired"), N_("Flash Fired"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicFlashFired)}, - {0x8008, "TextStamp3", N_("Text Stamp 3"), N_("Text Stamp 3"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicTextStamp)}, - {0x8009, "TextStamp4", N_("Text Stamp 4"), N_("Text Stamp 4"), panasonicId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(panasonicTextStamp)}, - {0x8010, "BabyAge2", N_("Baby Age 2"), N_("Baby (or pet) age 2"), panasonicId, makerTags, asciiString, -1, - print0x0033}, - {0x8012, "Transform2", N_("Transform 2"), N_("Transform 2"), panasonicId, makerTags, undefined, -1, printValue}, + {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::panasonicId, SectionId::makerTags, undefined, + -1, printValue}, + {0x4449, "0x4449", "0x4449", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, printValue}, + {0x8000, "MakerNoteVersion", N_("MakerNote Version"), N_("MakerNote version"), IfdId::panasonicId, + SectionId::makerTags, undefined, -1, printExifVersion}, + {0x8001, "SceneMode", N_("Scene Mode"), N_("Scene mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(panasonicShootingMode)}, + {0x8004, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x8005, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x8006, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, printValue}, + {0x8007, "FlashFired", N_("Flash Fired"), N_("Flash Fired"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashFired)}, + {0x8008, "TextStamp3", N_("Text Stamp 3"), N_("Text Stamp 3"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)}, + {0x8009, "TextStamp4", N_("Text Stamp 4"), N_("Text Stamp 4"), IfdId::panasonicId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)}, + {0x8010, "BabyAge2", N_("Baby Age 2"), N_("Baby (or pet) age 2"), IfdId::panasonicId, SectionId::makerTags, + asciiString, -1, print0x0033}, + {0x8012, "Transform2", N_("Transform 2"), N_("Transform 2"), IfdId::panasonicId, SectionId::makerTags, undefined, + -1, printValue}, // End of list marker {0xffff, "(UnknownPanasonicMakerNoteTag)", "(UnknownPanasonicMakerNoteTag)", N_("Unknown PanasonicMakerNote tag"), - panasonicId, makerTags, asciiString, -1, printValue}, + IfdId::panasonicId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* PanasonicMakerNote::tagList() { @@ -613,47 +637,55 @@ std::ostream& PanasonicMakerNote::printPitchAngle(std::ostream& os, const Value& // Panasonic MakerNote Tag Info constexpr TagInfo PanasonicMakerNote::tagInfoRaw_[] = { - {0x0001, "Version", N_("Version"), N_("Panasonic raw version"), panaRawId, panaRaw, undefined, -1, + {0x0001, "Version", N_("Version"), N_("Panasonic raw version"), IfdId::panaRawId, SectionId::panaRaw, undefined, -1, printExifVersion}, - {0x0002, "SensorWidth", N_("Sensor Width"), N_("Sensor width"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0003, "SensorHeight", N_("Sensor Height"), N_("Sensor height"), panaRawId, panaRaw, unsignedShort, -1, - printValue}, - {0x0004, "SensorTopBorder", N_("Sensor Top Border"), N_("Sensor top border"), panaRawId, panaRaw, unsignedShort, -1, - printValue}, - {0x0005, "SensorLeftBorder", N_("Sensor Left Border"), N_("Sensor left border"), panaRawId, panaRaw, unsignedShort, + {0x0002, "SensorWidth", N_("Sensor Width"), N_("Sensor width"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, -1, printValue}, - {0x0006, "ImageHeight", N_("Image Height"), N_("Image height"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0007, "ImageWidth", N_("Image Width"), N_("Image width"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0011, "RedBalance", N_("Red Balance"), N_("Red balance (found in Digilux 2 RAW images)"), panaRawId, panaRaw, + {0x0003, "SensorHeight", N_("Sensor Height"), N_("Sensor height"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, -1, printValue}, - {0x0012, "BlueBalance", N_("Blue Balance"), N_("Blue balance"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0017, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0024, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), panaRawId, panaRaw, unsignedShort, -1, printValue}, - {0x0025, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), panaRawId, panaRaw, unsignedShort, -1, - printValue}, - {0x0026, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), panaRawId, panaRaw, unsignedShort, -1, - printValue}, - {0x002e, "PreviewImage", N_("Preview Image"), N_("Preview image"), panaRawId, panaRaw, undefined, -1, printValue}, - {0x010f, "Make", N_("Manufacturer"), N_("The manufacturer of the recording equipment"), panaRawId, panaRaw, - asciiString, -1, printValue}, - {0x0110, "Model", N_("Model"), N_("The model name or model number of the equipment"), panaRawId, panaRaw, - asciiString, -1, printValue}, - {0x0111, "StripOffsets", N_("Strip Offsets"), N_("Strip offsets"), panaRawId, panaRaw, unsignedLong, -1, - printValue}, - {0x0112, "Orientation", N_("Orientation"), N_("Orientation"), panaRawId, panaRaw, unsignedShort, -1, print0x0112}, - {0x0116, "RowsPerStrip", N_("Rows Per Strip"), N_("The number of rows per strip"), panaRawId, panaRaw, + {0x0004, "SensorTopBorder", N_("Sensor Top Border"), N_("Sensor top border"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, -1, printValue}, - {0x0117, "StripByteCounts", N_("Strip Byte Counts"), N_("Strip byte counts"), panaRawId, panaRaw, unsignedLong, -1, - printValue}, - {0x0118, "RawDataOffset", N_("Raw Data Offset"), N_("Raw data offset"), panaRawId, panaRaw, unsignedLong, -1, - printValue}, - {0x8769, "ExifTag", N_("Exif IFD Pointer"), N_("A pointer to the Exif IFD"), panaRawId, panaRaw, unsignedLong, -1, - printValue}, - {0x8825, "GPSTag", N_("GPS Info IFD Pointer"), N_("A pointer to the GPS Info IFD"), panaRawId, panaRaw, + {0x0005, "SensorLeftBorder", N_("Sensor Left Border"), N_("Sensor left border"), IfdId::panaRawId, + SectionId::panaRaw, unsignedShort, -1, printValue}, + {0x0006, "ImageHeight", N_("Image Height"), N_("Image height"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, printValue}, + {0x0007, "ImageWidth", N_("Image Width"), N_("Image width"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, printValue}, + {0x0011, "RedBalance", N_("Red Balance"), N_("Red balance (found in Digilux 2 RAW images)"), IfdId::panaRawId, + SectionId::panaRaw, unsignedShort, -1, printValue}, + {0x0012, "BlueBalance", N_("Blue Balance"), N_("Blue balance"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, printValue}, + {0x0017, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, printValue}, + {0x0024, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, printValue}, + {0x0025, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), IfdId::panaRawId, SectionId::panaRaw, + unsignedShort, -1, printValue}, + {0x0026, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), IfdId::panaRawId, SectionId::panaRaw, + unsignedShort, -1, printValue}, + {0x002e, "PreviewImage", N_("Preview Image"), N_("Preview image"), IfdId::panaRawId, SectionId::panaRaw, undefined, + -1, printValue}, + {0x010f, "Make", N_("Manufacturer"), N_("The manufacturer of the recording equipment"), IfdId::panaRawId, + SectionId::panaRaw, asciiString, -1, printValue}, + {0x0110, "Model", N_("Model"), N_("The model name or model number of the equipment"), IfdId::panaRawId, + SectionId::panaRaw, asciiString, -1, printValue}, + {0x0111, "StripOffsets", N_("Strip Offsets"), N_("Strip offsets"), IfdId::panaRawId, SectionId::panaRaw, + unsignedLong, -1, printValue}, + {0x0112, "Orientation", N_("Orientation"), N_("Orientation"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, + -1, print0x0112}, + {0x0116, "RowsPerStrip", N_("Rows Per Strip"), N_("The number of rows per strip"), IfdId::panaRawId, + SectionId::panaRaw, unsignedShort, -1, printValue}, + {0x0117, "StripByteCounts", N_("Strip Byte Counts"), N_("Strip byte counts"), IfdId::panaRawId, SectionId::panaRaw, unsignedLong, -1, printValue}, + {0x0118, "RawDataOffset", N_("Raw Data Offset"), N_("Raw data offset"), IfdId::panaRawId, SectionId::panaRaw, + unsignedLong, -1, printValue}, + {0x8769, "ExifTag", N_("Exif IFD Pointer"), N_("A pointer to the Exif IFD"), IfdId::panaRawId, SectionId::panaRaw, + unsignedLong, -1, printValue}, + {0x8825, "GPSTag", N_("GPS Info IFD Pointer"), N_("A pointer to the GPS Info IFD"), IfdId::panaRawId, + SectionId::panaRaw, unsignedLong, -1, printValue}, // End of list marker - {0xffff, "(UnknownPanasonicRawTag)", "(UnknownPanasonicRawTag)", N_("Unknown PanasonicRaw tag"), panaRawId, panaRaw, - asciiString, -1, printValue}, + {0xffff, "(UnknownPanasonicRawTag)", "(UnknownPanasonicRawTag)", N_("Unknown PanasonicRaw tag"), IfdId::panaRawId, + SectionId::panaRaw, asciiString, -1, printValue}, }; const TagInfo* PanasonicMakerNote::tagListRaw() { diff --git a/src/pentaxmn_int.cpp b/src/pentaxmn_int.cpp index f60d8327..11b49d5b 100644 --- a/src/pentaxmn_int.cpp +++ b/src/pentaxmn_int.cpp @@ -1274,177 +1274,184 @@ std::ostream& printLensType(std::ostream& os, const Value& value, const ExifData // Pentax MakerNote Tag Info constexpr TagInfo PentaxMakerNote::tagInfo_[] = { - {0x0000, "Version", N_("Version"), N_("Pentax Makernote version"), pentaxId, makerTags, undefined, -1, - printVersion}, - {0x0001, "Mode", N_("Shooting mode"), N_("Camera shooting mode"), pentaxId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(pentaxShootingMode)}, - {0x0002, "PreviewResolution", N_("Resolution of a preview image"), N_("Resolution of a preview image"), pentaxId, - makerTags, undefined, -1, printResolution}, + {0x0000, "Version", N_("Version"), N_("Pentax Makernote version"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, printVersion}, + {0x0001, "Mode", N_("Shooting mode"), N_("Camera shooting mode"), IfdId::pentaxId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(pentaxShootingMode)}, + {0x0002, "PreviewResolution", N_("Resolution of a preview image"), N_("Resolution of a preview image"), + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printResolution}, {0x0003, "PreviewLength", N_("Length of a preview image"), N_("Size of an IFD containing a preview image"), - pentaxId, makerTags, undefined, -1, printValue}, + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, {0x0004, "PreviewOffset", N_("Pointer to a preview image"), N_("Offset to an IFD containing a preview image"), - pentaxId, makerTags, undefined, -1, printValue}, - {0x0005, "ModelID", N_("Model identification"), N_("Pentax model identification"), pentaxId, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(pentaxModel)}, - {0x0006, "Date", N_("Date"), N_("Date"), pentaxId, makerTags, undefined, -1, printDate}, - {0x0007, "Time", N_("Time"), N_("Time"), pentaxId, makerTags, undefined, -1, printTime}, - {0x0008, "Quality", N_("Image quality"), N_("Image quality settings"), pentaxId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(pentaxQuality)}, - {0x0009, "Size", N_("Image size"), N_("Image size settings"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxSize)}, + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, + {0x0005, "ModelID", N_("Model identification"), N_("Pentax model identification"), IfdId::pentaxId, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(pentaxModel)}, + {0x0006, "Date", N_("Date"), N_("Date"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printDate}, + {0x0007, "Time", N_("Time"), N_("Time"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printTime}, + {0x0008, "Quality", N_("Image quality"), N_("Image quality settings"), IfdId::pentaxId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(pentaxQuality)}, + {0x0009, "Size", N_("Image size"), N_("Image size settings"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(pentaxSize)}, /* Some missing ! */ - {0x000c, "Flash", N_("Flash mode"), N_("Flash mode settings"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxFlash)}, - {0x000d, "Focus", N_("Focus mode"), N_("Focus mode settings"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxFocus)}, - {0x000e, "AFPoint", N_("AF point"), N_("Selected AF point"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxAFPoint)}, - {0x000F, "AFPointInFocus", N_("AF point in focus"), N_("AF point in focus"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxAFPointFocus)}, + {0x000c, "Flash", N_("Flash mode"), N_("Flash mode settings"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(pentaxFlash)}, + {0x000d, "Focus", N_("Focus mode"), N_("Focus mode settings"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(pentaxFocus)}, + {0x000e, "AFPoint", N_("AF point"), N_("Selected AF point"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, + -1, EXV_PRINT_TAG(pentaxAFPoint)}, + {0x000F, "AFPointInFocus", N_("AF point in focus"), N_("AF point in focus"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, EXV_PRINT_TAG(pentaxAFPointFocus)}, /* Some missing ! */ - {0x0012, "ExposureTime", N_("Exposure time"), N_("Exposure time"), pentaxId, makerTags, unsignedLong, -1, - printExposure}, - {0x0013, "FNumber", N_("F-Number"), N_("F-Number"), pentaxId, makerTags, unsignedLong, -1, printFValue}, - {0x0014, "ISO", N_("ISO sensitivity"), N_("ISO sensitivity settings"), pentaxId, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(pentaxISO)}, + {0x0012, "ExposureTime", N_("Exposure time"), N_("Exposure time"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, printExposure}, + {0x0013, "FNumber", N_("F-Number"), N_("F-Number"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, -1, + printFValue}, + {0x0014, "ISO", N_("ISO sensitivity"), N_("ISO sensitivity settings"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, EXV_PRINT_TAG(pentaxISO)}, /* Some missing ! */ - {0x0016, "ExposureCompensation", N_("Exposure compensation"), N_("Exposure compensation"), pentaxId, makerTags, - unsignedLong, -1, printCompensation}, + {0x0016, "ExposureCompensation", N_("Exposure compensation"), N_("Exposure compensation"), IfdId::pentaxId, + SectionId::makerTags, unsignedLong, -1, printCompensation}, /* Some missing ! */ - {0x0017, "MeteringMode", N_("MeteringMode"), N_("MeteringMode"), pentaxId, makerTags, undefined, -1, - EXV_PRINT_TAG(pentaxMeteringMode)}, - {0x0018, "AutoBracketing", N_("AutoBracketing"), N_("AutoBracketing"), pentaxId, makerTags, undefined, -1, - printBracketing}, - {0x0019, "WhiteBalance", N_("White balance"), N_("White balance"), pentaxId, makerTags, undefined, -1, - EXV_PRINT_TAG(pentaxWhiteBalance)}, - {0x001a, "WhiteBalanceMode", N_("White balance mode"), N_("White balance mode"), pentaxId, makerTags, undefined, -1, - EXV_PRINT_TAG(pentaxWhiteBalanceMode)}, - {0x001b, "BlueBalance", N_("Blue balance"), N_("Blue color balance"), pentaxId, makerTags, unsignedLong, -1, - printValue}, - {0x001c, "RedBalance", N_("Red balance"), N_("Red color balance"), pentaxId, makerTags, unsignedLong, -1, - printValue}, - {0x001d, "FocalLength", N_("FocalLength"), N_("FocalLength"), pentaxId, makerTags, undefined, -1, printFocalLength}, - {0x001e, "DigitalZoom", N_("Digital zoom"), N_("Digital zoom"), pentaxId, makerTags, unsignedLong, -1, printValue}, - {0x001f, "Saturation", N_("Saturation"), N_("Saturation"), pentaxId, makerTags, undefined, -1, + {0x0017, "MeteringMode", N_("MeteringMode"), N_("MeteringMode"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, EXV_PRINT_TAG(pentaxMeteringMode)}, + {0x0018, "AutoBracketing", N_("AutoBracketing"), N_("AutoBracketing"), IfdId::pentaxId, SectionId::makerTags, + undefined, -1, printBracketing}, + {0x0019, "WhiteBalance", N_("White balance"), N_("White balance"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, EXV_PRINT_TAG(pentaxWhiteBalance)}, + {0x001a, "WhiteBalanceMode", N_("White balance mode"), N_("White balance mode"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxWhiteBalanceMode)}, + {0x001b, "BlueBalance", N_("Blue balance"), N_("Blue color balance"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x001c, "RedBalance", N_("Red balance"), N_("Red color balance"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x001d, "FocalLength", N_("FocalLength"), N_("FocalLength"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, + printFocalLength}, + {0x001e, "DigitalZoom", N_("Digital zoom"), N_("Digital zoom"), IfdId::pentaxId, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0x001f, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxSaturation)}, - {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), pentaxId, makerTags, undefined, -1, + {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxContrast)}, - {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), pentaxId, makerTags, undefined, -1, + {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxSharpness)}, - {0x0022, "Location", N_("Location"), N_("Location"), pentaxId, makerTags, undefined, -1, + {0x0022, "Location", N_("Location"), N_("Location"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxLocation)}, - {0x0023, "Hometown", N_("Hometown"), N_("Home town"), pentaxId, makerTags, undefined, -1, + {0x0023, "Hometown", N_("Hometown"), N_("Home town"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxCities)}, - {0x0024, "Destination", N_("Destination"), N_("Destination"), pentaxId, makerTags, undefined, -1, + {0x0024, "Destination", N_("Destination"), N_("Destination"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxCities)}, - {0x0025, "HometownDST", N_("Hometown DST"), N_("Whether day saving time is active in home town"), pentaxId, - makerTags, undefined, -1, EXV_PRINT_TAG(pentaxYesNo)}, - {0x0026, "DestinationDST", N_("Destination DST"), N_("Whether day saving time is active in destination"), pentaxId, - makerTags, undefined, -1, EXV_PRINT_TAG(pentaxYesNo)}, - {0x0027, "DSPFirmwareVersion", N_("DSPFirmwareVersion"), N_("DSPFirmwareVersion"), pentaxId, makerTags, - unsignedByte, -1, printValue}, /* TODO: Decoding missing */ - {0x0028, "CPUFirmwareVersion", N_("CPUFirmwareVersion"), N_("CPUFirmwareVersion"), pentaxId, makerTags, - unsignedByte, -1, printValue}, /* TODO: Decoding missing */ - {0x0029, "FrameNumber", N_("Frame number"), N_("Frame number"), pentaxId, makerTags, undefined, -1, printValue}, + {0x0025, "HometownDST", N_("Hometown DST"), N_("Whether day saving time is active in home town"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxYesNo)}, + {0x0026, "DestinationDST", N_("Destination DST"), N_("Whether day saving time is active in destination"), + IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_TAG(pentaxYesNo)}, + {0x0027, "DSPFirmwareVersion", N_("DSPFirmwareVersion"), N_("DSPFirmwareVersion"), IfdId::pentaxId, + SectionId::makerTags, unsignedByte, -1, printValue}, /* TODO: Decoding missing */ + {0x0028, "CPUFirmwareVersion", N_("CPUFirmwareVersion"), N_("CPUFirmwareVersion"), IfdId::pentaxId, + SectionId::makerTags, unsignedByte, -1, printValue}, /* TODO: Decoding missing */ + {0x0029, "FrameNumber", N_("Frame number"), N_("Frame number"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, printValue}, /* Some missing ! */ {0x002d, "EffectiveLV", N_("Light value"), N_("Camera calculated light value, includes exposure compensation"), - pentaxId, makerTags, unsignedShort, -1, printValue}, + IfdId::pentaxId, SectionId::makerTags, unsignedShort, -1, printValue}, /* Some missing ! */ - {0x0032, "ImageProcessing", N_("Image processing"), N_("Image processing"), pentaxId, makerTags, undefined, -1, - EXV_PRINT_COMBITAG(pentaxImageProcessing, 4, 0)}, - {0x0033, "PictureMode", N_("Picture mode"), N_("Picture mode"), pentaxId, makerTags, undefined, -1, - EXV_PRINT_COMBITAG(pentaxPictureMode, 3, 0)}, - {0x0034, "DriveMode", N_("Drive mode"), N_("Drive mode"), pentaxId, makerTags, undefined, -1, + {0x0032, "ImageProcessing", N_("Image processing"), N_("Image processing"), IfdId::pentaxId, SectionId::makerTags, + undefined, -1, EXV_PRINT_COMBITAG(pentaxImageProcessing, 4, 0)}, + {0x0033, "PictureMode", N_("Picture mode"), N_("Picture mode"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, EXV_PRINT_COMBITAG(pentaxPictureMode, 3, 0)}, + {0x0034, "DriveMode", N_("Drive mode"), N_("Drive mode"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, EXV_PRINT_COMBITAG(pentaxDriveMode, 4, 0)}, /* Some missing ! */ - {0x0037, "ColorSpace", N_("Color space"), N_("Color space"), pentaxId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(pentaxColorSpace)}, - {0x0038, "ImageAreaOffset", N_("Image area offset"), N_("Image area offset"), pentaxId, makerTags, unsignedLong, -1, - printValue}, - {0x0039, "RawImageSize", N_("Raw image size"), N_("Raw image size"), pentaxId, makerTags, unsignedLong, -1, - printValue}, + {0x0037, "ColorSpace", N_("Color space"), N_("Color space"), IfdId::pentaxId, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(pentaxColorSpace)}, + {0x0038, "ImageAreaOffset", N_("Image area offset"), N_("Image area offset"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0x0039, "RawImageSize", N_("Raw image size"), N_("Raw image size"), IfdId::pentaxId, SectionId::makerTags, + unsignedLong, -1, printValue}, /* Some missing ! */ - {0x003e, "PreviewImageBorders", N_("Preview image borders"), N_("Preview image borders"), pentaxId, makerTags, - unsignedByte, -1, printValue}, - {0x003f, "LensType", N_("Lens type"), N_("Lens type"), pentaxId, makerTags, unsignedByte, -1, + {0x003e, "PreviewImageBorders", N_("Preview image borders"), N_("Preview image borders"), IfdId::pentaxId, + SectionId::makerTags, unsignedByte, -1, printValue}, + {0x003f, "LensType", N_("Lens type"), N_("Lens type"), IfdId::pentaxId, SectionId::makerTags, unsignedByte, -1, printLensType}, // #816 - {0x0040, "SensitivityAdjust", N_("Sensitivity adjust"), N_("Sensitivity adjust"), pentaxId, makerTags, unsignedLong, - -1, printValue}, - {0x0041, "DigitalFilter", N_("Digital filter"), N_("Digital filter"), pentaxId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(pentaxOffOn)}, + {0x0040, "SensitivityAdjust", N_("Sensitivity adjust"), N_("Sensitivity adjust"), IfdId::pentaxId, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0041, "DigitalFilter", N_("Digital filter"), N_("Digital filter"), IfdId::pentaxId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(pentaxOffOn)}, /* Some missing ! */ - {0x0047, "Temperature", N_("Temperature"), N_("Camera temperature"), pentaxId, makerTags, signedByte, -1, - printTemperature}, - {0x0048, "AELock", N_("AE lock"), N_("AE lock"), pentaxId, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(pentaxOffOn)}, - {0x0049, "NoiseReduction", N_("Noise reduction"), N_("Noise reduction"), pentaxId, makerTags, unsignedShort, -1, + {0x0047, "Temperature", N_("Temperature"), N_("Camera temperature"), IfdId::pentaxId, SectionId::makerTags, + signedByte, -1, printTemperature}, + {0x0048, "AELock", N_("AE lock"), N_("AE lock"), IfdId::pentaxId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(pentaxOffOn)}, + {0x0049, "NoiseReduction", N_("Noise reduction"), N_("Noise reduction"), IfdId::pentaxId, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(pentaxOffOn)}, /* Some missing ! */ {0x004d, "FlashExposureCompensation", N_("Flash exposure compensation"), N_("Flash exposure compensation"), - pentaxId, makerTags, signedLong, -1, printFlashCompensation}, + IfdId::pentaxId, SectionId::makerTags, signedLong, -1, printFlashCompensation}, /* Some missing ! */ - {0x004f, "ImageTone", N_("Image tone"), N_("Image tone"), pentaxId, makerTags, unsignedShort, -1, + {0x004f, "ImageTone", N_("Image tone"), N_("Image tone"), IfdId::pentaxId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(pentaxImageTone)}, - {0x0050, "ColorTemperature", N_("Color temperature"), N_("Color temperature"), pentaxId, makerTags, unsignedShort, - -1, printValue}, + {0x0050, "ColorTemperature", N_("Color temperature"), N_("Color temperature"), IfdId::pentaxId, + SectionId::makerTags, unsignedShort, -1, printValue}, /* Some missing ! */ - {0x005c, "ShakeReduction", N_("Shake reduction"), N_("Shake reduction information"), pentaxId, makerTags, undefined, + {0x005c, "ShakeReduction", N_("Shake reduction"), N_("Shake reduction information"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, + {0x005d, "ShutterCount", N_("Shutter count"), N_("Shutter count"), IfdId::pentaxId, SectionId::makerTags, undefined, + -1, printShutterCount}, + {0x0069, "DynamicRangeExpansion", N_("Dynamic range expansion"), N_("Dynamic range expansion"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, EXV_PRINT_COMBITAG(pentaxDynamicRangeExpansion, 4, 0)}, + {0x0071, "HighISONoiseReduction", N_("High ISO noise reduction"), N_("High ISO noise reduction"), IfdId::pentaxId, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(pentaxHighISONoiseReduction)}, + {0x0072, "AFAdjustment", N_("AF Adjustment"), N_("AF Adjustment"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, - {0x005d, "ShutterCount", N_("Shutter count"), N_("Shutter count"), pentaxId, makerTags, undefined, -1, - printShutterCount}, - {0x0069, "DynamicRangeExpansion", N_("Dynamic range expansion"), N_("Dynamic range expansion"), pentaxId, makerTags, - undefined, -1, EXV_PRINT_COMBITAG(pentaxDynamicRangeExpansion, 4, 0)}, - {0x0071, "HighISONoiseReduction", N_("High ISO noise reduction"), N_("High ISO noise reduction"), pentaxId, - makerTags, unsignedByte, -1, EXV_PRINT_TAG(pentaxHighISONoiseReduction)}, - {0x0072, "AFAdjustment", N_("AF Adjustment"), N_("AF Adjustment"), pentaxId, makerTags, undefined, -1, printValue}, /* Many missing ! */ - {0x0200, "BlackPoint", N_("Black point"), N_("Black point"), pentaxId, makerTags, undefined, -1, printValue}, - {0x0201, "WhitePoint", N_("White point"), N_("White point"), pentaxId, makerTags, undefined, -1, printValue}, + {0x0200, "BlackPoint", N_("Black point"), N_("Black point"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, + printValue}, + {0x0201, "WhitePoint", N_("White point"), N_("White point"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, + printValue}, /* Some missing ! */ - {0x0205, "ShotInfo", N_("ShotInfo"), N_("ShotInfo"), pentaxId, makerTags, undefined, -1, + {0x0205, "ShotInfo", N_("ShotInfo"), N_("ShotInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0206, "AEInfo", N_("AEInfo"), N_("AEInfo"), pentaxId, makerTags, undefined, -1, + {0x0206, "AEInfo", N_("AEInfo"), N_("AEInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0207, "LensInfo", N_("LensInfo"), N_("LensInfo"), pentaxId, makerTags, undefined, -1, + {0x0207, "LensInfo", N_("LensInfo"), N_("LensInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0208, "FlashInfo", N_("FlashInfo"), N_("FlashInfo"), pentaxId, makerTags, undefined, -1, + {0x0208, "FlashInfo", N_("FlashInfo"), N_("FlashInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0209, "AEMeteringSegments", N_("AEMeteringSegments"), N_("AEMeteringSegments"), pentaxId, makerTags, undefined, - -1, printValue}, /* TODO: Decoding missing */ - {0x020a, "FlashADump", N_("FlashADump"), N_("FlashADump"), pentaxId, makerTags, undefined, -1, + {0x0209, "AEMeteringSegments", N_("AEMeteringSegments"), N_("AEMeteringSegments"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x020a, "FlashADump", N_("FlashADump"), N_("FlashADump"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x020b, "FlashBDump", N_("FlashBDump"), N_("FlashBDump"), pentaxId, makerTags, undefined, -1, + {0x020b, "FlashBDump", N_("FlashBDump"), N_("FlashBDump"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ /* Some missing ! */ - {0x020d, "WB_RGGBLevelsDaylight", N_("WB_RGGBLevelsDaylight"), N_("WB_RGGBLevelsDaylight"), pentaxId, makerTags, - undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x020e, "WB_RGGBLevelsShade", N_("WB_RGGBLevelsShade"), N_("WB_RGGBLevelsShade"), pentaxId, makerTags, undefined, - -1, printValue}, /* TODO: Decoding missing */ - {0x020f, "WB_RGGBLevelsCloudy", N_("WB_RGGBLevelsCloudy"), N_("WB_RGGBLevelsCloudy"), pentaxId, makerTags, - undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0210, "WB_RGGBLevelsTungsten", N_("WB_RGGBLevelsTungsten"), N_("WB_RGGBLevelsTungsten"), pentaxId, makerTags, - undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0211, "WB_RGGBLevelsFluorescentD", N_("WB_RGGBLevelsFluorescentD"), N_("WB_RGGBLevelsFluorescentD"), pentaxId, - makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0212, "WB_RGGBLevelsFluorescentN", N_("WB_RGGBLevelsFluorescentN"), N_("WB_RGGBLevelsFluorescentN"), pentaxId, - makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0213, "WB_RGGBLevelsFluorescentW", N_("WB_RGGBLevelsFluorescentW"), N_("WB_RGGBLevelsFluorescentW"), pentaxId, - makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0214, "WB_RGGBLevelsFlash", N_("WB_RGGBLevelsFlash"), N_("WB_RGGBLevelsFlash"), pentaxId, makerTags, undefined, - -1, printValue}, /* TODO: Decoding missing */ - {0x0215, "CameraInfo", N_("CameraInfo"), N_("CameraInfo"), pentaxId, makerTags, undefined, -1, + {0x020d, "WB_RGGBLevelsDaylight", N_("WB_RGGBLevelsDaylight"), N_("WB_RGGBLevelsDaylight"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x020e, "WB_RGGBLevelsShade", N_("WB_RGGBLevelsShade"), N_("WB_RGGBLevelsShade"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x020f, "WB_RGGBLevelsCloudy", N_("WB_RGGBLevelsCloudy"), N_("WB_RGGBLevelsCloudy"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0210, "WB_RGGBLevelsTungsten", N_("WB_RGGBLevelsTungsten"), N_("WB_RGGBLevelsTungsten"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0211, "WB_RGGBLevelsFluorescentD", N_("WB_RGGBLevelsFluorescentD"), N_("WB_RGGBLevelsFluorescentD"), + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0212, "WB_RGGBLevelsFluorescentN", N_("WB_RGGBLevelsFluorescentN"), N_("WB_RGGBLevelsFluorescentN"), + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0213, "WB_RGGBLevelsFluorescentW", N_("WB_RGGBLevelsFluorescentW"), N_("WB_RGGBLevelsFluorescentW"), + IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0214, "WB_RGGBLevelsFlash", N_("WB_RGGBLevelsFlash"), N_("WB_RGGBLevelsFlash"), IfdId::pentaxId, + SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ + {0x0215, "CameraInfo", N_("CameraInfo"), N_("CameraInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0216, "BatteryInfo", N_("BatteryInfo"), N_("BatteryInfo"), pentaxId, makerTags, undefined, -1, + {0x0216, "BatteryInfo", N_("BatteryInfo"), N_("BatteryInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x021f, "AFInfo", N_("AFInfo"), N_("AFInfo"), pentaxId, makerTags, undefined, -1, + {0x021f, "AFInfo", N_("AFInfo"), N_("AFInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0222, "ColorInfo", N_("ColorInfo"), N_("ColorInfo"), pentaxId, makerTags, undefined, -1, + {0x0222, "ColorInfo", N_("ColorInfo"), N_("ColorInfo"), IfdId::pentaxId, SectionId::makerTags, undefined, -1, printValue}, /* TODO: Decoding missing */ - {0x0229, "SerialNumber", N_("Serial Number"), N_("Serial Number"), pentaxId, makerTags, asciiString, -1, - printValue}, + {0x0229, "SerialNumber", N_("Serial Number"), N_("Serial Number"), IfdId::pentaxId, SectionId::makerTags, + asciiString, -1, printValue}, // End of list marker - {0xffff, "(UnknownPentaxMakerNoteTag)", "(UnknownPentaxMakerNoteTag)", N_("Unknown PentaxMakerNote tag"), pentaxId, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownPentaxMakerNoteTag)", "(UnknownPentaxMakerNoteTag)", N_("Unknown PentaxMakerNote tag"), + IfdId::pentaxId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* PentaxMakerNote::tagList() { diff --git a/src/preview.cpp b/src/preview.cpp index 3383aa32..ec4a88b2 100644 --- a/src/preview.cpp +++ b/src/preview.cpp @@ -697,7 +697,7 @@ DataBuf LoaderTiff::getData() const { consistent result for all previews, including JPEG */ uint16_t tag = pos.tag(); - if (tag != 0x00fe && tag != 0x00ff && Internal::isTiffImageTag(tag, ifd0Id)) { + if (tag != 0x00fe && tag != 0x00ff && Internal::isTiffImageTag(tag, IfdId::ifd0Id)) { preview.add(ExifKey(tag, "Image"), &pos.value()); } } diff --git a/src/rw2image.cpp b/src/rw2image.cpp index f22ea51e..f1f2d859 100644 --- a/src/rw2image.cpp +++ b/src/rw2image.cpp @@ -122,7 +122,7 @@ void Rw2Image::readMetadata() { if (!prevData.empty()) { // Filter duplicate tags for (auto&& pos : exifData_) { - if (pos.ifdId() == panaRawId) + if (pos.ifdId() == IfdId::panaRawId) continue; auto dup = prevData.findKey(ExifKey(pos.key())); if (dup != prevData.end()) { diff --git a/src/samsungmn_int.cpp b/src/samsungmn_int.cpp index 6e0e811e..b8a76104 100644 --- a/src/samsungmn_int.cpp +++ b/src/samsungmn_int.cpp @@ -69,61 +69,69 @@ std::ostream& printFocalLength35(std::ostream& os, const Value& value, const Exi // Samsung MakerNote Tag Info constexpr TagInfo Samsung2MakerNote::tagInfo_[] = { - {0x0001, "Version", N_("Version"), N_("Makernote version"), samsung2Id, makerTags, undefined, -1, printExifVersion}, - {0x0021, "PictureWizard", N_("Picture Wizard"), N_("Picture wizard composite tag"), samsung2Id, makerTags, - unsignedShort, -1, printValue}, - {0x0030, "LocalLocationName", N_("Local Location Name"), N_("Local location name"), samsung2Id, makerTags, + {0x0001, "Version", N_("Version"), N_("Makernote version"), IfdId::samsung2Id, SectionId::makerTags, undefined, -1, + printExifVersion}, + {0x0021, "PictureWizard", N_("Picture Wizard"), N_("Picture wizard composite tag"), IfdId::samsung2Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x0030, "LocalLocationName", N_("Local Location Name"), N_("Local location name"), IfdId::samsung2Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0x0031, "LocationName", N_("Location Name"), N_("Location name"), IfdId::samsung2Id, SectionId::makerTags, asciiString, -1, printValue}, - {0x0031, "LocationName", N_("Location Name"), N_("Location name"), samsung2Id, makerTags, asciiString, -1, - printValue}, - {0x0035, "Preview", N_("Pointer to a preview image"), N_("Offset to an IFD containing a preview image"), samsung2Id, - makerTags, unsignedLong, -1, printValue}, - {0x0043, "CameraTemperature", N_("Camera Temperature"), N_("Camera temperature"), samsung2Id, makerTags, - signedRational, -1, printCameraTemperature}, - {0xa001, "FirmwareName", N_("Firmware Name"), N_("Firmware name"), samsung2Id, makerTags, asciiString, -1, - printValue}, - {0xa003, "LensType", N_("Lens Type"), N_("Lens type"), samsung2Id, makerTags, unsignedShort, -1, + {0x0035, "Preview", N_("Pointer to a preview image"), N_("Offset to an IFD containing a preview image"), + IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0043, "CameraTemperature", N_("Camera Temperature"), N_("Camera temperature"), IfdId::samsung2Id, + SectionId::makerTags, signedRational, -1, printCameraTemperature}, + {0xa001, "FirmwareName", N_("Firmware Name"), N_("Firmware name"), IfdId::samsung2Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0xa003, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::samsung2Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(samsung2LensType)}, - {0xa004, "LensFirmware", N_("Lens Firmware"), N_("Lens firmware"), samsung2Id, makerTags, asciiString, -1, - printValue}, - {0xa010, "SensorAreas", N_("Sensor Areas"), N_("Sensor areas"), samsung2Id, makerTags, unsignedLong, -1, - printValue}, - {0xa011, "ColorSpace", N_("Color Space"), N_("Color space"), samsung2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(samsung2ColorSpace)}, - {0xa012, "SmartRange", N_("Smart Range"), N_("Smart range"), samsung2Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(samsung2SmartRange)}, - {0xa013, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), samsung2Id, makerTags, - signedRational, -1, print0x9204}, - {0xa014, "ISO", N_("ISO"), N_("ISO"), samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa018, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), samsung2Id, makerTags, unsignedRational, -1, - print0x829a}, - {0xa019, "FNumber", N_("FNumber"), N_("The F number."), samsung2Id, makerTags, unsignedRational, -1, print0x829d}, + {0xa004, "LensFirmware", N_("Lens Firmware"), N_("Lens firmware"), IfdId::samsung2Id, SectionId::makerTags, + asciiString, -1, printValue}, + {0xa010, "SensorAreas", N_("Sensor Areas"), N_("Sensor areas"), IfdId::samsung2Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0xa011, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::samsung2Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(samsung2ColorSpace)}, + {0xa012, "SmartRange", N_("Smart Range"), N_("Smart range"), IfdId::samsung2Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(samsung2SmartRange)}, + {0xa013, "ExposureBiasValue", N_("Exposure Bias Value"), N_("Exposure bias value"), IfdId::samsung2Id, + SectionId::makerTags, signedRational, -1, print0x9204}, + {0xa014, "ISO", N_("ISO"), N_("ISO"), IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printValue}, + {0xa018, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::samsung2Id, SectionId::makerTags, + unsignedRational, -1, print0x829a}, + {0xa019, "FNumber", N_("FNumber"), N_("The F number."), IfdId::samsung2Id, SectionId::makerTags, unsignedRational, + -1, print0x829d}, {0xa01a, "FocalLengthIn35mmFormat", N_("Focal Length In 35mm Format"), N_("Focal length in 35mm format"), - samsung2Id, makerTags, unsignedLong, -1, printFocalLength35}, - {0xa020, "EncryptionKey", N_("Encryption Key"), N_("Encryption key"), samsung2Id, makerTags, unsignedLong, -1, - printValue}, - {0xa021, "WB_RGGBLevelsUncorrected", N_("WB RGGB Levels Uncorrected"), - N_("WB RGGB levels not corrected for WB_RGGBLevelsBlack"), samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa022, "WB_RGGBLevelsAuto", N_("WB RGGB Levels Auto"), N_("WB RGGB levels auto"), samsung2Id, makerTags, + IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printFocalLength35}, + {0xa020, "EncryptionKey", N_("Encryption Key"), N_("Encryption key"), IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printValue}, + {0xa021, "WB_RGGBLevelsUncorrected", N_("WB RGGB Levels Uncorrected"), + N_("WB RGGB levels not corrected for WB_RGGBLevelsBlack"), IfdId::samsung2Id, SectionId::makerTags, unsignedLong, + -1, printValue}, + {0xa022, "WB_RGGBLevelsAuto", N_("WB RGGB Levels Auto"), N_("WB RGGB levels auto"), IfdId::samsung2Id, + SectionId::makerTags, unsignedLong, -1, printValue}, {0xa023, "WB_RGGBLevelsIlluminator1", N_("WB RGGB Levels Illuminator1"), N_("WB RGGB levels illuminator1"), - samsung2Id, makerTags, unsignedLong, -1, printValue}, + IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printValue}, {0xa024, "WB_RGGBLevelsIlluminator2", N_("WB RGGB Levels Illuminator2"), N_("WB RGGB levels illuminator2"), - samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa028, "WB_RGGBLevelsBlack", N_("WB RGGB Levels Black"), N_("WB RGGB levels black"), samsung2Id, makerTags, - signedLong, -1, printValue}, - {0xa030, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), samsung2Id, makerTags, signedLong, -1, printValue}, - {0xa031, "ColorMatrixSRGB", N_("Color Matrix sRGB"), N_("Color matrix sRGB"), samsung2Id, makerTags, signedLong, -1, - printValue}, - {0xa032, "ColorMatrixAdobeRGB", N_("Color Matrix Adobe RGB"), N_("Color matrix Adobe RGB"), samsung2Id, makerTags, - signedLong, -1, printValue}, - {0xa040, "ToneCurve1", N_("Tone Curve 1"), N_("Tone curve 1"), samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa041, "ToneCurve2", N_("Tone Curve 2"), N_("Tone curve 2"), samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa042, "ToneCurve3", N_("Tone Curve 3"), N_("Tone curve 3"), samsung2Id, makerTags, unsignedLong, -1, printValue}, - {0xa043, "ToneCurve4", N_("Tone Curve 4"), N_("Tone curve 4"), samsung2Id, makerTags, unsignedLong, -1, printValue}, + IfdId::samsung2Id, SectionId::makerTags, unsignedLong, -1, printValue}, + {0xa028, "WB_RGGBLevelsBlack", N_("WB RGGB Levels Black"), N_("WB RGGB levels black"), IfdId::samsung2Id, + SectionId::makerTags, signedLong, -1, printValue}, + {0xa030, "ColorMatrix", N_("Color Matrix"), N_("Color matrix"), IfdId::samsung2Id, SectionId::makerTags, signedLong, + -1, printValue}, + {0xa031, "ColorMatrixSRGB", N_("Color Matrix sRGB"), N_("Color matrix sRGB"), IfdId::samsung2Id, + SectionId::makerTags, signedLong, -1, printValue}, + {0xa032, "ColorMatrixAdobeRGB", N_("Color Matrix Adobe RGB"), N_("Color matrix Adobe RGB"), IfdId::samsung2Id, + SectionId::makerTags, signedLong, -1, printValue}, + {0xa040, "ToneCurve1", N_("Tone Curve 1"), N_("Tone curve 1"), IfdId::samsung2Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0xa041, "ToneCurve2", N_("Tone Curve 2"), N_("Tone curve 2"), IfdId::samsung2Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0xa042, "ToneCurve3", N_("Tone Curve 3"), N_("Tone curve 3"), IfdId::samsung2Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0xa043, "ToneCurve4", N_("Tone Curve 4"), N_("Tone curve 4"), IfdId::samsung2Id, SectionId::makerTags, + unsignedLong, -1, printValue}, // End of list marker {0xffff, "(UnknownSamsung2MakerNoteTag)", "(UnknownSamsung2MakerNoteTag)", N_("Unknown Samsung2MakerNote tag"), - samsung2Id, makerTags, undefined, -1, printValue}, + IfdId::samsung2Id, SectionId::makerTags, undefined, -1, printValue}, }; const TagInfo* Samsung2MakerNote::tagList() { @@ -159,15 +167,19 @@ std::ostream& printValueMinus4(std::ostream& os, const Value& value, const ExifD // Samsung PictureWizard Tag Info constexpr TagInfo Samsung2MakerNote::tagInfoPw_[] = { - {0x0000, "Mode", N_("Mode"), N_("Mode"), samsungPwId, makerTags, unsignedShort, 1, EXV_PRINT_TAG(samsungPwMode)}, - {0x0001, "Color", N_("Color"), N_("Color"), samsungPwId, makerTags, unsignedShort, 1, printPwColor}, - {0x0002, "Saturation", N_("Saturation"), N_("Saturation"), samsungPwId, makerTags, unsignedShort, 1, + {0x0000, "Mode", N_("Mode"), N_("Mode"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, 1, + EXV_PRINT_TAG(samsungPwMode)}, + {0x0001, "Color", N_("Color"), N_("Color"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, 1, + printPwColor}, + {0x0002, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, + 1, printValueMinus4}, + {0x0003, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, 1, + printValueMinus4}, + {0x0004, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, 1, printValueMinus4}, - {0x0003, "Sharpness", N_("Sharpness"), N_("Sharpness"), samsungPwId, makerTags, unsignedShort, 1, printValueMinus4}, - {0x0004, "Contrast", N_("Contrast"), N_("Contrast"), samsungPwId, makerTags, unsignedShort, 1, printValueMinus4}, // End of list marker {0xffff, "(UnknownSamsungPictureWizardTag)", "(UnknownSamsungPictureWizardTag)", - N_("Unknown SamsungPictureWizard tag"), samsungPwId, makerTags, unsignedShort, 1, printValue}, + N_("Unknown SamsungPictureWizard tag"), IfdId::samsungPwId, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* Samsung2MakerNote::tagListPw() { diff --git a/src/sigmamn_int.cpp b/src/sigmamn_int.cpp index 79eb2e4e..b537ee46 100644 --- a/src/sigmamn_int.cpp +++ b/src/sigmamn_int.cpp @@ -16,40 +16,55 @@ namespace Exiv2::Internal { // Sigma (Foveon) MakerNote Tag Info constexpr TagInfo SigmaMakerNote::tagInfo_[] = { - {0x0002, "SerialNumber", N_("Serial Number"), N_("Camera serial number"), sigmaId, makerTags, asciiString, -1, + {0x0002, "SerialNumber", N_("Serial Number"), N_("Camera serial number"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0003, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0003, "DriveMode", N_("Drive Mode"), N_("Drive mode"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x0004, "ResolutionMode", N_("Resolution Mode"), N_("Resolution mode"), sigmaId, makerTags, asciiString, -1, + {0x0004, "ResolutionMode", N_("Resolution Mode"), N_("Resolution mode"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0005, "AutofocusMode", N_("Autofocus Mode"), N_("Autofocus mode"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0006, "FocusSetting", N_("Focus Setting"), N_("Focus setting"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0008, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, print0x0008}, + {0x0009, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, print0x0009}, + {0x000a, "LensRange", N_("Lens Range"), N_("Lens focal length range"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x000b, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0005, "AutofocusMode", N_("Autofocus Mode"), N_("Autofocus mode"), sigmaId, makerTags, asciiString, -1, - printValue}, - {0x0006, "FocusSetting", N_("Focus Setting"), N_("Focus setting"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x0007, "WhiteBalance", N_("White Balance"), N_("White balance"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x0008, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), sigmaId, makerTags, asciiString, -1, - print0x0008}, - {0x0009, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), sigmaId, makerTags, asciiString, -1, - print0x0009}, - {0x000a, "LensRange", N_("Lens Range"), N_("Lens focal length range"), sigmaId, makerTags, asciiString, -1, - printValue}, - {0x000b, "ColorSpace", N_("Color Space"), N_("Color space"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x000c, "Exposure", N_("Exposure"), N_("Exposure"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x000d, "Contrast", N_("Contrast"), N_("Contrast"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x000e, "Shadow", N_("Shadow"), N_("Shadow"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x000f, "Highlight", N_("Highlight"), N_("Highlight"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x0010, "Saturation", N_("Saturation"), N_("Saturation"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x0011, "Sharpness", N_("Sharpness"), N_("Sharpness"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x0012, "FillLight", N_("Fill Light"), N_("X3 Fill light"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x0014, "ColorAdjustment", N_("Color Adjustment"), N_("Color adjustment"), sigmaId, makerTags, asciiString, -1, + {0x000c, "Exposure", N_("Exposure"), N_("Exposure"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x000d, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x000e, "Shadow", N_("Shadow"), N_("Shadow"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x000f, "Highlight", N_("Highlight"), N_("Highlight"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, printStripLabel}, - {0x0015, "AdjustmentMode", N_("Adjustment Mode"), N_("Adjustment mode"), sigmaId, makerTags, asciiString, -1, + {0x0010, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x0011, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x0012, "FillLight", N_("Fill Light"), N_("X3 Fill light"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x0014, "ColorAdjustment", N_("Color Adjustment"), N_("Color adjustment"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printStripLabel}, + {0x0015, "AdjustmentMode", N_("Adjustment Mode"), N_("Adjustment mode"), IfdId::sigmaId, SectionId::makerTags, + asciiString, -1, printValue}, + {0x0016, "Quality", N_("Quality"), N_("Quality"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printStripLabel}, + {0x0017, "Firmware", N_("Firmware"), N_("Firmware"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, + printValue}, + {0x0018, "Software", N_("Software"), N_("Software"), IfdId::sigmaId, SectionId::makerTags, asciiString, -1, printValue}, - {0x0016, "Quality", N_("Quality"), N_("Quality"), sigmaId, makerTags, asciiString, -1, printStripLabel}, - {0x0017, "Firmware", N_("Firmware"), N_("Firmware"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x0018, "Software", N_("Software"), N_("Software"), sigmaId, makerTags, asciiString, -1, printValue}, - {0x0019, "AutoBracket", N_("Auto Bracket"), N_("Auto bracket"), sigmaId, makerTags, asciiString, -1, printValue}, + {0x0019, "AutoBracket", N_("Auto Bracket"), N_("Auto bracket"), IfdId::sigmaId, SectionId::makerTags, asciiString, + -1, printValue}, // End of list marker - {0xffff, "(UnknownSigmaMakerNoteTag)", "(UnknownSigmaMakerNoteTag)", N_("Unknown SigmaMakerNote tag"), sigmaId, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownSigmaMakerNoteTag)", "(UnknownSigmaMakerNoteTag)", N_("Unknown SigmaMakerNote tag"), + IfdId::sigmaId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* SigmaMakerNote::tagList() { diff --git a/src/sonymn_int.cpp b/src/sonymn_int.cpp index 0f4d2483..56e28d62 100644 --- a/src/sonymn_int.cpp +++ b/src/sonymn_int.cpp @@ -263,100 +263,107 @@ std::ostream& SonyMakerNote::printImageSize(std::ostream& os, const Value& value // Sony MakerNote Tag Info constexpr TagInfo SonyMakerNote::tagInfo_[] = { - {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), sony1Id, makerTags, unsignedLong, -1, - printMinoltaSonyImageQuality}, - {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), sony1Id, - makerTags, signedRational, -1, print0x9204}, - {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), sony1Id, makerTags, unsignedLong, - -1, printMinoltaSonyTeleconverterModel}, - {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"), sony1Id, - makerTags, unsignedLong, -1, printValue}, - {0x0114, "CameraSettings", N_("Camera Settings"), N_("Camera Settings"), sony1Id, makerTags, undefined, -1, + {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, + -1, printMinoltaSonyImageQuality}, + {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"), + IfdId::sony1Id, SectionId::makerTags, signedRational, -1, print0x9204}, + {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), IfdId::sony1Id, + SectionId::makerTags, unsignedLong, -1, printMinoltaSonyTeleconverterModel}, + {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"), IfdId::sony1Id, + SectionId::makerTags, unsignedLong, -1, printValue}, + {0x0114, "CameraSettings", N_("Camera Settings"), N_("Camera Settings"), IfdId::sony1Id, SectionId::makerTags, + undefined, -1, printValue}, + {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, printMinoltaSonyWhiteBalanceStd}, + {0x0116, "0x0116", "0x0116", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, + {0x0E00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, - {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), sony1Id, makerTags, unsignedLong, -1, - printMinoltaSonyWhiteBalanceStd}, - {0x0116, "0x0116", "0x0116", N_("Unknown"), sony1Id, makerTags, undefined, -1, printValue}, - {0x0E00, "PrintIM", N_("Print IM"), N_("PrintIM information"), sony1Id, makerTags, undefined, -1, printValue}, - {0x1000, "MultiBurstMode", N_("Multi Burst Mode"), N_("Multi Burst Mode"), sony1Id, makerTags, undefined, -1, - printMinoltaSonyBoolValue}, - {0x1001, "MultiBurstImageWidth", N_("Multi Burst Image Width"), N_("Multi Burst Image Width"), sony1Id, makerTags, - unsignedShort, -1, printValue}, - {0x1002, "MultiBurstImageHeight", N_("Multi Burst Image Height"), N_("Multi Burst Image Height"), sony1Id, - makerTags, unsignedShort, -1, printValue}, + {0x1000, "MultiBurstMode", N_("Multi Burst Mode"), N_("Multi Burst Mode"), IfdId::sony1Id, SectionId::makerTags, + undefined, -1, printMinoltaSonyBoolValue}, + {0x1001, "MultiBurstImageWidth", N_("Multi Burst Image Width"), N_("Multi Burst Image Width"), IfdId::sony1Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {0x1002, "MultiBurstImageHeight", N_("Multi Burst Image Height"), N_("Multi Burst Image Height"), IfdId::sony1Id, + SectionId::makerTags, unsignedShort, -1, printValue}, // TODO : Implement Panorama tags decoding. - {0x1003, "Panorama", N_("Panorama"), N_("Panorama"), sony1Id, makerTags, undefined, -1, printValue}, - {0x2000, "0x2000", "0x2000", N_("Unknown"), sony1Id, makerTags, undefined, -1, printValue}, - {0x2001, "PreviewImage", N_("Preview Image"), N_("JPEG preview image"), sony1Id, makerTags, undefined, -1, + {0x1003, "Panorama", N_("Panorama"), N_("Panorama"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, + printValue}, + {0x2000, "0x2000", "0x2000", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, + {0x2001, "PreviewImage", N_("Preview Image"), N_("JPEG preview image"), IfdId::sony1Id, SectionId::makerTags, + undefined, -1, printValue}, + {0x2002, "0x2002", "0x2002", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printValue}, + {0x2003, "0x2003", "0x2003", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, asciiString, -1, printValue}, + {0x2004, "Contrast", "Contrast", N_("Contrast"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, + {0x2005, "Saturation", "Saturation", N_("Saturation"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, - {0x2002, "0x2002", "0x2002", N_("Unknown"), sony1Id, makerTags, unsignedLong, -1, printValue}, - {0x2003, "0x2003", "0x2003", N_("Unknown"), sony1Id, makerTags, asciiString, -1, printValue}, - {0x2004, "Contrast", "Contrast", N_("Contrast"), sony1Id, makerTags, signedLong, -1, printValue}, - {0x2005, "Saturation", "Saturation", N_("Saturation"), sony1Id, makerTags, signedLong, -1, printValue}, - {0x2006, "0x2006", "0x2006", N_("Unknown"), sony1Id, makerTags, signedLong, -1, printValue}, - {0x2007, "0x2007", "0x2007", N_("Unknown"), sony1Id, makerTags, signedLong, -1, printValue}, - {0x2008, "0x2008", "0x2008", N_("Unknown"), sony1Id, makerTags, signedLong, -1, printValue}, - {0x2009, "0x2009", "0x2009", N_("Unknown"), sony1Id, makerTags, unsignedShort, -1, printValue}, - {0x200A, "AutoHDR", N_("Auto HDR"), N_("High Definition Range Mode"), sony1Id, makerTags, unsignedLong, -1, - EXV_PRINT_TAG(sonyHDRMode)}, + {0x2006, "0x2006", "0x2006", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, + {0x2007, "0x2007", "0x2007", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, + {0x2008, "0x2008", "0x2008", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, signedLong, -1, printValue}, + {0x2009, "0x2009", "0x2009", N_("Unknown"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, printValue}, + {0x200A, "AutoHDR", N_("Auto HDR"), N_("High Definition Range Mode"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, EXV_PRINT_TAG(sonyHDRMode)}, // TODO : Implement Shot Info tags decoding. - {0x3000, "ShotInfo", N_("Shot Info"), N_("Shot Information"), sony1Id, makerTags, undefined, -1, printValue}, - {0xB000, "FileFormat", N_("File Format"), N_("File Format"), sony1Id, makerTags, unsignedByte, -1, print0xb000}, - {0xB001, "SonyModelID", N_("Sony Model ID"), N_("Sony Model ID"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyModelId)}, - {0xB020, "ColorReproduction", N_("Color Reproduction"), N_("Color Reproduction"), sony1Id, makerTags, asciiString, - -1, printValue}, - {0xb021, "ColorTemperature", N_("Color Temperature"), N_("Color Temperature"), sony1Id, makerTags, unsignedLong, -1, + {0x3000, "ShotInfo", N_("Shot Info"), N_("Shot Information"), IfdId::sony1Id, SectionId::makerTags, undefined, -1, printValue}, + {0xB000, "FileFormat", N_("File Format"), N_("File Format"), IfdId::sony1Id, SectionId::makerTags, unsignedByte, -1, + print0xb000}, + {0xB001, "SonyModelID", N_("Sony Model ID"), N_("Sony Model ID"), IfdId::sony1Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(sonyModelId)}, + {0xB020, "ColorReproduction", N_("Color Reproduction"), N_("Color Reproduction"), IfdId::sony1Id, + SectionId::makerTags, asciiString, -1, printValue}, + {0xb021, "ColorTemperature", N_("Color Temperature"), N_("Color Temperature"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, printValue}, {0xB022, "ColorCompensationFilter", N_("Color Compensation Filter"), - N_("Color Compensation Filter: negative is green, positive is magenta"), sony1Id, makerTags, unsignedLong, -1, - printValue}, - {0xB023, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), sony1Id, makerTags, unsignedLong, -1, + N_("Color Compensation Filter: negative is green, positive is magenta"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, printValue}, + {0xB023, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonySceneMode}, - {0xB024, "ZoneMatching", N_("Zone Matching"), N_("Zone Matching"), sony1Id, makerTags, unsignedLong, -1, - printMinoltaSonyZoneMatching}, - {0xB025, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), sony1Id, makerTags, - unsignedLong, -1, EXV_PRINT_TAG(print0xb025)}, - {0xB026, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), sony1Id, makerTags, - unsignedLong, -1, printMinoltaSonyBoolValue}, - {0xB027, "LensID", N_("Lens ID"), N_("Lens identifier"), sony1Id, makerTags, unsignedLong, -1, + {0xB024, "ZoneMatching", N_("Zone Matching"), N_("Zone Matching"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, printMinoltaSonyZoneMatching}, + {0xB025, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), IfdId::sony1Id, + SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(print0xb025)}, + {0xB026, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::sony1Id, + SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue}, + {0xB027, "LensID", N_("Lens ID"), N_("Lens identifier"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyLensID}, - {0xB028, "MinoltaMakerNote", N_("Minolta MakerNote"), N_("Minolta MakerNote"), sony1Id, makerTags, undefined, -1, - printValue}, - {0xB029, "ColorMode", N_("Color Mode"), N_("Color Mode"), sony1Id, makerTags, unsignedLong, -1, + {0xB028, "MinoltaMakerNote", N_("Minolta MakerNote"), N_("Minolta MakerNote"), IfdId::sony1Id, SectionId::makerTags, + undefined, -1, printValue}, + {0xB029, "ColorMode", N_("Color Mode"), N_("Color Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyColorMode}, - {0xB02B, "FullImageSize", N_("Full Image Size"), N_("Full Image Size"), sony1Id, makerTags, unsignedLong, -1, - printImageSize}, - {0xB02C, "PreviewImageSize", N_("Preview Image Size"), N_("Preview image size"), sony1Id, makerTags, unsignedLong, - -1, printImageSize}, - {0xB040, "Macro", N_("Macro"), N_("Macro"), sony1Id, makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyMacroMode)}, - {0xB041, "ExposureMode", N_("Exposure Mode"), N_("Exposure Mode"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyExposureMode)}, - {0xB042, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), sony1Id, makerTags, unsignedShort, -1, + {0xB02B, "FullImageSize", N_("Full Image Size"), N_("Full Image Size"), IfdId::sony1Id, SectionId::makerTags, + unsignedLong, -1, printImageSize}, + {0xB02C, "PreviewImageSize", N_("Preview Image Size"), N_("Preview image size"), IfdId::sony1Id, + SectionId::makerTags, unsignedLong, -1, printImageSize}, + {0xB040, "Macro", N_("Macro"), N_("Macro"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, + EXV_PRINT_TAG(sonyMacroMode)}, + {0xB041, "ExposureMode", N_("Exposure Mode"), N_("Exposure Mode"), IfdId::sony1Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(sonyExposureMode)}, + {0xB042, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyFocusMode)}, - {0xB043, "AFMode", N_("AF Mode"), N_("AF Mode"), sony1Id, makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyAFMode)}, - {0xB044, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyAFIlluminator)}, - {0xB047, "JPEGQuality", N_("JPEG Quality"), N_("JPEG Quality"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyJPEGQuality)}, - {0xB048, "FlashLevel", N_("Flash Level"), N_("Flash Level"), sony1Id, makerTags, signedShort, -1, + {0xB043, "AFMode", N_("AF Mode"), N_("AF Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, + EXV_PRINT_TAG(sonyAFMode)}, + {0xB044, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), IfdId::sony1Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(sonyAFIlluminator)}, + {0xB047, "JPEGQuality", N_("JPEG Quality"), N_("JPEG Quality"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(sonyJPEGQuality)}, + {0xB048, "FlashLevel", N_("Flash Level"), N_("Flash Level"), IfdId::sony1Id, SectionId::makerTags, signedShort, -1, EXV_PRINT_TAG(sonyFlashLevel)}, - {0xB049, "ReleaseMode", N_("Release Mode"), N_("Release Mode"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyReleaseMode)}, - {0xB04A, "SequenceNumber", N_("Sequence Number"), N_("Shot number in continuous burst mode"), sony1Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(sonySequenceNumber)}, - {0xB04B, "AntiBlur", N_("Anti-Blur"), N_("Anti-Blur"), sony1Id, makerTags, unsignedShort, -1, + {0xB049, "ReleaseMode", N_("Release Mode"), N_("Release Mode"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, + -1, EXV_PRINT_TAG(sonyReleaseMode)}, + {0xB04A, "SequenceNumber", N_("Sequence Number"), N_("Shot number in continuous burst mode"), IfdId::sony1Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonySequenceNumber)}, + {0xB04B, "AntiBlur", N_("Anti-Blur"), N_("Anti-Blur"), IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyAntiBlur)}, {0xB04E, "LongExposureNoiseReduction", N_("Long Exposure Noise Reduction"), N_("Long Exposure Noise Reduction"), - sony1Id, makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyLongExposureNoiseReduction)}, - {0xB04F, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), sony1Id, makerTags, - unsignedShort, -1, EXV_PRINT_TAG(print0xb04f)}, - {0xB052, "IntelligentAuto", N_("Intelligent Auto"), N_("Intelligent Auto"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyIntelligentAuto)}, - {0xB054, "WhiteBalance2", N_("White Balance 2"), N_("White balance 2"), sony1Id, makerTags, unsignedShort, -1, - EXV_PRINT_TAG(sonyWhiteBalance)}, + IfdId::sony1Id, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(sonyLongExposureNoiseReduction)}, + {0xB04F, "DynamicRangeOptimizer", N_("Dynamic Range Optimizer"), N_("Dynamic Range Optimizer"), IfdId::sony1Id, + SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(print0xb04f)}, + {0xB052, "IntelligentAuto", N_("Intelligent Auto"), N_("Intelligent Auto"), IfdId::sony1Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(sonyIntelligentAuto)}, + {0xB054, "WhiteBalance2", N_("White Balance 2"), N_("White balance 2"), IfdId::sony1Id, SectionId::makerTags, + unsignedShort, -1, EXV_PRINT_TAG(sonyWhiteBalance)}, // End of list marker - {0xffff, "(UnknownSony1MakerNoteTag)", "(UnknownSony1MakerNoteTag)", N_("Unknown Sony1MakerNote tag"), sony1Id, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownSony1MakerNoteTag)", "(UnknownSony1MakerNoteTag)", N_("Unknown Sony1MakerNote tag"), + IfdId::sony1Id, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* SonyMakerNote::tagList() { @@ -447,69 +454,74 @@ constexpr TagDetails sonyExposureLevelIncrements[] = {{33, "1/3 EV"}, {50, "1/2 constexpr TagInfo SonyMakerNote::tagInfoCs_[] = { // NOTE: A700 only - {0x0004, "DriveMode", N_("Drive Mode"), N_("Drive Mode"), sony1CsId, makerTags, unsignedShort, 1, + {0x0004, "DriveMode", N_("Drive Mode"), N_("Drive Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyDriveModeStd)}, // NOTE: A700 only - {0x0006, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune"), sony1CsId, makerTags, - signedShort, 1, printValue}, - {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), sony1CsId, makerTags, unsignedShort, 1, + {0x0006, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune"), IfdId::sony1CsId, + SectionId::makerTags, signedShort, 1, printValue}, + {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCSFocusMode)}, - {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), sony1CsId, makerTags, unsignedShort, 1, - printMinoltaSonyAFAreaMode}, - {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), sony1CsId, makerTags, - unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, - {0x0015, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyMeteringMode)}, - {0x0016, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), sony1CsId, makerTags, unsignedShort, 1, printValue}, + {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, printMinoltaSonyAFAreaMode}, + {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1CsId, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, + {0x0015, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringMode)}, + {0x0016, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, + 1, printValue}, {0x0018, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic Range Optimizer Mode"), - sony1CsId, makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, + IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, {0x0019, "DynamicRangeOptimizerLevel", N_("Dynamic Range Optimizer Level"), N_("Dynamic Range Optimizer Level"), - sony1CsId, makerTags, unsignedShort, 1, printValue}, - {0x001A, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyCreativeStyle)}, - {0x001C, "Sharpness", N_("Sharpness"), N_("Sharpness"), sony1CsId, makerTags, unsignedShort, 1, printValue}, - {0x001D, "Contrast", N_("Contrast"), N_("Contrast"), sony1CsId, makerTags, unsignedShort, 1, printValue}, - {0x001E, "Saturation", N_("Saturation"), N_("Saturation"), sony1CsId, makerTags, unsignedShort, 1, printValue}, - {0x001F, "ZoneMatchingValue", N_("Zone Matching Value"), N_("Zone Matching Value"), sony1CsId, makerTags, - unsignedShort, 1, printValue}, - {0x0022, "Brightness", N_("Brightness"), N_("Brightness"), sony1CsId, makerTags, unsignedShort, 1, printValue}, - {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), sony1CsId, makerTags, unsignedShort, 1, + IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x001A, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyCreativeStyle)}, + {0x001C, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x001D, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x001E, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x001F, "ZoneMatchingValue", N_("Zone Matching Value"), N_("Zone Matching Value"), IfdId::sony1CsId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0022, "Brightness", N_("Brightness"), N_("Brightness"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFlashMode)}, // NOTE: A700 only {0x0028, "PrioritySetupShutterRelease", N_("Priority Setup Shutter Release"), N_("Priority Setup Shutter Release"), - sony1CsId, makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease}, + IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease}, // NOTE: A700 only - {0x0029, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyAFIlluminatorCS)}, + {0x0029, "AFIlluminator", N_("AF Illuminator"), N_("AF Illuminator"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyAFIlluminatorCS)}, // NOTE: A700 only - {0x002A, "AFWithShutter", N_("AF With Shutter"), N_("AF With Shutter"), sony1CsId, makerTags, unsignedShort, 1, - printMinoltaSonyBoolInverseValue}, + {0x002A, "AFWithShutter", N_("AF With Shutter"), N_("AF With Shutter"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, printMinoltaSonyBoolInverseValue}, // NOTE: A700 only {0x002B, "LongExposureNoiseReduction", N_("Long Exposure Noise Reduction"), N_("Long Exposure Noise Reduction"), - sony1CsId, makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, // NOTE: A700 only - {0x002C, "HighISONoiseReduction", N_("High ISO NoiseReduction"), N_("High ISO NoiseReduction"), sony1CsId, - makerTags, unsignedShort, 1, printValue}, + {0x002C, "HighISONoiseReduction", N_("High ISO NoiseReduction"), N_("High ISO NoiseReduction"), IfdId::sony1CsId, + SectionId::makerTags, unsignedShort, 1, printValue}, // NOTE: A700 only - {0x002D, "ImageStyle", N_("Image Style"), N_("Image Style"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyImageStyle)}, - {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyExposureProgram)}, - {0x003D, "ImageStabilization", N_("Image Stabilization"), N_("Image Stabilization"), sony1CsId, makerTags, - unsignedShort, 1, printMinoltaSonyBoolValue}, - {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), sony1CsId, makerTags, unsignedShort, 1, + {0x002D, "ImageStyle", N_("Image Style"), N_("Image Style"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, + 1, EXV_PRINT_TAG(sonyImageStyle)}, + {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyExposureProgram)}, + {0x003D, "ImageStabilization", N_("Image Stabilization"), N_("Image Stabilization"), IfdId::sony1CsId, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue}, + {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyRotation}, - {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyImageSize)}, - {0x0055, "AspectRatio", N_("Aspect Ratio"), N_("Aspect Ratio"), sony1CsId, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyAspectRatio)}, - {0x0056, "Quality", N_("Quality"), N_("Quality"), sony1CsId, makerTags, unsignedShort, 1, + {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyImageSize)}, + {0x0055, "AspectRatio", N_("Aspect Ratio"), N_("Aspect Ratio"), IfdId::sony1CsId, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyAspectRatio)}, + {0x0056, "Quality", N_("Quality"), N_("Quality"), IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyQualityCs}, - {0x0058, "ExposureLevelIncrements", N_("Exposure Level Increments"), N_("Exposure Level Increments"), sony1CsId, - makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureLevelIncrements)}, + {0x0058, "ExposureLevelIncrements", N_("Exposure Level Increments"), N_("Exposure Level Increments"), + IfdId::sony1CsId, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureLevelIncrements)}, // End of list marker - {0xffff, "(UnknownSony1CsTag)", "(UnknownSony1CsTag)", N_("Unknown Sony1 Camera Settings tag"), sony1CsId, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownSony1CsTag)", "(UnknownSony1CsTag)", N_("Unknown Sony1 Camera Settings tag"), IfdId::sony1CsId, + SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListCs() { @@ -524,35 +536,39 @@ const TagInfo* SonyMakerNote::tagListCs() { // Warnings: Exiftool database give a list of tags shorted in decimal mode, not hexadecimal. constexpr TagInfo SonyMakerNote::tagInfoCs2_[] = { - {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), sony1Cs2Id, makerTags, unsignedShort, 1, + {0x0010, "FocusMode", N_("Focus Mode"), N_("Focus Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCSFocusMode)}, - {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), sony1Cs2Id, makerTags, unsignedShort, 1, - printMinoltaSonyAFAreaMode}, - {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), sony1Cs2Id, makerTags, - unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, - {0x0013, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), sony1Cs2Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyMeteringMode)}, - {0x0014, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), sony1Cs2Id, makerTags, unsignedShort, 1, printValue}, + {0x0011, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, + unsignedShort, 1, printMinoltaSonyAFAreaMode}, + {0x0012, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1Cs2Id, + SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint}, + {0x0013, "MeteringMode", N_("Metering Mode"), N_("Metering Mode"), IfdId::sony1Cs2Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringMode)}, + {0x0014, "ISOSetting", N_("ISO Setting"), N_("ISO Setting"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, + 1, printValue}, {0x0016, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic Range Optimizer Mode"), - sony1Cs2Id, makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, + IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode}, {0x0017, "DynamicRangeOptimizerLevel", N_("Dynamic Range Optimizer Level"), N_("Dynamic Range Optimizer Level"), - sony1Cs2Id, makerTags, unsignedShort, 1, printValue}, - {0x0018, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), sony1Cs2Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyCreativeStyle)}, - {0x0019, "Sharpness", N_("Sharpness"), N_("Sharpness"), sony1Cs2Id, makerTags, unsignedShort, 1, printValue}, - {0x001A, "Contrast", N_("Contrast"), N_("Contrast"), sony1Cs2Id, makerTags, unsignedShort, 1, printValue}, - {0x001B, "Saturation", N_("Saturation"), N_("Saturation"), sony1Cs2Id, makerTags, unsignedShort, 1, printValue}, - {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), sony1Cs2Id, makerTags, unsignedShort, 1, + IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, + {0x0018, "CreativeStyle", N_("Creative Style"), N_("Creative Style"), IfdId::sony1Cs2Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyCreativeStyle)}, + {0x0019, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x001A, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, + printValue}, + {0x001B, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, + 1, printValue}, + {0x0023, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFlashMode)}, - {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), sony1Cs2Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyExposureProgram)}, - {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), sony1Cs2Id, makerTags, unsignedShort, 1, + {0x003C, "ExposureProgram", N_("Exposure Program"), N_("Exposure Program"), IfdId::sony1Cs2Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyExposureProgram)}, + {0x003F, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyRotation}, - {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), sony1Cs2Id, makerTags, unsignedShort, 1, - EXV_PRINT_TAG(sonyImageSize)}, + {0x0054, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1Cs2Id, SectionId::makerTags, + unsignedShort, 1, EXV_PRINT_TAG(sonyImageSize)}, // End of list marker - {0xffff, "(UnknownSony1Cs2Tag)", "(UnknownSony1Cs2Tag)", N_("Unknown Sony1 Camera Settings 2 tag"), sony1Cs2Id, - makerTags, unsignedShort, 1, printValue}, + {0xffff, "(UnknownSony1Cs2Tag)", "(UnknownSony1Cs2Tag)", N_("Unknown Sony1 Camera Settings 2 tag"), + IfdId::sony1Cs2Id, SectionId::makerTags, unsignedShort, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListCs2() { @@ -575,16 +591,16 @@ constexpr TagDetails sony2FpAFAreaMode[] = {{0, N_("Multi")}, //! Sony Tag 9402 Sony2Fp (FocusPosition) constexpr TagInfo SonyMakerNote::tagInfoFp_[] = { {0x04, "AmbientTemperature", N_("Ambient temperature"), N_("Temperature of the surroundings (in degrees Celsius)"), - sony2FpId, makerTags, signedByte, 1, printSony2FpAmbientTemperature}, - {0x16, "FocusMode", N_("Focus mode"), N_("Focus mode"), sony2FpId, makerTags, unsignedByte, 1, + IfdId::sony2FpId, SectionId::makerTags, signedByte, 1, printSony2FpAmbientTemperature}, + {0x16, "FocusMode", N_("Focus mode"), N_("Focus mode"), IfdId::sony2FpId, SectionId::makerTags, unsignedByte, 1, printSony2FpFocusMode}, - {0x17, "AFAreaMode", N_("AF area mode"), N_("Auto focus area mode"), sony2FpId, makerTags, unsignedByte, 1, - EXV_PRINT_TAG(sony2FpAFAreaMode)}, - {0x2d, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), sony2FpId, makerTags, unsignedByte, 1, - printSony2FpFocusPosition2}, + {0x17, "AFAreaMode", N_("AF area mode"), N_("Auto focus area mode"), IfdId::sony2FpId, SectionId::makerTags, + unsignedByte, 1, EXV_PRINT_TAG(sony2FpAFAreaMode)}, + {0x2d, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), IfdId::sony2FpId, SectionId::makerTags, + unsignedByte, 1, printSony2FpFocusPosition2}, // End of list marker - {0xffff, "(UnknownSony2FpTag)", "(Unknown Sony2Fp tag)", "(Unknown Sony2Fp tag)", sony2FpId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownSony2FpTag)", "(Unknown Sony2Fp tag)", "(Unknown Sony2Fp tag)", IfdId::sony2FpId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* SonyMakerNote::tagListFp() { @@ -664,10 +680,10 @@ std::ostream& SonyMakerNote::printSony2FpFocusPosition2(std::ostream& os, const //! Sony Tag 9403 SonyMisc1 constexpr TagInfo SonyMakerNote::tagInfoSonyMisc1_[] = { {0x05, "CameraTemperature", N_("Camera temperature"), N_("Internal camera temperature (in degrees Celsius)"), - sonyMisc1Id, makerTags, signedByte, -1, printSonyMisc1CameraTemperature}, + IfdId::sonyMisc1Id, SectionId::makerTags, signedByte, -1, printSonyMisc1CameraTemperature}, // End of list marker - {0xffff, "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", sonyMisc1Id, makerTags, - unsignedByte, -1, printValue}}; + {0xffff, "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", "(UnknownSonyMisc1Tag)", IfdId::sonyMisc1Id, + SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonyMisc1() { return tagInfoSonyMisc1_; @@ -722,17 +738,17 @@ constexpr TagDetails sonyExposureProgram3[] = {{0, N_("Program AE")}, //! Sony Tag 9404b SonyMisc2b tags constexpr TagInfo SonyMakerNote::tagInfoSonyMisc2b_[] = { - {12, "ExposureProgram", N_("Exposure program"), N_("Exposure program"), sonyMisc2bId, makerTags, unsignedByte, -1, - EXV_PRINT_TAG(sonyExposureProgram3)}, - {14, "IntelligentAuto", N_("Intelligent auto"), N_("Whether intelligent auto was used"), sonyMisc2bId, makerTags, - unsignedByte, -1, printMinoltaSonyBoolValue}, - {30, "LensZoomPosition", N_("Lens zoom position"), N_("Lens zoom position (in %)"), sonyMisc2bId, makerTags, - unsignedShort, -1, printSonyMisc2bLensZoomPosition}, - {32, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), sonyMisc2bId, makerTags, unsignedByte, -1, - printSonyMisc2bFocusPosition2}, + {12, "ExposureProgram", N_("Exposure program"), N_("Exposure program"), IfdId::sonyMisc2bId, SectionId::makerTags, + unsignedByte, -1, EXV_PRINT_TAG(sonyExposureProgram3)}, + {14, "IntelligentAuto", N_("Intelligent auto"), N_("Whether intelligent auto was used"), IfdId::sonyMisc2bId, + SectionId::makerTags, unsignedByte, -1, printMinoltaSonyBoolValue}, + {30, "LensZoomPosition", N_("Lens zoom position"), N_("Lens zoom position (in %)"), IfdId::sonyMisc2bId, + SectionId::makerTags, unsignedShort, -1, printSonyMisc2bLensZoomPosition}, + {32, "FocusPosition2", N_("Focus position 2"), N_("Focus position 2"), IfdId::sonyMisc2bId, SectionId::makerTags, + unsignedByte, -1, printSonyMisc2bFocusPosition2}, // End of list marker - {0xffff, "(UnknownSonyMisc2bTag)", "(Unknown SonyMisc2b tag)", "(Unknown SonyMisc2b tag)", sonyMisc2bId, makerTags, - unsignedByte, -1, printValue}}; + {0xffff, "(UnknownSonyMisc2bTag)", "(Unknown SonyMisc2b tag)", "(Unknown SonyMisc2b tag)", IfdId::sonyMisc2bId, + SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonyMisc2b() { return tagInfoSonyMisc2b_; @@ -805,32 +821,32 @@ constexpr TagDetails sonyMisc3cCameraOrientation[] = { //! SonyMisc3c tags (Tag 9400c) constexpr TagInfo SonyMakerNote::tagInfoSonyMisc3c_[] = { - {9, "ReleaseMode2", N_("Release mode 2"), N_("Release mode 2"), sonyMisc3cId, makerTags, unsignedByte, -1, - EXV_PRINT_TAG(sonyReleaseMode2)}, + {9, "ReleaseMode2", N_("Release mode 2"), N_("Release mode 2"), IfdId::sonyMisc3cId, SectionId::makerTags, + unsignedByte, -1, EXV_PRINT_TAG(sonyReleaseMode2)}, {10, "ShotNumberSincePowerUp", N_("Shot number since power up"), - N_("Number of photos taken since the camera was powered up"), sonyMisc3cId, makerTags, unsignedLong, -1, - printSonyMisc3cShotNumberSincePowerUp}, + N_("Number of photos taken since the camera was powered up"), IfdId::sonyMisc3cId, SectionId::makerTags, + unsignedLong, -1, printSonyMisc3cShotNumberSincePowerUp}, {18, "SequenceImageNumber", N_("Sequence image number"), N_("Number of images captured in burst sequence"), - sonyMisc3cId, makerTags, unsignedLong, -1, printSonyMisc3cSequenceNumber}, + IfdId::sonyMisc3cId, SectionId::makerTags, unsignedLong, -1, printSonyMisc3cSequenceNumber}, // In Exiftool, "SequenceLength1" is called "SequenceLength. Renamed due to clash of names." - {22, "SequenceLength1", N_("Sequence length 1"), N_("Length of the sequence of photos taken"), sonyMisc3cId, - makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength1)}, - {26, "SequenceFileNumber", N_("Sequence file number"), N_("File number in burst sequence"), sonyMisc3cId, makerTags, - unsignedLong, -1, printSonyMisc3cSequenceNumber}, + {22, "SequenceLength1", N_("Sequence length 1"), N_("Length of the sequence of photos taken"), IfdId::sonyMisc3cId, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength1)}, + {26, "SequenceFileNumber", N_("Sequence file number"), N_("File number in burst sequence"), IfdId::sonyMisc3cId, + SectionId::makerTags, unsignedLong, -1, printSonyMisc3cSequenceNumber}, // In Exiftool, "SequenceLength2" is called "SequenceLength". Renamed due to clash of names." - {30, "SequenceLength2", N_("Sequence length 2"), N_("Length of the sequence of photos taken"), sonyMisc3cId, - makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength2)}, + {30, "SequenceLength2", N_("Sequence length 2"), N_("Length of the sequence of photos taken"), IfdId::sonyMisc3cId, + SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cSequenceLength2)}, {41, "CameraOrientation", N_("Camera orientation"), N_("Orientation of the camera when the photo was taken"), - sonyMisc3cId, makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cCameraOrientation)}, - {42, "Quality2", N_("Quality 2"), N_("Quality 2"), sonyMisc3cId, makerTags, unsignedByte, -1, + IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(sonyMisc3cCameraOrientation)}, + {42, "Quality2", N_("Quality 2"), N_("Quality 2"), IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, printSonyMisc3cQuality2}, - {71, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), sonyMisc3cId, makerTags, unsignedShort, - -1, printSonyMisc3cSonyImageHeight}, - {83, "ModelReleaseYear", N_("Model release year"), N_("Year that the model of camera was released"), sonyMisc3cId, - makerTags, unsignedByte, -1, printSonyMisc3cModelReleaseYear}, + {71, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), IfdId::sonyMisc3cId, + SectionId::makerTags, unsignedShort, -1, printSonyMisc3cSonyImageHeight}, + {83, "ModelReleaseYear", N_("Model release year"), N_("Year that the model of camera was released"), + IfdId::sonyMisc3cId, SectionId::makerTags, unsignedByte, -1, printSonyMisc3cModelReleaseYear}, // End of list marker - {0xffff, "(UnknownSonyMisc3c)", "(Unknown SonyMisc3c Tag)", N_("Unknown SonyMisc23 tag"), sonyMisc3cId, makerTags, - asciiString, -1, printValue}, + {0xffff, "(UnknownSonyMisc3c)", "(Unknown SonyMisc3c Tag)", N_("Unknown SonyMisc23 tag"), IfdId::sonyMisc3cId, + SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* SonyMakerNote::tagListSonyMisc3c() { @@ -961,20 +977,20 @@ constexpr TagInfo SonyMakerNote::tagInfoSonySInfo1_[] = { // "FaceInfoOffset" (2) and "FaceInfoLength" (50) does not make sense. // The values are all connected and changing one without the rest will // corrupt the data. - {6, "SonyDateTime", N_("Sony date/time"), N_("Date and time when the photo was captured"), sonySInfo1Id, makerTags, - asciiString, -1, printValue}, - {26, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), sonySInfo1Id, makerTags, unsignedShort, - -1, printValue}, - {28, "SonyImageWidth", N_("Sony image width"), N_("Width of the image"), sonySInfo1Id, makerTags, unsignedShort, -1, - printValue}, - {48, "FacesDetected", N_("Faces detected"), N_("Number of faces detected in the image"), sonySInfo1Id, makerTags, + {6, "SonyDateTime", N_("Sony date/time"), N_("Date and time when the photo was captured"), IfdId::sonySInfo1Id, + SectionId::makerTags, asciiString, -1, printValue}, + {26, "SonyImageHeight", N_("Sony image height"), N_("Height of the image"), IfdId::sonySInfo1Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {28, "SonyImageWidth", N_("Sony image width"), N_("Width of the image"), IfdId::sonySInfo1Id, SectionId::makerTags, unsignedShort, -1, printValue}, - {52, "MetaVersion", N_("Meta version"), N_("Sony meta version"), sonySInfo1Id, makerTags, asciiString, -1, - printValue}, + {48, "FacesDetected", N_("Faces detected"), N_("Number of faces detected in the image"), IfdId::sonySInfo1Id, + SectionId::makerTags, unsignedShort, -1, printValue}, + {52, "MetaVersion", N_("Meta version"), N_("Sony meta version"), IfdId::sonySInfo1Id, SectionId::makerTags, + asciiString, -1, printValue}, // TODO: Add FaceInfo1 (72) and FaceInfo2 (94) which are sub-groups of tags. // End of list marker - {0xffff, "(UnknownsonySInfo1Tag)", "(Unknown SonySInfo1 Tag)", "(Unknown SonySInfo1 Tag)", sonySInfo1Id, makerTags, - unsignedByte, -1, printValue}}; + {0xffff, "(UnknownsonySInfo1Tag)", "(Unknown SonySInfo1 Tag)", "(Unknown SonySInfo1 Tag)", IfdId::sonySInfo1Id, + SectionId::makerTags, unsignedByte, -1, printValue}}; const TagInfo* SonyMakerNote::tagListSonySInfo1() { return tagInfoSonySInfo1_; @@ -982,63 +998,81 @@ const TagInfo* SonyMakerNote::tagListSonySInfo1() { //! Sony Tag 2010 Sony2010 (Miscellaneous) constexpr TagInfo SonyMakerNote::tagInfo2010e_[] = { - {0, "SequenceImageNumber", N_("Sequence Image Number"), N_("Sequence Image Number"), sony2010eId, makerTags, - unsignedLong, 1, printValue}, - {4, "SequenceFileNumber", N_("SequenceFileNumber"), N_("SequenceFileNumber"), sony2010eId, makerTags, unsignedLong, + {0, "SequenceImageNumber", N_("Sequence Image Number"), N_("Sequence Image Number"), IfdId::sony2010eId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {4, "SequenceFileNumber", N_("SequenceFileNumber"), N_("SequenceFileNumber"), IfdId::sony2010eId, + SectionId::makerTags, unsignedLong, 1, printValue}, + {8, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), IfdId::sony2010eId, SectionId::makerTags, unsignedLong, 1, printValue}, - {8, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), sony2010eId, makerTags, unsignedLong, 1, printValue}, - {540, "DigitalZoomRatio", N_("DigitalZoomRatio"), N_("DigitalZoomRatio"), sony2010eId, makerTags, unsignedByte, 1, - printValue}, - {556, "SonyDateTime", N_("SonyDateTime"), N_("SonyDateTime"), sony2010eId, makerTags, undefined, 1, printValue}, - {808, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), sony2010eId, makerTags, + {540, "DigitalZoomRatio", N_("DigitalZoomRatio"), N_("DigitalZoomRatio"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {1208, "MeterInfo", N_("MeterInfo"), N_("MeterInfo"), sony2010eId, makerTags, undefined, 1, printValue}, - {4444, "ReleaseMode3", N_("ReleaseMode3"), N_("ReleaseMode3"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4448, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4456, "SelfTimer", N_("SelfTimer"), N_("SelfTimer"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4460, "FlashMode", N_("FlashMode"), N_("FlashMode"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4466, "StopsAboveBaseISO", N_("StopsAboveBaseISO"), N_("StopsAboveBaseISO"), sony2010eId, makerTags, unsignedShort, + {556, "SonyDateTime", N_("SonyDateTime"), N_("SonyDateTime"), IfdId::sony2010eId, SectionId::makerTags, undefined, 1, printValue}, - {4468, "BrightnessValue", N_("BrightnessValue"), N_("BrightnessValue"), sony2010eId, makerTags, unsignedShort, 1, + {808, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), IfdId::sony2010eId, + SectionId::makerTags, unsignedByte, 1, printValue}, + {1208, "MeterInfo", N_("MeterInfo"), N_("MeterInfo"), IfdId::sony2010eId, SectionId::makerTags, undefined, 1, + printValue}, + {4444, "ReleaseMode3", N_("ReleaseMode3"), N_("ReleaseMode3"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4448, "ReleaseMode2", N_("ReleaseMode2"), N_("ReleaseMode2"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4456, "SelfTimer", N_("SelfTimer"), N_("SelfTimer"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, + printValue}, + {4460, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, + printValue}, + {4466, "StopsAboveBaseISO", N_("StopsAboveBaseISO"), N_("StopsAboveBaseISO"), IfdId::sony2010eId, + SectionId::makerTags, unsignedShort, 1, printValue}, + {4468, "BrightnessValue", N_("BrightnessValue"), N_("BrightnessValue"), IfdId::sony2010eId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {4472, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), IfdId::sony2010eId, + SectionId::makerTags, unsignedByte, 1, printValue}, + {4476, "HDRSetting", N_("HDRSetting"), N_("HDRSetting"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {4472, "DynamicRangeOptimizer", N_("DynamicRangeOptimizer"), N_("DynamicRangeOptimizer"), sony2010eId, makerTags, + {4480, "ExposureCompensation", N_("ExposureCompensation"), N_("ExposureCompensation"), IfdId::sony2010eId, + SectionId::makerTags, signedShort, 1, printValue}, + {4502, "PictureProfile", N_("PictureProfile"), N_("PictureProfile"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {4476, "HDRSetting", N_("HDRSetting"), N_("HDRSetting"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4480, "ExposureCompensation", N_("ExposureCompensation"), N_("ExposureCompensation"), sony2010eId, makerTags, - signedShort, 1, printValue}, - {4502, "PictureProfile", N_("PictureProfile"), N_("PictureProfile"), sony2010eId, makerTags, unsignedByte, 1, + {4503, "PictureProfile2", N_("PictureProfile2"), N_("PictureProfile2"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4507, "PictureEffect2", N_("PictureEffect2"), N_("PictureEffect2"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4520, "Quality2", N_("Quality2"), N_("Quality2"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {4503, "PictureProfile2", N_("PictureProfile2"), N_("PictureProfile2"), sony2010eId, makerTags, unsignedByte, 1, + {4524, "MeteringMode", N_("MeteringMode"), N_("MeteringMode"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4525, "ExposureProgram", N_("ExposureProgram"), N_("ExposureProgram"), IfdId::sony2010eId, SectionId::makerTags, + unsignedByte, 1, printValue}, + {4532, "WB_RGBLevels", N_("WB_RGBLevels"), N_("WB_RGBLevels"), IfdId::sony2010eId, SectionId::makerTags, + unsignedShort, 3, printValue}, + {4692, "SonyISO", N_("SonyISO"), N_("SonyISO"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, - {4507, "PictureEffect2", N_("PictureEffect2"), N_("PictureEffect2"), sony2010eId, makerTags, unsignedByte, 1, + {4696, "SonyISO2", N_("SonyISO2"), N_("SonyISO2"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, - {4520, "Quality2", N_("Quality2"), N_("Quality2"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4524, "MeteringMode", N_("MeteringMode"), N_("MeteringMode"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {4525, "ExposureProgram", N_("ExposureProgram"), N_("ExposureProgram"), sony2010eId, makerTags, unsignedByte, 1, + {4728, "FocalLength", N_("FocalLength"), N_("FocalLength"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, + 1, printValue}, + {4730, "MinFocalLength", N_("MinFocalLength"), N_("MinFocalLength"), IfdId::sony2010eId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {4732, "MaxFocalLength", N_("MaxFocalLength"), N_("MaxFocalLength"), IfdId::sony2010eId, SectionId::makerTags, + unsignedShort, 1, printValue}, + {4736, "SonyISO3", N_("SonyISO3"), N_("SonyISO3"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, - {4532, "WB_RGBLevels", N_("WB_RGBLevels"), N_("WB_RGBLevels"), sony2010eId, makerTags, unsignedShort, 3, + {6256, "DistortionCorrParams", N_("DistortionCorrParams"), N_("DistortionCorrParams"), IfdId::sony2010eId, + SectionId::makerTags, signedShort, 16, printValue}, + {6289, "LensFormat", N_("LensFormat"), N_("LensFormat"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {4692, "SonyISO", N_("SonyISO"), N_("SonyISO"), sony2010eId, makerTags, unsignedShort, 1, printValue}, - {4696, "SonyISO2", N_("SonyISO2"), N_("SonyISO2"), sony2010eId, makerTags, unsignedShort, 1, printValue}, - {4728, "FocalLength", N_("FocalLength"), N_("FocalLength"), sony2010eId, makerTags, unsignedShort, 1, printValue}, - {4730, "MinFocalLength", N_("MinFocalLength"), N_("MinFocalLength"), sony2010eId, makerTags, unsignedShort, 1, + {6290, "LensMount", N_("LensMount"), N_("LensMount"), IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, - {4732, "MaxFocalLength", N_("MaxFocalLength"), N_("MaxFocalLength"), sony2010eId, makerTags, unsignedShort, 1, + {6291, "LensType2", N_("LensType2"), N_("LensType2"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, + printValue}, + {6294, "LensType", N_("LensType"), N_("LensType"), IfdId::sony2010eId, SectionId::makerTags, unsignedShort, 1, printValue}, - {4736, "SonyISO3", N_("SonyISO3"), N_("SonyISO3"), sony2010eId, makerTags, unsignedShort, 1, printValue}, - {6256, "DistortionCorrParams", N_("DistortionCorrParams"), N_("DistortionCorrParams"), sony2010eId, makerTags, - signedShort, 16, printValue}, - {6289, "LensFormat", N_("LensFormat"), N_("LensFormat"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {6290, "LensMount", N_("LensMount"), N_("LensMount"), sony2010eId, makerTags, unsignedByte, 1, printValue}, - {6291, "LensType2", N_("LensType2"), N_("LensType2"), sony2010eId, makerTags, unsignedShort, 1, printValue}, - {6294, "LensType", N_("LensType"), N_("LensType"), sony2010eId, makerTags, unsignedShort, 1, printValue}, {6296, "DistortionCorrParamsPresent", N_("DistortionCorrParamsPresent"), N_("DistortionCorrParamsPresent"), - sony2010eId, makerTags, unsignedByte, 1, printValue}, + IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, {6297, "DistortionCorrParamsNumber", N_("DistortionCorrParamsNumber"), N_("DistortionCorrParamsNumber"), - sony2010eId, makerTags, unsignedByte, 1, printValue}, + IfdId::sony2010eId, SectionId::makerTags, unsignedByte, 1, printValue}, // End of list marker - {0xffff, "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", sony2010eId, makerTags, - unsignedByte, 1, printValue}, + {0xffff, "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", "(UnknownSony2010eTag)", IfdId::sony2010eId, + SectionId::makerTags, unsignedByte, 1, printValue}, }; const TagInfo* SonyMakerNote::tagList2010e() { diff --git a/src/tags.cpp b/src/tags.cpp index 65777283..91605f89 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -20,28 +20,28 @@ using namespace Internal; //! List of all defined Exif sections. constexpr auto sectionInfo = std::array{ - SectionInfo(sectionIdNotSet, "(UnknownSection)", N_("Unknown section")), - SectionInfo(imgStruct, "ImageStructure", N_("Image data structure")), - SectionInfo(recOffset, "RecordingOffset", N_("Recording offset")), - SectionInfo(imgCharacter, "ImageCharacteristics", N_("Image data characteristics")), - SectionInfo(otherTags, "OtherTags", N_("Other data")), - SectionInfo(exifFormat, "ExifFormat", N_("Exif data structure")), - SectionInfo(exifVersion, "ExifVersion", N_("Exif version")), - SectionInfo(imgConfig, "ImageConfig", N_("Image configuration")), - SectionInfo(userInfo, "UserInfo", N_("User information")), - SectionInfo(relatedFile, "RelatedFile", N_("Related file")), - SectionInfo(dateTime, "DateTime", N_("Date and time")), - SectionInfo(captureCond, "CaptureConditions", N_("Picture taking conditions")), - SectionInfo(gpsTags, "GPS", N_("GPS information")), - SectionInfo(iopTags, "Interoperability", N_("Interoperability information")), - SectionInfo(mpfTags, "MPF", N_("CIPA Multi-Picture Format")), - SectionInfo(makerTags, "Makernote", N_("Vendor specific information")), - SectionInfo(dngTags, "DngTags", N_("Adobe DNG tags")), - SectionInfo(panaRaw, "PanasonicRaw", N_("Panasonic RAW tags")), - SectionInfo(tiffEp, "TIFF/EP", N_("TIFF/EP tags")), - SectionInfo(tiffPm6, "TIFF&PM6", N_("TIFF PageMaker 6.0 tags")), - SectionInfo(adobeOpi, "AdobeOPI", N_("Adobe OPI tags")), - SectionInfo(lastSectionId, "(LastSection)", N_("Last section")), + SectionInfo(SectionId::sectionIdNotSet, "(UnknownSection)", N_("Unknown section")), + SectionInfo(SectionId::imgStruct, "ImageStructure", N_("Image data structure")), + SectionInfo(SectionId::recOffset, "RecordingOffset", N_("Recording offset")), + SectionInfo(SectionId::imgCharacter, "ImageCharacteristics", N_("Image data characteristics")), + SectionInfo(SectionId::otherTags, "OtherTags", N_("Other data")), + SectionInfo(SectionId::exifFormat, "ExifFormat", N_("Exif data structure")), + SectionInfo(SectionId::exifVersion, "ExifVersion", N_("Exif version")), + SectionInfo(SectionId::imgConfig, "ImageConfig", N_("Image configuration")), + SectionInfo(SectionId::userInfo, "UserInfo", N_("User information")), + SectionInfo(SectionId::relatedFile, "RelatedFile", N_("Related file")), + SectionInfo(SectionId::dateTime, "DateTime", N_("Date and time")), + SectionInfo(SectionId::captureCond, "CaptureConditions", N_("Picture taking conditions")), + SectionInfo(SectionId::gpsTags, "GPS", N_("GPS information")), + SectionInfo(SectionId::iopTags, "Interoperability", N_("Interoperability information")), + SectionInfo(SectionId::mpfTags, "MPF", N_("CIPA Multi-Picture Format")), + SectionInfo(SectionId::makerTags, "Makernote", N_("Vendor specific information")), + SectionInfo(SectionId::dngTags, "DngTags", N_("Adobe DNG tags")), + SectionInfo(SectionId::panaRaw, "PanasonicRaw", N_("Panasonic RAW tags")), + SectionInfo(SectionId::tiffEp, "TIFF/EP", N_("TIFF/EP tags")), + SectionInfo(SectionId::tiffPm6, "TIFF&PM6", N_("TIFF PageMaker 6.0 tags")), + SectionInfo(SectionId::adobeOpi, "AdobeOPI", N_("Adobe OPI tags")), + SectionInfo(SectionId::lastSectionId, "(LastSection)", N_("Last section")), }; } // namespace Exiv2 @@ -54,8 +54,14 @@ bool TagVocabulary::operator==(const std::string& key) const { } // Unknown Tag -static const TagInfo unknownTag{0xffff, "Unknown tag", N_("Unknown tag"), N_("Unknown tag"), - ifdIdNotSet, sectionIdNotSet, asciiString, -1, +static const TagInfo unknownTag{0xffff, + "Unknown tag", + N_("Unknown tag"), + N_("Unknown tag"), + IfdId::ifdIdNotSet, + SectionId::sectionIdNotSet, + asciiString, + -1, printValue}; } // namespace Exiv2::Internal @@ -66,7 +72,7 @@ GroupInfo::GroupName::GroupName(std::string groupName) : g_(std::move(groupName) } //! @endcond -bool GroupInfo::operator==(int ifdId) const { +bool GroupInfo::operator==(IfdId ifdId) const { return ifdId_ == ifdId; } @@ -77,8 +83,8 @@ bool GroupInfo::operator==(const GroupName& groupName) const { const char* ExifTags::sectionName(const ExifKey& key) { const TagInfo* ti = tagInfo(key.tag(), static_cast(key.ifdId())); if (!ti) - return sectionInfo[unknownTag.sectionId_].name_; - return sectionInfo[ti->sectionId_].name_; + return sectionInfo[static_cast(unknownTag.sectionId_)].name_; + return sectionInfo[static_cast(ti->sectionId_)].name_; } /// \todo not used internally. At least we should test it @@ -169,12 +175,12 @@ struct ExifKey::Impl { // DATA static constexpr auto familyName_ = "Exif"; //!< "Exif" - const TagInfo* tagInfo_{}; //!< Tag info - uint16_t tag_{0}; //!< Tag value - IfdId ifdId_{ifdIdNotSet}; //!< The IFD associated with this tag - int idx_{0}; //!< Unique id of the Exif key in the image - std::string groupName_; //!< The group name - std::string key_; //!< %Key + const TagInfo* tagInfo_{}; //!< Tag info + uint16_t tag_{0}; //!< Tag value + IfdId ifdId_{IfdId::ifdIdNotSet}; //!< The IFD associated with this tag + int idx_{0}; //!< Unique id of the Exif key in the image + std::string groupName_; //!< The group name + std::string key_; //!< %Key }; std::string ExifKey::Impl::tagName() const { @@ -208,7 +214,7 @@ void ExifKey::Impl::decomposeKey(const std::string& key) { // Find IfdId IfdId ifdId = groupId(groupName); - if (ifdId == ifdIdNotSet) + if (ifdId == IfdId::ifdIdNotSet) throw Error(ErrorCode::kerInvalidKey, key); if (!Internal::isExifIfd(ifdId) && !Internal::isMakerIfd(ifdId)) { throw Error(ErrorCode::kerInvalidKey, key); @@ -324,7 +330,7 @@ ExifKey* ExifKey::clone_() const { return new ExifKey(*this); } -int ExifKey::ifdId() const { +IfdId ExifKey::ifdId() const { return p_->ifdId_; } diff --git a/src/tags_int.cpp b/src/tags_int.cpp index 2b300c59..398b2141 100644 --- a/src/tags_int.cpp +++ b/src/tags_int.cpp @@ -39,131 +39,132 @@ std::ostream& printVersion(std::ostream& os, const std::string& str) { namespace Exiv2::Internal { //! List of all known Exif groups. Important: Group name (3rd column) must be unique! -constexpr GroupInfo groupInfo[] = {{ifdIdNotSet, "Unknown IFD", "Unknown", nullptr}, - {ifd0Id, "IFD0", "Image", ifdTagList}, - {ifd1Id, "IFD1", "Thumbnail", ifdTagList}, - {ifd2Id, "IFD2", "Image2", ifdTagList}, - {ifd3Id, "IFD3", "Image3", ifdTagList}, - {exifId, "Exif", "Photo", exifTagList}, - {gpsId, "GPSInfo", "GPSInfo", gpsTagList}, - {iopId, "Iop", "Iop", iopTagList}, - {mpfId, "MPF", "MpfInfo", mpfTagList}, - {subImage1Id, "SubImage1", "SubImage1", ifdTagList}, - {subImage2Id, "SubImage2", "SubImage2", ifdTagList}, - {subImage3Id, "SubImage3", "SubImage3", ifdTagList}, - {subImage4Id, "SubImage4", "SubImage4", ifdTagList}, - {subImage5Id, "SubImage5", "SubImage5", ifdTagList}, - {subImage6Id, "SubImage6", "SubImage6", ifdTagList}, - {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}, - {canonCsId, "Makernote", "CanonCs", CanonMakerNote::tagListCs}, - {canonSiId, "Makernote", "CanonSi", CanonMakerNote::tagListSi}, - {canonCfId, "Makernote", "CanonCf", CanonMakerNote::tagListCf}, - {canonPiId, "Makernote", "CanonPi", CanonMakerNote::tagListPi}, - {canonTiId, "Makernote", "CanonTi", CanonMakerNote::tagListTi}, - {canonFiId, "Makernote", "CanonFi", CanonMakerNote::tagListFi}, - {canonPaId, "Makernote", "CanonPa", CanonMakerNote::tagListPa}, - {canonPrId, "Makernote", "CanonPr", CanonMakerNote::tagListPr}, - {canonVigCor2Id, "Makernote", "CanonVigCor2", CanonMakerNote::tagListVigCor2}, - {canonLiOpId, "Makernote", "CanonLiOp", CanonMakerNote::tagListLiOp}, - {canonAfMiAdjId, "Makernote", "CanonAfMiAdj", CanonMakerNote::tagListAfMiAdj}, - {canonLeId, "Makernote", "CanonLe", CanonMakerNote::tagListLe}, - {canonAmId, "Makernote", "CanonAm", CanonMakerNote::tagListAm}, - {canonFilId, "Makernote", "CanonFil", CanonMakerNote::tagListFil}, - {canonMeId, "Makernote", "CanonMe", CanonMakerNote::tagListMe}, - {canonHdrId, "Makernote", "CanonHdr", CanonMakerNote::tagListHdr}, - {canonAfCId, "Makernote", "CanonAfC", CanonMakerNote::tagListAfC}, - {canonRawBId, "Makernote", "CanonRawB", CanonMakerNote::tagListRawB}, - {casioId, "Makernote", "Casio", CasioMakerNote::tagList}, - {casio2Id, "Makernote", "Casio2", Casio2MakerNote::tagList}, - {fujiId, "Makernote", "Fujifilm", FujiMakerNote::tagList}, - {minoltaId, "Makernote", "Minolta", MinoltaMakerNote::tagList}, - {minoltaCs5DId, "Makernote", "MinoltaCs5D", MinoltaMakerNote::tagListCs5D}, - {minoltaCs7DId, "Makernote", "MinoltaCs7D", MinoltaMakerNote::tagListCs7D}, - {minoltaCsOldId, "Makernote", "MinoltaCsOld", MinoltaMakerNote::tagListCsStd}, - {minoltaCsNewId, "Makernote", "MinoltaCsNew", MinoltaMakerNote::tagListCsStd}, - {nikon1Id, "Makernote", "Nikon1", Nikon1MakerNote::tagList}, - {nikon2Id, "Makernote", "Nikon2", Nikon2MakerNote::tagList}, - {nikon3Id, "Makernote", "Nikon3", Nikon3MakerNote::tagList}, - {nikonPvId, "Makernote", "NikonPreview", ifdTagList}, - {nikonVrId, "Makernote", "NikonVr", Nikon3MakerNote::tagListVr}, - {nikonPcId, "Makernote", "NikonPc", Nikon3MakerNote::tagListPc}, - {nikonWtId, "Makernote", "NikonWt", Nikon3MakerNote::tagListWt}, - {nikonIiId, "Makernote", "NikonIi", Nikon3MakerNote::tagListIi}, - {nikonAfId, "Makernote", "NikonAf", Nikon3MakerNote::tagListAf}, - {nikonAf21Id, "Makernote", "NikonAf2", Nikon3MakerNote::tagListAf21}, - {nikonAf22Id, "Makernote", "NikonAf22", Nikon3MakerNote::tagListAf22}, - {nikonAFTId, "Makernote", "NikonAFT", Nikon3MakerNote::tagListAFT}, - {nikonFiId, "Makernote", "NikonFi", Nikon3MakerNote::tagListFi}, - {nikonMeId, "Makernote", "NikonMe", Nikon3MakerNote::tagListMe}, - {nikonFl1Id, "Makernote", "NikonFl1", Nikon3MakerNote::tagListFl1}, - {nikonFl2Id, "Makernote", "NikonFl2", Nikon3MakerNote::tagListFl2}, - {nikonFl3Id, "Makernote", "NikonFl3", Nikon3MakerNote::tagListFl3}, - {nikonFl7Id, "Makernote", "NikonFl7", Nikon3MakerNote::tagListFl7}, - {nikonSi1Id, "Makernote", "NikonSiD80", Nikon3MakerNote::tagListSi1}, - {nikonSi2Id, "Makernote", "NikonSiD40", Nikon3MakerNote::tagListSi2}, - {nikonSi3Id, "Makernote", "NikonSiD300a", Nikon3MakerNote::tagListSi3}, - {nikonSi4Id, "Makernote", "NikonSiD300b", Nikon3MakerNote::tagListSi4}, - {nikonSi5Id, "Makernote", "NikonSi02xx", Nikon3MakerNote::tagListSi5}, - {nikonSi6Id, "Makernote", "NikonSi01xx", Nikon3MakerNote::tagListSi5}, - {nikonCb1Id, "Makernote", "NikonCb1", Nikon3MakerNote::tagListCb1}, - {nikonCb2Id, "Makernote", "NikonCb2", Nikon3MakerNote::tagListCb2}, - {nikonCb2aId, "Makernote", "NikonCb2a", Nikon3MakerNote::tagListCb2a}, - {nikonCb2bId, "Makernote", "NikonCb2b", Nikon3MakerNote::tagListCb2b}, - {nikonCb3Id, "Makernote", "NikonCb3", Nikon3MakerNote::tagListCb3}, - {nikonCb4Id, "Makernote", "NikonCb4", Nikon3MakerNote::tagListCb4}, - {nikonLd1Id, "Makernote", "NikonLd1", Nikon3MakerNote::tagListLd1}, - {nikonLd2Id, "Makernote", "NikonLd2", Nikon3MakerNote::tagListLd2}, - {nikonLd3Id, "Makernote", "NikonLd3", Nikon3MakerNote::tagListLd3}, - {nikonLd4Id, "Makernote", "NikonLd4", Nikon3MakerNote::tagListLd4}, - {olympusId, "Makernote", "Olympus", OlympusMakerNote::tagList}, - {olympus2Id, "Makernote", "Olympus2", OlympusMakerNote::tagList}, - {olympusCsId, "Makernote", "OlympusCs", OlympusMakerNote::tagListCs}, - {olympusEqId, "Makernote", "OlympusEq", OlympusMakerNote::tagListEq}, - {olympusRdId, "Makernote", "OlympusRd", OlympusMakerNote::tagListRd}, - {olympusRd2Id, "Makernote", "OlympusRd2", OlympusMakerNote::tagListRd2}, - {olympusIpId, "Makernote", "OlympusIp", OlympusMakerNote::tagListIp}, - {olympusFiId, "Makernote", "OlympusFi", OlympusMakerNote::tagListFi}, - {olympusFe1Id, "Makernote", "OlympusFe1", OlympusMakerNote::tagListFe}, - {olympusFe2Id, "Makernote", "OlympusFe2", OlympusMakerNote::tagListFe}, - {olympusFe3Id, "Makernote", "OlympusFe3", OlympusMakerNote::tagListFe}, - {olympusFe4Id, "Makernote", "OlympusFe4", OlympusMakerNote::tagListFe}, - {olympusFe5Id, "Makernote", "OlympusFe5", OlympusMakerNote::tagListFe}, - {olympusFe6Id, "Makernote", "OlympusFe6", OlympusMakerNote::tagListFe}, - {olympusFe7Id, "Makernote", "OlympusFe7", OlympusMakerNote::tagListFe}, - {olympusFe8Id, "Makernote", "OlympusFe8", OlympusMakerNote::tagListFe}, - {olympusFe9Id, "Makernote", "OlympusFe9", OlympusMakerNote::tagListFe}, - {olympusRiId, "Makernote", "OlympusRi", OlympusMakerNote::tagListRi}, - {panasonicId, "Makernote", "Panasonic", PanasonicMakerNote::tagList}, - {pentaxDngId, "Makernote", "PentaxDng", PentaxMakerNote::tagList}, - {pentaxId, "Makernote", "Pentax", PentaxMakerNote::tagList}, - {samsung2Id, "Makernote", "Samsung2", Samsung2MakerNote::tagList}, - {samsungPvId, "Makernote", "SamsungPreview", ifdTagList}, - {samsungPwId, "Makernote", "SamsungPictureWizard", Samsung2MakerNote::tagListPw}, - {sigmaId, "Makernote", "Sigma", SigmaMakerNote::tagList}, - {sony1Id, "Makernote", "Sony1", SonyMakerNote::tagList}, - {sony2Id, "Makernote", "Sony2", SonyMakerNote::tagList}, - {sonyMltId, "Makernote", "SonyMinolta", MinoltaMakerNote::tagList}, - {sony1CsId, "Makernote", "Sony1Cs", SonyMakerNote::tagListCs}, - {sony1Cs2Id, "Makernote", "Sony1Cs2", SonyMakerNote::tagListCs2}, - {sony1MltCs7DId, "Makernote", "Sony1MltCs7D", MinoltaMakerNote::tagListCs7D}, - {sony1MltCsOldId, "Makernote", "Sony1MltCsOld", MinoltaMakerNote::tagListCsStd}, - {sony1MltCsNewId, "Makernote", "Sony1MltCsNew", MinoltaMakerNote::tagListCsStd}, - {sony1MltCsA100Id, "Makernote", "Sony1MltCsA100", MinoltaMakerNote::tagListCsA100}, - {sony2CsId, "Makernote", "Sony2Cs", SonyMakerNote::tagListCs}, - {sony2Cs2Id, "Makernote", "Sony2Cs2", SonyMakerNote::tagListCs2}, - {sony2FpId, "Makernote", "Sony2Fp", SonyMakerNote::tagListFp}, - {sonyMisc1Id, "Makernote", "SonyMisc1", SonyMakerNote::tagListSonyMisc1}, - {sonyMisc2bId, "Makernote", "SonyMisc2b", SonyMakerNote::tagListSonyMisc2b}, - {sonyMisc3cId, "Makernote", "SonyMisc3c", SonyMakerNote::tagListSonyMisc3c}, - {sonySInfo1Id, "Makernote", "SonySInfo1", SonyMakerNote::tagListSonySInfo1}, - {sony2010eId, "Makernote", "Sony2010e", SonyMakerNote::tagList2010e}, - {lastId, "(Last IFD info)", "(Last IFD item)", nullptr}}; +constexpr GroupInfo groupInfo[] = { + {IfdId::ifdIdNotSet, "Unknown IFD", "Unknown", nullptr}, + {IfdId::ifd0Id, "IFD0", "Image", ifdTagList}, + {IfdId::ifd1Id, "IFD1", "Thumbnail", ifdTagList}, + {IfdId::ifd2Id, "IFD2", "Image2", ifdTagList}, + {IfdId::ifd3Id, "IFD3", "Image3", ifdTagList}, + {IfdId::exifId, "Exif", "Photo", exifTagList}, + {IfdId::gpsId, "GPSInfo", "GPSInfo", gpsTagList}, + {IfdId::iopId, "Iop", "Iop", iopTagList}, + {IfdId::mpfId, "MPF", "MpfInfo", mpfTagList}, + {IfdId::subImage1Id, "SubImage1", "SubImage1", ifdTagList}, + {IfdId::subImage2Id, "SubImage2", "SubImage2", ifdTagList}, + {IfdId::subImage3Id, "SubImage3", "SubImage3", ifdTagList}, + {IfdId::subImage4Id, "SubImage4", "SubImage4", ifdTagList}, + {IfdId::subImage5Id, "SubImage5", "SubImage5", ifdTagList}, + {IfdId::subImage6Id, "SubImage6", "SubImage6", ifdTagList}, + {IfdId::subImage7Id, "SubImage7", "SubImage7", ifdTagList}, + {IfdId::subImage8Id, "SubImage8", "SubImage8", ifdTagList}, + {IfdId::subImage9Id, "SubImage9", "SubImage9", ifdTagList}, + {IfdId::subThumb1Id, "SubThumb1", "SubThumb1", ifdTagList}, + {IfdId::panaRawId, "PanaRaw", "PanasonicRaw", PanasonicMakerNote::tagListRaw}, + {IfdId::mnId, "Makernote", "MakerNote", mnTagList}, + {IfdId::canonId, "Makernote", "Canon", CanonMakerNote::tagList}, + {IfdId::canonCsId, "Makernote", "CanonCs", CanonMakerNote::tagListCs}, + {IfdId::canonSiId, "Makernote", "CanonSi", CanonMakerNote::tagListSi}, + {IfdId::canonCfId, "Makernote", "CanonCf", CanonMakerNote::tagListCf}, + {IfdId::canonPiId, "Makernote", "CanonPi", CanonMakerNote::tagListPi}, + {IfdId::canonTiId, "Makernote", "CanonTi", CanonMakerNote::tagListTi}, + {IfdId::canonFiId, "Makernote", "CanonFi", CanonMakerNote::tagListFi}, + {IfdId::canonPaId, "Makernote", "CanonPa", CanonMakerNote::tagListPa}, + {IfdId::canonPrId, "Makernote", "CanonPr", CanonMakerNote::tagListPr}, + {IfdId::canonVigCor2Id, "Makernote", "CanonVigCor2", CanonMakerNote::tagListVigCor2}, + {IfdId::canonLiOpId, "Makernote", "CanonLiOp", CanonMakerNote::tagListLiOp}, + {IfdId::canonAfMiAdjId, "Makernote", "CanonAfMiAdj", CanonMakerNote::tagListAfMiAdj}, + {IfdId::canonLeId, "Makernote", "CanonLe", CanonMakerNote::tagListLe}, + {IfdId::canonAmId, "Makernote", "CanonAm", CanonMakerNote::tagListAm}, + {IfdId::canonFilId, "Makernote", "CanonFil", CanonMakerNote::tagListFil}, + {IfdId::canonMeId, "Makernote", "CanonMe", CanonMakerNote::tagListMe}, + {IfdId::canonHdrId, "Makernote", "CanonHdr", CanonMakerNote::tagListHdr}, + {IfdId::canonAfCId, "Makernote", "CanonAfC", CanonMakerNote::tagListAfC}, + {IfdId::canonRawBId, "Makernote", "CanonRawB", CanonMakerNote::tagListRawB}, + {IfdId::casioId, "Makernote", "Casio", CasioMakerNote::tagList}, + {IfdId::casio2Id, "Makernote", "Casio2", Casio2MakerNote::tagList}, + {IfdId::fujiId, "Makernote", "Fujifilm", FujiMakerNote::tagList}, + {IfdId::minoltaId, "Makernote", "Minolta", MinoltaMakerNote::tagList}, + {IfdId::minoltaCs5DId, "Makernote", "MinoltaCs5D", MinoltaMakerNote::tagListCs5D}, + {IfdId::minoltaCs7DId, "Makernote", "MinoltaCs7D", MinoltaMakerNote::tagListCs7D}, + {IfdId::minoltaCsOldId, "Makernote", "MinoltaCsOld", MinoltaMakerNote::tagListCsStd}, + {IfdId::minoltaCsNewId, "Makernote", "MinoltaCsNew", MinoltaMakerNote::tagListCsStd}, + {IfdId::nikon1Id, "Makernote", "Nikon1", Nikon1MakerNote::tagList}, + {IfdId::nikon2Id, "Makernote", "Nikon2", Nikon2MakerNote::tagList}, + {IfdId::nikon3Id, "Makernote", "Nikon3", Nikon3MakerNote::tagList}, + {IfdId::nikonPvId, "Makernote", "NikonPreview", ifdTagList}, + {IfdId::nikonVrId, "Makernote", "NikonVr", Nikon3MakerNote::tagListVr}, + {IfdId::nikonPcId, "Makernote", "NikonPc", Nikon3MakerNote::tagListPc}, + {IfdId::nikonWtId, "Makernote", "NikonWt", Nikon3MakerNote::tagListWt}, + {IfdId::nikonIiId, "Makernote", "NikonIi", Nikon3MakerNote::tagListIi}, + {IfdId::nikonAfId, "Makernote", "NikonAf", Nikon3MakerNote::tagListAf}, + {IfdId::nikonAf21Id, "Makernote", "NikonAf2", Nikon3MakerNote::tagListAf21}, + {IfdId::nikonAf22Id, "Makernote", "NikonAf22", Nikon3MakerNote::tagListAf22}, + {IfdId::nikonAFTId, "Makernote", "NikonAFT", Nikon3MakerNote::tagListAFT}, + {IfdId::nikonFiId, "Makernote", "NikonFi", Nikon3MakerNote::tagListFi}, + {IfdId::nikonMeId, "Makernote", "NikonMe", Nikon3MakerNote::tagListMe}, + {IfdId::nikonFl1Id, "Makernote", "NikonFl1", Nikon3MakerNote::tagListFl1}, + {IfdId::nikonFl2Id, "Makernote", "NikonFl2", Nikon3MakerNote::tagListFl2}, + {IfdId::nikonFl3Id, "Makernote", "NikonFl3", Nikon3MakerNote::tagListFl3}, + {IfdId::nikonFl7Id, "Makernote", "NikonFl7", Nikon3MakerNote::tagListFl7}, + {IfdId::nikonSi1Id, "Makernote", "NikonSiD80", Nikon3MakerNote::tagListSi1}, + {IfdId::nikonSi2Id, "Makernote", "NikonSiD40", Nikon3MakerNote::tagListSi2}, + {IfdId::nikonSi3Id, "Makernote", "NikonSiD300a", Nikon3MakerNote::tagListSi3}, + {IfdId::nikonSi4Id, "Makernote", "NikonSiD300b", Nikon3MakerNote::tagListSi4}, + {IfdId::nikonSi5Id, "Makernote", "NikonSi02xx", Nikon3MakerNote::tagListSi5}, + {IfdId::nikonSi6Id, "Makernote", "NikonSi01xx", Nikon3MakerNote::tagListSi5}, + {IfdId::nikonCb1Id, "Makernote", "NikonCb1", Nikon3MakerNote::tagListCb1}, + {IfdId::nikonCb2Id, "Makernote", "NikonCb2", Nikon3MakerNote::tagListCb2}, + {IfdId::nikonCb2aId, "Makernote", "NikonCb2a", Nikon3MakerNote::tagListCb2a}, + {IfdId::nikonCb2bId, "Makernote", "NikonCb2b", Nikon3MakerNote::tagListCb2b}, + {IfdId::nikonCb3Id, "Makernote", "NikonCb3", Nikon3MakerNote::tagListCb3}, + {IfdId::nikonCb4Id, "Makernote", "NikonCb4", Nikon3MakerNote::tagListCb4}, + {IfdId::nikonLd1Id, "Makernote", "NikonLd1", Nikon3MakerNote::tagListLd1}, + {IfdId::nikonLd2Id, "Makernote", "NikonLd2", Nikon3MakerNote::tagListLd2}, + {IfdId::nikonLd3Id, "Makernote", "NikonLd3", Nikon3MakerNote::tagListLd3}, + {IfdId::nikonLd4Id, "Makernote", "NikonLd4", Nikon3MakerNote::tagListLd4}, + {IfdId::olympusId, "Makernote", "Olympus", OlympusMakerNote::tagList}, + {IfdId::olympus2Id, "Makernote", "Olympus2", OlympusMakerNote::tagList}, + {IfdId::olympusCsId, "Makernote", "OlympusCs", OlympusMakerNote::tagListCs}, + {IfdId::olympusEqId, "Makernote", "OlympusEq", OlympusMakerNote::tagListEq}, + {IfdId::olympusRdId, "Makernote", "OlympusRd", OlympusMakerNote::tagListRd}, + {IfdId::olympusRd2Id, "Makernote", "OlympusRd2", OlympusMakerNote::tagListRd2}, + {IfdId::olympusIpId, "Makernote", "OlympusIp", OlympusMakerNote::tagListIp}, + {IfdId::olympusFiId, "Makernote", "OlympusFi", OlympusMakerNote::tagListFi}, + {IfdId::olympusFe1Id, "Makernote", "OlympusFe1", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe2Id, "Makernote", "OlympusFe2", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe3Id, "Makernote", "OlympusFe3", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe4Id, "Makernote", "OlympusFe4", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe5Id, "Makernote", "OlympusFe5", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe6Id, "Makernote", "OlympusFe6", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe7Id, "Makernote", "OlympusFe7", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe8Id, "Makernote", "OlympusFe8", OlympusMakerNote::tagListFe}, + {IfdId::olympusFe9Id, "Makernote", "OlympusFe9", OlympusMakerNote::tagListFe}, + {IfdId::olympusRiId, "Makernote", "OlympusRi", OlympusMakerNote::tagListRi}, + {IfdId::panasonicId, "Makernote", "Panasonic", PanasonicMakerNote::tagList}, + {IfdId::pentaxDngId, "Makernote", "PentaxDng", PentaxMakerNote::tagList}, + {IfdId::pentaxId, "Makernote", "Pentax", PentaxMakerNote::tagList}, + {IfdId::samsung2Id, "Makernote", "Samsung2", Samsung2MakerNote::tagList}, + {IfdId::samsungPvId, "Makernote", "SamsungPreview", ifdTagList}, + {IfdId::samsungPwId, "Makernote", "SamsungPictureWizard", Samsung2MakerNote::tagListPw}, + {IfdId::sigmaId, "Makernote", "Sigma", SigmaMakerNote::tagList}, + {IfdId::sony1Id, "Makernote", "Sony1", SonyMakerNote::tagList}, + {IfdId::sony2Id, "Makernote", "Sony2", SonyMakerNote::tagList}, + {IfdId::sonyMltId, "Makernote", "SonyMinolta", MinoltaMakerNote::tagList}, + {IfdId::sony1CsId, "Makernote", "Sony1Cs", SonyMakerNote::tagListCs}, + {IfdId::sony1Cs2Id, "Makernote", "Sony1Cs2", SonyMakerNote::tagListCs2}, + {IfdId::sony1MltCs7DId, "Makernote", "Sony1MltCs7D", MinoltaMakerNote::tagListCs7D}, + {IfdId::sony1MltCsOldId, "Makernote", "Sony1MltCsOld", MinoltaMakerNote::tagListCsStd}, + {IfdId::sony1MltCsNewId, "Makernote", "Sony1MltCsNew", MinoltaMakerNote::tagListCsStd}, + {IfdId::sony1MltCsA100Id, "Makernote", "Sony1MltCsA100", MinoltaMakerNote::tagListCsA100}, + {IfdId::sony2CsId, "Makernote", "Sony2Cs", SonyMakerNote::tagListCs}, + {IfdId::sony2Cs2Id, "Makernote", "Sony2Cs2", SonyMakerNote::tagListCs2}, + {IfdId::sony2FpId, "Makernote", "Sony2Fp", SonyMakerNote::tagListFp}, + {IfdId::sonyMisc1Id, "Makernote", "SonyMisc1", SonyMakerNote::tagListSonyMisc1}, + {IfdId::sonyMisc2bId, "Makernote", "SonyMisc2b", SonyMakerNote::tagListSonyMisc2b}, + {IfdId::sonyMisc3cId, "Makernote", "SonyMisc3c", SonyMakerNote::tagListSonyMisc3c}, + {IfdId::sonySInfo1Id, "Makernote", "SonySInfo1", SonyMakerNote::tagListSonySInfo1}, + {IfdId::sony2010eId, "Makernote", "Sony2010e", SonyMakerNote::tagList2010e}, + {IfdId::lastId, "(Last IFD info)", "(Last IFD item)", nullptr}}; //! Units for measuring X and Y resolution, tags 0x0128, 0xa210 constexpr TagDetails exifUnit[] = {{1, N_("none")}, {2, N_("inch")}, {3, N_("cm")}}; @@ -401,157 +402,157 @@ constexpr TagInfo ifdTagInfo[] = { {0x000b, "ProcessingSoftware", N_("Processing Software"), N_("The name and version of the software used to post-process " "the picture."), // ACD Systems Digital Imaging tag - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x00fe, "NewSubfileType", N_("New Subfile Type"), - N_("A general indication of the kind of data contained in this subfile."), ifd0Id, imgStruct, unsignedLong, 1, - EXV_PRINT_TAG(exifNewSubfileType)}, // TIFF tag + N_("A general indication of the kind of data contained in this subfile."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedLong, 1, EXV_PRINT_TAG(exifNewSubfileType)}, // TIFF tag {0x00ff, "SubfileType", N_("Subfile Type"), N_("A general indication of the kind of data contained in this subfile. " "This field is deprecated. The NewSubfileType field should be used instead."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifSubfileType)}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifSubfileType)}, // TIFF tag {0x0100, "ImageWidth", N_("Image Width"), N_("The number of columns of image data, equal to the number of " "pixels per row. In JPEG compressed data a JPEG marker is " "used instead of this tag."), - ifd0Id, imgStruct, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedLong, 1, printValue}, {0x0101, "ImageLength", N_("Image Length"), N_("The number of rows of image data. In JPEG compressed data a " "JPEG marker is used instead of this tag."), - ifd0Id, imgStruct, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedLong, 1, printValue}, {0x0102, "BitsPerSample", N_("Bits per Sample"), N_("The number of bits per image component. In this standard each " "component of the image is 8 bits, so the value for this " "tag is 8. See also . In JPEG compressed data " "a JPEG marker is used instead of this tag."), - ifd0Id, imgStruct, unsignedShort, 3, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 3, printValue}, {0x0103, "Compression", N_("Compression"), N_("The compression scheme used for the image data. When a " "primary image is JPEG compressed, this designation is " "not necessary and is omitted. When thumbnails use JPEG " "compression, this tag value is set to 6."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifCompression)}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifCompression)}, {0x0106, "PhotometricInterpretation", N_("Photometric Interpretation"), N_("The pixel composition. In JPEG compressed data a JPEG " "marker is used instead of this tag."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPhotometricInterpretation)}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPhotometricInterpretation)}, {0x0107, "Thresholding", N_("Thresholding"), N_("For black and white TIFF files that represent shades of gray, " "the technique used to convert from gray to black and white pixels."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifThresholding)}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifThresholding)}, // TIFF tag {0x0108, "CellWidth", N_("Cell Width"), N_("The width of the dithering or halftoning matrix used to create a " "dithered or halftoned bilevel file."), - ifd0Id, imgStruct, unsignedShort, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, printValue}, // TIFF tag {0x0109, "CellLength", N_("Cell Length"), N_("The length of the dithering or halftoning matrix used to create a " "dithered or halftoned bilevel file."), - ifd0Id, imgStruct, unsignedShort, 1, printValue}, // TIFF tag - {0x010a, "FillOrder", N_("Fill Order"), N_("The logical order of bits within a byte"), ifd0Id, imgStruct, - unsignedShort, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, printValue}, // TIFF tag + {0x010a, "FillOrder", N_("Fill Order"), N_("The logical order of bits within a byte"), IfdId::ifd0Id, + SectionId::imgStruct, unsignedShort, 1, printValue}, // TIFF tag {0x010d, "DocumentName", N_("Document Name"), N_("The name of the document from which this image was scanned."), - ifd0Id, imgStruct, asciiString, 0, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, asciiString, 0, printValue}, // TIFF tag {0x010e, "ImageDescription", N_("Image Description"), N_("A character string giving the title of the image. It may be " "a comment such as \"1988 company picnic\" or " "the like. Two-bytes character codes cannot be used. " "When a 2-bytes code is necessary, the Exif Private tag " " is to be used."), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x010f, "Make", N_("Manufacturer"), N_("The manufacturer of the recording " "equipment. This is the manufacturer of the DSC, scanner, " "video digitizer or other equipment that generated the " "image. When the field is left blank, it is treated as unknown."), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x0110, "Model", N_("Model"), N_("The model name or model number of the equipment. This is the " "model name or number of the DSC, scanner, video digitizer " "or other equipment that generated the image. When the field " "is left blank, it is treated as unknown."), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x0111, "StripOffsets", N_("Strip Offsets"), N_("For each strip, the byte offset of that strip. It is " "recommended that this be selected so the number of strip " "bytes does not exceed 64 Kbytes. With JPEG compressed " "data this designation is not needed and is omitted. See also " " and ."), - ifd0Id, recOffset, unsignedLong, -1, printValue}, - {0x0112, "Orientation", N_("Orientation"), N_("The image orientation viewed in terms of rows and columns."), ifd0Id, - imgStruct, unsignedShort, 1, print0x0112}, + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, -1, printValue}, + {0x0112, "Orientation", N_("Orientation"), N_("The image orientation viewed in terms of rows and columns."), + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, print0x0112}, {0x0115, "SamplesPerPixel", N_("Samples per Pixel"), N_("The number of components per pixel. Since this standard applies " "to RGB and YCbCr images, the value set for this tag is 3. " "In JPEG compressed data a JPEG marker is used instead of this tag."), - ifd0Id, imgStruct, unsignedShort, 1, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, printValue}, {0x0116, "RowsPerStrip", N_("Rows per Strip"), N_("The number of rows per strip. This is the number of rows " "in the image of one strip when an image is divided into " "strips. With JPEG compressed data this designation is not " "needed and is omitted. See also and ."), - ifd0Id, recOffset, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, 1, printValue}, {0x0117, "StripByteCounts", N_("Strip Byte Count"), N_("The total number of bytes in each strip. With JPEG compressed " "data this designation is not needed and is omitted."), - ifd0Id, recOffset, unsignedLong, -1, printValue}, + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, -1, printValue}, {0x011a, "XResolution", N_("X-Resolution"), N_("The number of pixels per in the " "direction. When the image resolution is unknown, 72 [dpi] is designated."), - ifd0Id, imgStruct, unsignedRational, 1, printInt64}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedRational, 1, printInt64}, {0x011b, "YResolution", N_("Y-Resolution"), N_("The number of pixels per in the " "direction. The same value as is designated."), - ifd0Id, imgStruct, unsignedRational, 1, printInt64}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedRational, 1, printInt64}, {0x011c, "PlanarConfiguration", N_("Planar Configuration"), N_("Indicates whether pixel components are recorded in a chunky " "or planar format. In JPEG compressed files a JPEG marker " "is used instead of this tag. If this field does not exist, " "the TIFF default of 1 (chunky) is assumed."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPlanarConfiguration)}, - {0x011d, "PageName", N_("Page Name"), N_("The name of the page from which this image was scanned."), ifd0Id, - imgStruct, asciiString, 0, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPlanarConfiguration)}, + {0x011d, "PageName", N_("Page Name"), N_("The name of the page from which this image was scanned."), IfdId::ifd0Id, + SectionId::imgStruct, asciiString, 0, printValue}, // TIFF tag {0x011e, "XPosition", N_("X Position"), N_("X position of the image. The X offset in ResolutionUnits of the " "left side of the image, with respect to the left side of the page."), - ifd0Id, imgStruct, unsignedRational, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedRational, 1, printValue}, // TIFF tag {0x011f, "YPosition", N_("Y Position"), N_("Y position of the image. The Y offset in ResolutionUnits of the " "top of the image, with respect to the top of the page. In the TIFF " "coordinate scheme, the positive Y direction is down, so that " "YPosition is always positive."), - ifd0Id, imgStruct, unsignedRational, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedRational, 1, printValue}, // TIFF tag {0x0122, "GrayResponseUnit", N_("Gray Response Unit"), - N_("The precision of the information contained in the GrayResponseCurve."), ifd0Id, imgStruct, unsignedShort, 1, - printValue}, // TIFF tag + N_("The precision of the information contained in the GrayResponseCurve."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedShort, 1, printValue}, // TIFF tag {0x0123, "GrayResponseCurve", N_("Gray Response Curve"), - N_("For grayscale data, the optical density of each possible pixel value."), ifd0Id, imgStruct, unsignedShort, -1, - printValue}, // TIFF tag - {0x0124, "T4Options", N_("T4 Options"), N_("T.4-encoding options."), ifd0Id, imgStruct, unsignedLong, 1, - printValue}, // TIFF tag - {0x0125, "T6Options", N_("T6 Options"), N_("T.6-encoding options."), ifd0Id, imgStruct, unsignedLong, 1, - printValue}, // TIFF tag + N_("For grayscale data, the optical density of each possible pixel value."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedShort, -1, printValue}, // TIFF tag + {0x0124, "T4Options", N_("T4 Options"), N_("T.4-encoding options."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedLong, 1, printValue}, // TIFF tag + {0x0125, "T6Options", N_("T6 Options"), N_("T.6-encoding options."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedLong, 1, printValue}, // TIFF tag {0x0128, "ResolutionUnit", N_("Resolution Unit"), N_("The unit for measuring and . The same " "unit is used for both and . If " "the image resolution is unknown, 2 (inches) is designated."), - ifd0Id, imgStruct, unsignedShort, 1, printExifUnit}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, printExifUnit}, {0x0129, "PageNumber", N_("Page Number"), N_("The page number of the page from which this image was scanned."), - ifd0Id, imgStruct, unsignedShort, 2, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 2, printValue}, {0x012d, "TransferFunction", N_("Transfer Function"), N_("A transfer function for the image, described in tabular style. " "Normally this tag is not necessary, since color space is " "specified in the color space information tag ()."), - ifd0Id, imgCharacter, unsignedShort, 3 * 256, printValue}, + IfdId::ifd0Id, SectionId::imgCharacter, unsignedShort, 3 * 256, printValue}, {0x0131, "Software", N_("Software"), N_("This tag records the name and version of the software or " "firmware of the camera or image input device used to " "generate the image. The detailed format is not specified, but " "it is recommended that the example shown below be " "followed. When the field is left blank, it is treated as unknown."), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x0132, "DateTime", N_("Date and Time"), N_("The date and time of image creation. In Exif standard, " "it is the date and time the file was changed."), - ifd0Id, otherTags, asciiString, 20, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 20, printValue}, {0x013b, "Artist", N_("Artist"), N_("This tag records the name of the camera owner, photographer or " "image creator. The detailed format is not specified, but it is " @@ -559,113 +560,113 @@ constexpr TagInfo ifdTagInfo[] = { "below for ease of Interoperability. When the field is " "left blank, it is treated as unknown. Ex.) \"Camera owner, John " "Smith; Photographer, Michael Brown; Image creator, Ken James\""), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x013c, "HostComputer", N_("Host Computer"), N_("This tag records information about the host computer used " "to generate the image."), - ifd0Id, otherTags, asciiString, 0, printValue}, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, printValue}, {0x013d, "Predictor", N_("Predictor"), N_("A predictor is a mathematical operator that is applied to " "the image data before an encoding scheme is applied."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPredictor)}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifPredictor)}, // TIFF tag {0x013e, "WhitePoint", N_("White Point"), N_("The chromaticity of the white point of the image. Normally " "this tag is not necessary, since color space is specified " "in the colorspace information tag ()."), - ifd0Id, imgCharacter, unsignedRational, 2, printValue}, + IfdId::ifd0Id, SectionId::imgCharacter, unsignedRational, 2, printValue}, {0x013f, "PrimaryChromaticities", N_("Primary Chromaticities"), N_("The chromaticity of the three primary colors of the image. " "Normally this tag is not necessary, since colorspace is " "specified in the colorspace information tag ()."), - ifd0Id, imgCharacter, unsignedRational, 6, printValue}, + IfdId::ifd0Id, SectionId::imgCharacter, unsignedRational, 6, printValue}, {0x0140, "ColorMap", N_("Color Map"), N_("A color map for palette color images. This field defines " "a Red-Green-Blue color map (often called a lookup table) " "for palette-color images. In a palette-color image, a " "pixel value is used to index into an RGB lookup table."), - ifd0Id, imgCharacter, unsignedShort, -1, printValue}, + IfdId::ifd0Id, SectionId::imgCharacter, unsignedShort, -1, printValue}, {0x0141, "HalftoneHints", N_("Halftone Hints"), N_("The purpose of the HalftoneHints field is to convey to the " "halftone function the range of gray levels within a " "colorimetrically-specified image that should retain tonal detail."), - ifd0Id, imgStruct, unsignedShort, 2, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 2, printValue}, // TIFF tag {0x0142, "TileWidth", N_("Tile Width"), N_("The tile width in pixels. This is the number of columns in each tile."), - ifd0Id, recOffset, unsignedLong, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, 1, printValue}, // TIFF tag {0x0143, "TileLength", N_("Tile Length"), - N_("The tile length (height) in pixels. This is the number of rows in each tile."), ifd0Id, recOffset, - unsignedLong, 1, printValue}, // TIFF tag + N_("The tile length (height) in pixels. This is the number of rows in each tile."), IfdId::ifd0Id, + SectionId::recOffset, unsignedLong, 1, printValue}, // TIFF tag {0x0144, "TileOffsets", N_("Tile Offsets"), N_("For each tile, the byte offset of that tile, as compressed and " "stored on disk. The offset is specified with respect to the " "beginning of the TIFF file. Note that this implies that each " "tile has a location independent of the locations of other tiles."), - ifd0Id, recOffset, unsignedShort, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::recOffset, unsignedShort, -1, printValue}, // TIFF tag {0x0145, "TileByteCounts", N_("Tile Byte Counts"), N_("For each tile, the number of (compressed) bytes in that tile. See " "TileOffsets for a description of how the byte counts are ordered."), - ifd0Id, recOffset, unsignedLong, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, -1, printValue}, // TIFF tag {0x014a, "SubIFDs", N_("SubIFD Offsets"), - N_("Defined by Adobe Corporation to enable TIFF Trees within a TIFF file."), ifd0Id, tiffEp, unsignedLong, -1, - printValue}, + N_("Defined by Adobe Corporation to enable TIFF Trees within a TIFF file."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedLong, -1, printValue}, {0x014c, "InkSet", N_("Ink Set"), N_("The set of inks used in a separated (PhotometricInterpretation=5) image."), - ifd0Id, imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifInkSet)}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, EXV_PRINT_TAG(exifInkSet)}, // TIFF tag {0x014d, "InkNames", N_("Ink Names"), - N_("The name of each ink used in a separated (PhotometricInterpretation=5) image."), ifd0Id, imgStruct, - asciiString, 0, printValue}, // TIFF tag + N_("The name of each ink used in a separated (PhotometricInterpretation=5) image."), IfdId::ifd0Id, + SectionId::imgStruct, asciiString, 0, printValue}, // TIFF tag {0x014e, "NumberOfInks", N_("Number Of Inks"), - N_("The number of inks. Usually equal to SamplesPerPixel, unless there are extra samples."), ifd0Id, imgStruct, - unsignedShort, 1, printValue}, // TIFF tag + N_("The number of inks. Usually equal to SamplesPerPixel, unless there are extra samples."), IfdId::ifd0Id, + SectionId::imgStruct, unsignedShort, 1, printValue}, // TIFF tag {0x0150, "DotRange", N_("Dot Range"), /* xgettext:no-c-format */ - N_("The component values that correspond to a 0% dot and 100% dot."), ifd0Id, imgStruct, unsignedByte, -1, - printValue}, // TIFF tag + N_("The component values that correspond to a 0% dot and 100% dot."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedByte, -1, printValue}, // TIFF tag {0x0151, "TargetPrinter", N_("Target Printer"), - N_("A description of the printing environment for which this separation is intended."), ifd0Id, imgStruct, - asciiString, 0, printValue}, // TIFF tag + N_("A description of the printing environment for which this separation is intended."), IfdId::ifd0Id, + SectionId::imgStruct, asciiString, 0, printValue}, // TIFF tag {0x0152, "ExtraSamples", N_("Extra Samples"), N_("Specifies that each pixel has m extra components whose interpretation " "is defined by one of the values listed below."), - ifd0Id, imgStruct, unsignedShort, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, -1, printValue}, // TIFF tag {0x0153, "SampleFormat", N_("Sample Format"), - N_("This field specifies how to interpret each data sample in a pixel."), ifd0Id, imgStruct, unsignedShort, -1, - EXV_PRINT_TAG(exifSampleFormat)}, // TIFF tag - {0x0154, "SMinSampleValue", N_("SMin Sample Value"), N_("This field specifies the minimum sample value."), ifd0Id, - imgStruct, unsignedShort, -1, printValue}, // TIFF tag - {0x0155, "SMaxSampleValue", N_("SMax Sample Value"), N_("This field specifies the maximum sample value."), ifd0Id, - imgStruct, unsignedShort, -1, printValue}, // TIFF tag - {0x0156, "TransferRange", N_("Transfer Range"), N_("Expands the range of the TransferFunction"), ifd0Id, - imgCharacter, unsignedShort, 6, printValue}, // TIFF tag + N_("This field specifies how to interpret each data sample in a pixel."), IfdId::ifd0Id, SectionId::imgStruct, + unsignedShort, -1, EXV_PRINT_TAG(exifSampleFormat)}, // TIFF tag + {0x0154, "SMinSampleValue", N_("SMin Sample Value"), N_("This field specifies the minimum sample value."), + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, -1, printValue}, // TIFF tag + {0x0155, "SMaxSampleValue", N_("SMax Sample Value"), N_("This field specifies the maximum sample value."), + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, -1, printValue}, // TIFF tag + {0x0156, "TransferRange", N_("Transfer Range"), N_("Expands the range of the TransferFunction"), IfdId::ifd0Id, + SectionId::imgCharacter, unsignedShort, 6, printValue}, // TIFF tag {0x0157, "ClipPath", N_("Clip Path"), N_("A TIFF ClipPath is intended to mirror the essentials of PostScript's " "path creation functionality."), - ifd0Id, tiffPm6, unsignedByte, -1, printValue}, // TIFF&PM6 tag + IfdId::ifd0Id, SectionId::tiffPm6, unsignedByte, -1, printValue}, // TIFF&PM6 tag {0x0158, "XClipPathUnits", N_("X Clip Path Units"), N_("The number of units that span the width of the image, in terms of " "integer ClipPath coordinates."), - ifd0Id, tiffPm6, signedShort, 1, printValue}, // TIFF&PM6 tag + IfdId::ifd0Id, SectionId::tiffPm6, signedShort, 1, printValue}, // TIFF&PM6 tag {0x0159, "YClipPathUnits", N_("Y Clip Path Units"), N_("The number of units that span the height of the image, in terms of " "integer ClipPath coordinates."), - ifd0Id, tiffPm6, signedShort, 1, printValue}, // TIFF&PM6 tag + IfdId::ifd0Id, SectionId::tiffPm6, signedShort, 1, printValue}, // TIFF&PM6 tag {0x015a, "Indexed", N_("Indexed"), N_("Indexed images are images where the 'pixels' do not represent color " "values, but rather an index (usually 8-bit) into a separate color " "table, the ColorMap."), - ifd0Id, tiffPm6, unsignedShort, 1, EXV_PRINT_TAG(exifIndexed)}, // TIFF&PM6 tag + IfdId::ifd0Id, SectionId::tiffPm6, unsignedShort, 1, EXV_PRINT_TAG(exifIndexed)}, // TIFF&PM6 tag {0x015b, "JPEGTables", N_("JPEG tables"), N_("This optional tag may be used to encode the JPEG quantization and " "Huffman tables for subsequent use by the JPEG decompression process."), - ifd0Id, imgStruct, undefined, 0, printValue}, // TIFF/EP tag + IfdId::ifd0Id, SectionId::imgStruct, undefined, 0, printValue}, // TIFF/EP tag {0x015F, "OPIProxy", N_("OPI Proxy"), N_("OPIProxy gives information concerning whether this image is a " "low-resolution proxy of a high-resolution image (Adobe OPI)."), - ifd0Id, adobeOpi, unsignedShort, 1, printValue}, // Adobe OPI tag + IfdId::ifd0Id, SectionId::adobeOpi, unsignedShort, 1, printValue}, // Adobe OPI tag {0x0200, "JPEGProc", N_("JPEG Process"), N_("This field indicates the process used to produce the compressed data"), - ifd0Id, recOffset, unsignedLong, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, 1, printValue}, // TIFF tag {0x0201, "JPEGInterchangeFormat", N_("JPEG Interchange Format"), N_("The offset to the start byte (SOI) of JPEG compressed " "thumbnail data. This is not used for primary image JPEG data."), - ifd0Id, recOffset, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, 1, printValue}, {0x0202, "JPEGInterchangeFormatLength", N_("JPEG Interchange Format Length"), N_("The number of bytes of JPEG compressed thumbnail data. This " "is not used for primary image JPEG data. JPEG thumbnails " @@ -673,30 +674,30 @@ constexpr TagInfo ifdTagInfo[] = { "bitstream from SOI to EOI. Appn and COM markers should " "not be recorded. Compressed thumbnails must be recorded in no " "more than 64 Kbytes, including all other data to be recorded in APP1."), - ifd0Id, recOffset, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::recOffset, unsignedLong, 1, printValue}, {0x0203, "JPEGRestartInterval", N_("JPEG Restart Interval"), N_("This Field indicates the length of the restart interval used " "in the compressed image data."), - ifd0Id, imgStruct, unsignedShort, 1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, printValue}, // TIFF tag {0x0205, "JPEGLosslessPredictors", N_("JPEG Lossless Predictors"), N_("This Field points to a list of lossless predictor-selection " "values, one per component."), - ifd0Id, imgStruct, unsignedShort, -1, EXV_PRINT_TAG(exifJpegLosslessPredictor)}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, -1, EXV_PRINT_TAG(exifJpegLosslessPredictor)}, // TIFF tag {0x0206, "JPEGPointTransforms", N_("JPEG Point Transforms"), - N_("This Field points to a list of point transform values, one per component."), ifd0Id, imgStruct, unsignedShort, - -1, printValue}, // TIFF tag + N_("This Field points to a list of point transform values, one per component."), IfdId::ifd0Id, + SectionId::imgStruct, unsignedShort, -1, printValue}, // TIFF tag {0x0207, "JPEGQTables", N_("JPEG Q-Tables"), N_("This Field points to a list of offsets to the quantization tables, " "one per component."), - ifd0Id, imgStruct, unsignedLong, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedLong, -1, printValue}, // TIFF tag {0x0208, "JPEGDCTables", N_("JPEG DC-Tables"), N_("This Field points to a list of offsets to the DC Huffman tables or " "the lossless Huffman tables, one per component."), - ifd0Id, imgStruct, unsignedLong, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedLong, -1, printValue}, // TIFF tag {0x0209, "JPEGACTables", N_("JPEG AC-Tables"), N_("This Field points to a list of offsets to the Huffman AC tables, " "one per component."), - ifd0Id, imgStruct, unsignedLong, -1, printValue}, // TIFF tag + IfdId::ifd0Id, SectionId::imgStruct, unsignedLong, -1, printValue}, // TIFF tag {0x0211, "YCbCrCoefficients", N_("YCbCr Coefficients"), N_("The matrix coefficients for transformation from RGB to YCbCr " "image data. No default is given in TIFF; but here the " @@ -705,12 +706,12 @@ constexpr TagInfo ifdTagInfo[] = { "color space information tag, with the default being the value " "that gives the optimal image characteristics " "Interoperability this condition."), - ifd0Id, imgCharacter, unsignedRational, 3, printValue}, + IfdId::ifd0Id, SectionId::imgCharacter, unsignedRational, 3, printValue}, {0x0212, "YCbCrSubSampling", N_("YCbCr Sub-Sampling"), N_("The sampling ratio of chrominance components in relation to the " "luminance component. In JPEG compressed data a JPEG marker " "is used instead of this tag."), - ifd0Id, imgStruct, unsignedShort, 2, printValue}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 2, printValue}, {0x0213, "YCbCrPositioning", N_("YCbCr Positioning"), N_("The position of chrominance components in relation to the " "luminance component. This field is designated only for " @@ -725,7 +726,7 @@ constexpr TagInfo ifdTagInfo[] = { ", it shall follow the TIFF default regardless " "of the value in this field. It is preferable that readers " "be able to support both centered and co-sited positioning."), - ifd0Id, imgStruct, unsignedShort, 1, print0x0213}, + IfdId::ifd0Id, SectionId::imgStruct, unsignedShort, 1, print0x0213}, {0x0214, "ReferenceBlackWhite", N_("Reference Black/White"), N_("The reference black point value and reference white point " "value. No defaults are given in TIFF, but the values " @@ -733,36 +734,36 @@ constexpr TagInfo ifdTagInfo[] = { "in a color space information tag, with the default " "being the value that gives the optimal image characteristics " "Interoperability these conditions."), - ifd0Id, imgCharacter, unsignedRational, 6, printValue}, - {0x02bc, "XMLPacket", N_("XML Packet"), N_("XMP Metadata (Adobe technote 9-14-02)"), ifd0Id, otherTags, - unsignedByte, -1, printValue}, - {0x4746, "Rating", N_("Windows Rating"), N_("Rating tag used by Windows"), ifd0Id, otherTags, unsignedShort, -1, - printValue}, // Windows Tag - {0x4749, "RatingPercent", N_("Windows Rating Percent"), N_("Rating tag used by Windows, value in percent"), ifd0Id, - otherTags, unsignedShort, -1, printValue}, // Windows Tag + IfdId::ifd0Id, SectionId::imgCharacter, unsignedRational, 6, printValue}, + {0x02bc, "XMLPacket", N_("XML Packet"), N_("XMP Metadata (Adobe technote 9-14-02)"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printValue}, + {0x4746, "Rating", N_("Windows Rating"), N_("Rating tag used by Windows"), IfdId::ifd0Id, SectionId::otherTags, + unsignedShort, -1, printValue}, // Windows Tag + {0x4749, "RatingPercent", N_("Windows Rating Percent"), N_("Rating tag used by Windows, value in percent"), + IfdId::ifd0Id, SectionId::otherTags, unsignedShort, -1, printValue}, // Windows Tag {0x7032, "VignettingCorrParams", N_("Vignetting Correction Params"), N_("Sony vignetting correction parameters"), - ifd0Id, otherTags, signedShort, 17, printValue}, // Sony Tag + IfdId::ifd0Id, SectionId::otherTags, signedShort, 17, printValue}, // Sony Tag {0x7035, "ChromaticAberrationCorrParams", N_("Chromatic Aberration Correction Params"), - N_("Sony chromatic aberration correction parameters"), ifd0Id, otherTags, signedShort, 33, + N_("Sony chromatic aberration correction parameters"), IfdId::ifd0Id, SectionId::otherTags, signedShort, 33, printValue}, // Sony Tag {0x7037, "DistortionCorrParams", N_("Distortion Correction Params"), N_("Sony distortion correction parameters"), - ifd0Id, otherTags, signedShort, 17, printValue}, // Sony Tag + IfdId::ifd0Id, SectionId::otherTags, signedShort, 17, printValue}, // Sony Tag {0x800d, "ImageID", N_("Image ID"), N_("ImageID is the full pathname of the original, high-resolution image, " "or any other identifying string that uniquely identifies the original " "image (Adobe OPI)."), - ifd0Id, adobeOpi, asciiString, 0, printValue}, // Adobe OPI tag + IfdId::ifd0Id, SectionId::adobeOpi, asciiString, 0, printValue}, // Adobe OPI tag {0x828d, "CFARepeatPatternDim", N_("CFA Repeat Pattern Dimension"), N_("Contains two values representing the minimum rows and columns " "to define the repeating patterns of the color filter array"), - ifd0Id, tiffEp, unsignedShort, 2, printValue}, // TIFF/EP Tag + IfdId::ifd0Id, SectionId::tiffEp, unsignedShort, 2, printValue}, // TIFF/EP Tag {0x828e, "CFAPattern", N_("CFA Pattern"), N_("Indicates the color filter array (CFA) geometric pattern of the image " "sensor when a one-chip color area sensor is used. It does not apply to " "all sensing methods"), - ifd0Id, tiffEp, unsignedByte, -1, printValue}, // TIFF/EP Tag + IfdId::ifd0Id, SectionId::tiffEp, unsignedByte, -1, printValue}, // TIFF/EP Tag {0x828f, "BatteryLevel", N_("Battery Level"), "Contains a value of the battery level as a fraction or string", - ifd0Id, tiffEp, unsignedRational, 1, printValue}, // TIFF/EP Tag + IfdId::ifd0Id, SectionId::tiffEp, unsignedRational, 1, printValue}, // TIFF/EP Tag {0x8298, "Copyright", N_("Copyright"), N_("Copyright information. In this standard the tag is used to " "indicate both the photographer and editor copyrights. It is " @@ -782,131 +783,132 @@ constexpr TagInfo ifdTagInfo[] = { "consists of one space followed by a terminating NULL code, then " "the editor copyright is given. When the field is left blank, it is " "treated as unknown."), - ifd0Id, otherTags, asciiString, 0, print0x8298}, - {0x829a, "ExposureTime", N_("Exposure Time"), N_("Exposure time, given in seconds."), ifd0Id, tiffEp, - unsignedRational, 1, print0x829a}, // TIFF/EP tag - {0x829d, "FNumber", N_("FNumber"), N_("The F number."), ifd0Id, tiffEp, unsignedRational, 1, + IfdId::ifd0Id, SectionId::otherTags, asciiString, 0, print0x8298}, + {0x829a, "ExposureTime", N_("Exposure Time"), N_("Exposure time, given in seconds."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedRational, 1, print0x829a}, // TIFF/EP tag + {0x829d, "FNumber", N_("FNumber"), N_("The F number."), IfdId::ifd0Id, SectionId::tiffEp, unsignedRational, 1, print0x829d}, // TIFF/EP tag - {0x83bb, "IPTCNAA", N_("IPTC/NAA"), N_("Contains an IPTC/NAA record"), ifd0Id, tiffEp, unsignedLong, 0, - printValue}, // TIFF/EP Tag + {0x83bb, "IPTCNAA", N_("IPTC/NAA"), N_("Contains an IPTC/NAA record"), IfdId::ifd0Id, SectionId::tiffEp, + unsignedLong, 0, printValue}, // TIFF/EP Tag {0x8649, "ImageResources", N_("Image Resources Block"), - N_("Contains information embedded by the Adobe Photoshop application"), ifd0Id, otherTags, unsignedByte, -1, - printValue}, + N_("Contains information embedded by the Adobe Photoshop application"), IfdId::ifd0Id, SectionId::otherTags, + unsignedByte, -1, printValue}, {0x8769, "ExifTag", N_("Exif IFD Pointer"), N_("A pointer to the Exif IFD. Interoperability, Exif IFD has the " "same structure as that of the IFD specified in TIFF. " "ordinarily, however, it does not contain image data as in " "the case of TIFF."), - ifd0Id, exifFormat, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::exifFormat, unsignedLong, 1, printValue}, {0x8773, "InterColorProfile", N_("Inter Color Profile"), - N_("Contains an InterColor Consortium (ICC) format color space characterization/profile"), ifd0Id, tiffEp, - undefined, -1, printValue}, + N_("Contains an InterColor Consortium (ICC) format color space characterization/profile"), IfdId::ifd0Id, + SectionId::tiffEp, undefined, -1, printValue}, {0x8822, "ExposureProgram", N_("Exposure Program"), - N_("The class of the program used by the camera to set exposure when the picture is taken."), ifd0Id, tiffEp, - unsignedShort, 1, print0x8822}, // TIFF/EP tag + N_("The class of the program used by the camera to set exposure when the picture is taken."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedShort, 1, print0x8822}, // TIFF/EP tag {0x8824, "SpectralSensitivity", N_("Spectral Sensitivity"), - N_("Indicates the spectral sensitivity of each channel of the camera used."), ifd0Id, tiffEp, asciiString, 0, - printValue}, // TIFF/EP tag + N_("Indicates the spectral sensitivity of each channel of the camera used."), IfdId::ifd0Id, SectionId::tiffEp, + asciiString, 0, printValue}, // TIFF/EP tag {0x8825, "GPSTag", N_("GPS Info IFD Pointer"), N_("A pointer to the GPS Info IFD. The " "Interoperability structure of the GPS Info IFD, like that of " "Exif IFD, has no image data."), - ifd0Id, exifFormat, unsignedLong, 1, printValue}, + IfdId::ifd0Id, SectionId::exifFormat, unsignedLong, 1, printValue}, {0x8827, "ISOSpeedRatings", N_("ISO Speed Ratings"), - N_("Indicates the ISO Speed and ISO Latitude of the camera or input device as specified in ISO 12232."), ifd0Id, - tiffEp, unsignedShort, 0, print0x8827}, // TIFF/EP tag + N_("Indicates the ISO Speed and ISO Latitude of the camera or input device as specified in ISO 12232."), + IfdId::ifd0Id, SectionId::tiffEp, unsignedShort, 0, print0x8827}, // TIFF/EP tag {0x8828, "OECF", N_("OECF"), N_("Indicates the Opto-Electric Conversion Function (OECF) specified in ISO 14524."), - ifd0Id, tiffEp, undefined, 0, printValue}, // TIFF/EP tag - {0x8829, "Interlace", N_("Interlace"), N_("Indicates the field number of multifield images."), ifd0Id, tiffEp, - unsignedShort, 1, printValue}, // TIFF/EP tag + IfdId::ifd0Id, SectionId::tiffEp, undefined, 0, printValue}, // TIFF/EP tag + {0x8829, "Interlace", N_("Interlace"), N_("Indicates the field number of multifield images."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedShort, 1, printValue}, // TIFF/EP tag {0x882a, "TimeZoneOffset", N_("Time Zone Offset"), N_("This optional tag encodes the time zone of the camera clock (relative " "to Greenwich Mean Time) used to create the DataTimeOriginal tag-value " "when the picture was taken. It may also contain the time zone offset " "of the clock used to create the DateTime tag-value when the image was " "modified."), - ifd0Id, tiffEp, signedShort, -1, printValue}, + IfdId::ifd0Id, SectionId::tiffEp, signedShort, -1, printValue}, {0x882b, "SelfTimerMode", N_("Self Timer Mode"), - N_("Number of seconds image capture was delayed from button press."), ifd0Id, tiffEp, unsignedShort, 1, - printValue}, // TIFF/EP tag + N_("Number of seconds image capture was delayed from button press."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedShort, 1, printValue}, // TIFF/EP tag {0x9003, "DateTimeOriginal", N_("Date Time Original"), - N_("The date and time when the original image data was generated."), ifd0Id, tiffEp, asciiString, 20, - printValue}, // TIFF/EP tag + N_("The date and time when the original image data was generated."), IfdId::ifd0Id, SectionId::tiffEp, asciiString, + 20, printValue}, // TIFF/EP tag {0x9102, "CompressedBitsPerPixel", N_("Compressed Bits Per Pixel"), - N_("Specific to compressed data; states the compressed bits per pixel."), ifd0Id, tiffEp, unsignedRational, 1, - printFloat}, // TIFF/EP tag - {0x9201, "ShutterSpeedValue", N_("Shutter Speed Value"), N_("Shutter speed."), ifd0Id, tiffEp, signedRational, 1, - print0x9201}, // TIFF/EP tag - {0x9202, "ApertureValue", N_("Aperture Value"), N_("The lens aperture."), ifd0Id, tiffEp, unsignedRational, 1, - print0x9202}, // TIFF/EP tag - {0x9203, "BrightnessValue", N_("Brightness Value"), N_("The value of brightness."), ifd0Id, tiffEp, signedRational, - 1, printFloat}, // TIFF/EP tag - {0x9204, "ExposureBiasValue", N_("Exposure Bias Value"), N_("The exposure bias."), ifd0Id, tiffEp, signedRational, - 1, print0x9204}, // TIFF/EP tag - {0x9205, "MaxApertureValue", N_("Max Aperture Value"), N_("The smallest F number of the lens."), ifd0Id, tiffEp, + N_("Specific to compressed data; states the compressed bits per pixel."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedRational, 1, printFloat}, // TIFF/EP tag + {0x9201, "ShutterSpeedValue", N_("Shutter Speed Value"), N_("Shutter speed."), IfdId::ifd0Id, SectionId::tiffEp, + signedRational, 1, print0x9201}, // TIFF/EP tag + {0x9202, "ApertureValue", N_("Aperture Value"), N_("The lens aperture."), IfdId::ifd0Id, SectionId::tiffEp, unsignedRational, 1, print0x9202}, // TIFF/EP tag - {0x9206, "SubjectDistance", N_("Subject Distance"), N_("The distance to the subject, given in meters."), ifd0Id, - tiffEp, signedRational, 1, print0x9206}, // TIFF/EP tag - {0x9207, "MeteringMode", N_("Metering Mode"), N_("The metering mode."), ifd0Id, tiffEp, unsignedShort, 1, - print0x9207}, // TIFF/EP tag - {0x9208, "LightSource", N_("Light Source"), N_("The kind of light source."), ifd0Id, tiffEp, unsignedShort, 1, - print0x9208}, // TIFF/EP tag - {0x9209, "Flash", N_("Flash"), N_("Indicates the status of flash when the image was shot."), ifd0Id, tiffEp, - unsignedShort, 1, EXV_PRINT_TAG(exifFlash)}, // TIFF/EP tag - {0x920a, "FocalLength", N_("Focal Length"), N_("The actual focal length of the lens, in mm."), ifd0Id, tiffEp, - unsignedRational, 1, print0x920a}, // TIFF/EP tag - {0x920b, "FlashEnergy", N_("Flash Energy"), N_("Amount of flash energy (BCPS)."), ifd0Id, tiffEp, unsignedRational, - 0, printValue}, // TIFF/EP tag - {0x920c, "SpatialFrequencyResponse", N_("Spatial Frequency Response"), N_("SFR of the camera."), ifd0Id, tiffEp, - undefined, 0, printValue}, // TIFF/EP tag - {0x920d, "Noise", N_("Noise"), N_("Noise measurement values."), ifd0Id, tiffEp, undefined, 0, + {0x9203, "BrightnessValue", N_("Brightness Value"), N_("The value of brightness."), IfdId::ifd0Id, + SectionId::tiffEp, signedRational, 1, printFloat}, // TIFF/EP tag + {0x9204, "ExposureBiasValue", N_("Exposure Bias Value"), N_("The exposure bias."), IfdId::ifd0Id, SectionId::tiffEp, + signedRational, 1, print0x9204}, // TIFF/EP tag + {0x9205, "MaxApertureValue", N_("Max Aperture Value"), N_("The smallest F number of the lens."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedRational, 1, print0x9202}, // TIFF/EP tag + {0x9206, "SubjectDistance", N_("Subject Distance"), N_("The distance to the subject, given in meters."), + IfdId::ifd0Id, SectionId::tiffEp, signedRational, 1, print0x9206}, // TIFF/EP tag + {0x9207, "MeteringMode", N_("Metering Mode"), N_("The metering mode."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedShort, 1, print0x9207}, // TIFF/EP tag + {0x9208, "LightSource", N_("Light Source"), N_("The kind of light source."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedShort, 1, print0x9208}, // TIFF/EP tag + {0x9209, "Flash", N_("Flash"), N_("Indicates the status of flash when the image was shot."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedShort, 1, EXV_PRINT_TAG(exifFlash)}, // TIFF/EP tag + {0x920a, "FocalLength", N_("Focal Length"), N_("The actual focal length of the lens, in mm."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedRational, 1, print0x920a}, // TIFF/EP tag + {0x920b, "FlashEnergy", N_("Flash Energy"), N_("Amount of flash energy (BCPS)."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedRational, 0, printValue}, // TIFF/EP tag + {0x920c, "SpatialFrequencyResponse", N_("Spatial Frequency Response"), N_("SFR of the camera."), IfdId::ifd0Id, + SectionId::tiffEp, undefined, 0, printValue}, // TIFF/EP tag + {0x920d, "Noise", N_("Noise"), N_("Noise measurement values."), IfdId::ifd0Id, SectionId::tiffEp, undefined, 0, printValue}, // TIFF/EP tag {0x920e, "FocalPlaneXResolution", N_("Focal Plane X Resolution"), - N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageWidth direction for main image."), ifd0Id, - tiffEp, unsignedRational, 1, printFloat}, // TIFF/EP tag + N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageWidth direction for main image."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedRational, 1, printFloat}, // TIFF/EP tag {0x920f, "FocalPlaneYResolution", N_("Focal Plane Y Resolution"), - N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageLength direction for main image."), ifd0Id, - tiffEp, unsignedRational, 1, printFloat}, // TIFF/EP tag + N_("Number of pixels per FocalPlaneResolutionUnit (37392) in ImageLength direction for main image."), + IfdId::ifd0Id, SectionId::tiffEp, unsignedRational, 1, printFloat}, // TIFF/EP tag {0x9210, "FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"), - N_("Unit of measurement for FocalPlaneXResolution(37390) and FocalPlaneYResolution(37391)."), ifd0Id, tiffEp, - unsignedShort, 1, EXV_PRINT_TAG(tiffFocalPlaneResolutionUnit)}, // TIFF/EP tag + N_("Unit of measurement for FocalPlaneXResolution(37390) and FocalPlaneYResolution(37391)."), IfdId::ifd0Id, + SectionId::tiffEp, unsignedShort, 1, EXV_PRINT_TAG(tiffFocalPlaneResolutionUnit)}, // TIFF/EP tag {0x9211, "ImageNumber", N_("Image Number"), N_("Number assigned to an image, e.g., in a chained image burst."), - ifd0Id, tiffEp, unsignedLong, 1, printValue}, // TIFF/EP tag + IfdId::ifd0Id, SectionId::tiffEp, unsignedLong, 1, printValue}, // TIFF/EP tag {0x9212, "SecurityClassification", N_("Security Classification"), - N_("Security classification assigned to the image."), ifd0Id, tiffEp, asciiString, 0, printValue}, // TIFF/EP tag - {0x9213, "ImageHistory", N_("Image History"), N_("Record of what has been done to the image."), ifd0Id, tiffEp, - asciiString, 0, printValue}, // TIFF/EP tag - {0x9214, "SubjectLocation", N_("Subject Location"), - N_("Indicates the location and area of the main subject in the overall scene."), ifd0Id, tiffEp, unsignedShort, 2, + N_("Security classification assigned to the image."), IfdId::ifd0Id, SectionId::tiffEp, asciiString, 0, printValue}, // TIFF/EP tag + {0x9213, "ImageHistory", N_("Image History"), N_("Record of what has been done to the image."), IfdId::ifd0Id, + SectionId::tiffEp, asciiString, 0, printValue}, // TIFF/EP tag + {0x9214, "SubjectLocation", N_("Subject Location"), + N_("Indicates the location and area of the main subject in the overall scene."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedShort, 2, printValue}, // TIFF/EP tag {0x9215, "ExposureIndex", N_("Exposure Index"), - N_("Encodes the camera exposure index setting when image was captured."), ifd0Id, tiffEp, unsignedRational, 0, - printValue}, // TIFF/EP tag + N_("Encodes the camera exposure index setting when image was captured."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedRational, 0, printValue}, // TIFF/EP tag {0x9216, "TIFFEPStandardID", N_("TIFF/EP Standard ID"), N_("Contains four ASCII characters representing the TIFF/EP standard " "version of a TIFF/EP file, eg '1', '0', '0', '0'"), - ifd0Id, tiffEp, unsignedByte, 4, printValue}, // TIFF/EP Tag - {0x9217, "SensingMethod", N_("Sensing Method"), N_("Type of image sensor."), ifd0Id, tiffEp, unsignedShort, 1, - EXV_PRINT_TAG(tiffSensingMethod)}, // TIFF/EP tag - {0x9c9b, "XPTitle", N_("Windows Title"), N_("Title tag used by Windows, encoded in UCS2"), ifd0Id, otherTags, - unsignedByte, -1, printUcs2}, // Windows Tag - {0x9c9c, "XPComment", N_("Windows Comment"), N_("Comment tag used by Windows, encoded in UCS2"), ifd0Id, otherTags, - unsignedByte, -1, printUcs2}, // Windows Tag - {0x9c9d, "XPAuthor", N_("Windows Author"), N_("Author tag used by Windows, encoded in UCS2"), ifd0Id, otherTags, - unsignedByte, -1, printUcs2}, // Windows Tag - {0x9c9e, "XPKeywords", N_("Windows Keywords"), N_("Keywords tag used by Windows, encoded in UCS2"), ifd0Id, - otherTags, unsignedByte, -1, printUcs2}, // Windows Tag - {0x9c9f, "XPSubject", N_("Windows Subject"), N_("Subject tag used by Windows, encoded in UCS2"), ifd0Id, otherTags, - unsignedByte, -1, printUcs2}, // Windows Tag - {0xc4a5, "PrintImageMatching", N_("Print Image Matching"), N_("Print Image Matching, description needed."), ifd0Id, - otherTags, undefined, -1, printValue}, + IfdId::ifd0Id, SectionId::tiffEp, unsignedByte, 4, printValue}, // TIFF/EP Tag + {0x9217, "SensingMethod", N_("Sensing Method"), N_("Type of image sensor."), IfdId::ifd0Id, SectionId::tiffEp, + unsignedShort, 1, EXV_PRINT_TAG(tiffSensingMethod)}, // TIFF/EP tag + {0x9c9b, "XPTitle", N_("Windows Title"), N_("Title tag used by Windows, encoded in UCS2"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printUcs2}, // Windows Tag + {0x9c9c, "XPComment", N_("Windows Comment"), N_("Comment tag used by Windows, encoded in UCS2"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printUcs2}, // Windows Tag + {0x9c9d, "XPAuthor", N_("Windows Author"), N_("Author tag used by Windows, encoded in UCS2"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printUcs2}, // Windows Tag + {0x9c9e, "XPKeywords", N_("Windows Keywords"), N_("Keywords tag used by Windows, encoded in UCS2"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printUcs2}, // Windows Tag + {0x9c9f, "XPSubject", N_("Windows Subject"), N_("Subject tag used by Windows, encoded in UCS2"), IfdId::ifd0Id, + SectionId::otherTags, unsignedByte, -1, printUcs2}, // Windows Tag + {0xc4a5, "PrintImageMatching", N_("Print Image Matching"), N_("Print Image Matching, description needed."), + IfdId::ifd0Id, SectionId::otherTags, undefined, -1, printValue}, //////////////////////////////////////// // https://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.5.0.0.pdf {0xc612, "DNGVersion", N_("DNG version"), N_("This tag encodes the DNG four-tier version number. For files " "compliant with version 1.1.0.0 of the DNG specification, this " "tag should contain the bytes: 1, 1, 0, 0."), - ifd0Id, dngTags, unsignedByte, 4, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 4, printValue}, // DNG tag {0xc613, "DNGBackwardVersion", N_("DNG backward version"), N_("This tag specifies the oldest version of the Digital Negative " "specification for which a file is compatible. Readers should" @@ -915,7 +917,7 @@ constexpr TagInfo ifdTagInfo[] = { "the reader was based on. In addition to checking the version tags, " "readers should, for all tags, check the types, counts, and values, " "to verify it is able to correctly read the file."), - ifd0Id, dngTags, unsignedByte, 4, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 4, printValue}, // DNG tag {0xc614, "UniqueCameraModel", N_("Unique Camera Model"), N_("Defines a unique, non-localized name for the camera model that " "created the image in the raw file. This name should include the " @@ -923,55 +925,55 @@ constexpr TagInfo ifdTagInfo[] = { "even if the camera name itself is localized for different markets " "(see LocalizedCameraModel). This string may be used by reader " "software to index into per-model preferences and replacement profiles."), - ifd0Id, dngTags, asciiString, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, asciiString, 0, printValue}, // DNG tag {0xc615, "LocalizedCameraModel", N_("Localized Camera Model"), N_("Similar to the UniqueCameraModel field, except the name can be " "localized for different markets to match the localization of the " "camera name."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc616, "CFAPlaneColor", N_("CFA Plane Color"), N_("Provides a mapping between the values in the CFAPattern tag and the " "plane numbers in LinearRaw space. This is a required tag for non-RGB " "CFA images."), - ifd0Id, dngTags, unsignedByte, -1, printValue}, // DNG tag - {0xc617, "CFALayout", N_("CFA Layout"), N_("Describes the spatial layout of the CFA."), ifd0Id, dngTags, - unsignedShort, 1, EXV_PRINT_TAG(dngCfaLayout)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, -1, printValue}, // DNG tag + {0xc617, "CFALayout", N_("CFA Layout"), N_("Describes the spatial layout of the CFA."), IfdId::ifd0Id, + SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngCfaLayout)}, // DNG tag {0xc618, "LinearizationTable", N_("Linearization Table"), N_("Describes a lookup table that maps stored values into linear values. " "This tag is typically used to increase compression ratios by storing " "the raw data in a non-linear, more visually uniform space with fewer " "total encoding levels. If SamplesPerPixel is not equal to one, this " "single table applies to all the samples for each pixel."), - ifd0Id, dngTags, unsignedShort, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, -1, printValue}, // DNG tag {0xc619, "BlackLevelRepeatDim", N_("Black Level Repeat Dim"), - N_("Specifies repeat pattern size for the BlackLevel tag."), ifd0Id, dngTags, unsignedShort, 2, + N_("Specifies repeat pattern size for the BlackLevel tag."), IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 2, printValue}, // DNG tag {0xc61a, "BlackLevel", N_("Black Level"), N_("Specifies the zero light (a.k.a. thermal black or black current) " "encoding level, as a repeating pattern. The origin of this pattern " "is the top-left corner of the ActiveArea rectangle. The values are " "stored in row-column-sample scan order."), - ifd0Id, dngTags, unsignedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, -1, printValue}, // DNG tag {0xc61b, "BlackLevelDeltaH", N_("Black Level Delta H"), N_("If the zero light encoding level is a function of the image column, " "BlackLevelDeltaH specifies the difference between the zero light " "encoding level for each column and the baseline zero light encoding " "level. If SamplesPerPixel is not equal to one, this single table " "applies to all the samples for each pixel."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc61c, "BlackLevelDeltaV", N_("Black Level Delta V"), N_("If the zero light encoding level is a function of the image row, " "this tag specifies the difference between the zero light encoding " "level for each row and the baseline zero light encoding level. If " "SamplesPerPixel is not equal to one, this single table applies to " "all the samples for each pixel."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc61d, "WhiteLevel", N_("White Level"), N_("This tag specifies the fully saturated encoding level for the raw " "sample values. Saturation is caused either by the sensor itself " "becoming highly non-linear in response, or by the camera's analog " "to digital converter clipping."), - ifd0Id, dngTags, unsignedLong, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, -1, printValue}, // DNG tag {0xc61e, "DefaultScale", N_("Default Scale"), N_("DefaultScale is required for cameras with non-square pixels. It " "specifies the default scale factors for each direction to convert " @@ -979,7 +981,7 @@ constexpr TagInfo ifdTagInfo[] = { "to approximately preserve total pixel count. For CFA images that " "use CFALayout equal to 2, 3, 4, or 5, such as the Fujifilm SuperCCD, " "these two values should usually differ by a factor of 2.0."), - ifd0Id, dngTags, unsignedRational, 2, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 2, printValue}, // DNG tag {0xc61f, "DefaultCropOrigin", N_("Default Crop Origin"), N_("Raw images often store extra pixels around the edges of the final " "image. These extra pixels help prevent interpolation artifacts near " @@ -987,27 +989,27 @@ constexpr TagInfo ifdTagInfo[] = { "of the final image area, in raw image coordinates (i.e., before the " "DefaultScale has been applied), relative to the top-left corner of " "the ActiveArea rectangle."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG tag {0xc620, "DefaultCropSize", N_("Default Crop Size"), N_("Raw images often store extra pixels around the edges of the final " "image. These extra pixels help prevent interpolation artifacts near " "the edges of the final image. DefaultCropSize specifies the size of " "the final image area, in raw image coordinates (i.e., before the " "DefaultScale has been applied)."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG tag {0xc621, "ColorMatrix1", N_("Color Matrix 1"), N_("ColorMatrix1 defines a transformation matrix that converts XYZ " "values to reference camera native color space values, under the " "first calibration illuminant. The matrix values are stored in row " "scan order. The ColorMatrix1 tag is required for all non-monochrome " "DNG files."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc622, "ColorMatrix2", N_("Color Matrix 2"), N_("ColorMatrix2 defines a transformation matrix that converts XYZ " "values to reference camera native color space values, under the " "second calibration illuminant. The matrix values are stored in row " "scan order."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc623, "CameraCalibration1", N_("Camera Calibration 1"), N_("CameraCalibration1 defines a calibration matrix that transforms " "reference camera native space values to individual camera native " @@ -1017,7 +1019,7 @@ constexpr TagInfo ifdTagInfo[] = { "swap in replacement color matrices based on UniqueCameraModel tag, " "while still taking advantage of any per-individual camera calibration " "performed by the camera manufacturer."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc624, "CameraCalibration2", N_("Camera Calibration 2"), N_("CameraCalibration2 defines a calibration matrix that transforms " "reference camera native space values to individual camera native " @@ -1027,21 +1029,21 @@ constexpr TagInfo ifdTagInfo[] = { "swap in replacement color matrices based on UniqueCameraModel tag, " "while still taking advantage of any per-individual camera calibration " "performed by the camera manufacturer."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc625, "ReductionMatrix1", N_("Reduction Matrix 1"), N_("ReductionMatrix1 defines a dimensionality reduction matrix for use as " "the first stage in converting color camera native space values to XYZ " "values, under the first calibration illuminant. This tag may only be " "used if ColorPlanes is greater than 3. The matrix is stored in row " "scan order."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc626, "ReductionMatrix2", N_("Reduction Matrix 2"), N_("ReductionMatrix2 defines a dimensionality reduction matrix for use as " "the first stage in converting color camera native space values to XYZ " "values, under the second calibration illuminant. This tag may only be " "used if ColorPlanes is greater than 3. The matrix is stored in row " "scan order."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc627, "AnalogBalance", N_("Analog Balance"), N_("Normally the stored raw values are not white balanced, since any " "digital white balancing will reduce the dynamic range of the final " @@ -1051,18 +1053,18 @@ constexpr TagInfo ifdTagInfo[] = { "range of the final image. AnalogBalance defines the gain, either " "analog (recommended) or digital (not recommended) that has been " "applied the stored raw values."), - ifd0Id, dngTags, unsignedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, -1, printValue}, // DNG tag {0xc628, "AsShotNeutral", N_("As Shot Neutral"), N_("Specifies the selected white balance at time of capture, encoded as " "the coordinates of a perfectly neutral color in linear reference " "space values. The inclusion of this tag precludes the inclusion of " "the AsShotWhiteXY tag."), - ifd0Id, dngTags, unsignedShort, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, -1, printValue}, // DNG tag {0xc629, "AsShotWhiteXY", N_("As Shot White XY"), N_("Specifies the selected white balance at time of capture, encoded as " "x-y chromaticity coordinates. The inclusion of this tag precludes " "the inclusion of the AsShotNeutral tag."), - ifd0Id, dngTags, unsignedRational, 2, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 2, printValue}, // DNG tag {0xc62a, "BaselineExposure", N_("Baseline Exposure"), N_("Camera models vary in the trade-off they make between highlight " "headroom and shadow noise. Some leave a significant amount of " @@ -1077,21 +1079,21 @@ constexpr TagInfo ifdTagInfo[] = { "(in EV units) to move the zero point. Positive values result in " "brighter default results, while negative values result in darker " "default results."), - ifd0Id, dngTags, signedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, 1, printValue}, // DNG tag {0xc62b, "BaselineNoise", N_("Baseline Noise"), N_("Specifies the relative noise level of the camera model at a baseline " "ISO value of 100, compared to a reference camera model. Since noise " "levels tend to vary approximately with the square root of the ISO " "value, a raw converter can use this value, combined with the current " "ISO, to estimate the relative noise level of the current image."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc62c, "BaselineSharpness", N_("Baseline Sharpness"), N_("Specifies the relative amount of sharpening required for this camera " "model, compared to a reference camera model. Camera models vary in " "the strengths of their anti-aliasing filters. Cameras with weak or " "no filters require less sharpening than cameras with strong " "anti-aliasing filters."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc62d, "BayerGreenSplit", N_("Bayer Green Split"), N_("Only applies to CFA images using a Bayer pattern filter array. This " "tag specifies, in arbitrary units, how closely the values of the " @@ -1100,7 +1102,7 @@ constexpr TagInfo ifdTagInfo[] = { "of green pixels track closely, while a non-zero value means they " "sometimes diverge. The useful range for this tag is from 0 (no " "divergence) to about 5000 (quite large divergence)."), - ifd0Id, dngTags, unsignedLong, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, printValue}, // DNG tag {0xc62e, "LinearResponseLimit", N_("Linear Response Limit"), N_("Some sensors have an unpredictable non-linearity in their response " "as they near the upper limit of their encoding range. This " @@ -1108,15 +1110,15 @@ constexpr TagInfo ifdTagInfo[] = { "resulting image unless the raw converter compensates for this effect. " "LinearResponseLimit specifies the fraction of the encoding range " "above which the response may become significantly non-linear."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc62f, "CameraSerialNumber", N_("Camera Serial Number"), N_("CameraSerialNumber contains the serial number of the camera or camera " "body that captured the image."), - ifd0Id, dngTags, asciiString, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, asciiString, 0, printValue}, // DNG tag {0xc630, "LensInfo", N_("Lens Info"), N_("Contains information about the lens that captured the image. If the " "minimum f-stops are unknown, they should be encoded as 0/0."), - ifd0Id, dngTags, unsignedRational, 4, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 4, printValue}, // DNG tag {0xc631, "ChromaBlurRadius", N_("Chroma Blur Radius"), N_("ChromaBlurRadius provides a hint to the DNG reader about how much " "chroma blur should be applied to the image. If this tag is omitted, " @@ -1125,23 +1127,23 @@ constexpr TagInfo ifdTagInfo[] = { "amount of chroma blur required for mosaic images is highly dependent " "on the de-mosaic algorithm, in which case the DNG reader's default " "value is likely optimized for its particular de-mosaic algorithm."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc632, "AntiAliasStrength", N_("Anti Alias Strength"), N_("Provides a hint to the DNG reader about how strong the camera's " "anti-alias filter is. A value of 0.0 means no anti-alias filter " "(i.e., the camera is prone to aliasing artifacts with some subjects), " "while a value of 1.0 means a strong anti-alias filter (i.e., the " "camera almost never has aliasing artifacts)."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc633, "ShadowScale", N_("Shadow Scale"), N_("This tag is used by Adobe Camera Raw to control the sensitivity of " "its 'Shadows' slider."), - ifd0Id, dngTags, signedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, 1, printValue}, // DNG tag {0xc634, "DNGPrivateData", N_("DNG Private Data"), N_("Provides a way for camera manufacturers to store private data in the " "DNG file for use by their own raw converters, and to have that data " "preserved by programs that edit DNG files."), - ifd0Id, dngTags, unsignedByte, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, -1, printValue}, // DNG tag {0xc635, "MakerNoteSafety", N_("MakerNote Safety"), N_("MakerNoteSafety lets the DNG reader know whether the EXIF MakerNote " "tag is safe to preserve along with the rest of the EXIF data. File " @@ -1149,7 +1151,7 @@ constexpr TagInfo ifdTagInfo[] = { "with a preserved MakerNote should be aware that any thumbnail " "image embedded in the MakerNote may be stale, and may not reflect " "the current state of the full size image."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngMakerNoteSafety)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngMakerNoteSafety)}, // DNG tag {0xc65a, "CalibrationIlluminant1", N_("Calibration Illuminant 1"), N_("The illuminant used for the first set of color calibration tags " "(ColorMatrix1, CameraCalibration1, ReductionMatrix1). The legal " @@ -1157,7 +1159,7 @@ constexpr TagInfo ifdTagInfo[] = { "LightSource EXIF tag. If set to 255 (Other), then the IFD must " "also include a IlluminantData1 tag to specify the x-y chromaticity " "or spectral power distribution function for this illuminant."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG tag {0xc65b, "CalibrationIlluminant2", N_("Calibration Illuminant 2"), N_("The illuminant used for an optional second set of color calibration " "tags (ColorMatrix2, CameraCalibration2, ReductionMatrix2). The legal " @@ -1166,7 +1168,7 @@ constexpr TagInfo ifdTagInfo[] = { "is allowed to have a value of 0 (unknown). If set to 255 (Other), then " "the IFD must also include a IlluminantData2 tag to specify the x-y " "chromaticity or spectral power distribution function for this illuminant."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG tag {0xc65c, "BestQualityScale", N_("Best Quality Scale"), N_("For some cameras, the best possible image quality is not achieved " "by preserving the total pixel count during conversion. For example, " @@ -1174,7 +1176,7 @@ constexpr TagInfo ifdTagInfo[] = { "count is doubled. This tag specifies the amount by which the values " "of the DefaultScale tag need to be multiplied to achieve the best " "quality image size."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc65d, "RawDataUniqueID", N_("Raw Data Unique ID"), N_("This tag contains a 16-byte unique identifier for the raw image data " "in the DNG file. DNG readers can use this tag to recognize a " @@ -1183,11 +1185,11 @@ constexpr TagInfo ifdTagInfo[] = { "an identifier, it should do so using an algorithm that will ensure " "that it is very unlikely two different images will end up having the " "same identifier."), - ifd0Id, dngTags, unsignedByte, 16, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 16, printValue}, // DNG tag {0xc68b, "OriginalRawFileName", N_("Original Raw File Name"), N_("If the DNG file was converted from a non-DNG raw file, then this tag " "contains the file name of that original raw file."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc68c, "OriginalRawFileData", N_("Original Raw File Data"), N_("If the DNG file was converted from a non-DNG raw file, then this tag " "contains the compressed contents of that original raw file. The " @@ -1198,11 +1200,11 @@ constexpr TagInfo ifdTagInfo[] = { "also detect the case where data blocks are missing from the end of " "the sequence, and should assume a default value for all the missing " "blocks. There are no padding or alignment bytes between data blocks."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc68d, "ActiveArea", N_("Active Area"), N_("This rectangle defines the active (non-masked) pixels of the sensor. " "The order of the rectangle coordinates is: top, left, bottom, right."), - ifd0Id, dngTags, unsignedLong, 4, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 4, printValue}, // DNG tag {0xc68e, "MaskedAreas", N_("Masked Areas"), N_("This tag contains a list of non-overlapping rectangle coordinates of " "fully masked pixels, which can be optionally used by DNG readers " @@ -1210,7 +1212,7 @@ constexpr TagInfo ifdTagInfo[] = { "coordinates is: top, left, bottom, right. If the raw image data has " "already had its black encoding level subtracted, then this tag should " "not be used, since the masked pixels are no longer useful."), - ifd0Id, dngTags, unsignedLong, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, -1, printValue}, // DNG tag {0xc68f, "AsShotICCProfile", N_("As-Shot ICC Profile"), N_("This tag contains an ICC profile that, in conjunction with the " "AsShotPreProfileMatrix tag, provides the camera manufacturer with a " @@ -1222,7 +1224,7 @@ constexpr TagInfo ifdTagInfo[] = { "means that the rendering in this profile should include any desired " "tone and gamut mapping needed to convert between scene referred " "values and output referred values."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc690, "AsShotPreProfileMatrix", N_("As-Shot Pre-Profile Matrix"), N_("This tag is used in conjunction with the AsShotICCProfile tag. It " "specifies a matrix that should be applied to the camera color space " @@ -1232,21 +1234,21 @@ constexpr TagInfo ifdTagInfo[] = { "matrix can (but is not required to) reduce the dimensionality of the " "color data down to three components, in which case the AsShotICCProfile " "should have three rather than ColorPlanes input components."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc691, "CurrentICCProfile", N_("Current ICC Profile"), N_("This tag is used in conjunction with the CurrentPreProfileMatrix tag. " "The CurrentICCProfile and CurrentPreProfileMatrix tags have the same " "purpose and usage as the AsShotICCProfile and AsShotPreProfileMatrix " "tag pair, except they are for use by raw file editors rather than " "camera manufacturers."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc692, "CurrentPreProfileMatrix", N_("Current Pre-Profile Matrix"), N_("This tag is used in conjunction with the CurrentICCProfile tag. " "The CurrentICCProfile and CurrentPreProfileMatrix tags have the same " "purpose and usage as the AsShotICCProfile and AsShotPreProfileMatrix " "tag pair, except they are for use by raw file editors rather than " "camera manufacturers."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc6bf, "ColorimetricReference", N_("Colorimetric Reference"), N_("The DNG color model documents a transform between camera colors and " "CIE XYZ values. This tag describes the colorimetric reference for the " @@ -1254,31 +1256,31 @@ constexpr TagInfo ifdTagInfo[] = { "are output-referred, using the ICC profile perceptual dynamic range. This " "tag allows output-referred data to be stored in DNG files and still processed " "correctly by DNG readers."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngColorimetricReference)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngColorimetricReference)}, // DNG tag {0xc6f3, "CameraCalibrationSignature", N_("Camera Calibration Signature"), N_("A UTF-8 encoded string associated with the CameraCalibration1 and " "CameraCalibration2 tags. The CameraCalibration1 and CameraCalibration2 tags " "should only be used in the DNG color transform if the string stored in the " "CameraCalibrationSignature tag exactly matches the string stored in the " "ProfileCalibrationSignature tag for the selected camera profile."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc6f4, "ProfileCalibrationSignature", N_("Profile Calibration Signature"), N_("A UTF-8 encoded string associated with the camera profile tags. The " "CameraCalibration1 and CameraCalibration2 tags should only be used in the " "DNG color transfer if the string stored in the CameraCalibrationSignature " "tag exactly matches the string stored in the ProfileCalibrationSignature tag " "for the selected camera profile."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc6f5, "ExtraCameraProfiles", N_("Extra Camera Profiles"), N_("A list of file offsets to extra Camera Profile IFDs. Note that the primary " "camera profile tags should be stored in IFD 0, and the ExtraCameraProfiles " "tag should only be used if there is more than one camera profile stored in " "the DNG file."), - ifd0Id, dngTags, unsignedLong, -1, printValue}, // DNG 1.2 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, -1, printValue}, // DNG 1.2 tag {0xc6f6, "AsShotProfileName", N_("As Shot Profile Name"), N_("A UTF-8 encoded string containing the name of the \"as shot\" camera " "profile, if any."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc6f7, "NoiseReductionApplied", N_("Noise Reduction Applied"), N_("This tag indicates how much noise reduction has been applied to the raw " "data on a scale of 0.0 to 1.0. A 0.0 value indicates that no noise reduction " @@ -1286,20 +1288,20 @@ constexpr TagInfo ifdTagInfo[] = { "reduction has been applied, i.e. that the DNG reader should not apply " "additional noise reduction by default. A value of 0/0 indicates that this " "parameter is unknown."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG tag {0xc6f8, "ProfileName", N_("Profile Name"), N_("A UTF-8 encoded string containing the name of the camera profile. This " "tag is optional if there is only a single camera profile stored in the file " "but is required for all camera profiles if there is more than one camera " "profile stored in the file."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc6f9, "ProfileHueSatMapDims", N_("Profile Hue Sat Map Dims"), N_("This tag specifies the number of input samples in each dimension of the " "hue/saturation/value mapping tables. The data for these tables are stored " "in ProfileHueSatMapData1, ProfileHueSatMapData2 and ProfileHueSatMapData3 " "tags. The most common case has ValueDivisions equal to 1, so only hue and " "saturation are used as inputs to the mapping table."), - ifd0Id, dngTags, unsignedLong, 3, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 3, printValue}, // DNG tag {0xc6fa, "ProfileHueSatMapData1", N_("Profile Hue Sat Map Data 1"), N_("This tag contains the data for the first hue/saturation/value mapping " "table. Each entry of the table contains three 32-bit IEEE floating-point " @@ -1309,7 +1311,7 @@ constexpr TagInfo ifdTagInfo[] = { "divisions in the outer loop, the hue divisions in the middle loop, and the " "saturation divisions in the inner loop. All zero input saturation entries " "are required to have a value scale factor of 1.0."), - ifd0Id, dngTags, tiffFloat, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, tiffFloat, 0, printValue}, // DNG tag {0xc6fb, "ProfileHueSatMapData2", N_("Profile Hue Sat Map Data 2"), N_("This tag contains the data for the second hue/saturation/value mapping " "table. Each entry of the table contains three 32-bit IEEE floating-point " @@ -1319,7 +1321,7 @@ constexpr TagInfo ifdTagInfo[] = { "divisions in the outer loop, the hue divisions in the middle loop, and the " "saturation divisions in the inner loop. All zero input saturation entries " "are required to have a value scale factor of 1.0."), - ifd0Id, dngTags, tiffFloat, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, tiffFloat, 0, printValue}, // DNG tag {0xc6fc, "ProfileToneCurve", N_("Profile Tone Curve"), N_("This tag contains a default tone curve that can be applied while " "processing the image as a starting point for user adjustments. The curve " @@ -1328,60 +1330,60 @@ constexpr TagInfo ifdTagInfo[] = { "output value in the range of 0.0 to 1.0. The first sample is required to be " "(0.0, 0.0), and the last sample is required to be (1.0, 1.0). Interpolated " "the curve using a cubic spline."), - ifd0Id, dngTags, tiffFloat, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, tiffFloat, -1, printValue}, // DNG tag {0xc6fd, "ProfileEmbedPolicy", N_("Profile Embed Policy"), N_("This tag contains information about the usage rules for the associated " "camera profile."), - ifd0Id, dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEmbedPolicy)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEmbedPolicy)}, // DNG tag {0xc6fe, "ProfileCopyright", N_("Profile Copyright"), N_("A UTF-8 encoded string containing the copyright information for the " "camera profile. This string always should be preserved along with the other " "camera profile tags."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc714, "ForwardMatrix1", N_("Forward Matrix 1"), N_("This tag defines a matrix that maps white balanced camera colors to XYZ " "D50 colors."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc715, "ForwardMatrix2", N_("Forward Matrix 2"), N_("This tag defines a matrix that maps white balanced camera colors to XYZ " "D50 colors."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG tag {0xc716, "PreviewApplicationName", N_("Preview Application Name"), N_("A UTF-8 encoded string containing the name of the application that " "created the preview stored in the IFD."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc717, "PreviewApplicationVersion", N_("Preview Application Version"), N_("A UTF-8 encoded string containing the version number of the application " "that created the preview stored in the IFD."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc718, "PreviewSettingsName", N_("Preview Settings Name"), N_("A UTF-8 encoded string containing the name of the conversion settings " "(for example, snapshot name) used for the preview stored in the IFD."), - ifd0Id, dngTags, unsignedByte, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 0, printValue}, // DNG tag {0xc719, "PreviewSettingsDigest", N_("Preview Settings Digest"), N_("A unique ID of the conversion settings (for example, MD5 digest) used " "to render the preview stored in the IFD."), - ifd0Id, dngTags, unsignedByte, 16, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 16, printValue}, // DNG tag {0xc71a, "PreviewColorSpace", N_("Preview Color Space"), N_("This tag specifies the color space in which the rendered preview in this " "IFD is stored. The default value for this tag is sRGB for color previews " "and Gray Gamma 2.2 for monochrome previews."), - ifd0Id, dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngPreviewColorSpace)}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngPreviewColorSpace)}, // DNG tag {0xc71b, "PreviewDateTime", N_("Preview Date Time"), N_("This tag is an ASCII string containing the name of the date/time at which " "the preview stored in the IFD was rendered. The date/time is encoded using " "ISO 8601 format."), - ifd0Id, dngTags, asciiString, 0, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, asciiString, 0, printValue}, // DNG tag {0xc71c, "RawImageDigest", N_("Raw Image Digest"), N_("This tag is an MD5 digest of the raw image data. All pixels in the image " "are processed in row-scan order. Each pixel is zero padded to 16 or 32 bits " "deep (16-bit for data less than or equal to 16 bits deep, 32-bit otherwise). " "The data for each pixel is processed in little-endian byte order."), - ifd0Id, dngTags, undefined, 16, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, 16, printValue}, // DNG tag {0xc71d, "OriginalRawFileDigest", N_("Original Raw File Digest"), N_("This tag is an MD5 digest of the data stored in the OriginalRawFileData " "tag."), - ifd0Id, dngTags, undefined, 16, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, 16, printValue}, // DNG tag {0xc71e, "SubTileBlockSize", N_("Sub Tile Block Size"), N_("Normally, the pixels within a tile are stored in simple row-scan order. " "This tag specifies that the pixels within a tile should be grouped first " @@ -1389,18 +1391,18 @@ constexpr TagInfo ifdTagInfo[] = { "row-scan order. Within each block, the pixels are stored in row-scan order. " "The use of a non-default value for this tag requires setting the " "DNGBackwardVersion tag to at least 1.2.0.0."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG tag {0xc71f, "RowInterleaveFactor", N_("Row Interleave Factor"), N_("This tag specifies that rows of the image are stored in interleaved " "order. The value of the tag specifies the number of interleaved fields. " "The use of a non-default value for this tag requires setting the " "DNGBackwardVersion tag to at least 1.2.0.0."), - ifd0Id, dngTags, unsignedLong, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, printValue}, // DNG tag {0xc725, "ProfileLookTableDims", N_("Profile Look Table Dims"), N_("This tag specifies the number of input samples in each dimension of a " "default \"look\" table. The data for this table is stored in the " "ProfileLookTableData tag."), - ifd0Id, dngTags, unsignedLong, 3, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 3, printValue}, // DNG tag {0xc726, "ProfileLookTableData", N_("Profile Look Table Data"), N_("This tag contains a default \"look\" table that can be applied while " "processing the image as a starting point for user adjustment. This table " @@ -1415,19 +1417,19 @@ constexpr TagInfo ifdTagInfo[] = { "value divisions in the outer loop, the hue divisions in the middle loop, " "and the saturation divisions in the inner loop. All zero input saturation " "entries are required to have a value scale factor of 1.0."), - ifd0Id, dngTags, tiffFloat, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, tiffFloat, -1, printValue}, // DNG tag {0xc740, "OpcodeList1", N_("Opcode List 1"), N_("Specifies the list of opcodes that should be applied to the raw image, " "as read directly from the file."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc741, "OpcodeList2", N_("Opcode List 2"), N_("Specifies the list of opcodes that should be applied to the raw image, " "just after it has been mapped to linear reference values."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc74e, "OpcodeList3", N_("Opcode List 3"), N_("Specifies the list of opcodes that should be applied to the raw image, " "just after it has been demosaiced."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG tag {0xc761, "NoiseProfile", N_("Noise Profile"), N_("NoiseProfile describes the amount of noise in a raw image. Specifically, " "this tag models the amount of signal-dependent photon (shot) noise and " @@ -1435,7 +1437,7 @@ constexpr TagInfo ifdTagInfo[] = { "raw images. The model assumes that the noise is white and spatially " "independent, ignoring fixed pattern effects and other sources of noise (e.g., " "pixel response non-uniformity, spatially-dependent thermal effects, etc.)."), - ifd0Id, dngTags, tiffDouble, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, tiffDouble, -1, printValue}, // DNG tag //////////////////////////////////////// // https://www.adobe.com/content/dam/acom/en/devnet/CinemaDNG/pdf/CinemaDNG_Format_Specification_v1_1.pdf {0xc763, "TimeCodes", N_("TimeCodes"), @@ -1446,14 +1448,14 @@ constexpr TagInfo ifdTagInfo[] = { "does not prescribe how to use multiple time codes. " "Each time code shall be as defined for the 8-byte time code structure in " "SMPTE 331M-2004, Section 8.3. See also SMPTE 12-1-2008 and SMPTE 309-1999."), - ifd0Id, dngTags, unsignedByte, 8, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 8, printValue}, // DNG tag {0xc764, "FrameRate", N_("FrameRate"), N_("The optional FrameRate tag shall specify the video frame " "rate in number of image frames per second, expressed as a " "signed rational number. The numerator shall be non-negative " "and the denominator shall be positive. This field value is " "identical to the sample rate field in SMPTE 377-1-2009."), - ifd0Id, dngTags, signedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, 1, printValue}, // DNG tag {0xc772, "TStop", N_("TStop"), N_("The optional TStop tag shall specify the T-stop of the " "actual lens, expressed as an unsigned rational number. " @@ -1464,47 +1466,47 @@ constexpr TagInfo ifdTagInfo[] = { "two numbers shall be used to indicate a T-stop range, " "in which case the first number shall be the minimum " "T-stop and the second number shall be the maximum T-stop."), - ifd0Id, dngTags, signedRational, 1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, 1, printValue}, // DNG tag {0xc789, "ReelName", N_("ReelName"), N_("The optional ReelName tag shall specify a name for a " "sequence of images, where each image in the sequence has " "a unique image identifier (including but not limited to file " "name, frame number, date time, time code)."), - ifd0Id, dngTags, asciiString, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, asciiString, -1, printValue}, // DNG tag {0xc7a1, "CameraLabel", N_("CameraLabel"), N_("The optional CameraLabel tag shall specify a text label " "for how the camera is used or assigned in this clip. " "This tag is similar to CameraLabel in XMP."), - ifd0Id, dngTags, asciiString, -1, printValue}, // DNG tag + IfdId::ifd0Id, SectionId::dngTags, asciiString, -1, printValue}, // DNG tag {0xc791, "OriginalDefaultFinalSize", N_("Original Default Final Size"), N_("If this file is a proxy for a larger original DNG file, this tag specifics the " "default final size of the larger original file from which this proxy was generated. " "The default value for this tag is default final size of the current DNG file, which " "is DefaultCropSize * DefaultScale."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag {0xc792, "OriginalBestQualityFinalSize", N_("Original Best Quality Final Size"), N_("If this file is a proxy for a larger original DNG file, this tag specifics the " "best quality final size of the larger original file from which this proxy was " "generated. The default value for this tag is the OriginalDefaultFinalSize, if " "specified. Otherwise the default value for this tag is the best quality size of " "the current DNG file, which is DefaultCropSize * DefaultScale * BestQualityScale."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag {0xc793, "OriginalDefaultCropSize", N_("Original Default Crop Size"), N_("If this file is a proxy for a larger original DNG file, this tag specifics the " "DefaultCropSize of the larger original file from which this proxy was generated. " "The default value for this tag is OriginalDefaultFinalSize, if specified. Otherwise, " "the default value for this tag is the DefaultCropSize of the current DNG file."), - ifd0Id, dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 2, printValue}, // DNG 1.4 tag {0xc7a3, "ProfileHueSatMapEncoding", N_("Profile Hue Sat Map Encoding"), N_("Provides a way for color profiles to specify how indexing into a 3D HueSatMap is " "performed during raw conversion. This tag is not applicable to 2.5D HueSatMap tables " "(i.e., where the Value dimension is 1)."), - ifd0Id, dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEncoding)}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEncoding)}, // DNG 1.4 tag {0xc7a4, "ProfileLookTableEncoding", N_("Profile Look Table Encoding"), N_("Provides a way for color profiles to specify how indexing into a 3D LookTable is " "performed during raw conversion. This tag is not applicable to a 2.5D LookTable " "(i.e., where the Value dimension is 1)."), - ifd0Id, dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEncoding)}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngProfileEncoding)}, // DNG 1.4 tag {0xc7a5, "BaselineExposureOffset", N_("Baseline Exposure Offset"), N_("Provides a way for color profiles to increase or decrease exposure during raw conversion. " "BaselineExposureOffset specifies the amount (in EV units) to add to the BaselineExposure tag " @@ -1512,29 +1514,29 @@ constexpr TagInfo ifdTagInfo[] = { "is +0.3, and the BaselineExposureOffset value for a given camera profile used to render an " "image for that camera model is -0.7, then the actual default exposure value used during " "rendering will be +0.3 - 0.7 = -0.4."), - ifd0Id, dngTags, signedRational, 1, printFloat}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, 1, printFloat}, // DNG 1.4 tag {0xc7a6, "DefaultBlackRender", N_("Default Black Render"), N_("This optional tag in a color profile provides a hint to the raw converter " "regarding how to handle the black point (e.g., flare subtraction) during rendering. " "If set to Auto, the raw converter should perform black subtraction during " "rendering. If set to None, the raw converter should not perform any black " "subtraction during rendering."), - ifd0Id, dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngDefaultBlackRender)}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 1, EXV_PRINT_TAG(dngDefaultBlackRender)}, // DNG 1.4 tag {0xc7a7, "NewRawImageDigest", N_("New Raw Image Digest"), N_("This tag is a modified MD5 digest of the raw image data. It has been updated " "from the algorithm used to compute the RawImageDigest tag be more multi-processor " "friendly, and to support lossy compression algorithms."), - ifd0Id, dngTags, unsignedByte, 16, printValue}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedByte, 16, printValue}, // DNG 1.4 tag {0xc7a8, "RawToPreviewGain", N_("Raw To Preview Gain"), N_("The gain (what number the sample values are multiplied by) between the main " "raw IFD and the preview IFD containing this tag."), - ifd0Id, dngTags, tiffDouble, 1, printValue}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, tiffDouble, 1, printValue}, // DNG 1.4 tag {0xc7b5, "DefaultUserCrop", N_("Default User Crop"), N_("Specifies a default user crop rectangle in relative coordinates. " "The values must satisfy: 0.0 <= top < bottom <= 1.0, 0.0 <= left < right <= 1.0." "The default values of (top = 0, left = 0, bottom = 1, right = 1) correspond exactly to the default " "crop rectangle (as specified by the DefaultCropOrigin and DefaultCropSize tags)."), - ifd0Id, dngTags, unsignedRational, 4, printFloat}, // DNG 1.4 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 4, printFloat}, // DNG 1.4 tag {0xc7e9, "DepthFormat", N_("Depth Format"), N_("Specifies the encoding of any depth data in the file. Can be unknown (apart " "from nearer distances being closer to zero, and farther distances being closer to " @@ -1542,38 +1544,38 @@ constexpr TagInfo ifdTagInfo[] = { "to the maximum value representing DepthFar), or inverse (values are stored inverse " "linearly, with zero representing DepthNear and the maximum value representing " "DepthFar)."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngDepthFormat)}, // DNG 1.5 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngDepthFormat)}, // DNG 1.5 tag {0xc7ea, "DepthNear", N_("Depth Near"), N_("Specifies distance from the camera represented by the zero value in the depth map. " "0/0 means unknown."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG 1.5 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG 1.5 tag {0xc7eb, "DepthFar", N_("Depth Far"), N_("Specifies distance from the camera represented by the maximum value in the depth " "map. 0/0 means unknown. 1/0 means infinity, which is valid for unknown and inverse " "depth formats."), - ifd0Id, dngTags, unsignedRational, 1, printValue}, // DNG 1.5 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedRational, 1, printValue}, // DNG 1.5 tag {0xc7ec, "DepthUnits", N_("Depth Units"), - N_("Specifies the measurement units for the DepthNear and DepthFar tags."), ifd0Id, dngTags, unsignedShort, 1, - EXV_PRINT_TAG(dngDepthUnits)}, // DNG 1.5 tag + N_("Specifies the measurement units for the DepthNear and DepthFar tags."), IfdId::ifd0Id, SectionId::dngTags, + unsignedShort, 1, EXV_PRINT_TAG(dngDepthUnits)}, // DNG 1.5 tag {0xc7ed, "DepthMeasureType", N_("Depth Measure Type"), N_("Specifies the measurement geometry for the depth map. Can be unknown, measured " "along the optical axis, or measured along the optical ray passing through each " "pixel."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngDepthMeasureType)}, // DNG 1.5 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(dngDepthMeasureType)}, // DNG 1.5 tag {0xc7ee, "EnhanceParams", N_("Enhance Params"), - N_("A string that documents how the enhanced image data was processed."), ifd0Id, dngTags, asciiString, 0, - printValue}, // DNG 1.5 tag + N_("A string that documents how the enhanced image data was processed."), IfdId::ifd0Id, SectionId::dngTags, + asciiString, 0, printValue}, // DNG 1.5 tag //////////////////////////////////////// // https://helpx.adobe.com/photoshop/kb/dng-specification-tags.html {0xcd2d, "ProfileGainTableMap", N_("Profile Gain Table Map"), N_("Contains spatially varying gain tables that can be applied while processing the " "image as a starting point for user adjustments."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG 1.6 tag - {0xcd2e, "SemanticName", N_("Semantic Name"), N_("A string that identifies the semantic mask."), ifd0Id, dngTags, - asciiString, 0, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG 1.6 tag + {0xcd2e, "SemanticName", N_("Semantic Name"), N_("A string that identifies the semantic mask."), IfdId::ifd0Id, + SectionId::dngTags, asciiString, 0, printValue}, // DNG 1.6 tag {0xcd30, "SemanticInstanceID", N_("Semantic Instance ID"), - N_("A string that identifies a specific instance in a semantic mask."), ifd0Id, dngTags, asciiString, 0, - printValue}, // DNG 1.6 tag + N_("A string that identifies a specific instance in a semantic mask."), IfdId::ifd0Id, SectionId::dngTags, + asciiString, 0, printValue}, // DNG 1.6 tag {0xcd31, "CalibrationIlluminant3", N_("Calibration Illuminant 3"), N_("The illuminant used for an optional third set of color calibration " "tags (ColorMatrix3, CameraCalibration3, ReductionMatrix3). The legal " @@ -1582,7 +1584,7 @@ constexpr TagInfo ifdTagInfo[] = { "must also be present. If set to 255 (Other), then the IFD must also " "include a IlluminantData3 tag to specify the x-y chromaticity or " "spectral power distribution function for this illuminant."), - ifd0Id, dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedShort, 1, EXV_PRINT_TAG(exifLightSource)}, // DNG 1.6 tag {0xcd32, "CameraCalibration3", N_("Camera Calibration 3"), N_("CameraCalibration3 defines a calibration matrix that transforms " "reference camera native space values to individual camera native " @@ -1592,40 +1594,40 @@ constexpr TagInfo ifdTagInfo[] = { "swap in replacement color matrices based on UniqueCameraModel tag, " "while still taking advantage of any per-individual camera calibration " "performed by the camera manufacturer."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG 1.6 tag {0xcd33, "ColorMatrix3", N_("Color Matrix 3"), N_("ColorMatrix3 defines a transformation matrix that converts XYZ " "values to reference camera native color space values, under the " "third calibration illuminant. The matrix values are stored in row " "scan order."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG 1.6 tag {0xcd34, "ForwardMatrix3", N_("Forward Matrix 3"), N_("This tag defines a matrix that maps white balanced camera colors to XYZ " "D50 colors."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG 1.6 tag {0xcd35, "IlluminantData1", N_("Illuminant Data 1"), N_("When the CalibrationIlluminant1 tag is set to 255 (Other), " "then the IlluminantData1 tag is required and specifies the data " "for the first illuminant. Otherwise, this tag is ignored. The " "illuminant data may be specified as either a x-y chromaticity " "coordinate or as a spectral power distribution function."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG 1.6 tag {0xcd36, "IlluminantData2", N_("Illuminant Data 2"), N_("When the CalibrationIlluminant2 tag is set to 255 (Other), " "then the IlluminantData2 tag is required and specifies the data " "for the second illuminant. Otherwise, this tag is ignored. The " "format of the data is the same as IlluminantData1."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG 1.6 tag {0xcd37, "IlluminantData3", N_("Illuminant Data 3"), N_("When the CalibrationIlluminant3 tag is set to 255 (Other), " "then the IlluminantData3 tag is required and specifies the data " "for the third illuminant. Otherwise, this tag is ignored. The " "format of the data is the same as IlluminantData1."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG 1.6 tag {0xcd38, "MaskSubArea", N_("Mask Subarea"), N_("This tag identifies the crop rectangle of this IFD's mask, " "relative to the main image."), - ifd0Id, dngTags, unsignedLong, 4, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, unsignedLong, 4, printValue}, // DNG 1.6 tag {0xcd39, "ProfileHueSatMapData3", N_("Profile Hue Sat Map Data 3"), N_("This tag contains the data for the third hue/saturation/value mapping " "table. Each entry of the table contains three 32-bit IEEE floating-point " @@ -1635,14 +1637,14 @@ constexpr TagInfo ifdTagInfo[] = { "divisions in the outer loop, the hue divisions in the middle loop, and the " "saturation divisions in the inner loop. All zero input saturation entries " "are required to have a value scale factor of 1.0."), - ifd0Id, dngTags, tiffFloat, 0, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, tiffFloat, 0, printValue}, // DNG 1.6 tag {0xcd3a, "ReductionMatrix3", N_("Reduction Matrix 3"), N_("ReductionMatrix3 defines a dimensionality reduction matrix for use as " "the first stage in converting color camera native space values to XYZ " "values, under the third calibration illuminant. This tag may only be " "used if ColorPlanes is greater than 3. The matrix is stored in row " "scan order."), - ifd0Id, dngTags, signedRational, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, signedRational, -1, printValue}, // DNG 1.6 tag {0xcd3b, "RGBTables", N_("RGB Tables"), N_("This tag specifies color transforms that can be applied to masked image " "regions. Color transforms are specified using RGB-to-RGB color lookup tables. " @@ -1650,12 +1652,12 @@ constexpr TagInfo ifdTagInfo[] = { "to a sub-region of the image. The overall color transform is a linear " "combination of the color tables, weighted by their corresponding Semantic " "Masks."), - ifd0Id, dngTags, undefined, -1, printValue}, // DNG 1.6 tag + IfdId::ifd0Id, SectionId::dngTags, undefined, -1, printValue}, // DNG 1.6 tag //////////////////////////////////////// // End of list marker - {0xffff, "(UnknownIfdTag)", N_("Unknown IFD tag"), N_("Unknown IFD tag"), ifd0Id, sectionIdNotSet, asciiString, -1, - printValue}, + {0xffff, "(UnknownIfdTag)", N_("Unknown IFD tag"), N_("Unknown IFD tag"), IfdId::ifd0Id, SectionId::sectionIdNotSet, + asciiString, -1, printValue}, }; const TagInfo* ifdTagList() { @@ -1668,78 +1670,80 @@ constexpr TagDetails exifCompositeImage[] = { // Exif IFD Tags constexpr TagInfo exifTagInfo[] = { - {0x829a, "ExposureTime", N_("Exposure Time"), N_("Exposure time, given in seconds (sec)."), exifId, captureCond, - unsignedRational, 1, print0x829a}, - {0x829d, "FNumber", N_("FNumber"), N_("The F number."), exifId, captureCond, unsignedRational, 1, print0x829d}, + {0x829a, "ExposureTime", N_("Exposure Time"), N_("Exposure time, given in seconds (sec)."), IfdId::exifId, + SectionId::captureCond, unsignedRational, 1, print0x829a}, + {0x829d, "FNumber", N_("FNumber"), N_("The F number."), IfdId::exifId, SectionId::captureCond, unsignedRational, 1, + print0x829d}, {0x8822, "ExposureProgram", N_("Exposure Program"), N_("The class of the program used by the camera to set exposure " "when the picture is taken."), - exifId, captureCond, unsignedShort, 1, print0x8822}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0x8822}, {0x8824, "SpectralSensitivity", N_("Spectral Sensitivity"), N_("Indicates the spectral sensitivity of each channel of the " "camera used. The tag value is an ASCII string compatible " "with the standard developed by the ASTM Technical Committee."), - exifId, captureCond, asciiString, 0, printValue}, + IfdId::exifId, SectionId::captureCond, asciiString, 0, printValue}, {0x8827, "ISOSpeedRatings", N_("ISO Speed Ratings"), N_("Indicates the ISO Speed and ISO Latitude of the camera or " "input device as specified in ISO 12232."), - exifId, captureCond, unsignedShort, 0, print0x8827}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 0, print0x8827}, {0x8828, "OECF", N_("Opto-Electoric Conversion Function"), N_("Indicates the Opto-Electoric Conversion Function (OECF) " "specified in ISO 14524. is the relationship between " "the camera optical input and the image values."), - exifId, captureCond, undefined, 0, printValue}, + IfdId::exifId, SectionId::captureCond, undefined, 0, printValue}, {0x8830, "SensitivityType", N_("Sensitivity Type"), N_("The SensitivityType tag indicates which one of the parameters of " "ISO12232 is the PhotographicSensitivity tag. Although it is an optional tag, " "it should be recorded when a PhotographicSensitivity tag is recorded. " "Value = 4, 5, 6, or 7 may be used in case that the values of plural " "parameters are the same."), - exifId, captureCond, unsignedShort, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, printValue}, {0x8831, "StandardOutputSensitivity", N_("Standard Output Sensitivity"), N_("This tag indicates the standard output sensitivity value of a camera or " "input device defined in ISO 12232. When recording this tag, the " "PhotographicSensitivity and SensitivityType tags shall also be recorded."), - exifId, captureCond, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedLong, 1, printValue}, {0x8832, "RecommendedExposureIndex", N_("Recommended Exposure Index"), N_("This tag indicates the recommended exposure index value of a camera or " "input device defined in ISO 12232. When recording this tag, the " "PhotographicSensitivity and SensitivityType tags shall also be recorded."), - exifId, captureCond, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedLong, 1, printValue}, {0x8833, "ISOSpeed", N_("ISO Speed"), N_("This tag indicates the ISO speed value of a camera or input device that " "is defined in ISO 12232. When recording this tag, the PhotographicSensitivity " "and SensitivityType tags shall also be recorded."), - exifId, captureCond, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedLong, 1, printValue}, {0x8834, "ISOSpeedLatitudeyyy", N_("ISO Speed Latitude yyy"), N_("This tag indicates the ISO speed latitude yyy value of a camera or input " "device that is defined in ISO 12232. However, this tag shall not be recorded " "without ISOSpeed and ISOSpeedLatitudezzz."), - exifId, captureCond, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedLong, 1, printValue}, {0x8835, "ISOSpeedLatitudezzz", N_("ISO Speed Latitude zzz"), N_("This tag indicates the ISO speed latitude zzz value of a camera or input " "device that is defined in ISO 12232. However, this tag shall not be recorded " "without ISOSpeed and ISOSpeedLatitudeyyy."), - exifId, captureCond, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedLong, 1, printValue}, {0x9000, "ExifVersion", N_("Exif Version"), N_("The version of this standard supported. Nonexistence of this " "field is taken to mean nonconformance to the standard."), - exifId, exifVersion, undefined, 4, printExifVersion}, + IfdId::exifId, SectionId::exifVersion, undefined, 4, printExifVersion}, {0x9003, "DateTimeOriginal", N_("Date and Time (original)"), N_("The date and time when the original image data was generated. " "For a digital still camera the date and time the picture was taken are recorded."), - exifId, dateTime, asciiString, 20, printValue}, + IfdId::exifId, SectionId::dateTime, asciiString, 20, printValue}, {0x9004, "DateTimeDigitized", N_("Date and Time (digitized)"), - N_("The date and time when the image was stored as digital data."), exifId, dateTime, asciiString, 20, printValue}, + N_("The date and time when the image was stored as digital data."), IfdId::exifId, SectionId::dateTime, + asciiString, 20, printValue}, {0x9010, "OffsetTime", N_("Offset Time"), - N_("Time difference from Universal Time Coordinated including daylight saving time of DateTime tag."), exifId, - dateTime, asciiString, 7, printValue}, // Exif 2.31 + N_("Time difference from Universal Time Coordinated including daylight saving time of DateTime tag."), + IfdId::exifId, SectionId::dateTime, asciiString, 7, printValue}, // Exif 2.31 {0x9011, "OffsetTimeOriginal", N_("Offset Time Original"), N_("Time difference from Universal Time Coordinated including daylight saving time of DateTimeOriginal tag."), - exifId, dateTime, asciiString, 7, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::dateTime, asciiString, 7, printValue}, // Exif 2.31 {0x9012, "OffsetTimeDigitized", N_("Offset Time Digitized"), N_("Time difference from Universal Time Coordinated including daylight saving time of DateTimeDigitized tag."), - exifId, dateTime, asciiString, 7, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::dateTime, asciiString, 7, printValue}, // Exif 2.31 {0x9101, "ComponentsConfiguration", N_("Components Configuration"), N_("Information specific to compressed data. The channels of " "each component are arranged in order from the 1st " @@ -1749,93 +1753,93 @@ constexpr TagInfo exifTagInfo[] = { "express the order of Y, Cb and Cr, this tag is provided " "for cases when compressed data uses components other than " "Y, Cb, and Cr and to enable support of other sequences."), - exifId, imgConfig, undefined, 4, print0x9101}, + IfdId::exifId, SectionId::imgConfig, undefined, 4, print0x9101}, {0x9102, "CompressedBitsPerPixel", N_("Compressed Bits per Pixel"), N_("Information specific to compressed data. The compression mode " "used for a compressed image is indicated in unit bits per pixel."), - exifId, imgConfig, unsignedRational, 1, printFloat}, + IfdId::exifId, SectionId::imgConfig, unsignedRational, 1, printFloat}, {0x9201, "ShutterSpeedValue", N_("Shutter speed"), N_("Shutter speed. The unit is the APEX (Additive System of " "Photographic Exposure) setting."), - exifId, captureCond, signedRational, 1, print0x9201}, - {0x9202, "ApertureValue", N_("Aperture"), N_("The lens aperture. The unit is the APEX value."), exifId, captureCond, - unsignedRational, 1, print0x9202}, + IfdId::exifId, SectionId::captureCond, signedRational, 1, print0x9201}, + {0x9202, "ApertureValue", N_("Aperture"), N_("The lens aperture. The unit is the APEX value."), IfdId::exifId, + SectionId::captureCond, unsignedRational, 1, print0x9202}, {0x9203, "BrightnessValue", N_("Brightness"), N_("The value of brightness. The unit is the APEX value. " "Ordinarily it is given in the range of -99.99 to 99.99."), - exifId, captureCond, signedRational, 1, printFloat}, + IfdId::exifId, SectionId::captureCond, signedRational, 1, printFloat}, {0x9204, "ExposureBiasValue", N_("Exposure Bias"), N_("The exposure bias. The units is the APEX value. Ordinarily " "it is given in the range of -99.99 to 99.99."), - exifId, captureCond, signedRational, 1, print0x9204}, + IfdId::exifId, SectionId::captureCond, signedRational, 1, print0x9204}, {0x9205, "MaxApertureValue", N_("Max Aperture Value"), N_("The smallest F number of the lens. The unit is the APEX value. " "Ordinarily it is given in the range of 00.00 to 99.99, " "but it is not limited to this range."), - exifId, captureCond, unsignedRational, 1, print0x9202}, - {0x9206, "SubjectDistance", N_("Subject Distance"), N_("The distance to the subject, given in meters."), exifId, - captureCond, unsignedRational, 1, print0x9206}, - {0x9207, "MeteringMode", N_("Metering Mode"), N_("The metering mode."), exifId, captureCond, unsignedShort, 1, - print0x9207}, - {0x9208, "LightSource", N_("Light Source"), N_("The kind of light source."), exifId, captureCond, unsignedShort, 1, - print0x9208}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, print0x9202}, + {0x9206, "SubjectDistance", N_("Subject Distance"), N_("The distance to the subject, given in meters."), + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, print0x9206}, + {0x9207, "MeteringMode", N_("Metering Mode"), N_("The metering mode."), IfdId::exifId, SectionId::captureCond, + unsignedShort, 1, print0x9207}, + {0x9208, "LightSource", N_("Light Source"), N_("The kind of light source."), IfdId::exifId, SectionId::captureCond, + unsignedShort, 1, print0x9208}, {0x9209, "Flash", N_("Flash"), N_("This tag is recorded when an image is taken using a strobe light (flash)."), - exifId, captureCond, unsignedShort, 1, EXV_PRINT_TAG(exifFlash)}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, EXV_PRINT_TAG(exifFlash)}, {0x920a, "FocalLength", N_("Focal Length"), N_("The actual focal length of the lens, in mm. Conversion is not " "made to the focal length of a 35 mm film camera."), - exifId, captureCond, unsignedRational, 1, print0x920a}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, print0x920a}, {0x9214, "SubjectArea", N_("Subject Area"), N_("This tag indicates the location and area of the main subject " "in the overall scene."), - exifId, captureCond, unsignedShort, -1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedShort, -1, printValue}, {0x927c, "MakerNote", N_("Maker Note"), N_("A tag for manufacturers of Exif writers to record any desired " "information. The contents are up to the manufacturer."), - exifId, userInfo, undefined, 0, printValue}, + IfdId::exifId, SectionId::userInfo, undefined, 0, printValue}, {0x9286, "UserComment", N_("User Comment"), N_("A tag for Exif users to write keywords or comments on the image " "besides those in , and without the " "character code limitations of the tag."), - exifId, userInfo, comment, 0, printValue}, + IfdId::exifId, SectionId::userInfo, comment, 0, printValue}, {0x9290, "SubSecTime", N_("Sub-seconds Time"), - N_("A tag used to record fractions of seconds for the tag."), exifId, dateTime, asciiString, 0, - printValue}, + N_("A tag used to record fractions of seconds for the tag."), IfdId::exifId, SectionId::dateTime, + asciiString, 0, printValue}, {0x9291, "SubSecTimeOriginal", N_("Sub-seconds Time Original"), - N_("A tag used to record fractions of seconds for the tag."), exifId, dateTime, asciiString, 0, - printValue}, + N_("A tag used to record fractions of seconds for the tag."), IfdId::exifId, + SectionId::dateTime, asciiString, 0, printValue}, {0x9292, "SubSecTimeDigitized", N_("Sub-seconds Time Digitized"), - N_("A tag used to record fractions of seconds for the tag."), exifId, dateTime, asciiString, 0, - printValue}, + N_("A tag used to record fractions of seconds for the tag."), IfdId::exifId, + SectionId::dateTime, asciiString, 0, printValue}, {0x9400, "Temperature", N_("Temperature"), N_("Temperature as the ambient situation at the shot, for example the room " "temperature where the photographer was holding the camera. The unit is " "degrees C."), - exifId, captureCond, signedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, signedRational, 1, printValue}, // Exif 2.31 {0x9401, "Humidity", N_("Humidity"), N_("Humidity as the ambient situation at the shot, for example the room humidity " "where the photographer was holding the camera. The unit is %."), - exifId, captureCond, unsignedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printValue}, // Exif 2.31 {0x9402, "Pressure", N_("Pressure"), N_("Pressure as the ambient situation at the shot, for example the room atmosphere " "where the photographer was holding the camera or the water pressure under the sea. " "The unit is hPa."), - exifId, captureCond, unsignedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printValue}, // Exif 2.31 {0x9403, "WaterDepth", N_("WaterDepth"), N_("Water depth as the ambient situation at the shot, for example the water depth " "of the camera at underwater photography. The unit is m."), - exifId, captureCond, signedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, signedRational, 1, printValue}, // Exif 2.31 {0x9404, "Acceleration", N_("Acceleration"), N_("Acceleration (a scalar regardless of direction) as the ambient situation at the " "shot, for example the driving acceleration of the vehicle which the photographer " "rode on at the shot. The unit is mGal (10e-5 m/s^2)."), - exifId, captureCond, unsignedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printValue}, // Exif 2.31 {0x9405, "CameraElevationAngle", N_("Camera elevation angle"), N_("Elevation/depression. angle of the orientation of the camera(imaging optical " "axis) as the ambient situation at the shot. The unit is degrees."), - exifId, captureCond, signedRational, 1, printValue}, // Exif 2.31 + IfdId::exifId, SectionId::captureCond, signedRational, 1, printValue}, // Exif 2.31 {0xa000, "FlashpixVersion", N_("FlashPix Version"), N_("The FlashPix format version supported by a FPXR file."), - exifId, exifVersion, undefined, 4, printExifVersion}, + IfdId::exifId, SectionId::exifVersion, undefined, 4, printExifVersion}, {0xa001, "ColorSpace", N_("Color Space"), N_("The color space information tag is always " "recorded as the color space specifier. Normally sRGB " @@ -1844,14 +1848,14 @@ constexpr TagInfo exifTagInfo[] = { "sRGB is used, Uncalibrated is set. Image data " "recorded as Uncalibrated can be treated as sRGB when it is " "converted to FlashPix."), - exifId, imgCharacter, unsignedShort, 1, print0xa001}, + IfdId::exifId, SectionId::imgCharacter, unsignedShort, 1, print0xa001}, {0xa002, "PixelXDimension", N_("Pixel X Dimension"), N_("Information specific to compressed data. When a " "compressed file is recorded, the valid width of the " "meaningful image must be recorded in this tag, whether or " "not there is padding data or a restart marker. This tag " "should not exist in an uncompressed file."), - exifId, imgConfig, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::imgConfig, unsignedLong, 1, printValue}, {0xa003, "PixelYDimension", N_("Pixel Y Dimension"), N_("Information specific to compressed data. When a compressed " "file is recorded, the valid height of the meaningful image " @@ -1860,14 +1864,14 @@ constexpr TagInfo exifTagInfo[] = { "uncompressed file. Since data padding is unnecessary in the vertical " "direction, the number of lines recorded in this valid image height tag " "will in fact be the same as that recorded in the SOF."), - exifId, imgConfig, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::imgConfig, unsignedLong, 1, printValue}, {0xa004, "RelatedSoundFile", N_("Related Sound File"), N_("This tag is used to record the name of an audio file related " "to the image data. The only relational information " "recorded here is the Exif audio file name and extension (an " "ASCII string consisting of 8 characters + '.' + 3 " "characters). The path is not recorded."), - exifId, relatedFile, asciiString, 13, printValue}, + IfdId::exifId, SectionId::relatedFile, asciiString, 13, printValue}, {0xa005, "InteroperabilityTag", N_("Interoperability IFD Pointer"), N_("Interoperability IFD is composed of tags which stores the " "information to ensure the Interoperability and pointed " @@ -1875,157 +1879,158 @@ constexpr TagInfo exifTagInfo[] = { "The Interoperability structure of Interoperability IFD is " "the same as TIFF defined IFD structure but does not contain the " "image data characteristically compared with normal TIFF IFD."), - exifId, exifFormat, unsignedLong, 1, printValue}, + IfdId::exifId, SectionId::exifFormat, unsignedLong, 1, printValue}, {0xa20b, "FlashEnergy", N_("Flash Energy"), N_("Indicates the strobe energy at the time the image is " "captured, as measured in Beam Candle Power Seconds (BCPS)."), - exifId, captureCond, unsignedRational, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printValue}, {0xa20c, "SpatialFrequencyResponse", N_("Spatial Frequency Response"), N_("This tag records the camera or input device spatial frequency " "table and SFR values in the direction of image width, " "image height, and diagonal direction, as specified in ISO 12233."), - exifId, captureCond, undefined, 0, printValue}, + IfdId::exifId, SectionId::captureCond, undefined, 0, printValue}, {0xa20e, "FocalPlaneXResolution", N_("Focal Plane X-Resolution"), N_("Indicates the number of pixels in the image width (X) direction " "per on the camera focal plane."), - exifId, captureCond, unsignedRational, 1, printFloat}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printFloat}, {0xa20f, "FocalPlaneYResolution", N_("Focal Plane Y-Resolution"), N_("Indicates the number of pixels in the image height (V) direction " "per on the camera focal plane."), - exifId, captureCond, unsignedRational, 1, printFloat}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printFloat}, {0xa210, "FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"), N_("Indicates the unit for measuring and " ". This value is the same as the ."), - exifId, captureCond, unsignedShort, 1, printExifUnit}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, printExifUnit}, {0xa214, "SubjectLocation", N_("Subject Location"), N_("Indicates the location of the main subject in the scene. The " "value of this tag represents the pixel at the center of the " "main subject relative to the left edge, prior to rotation " "processing as per the tag. The first value " "indicates the X column number and second indicates the Y row number."), - exifId, captureCond, unsignedShort, 2, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 2, printValue}, {0xa215, "ExposureIndex", N_("Exposure index"), N_("Indicates the exposure index selected on the camera or " "input device at the time the image is captured."), - exifId, captureCond, unsignedRational, 1, printValue}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, printValue}, {0xa217, "SensingMethod", N_("Sensing Method"), - N_("Indicates the image sensor type on the camera or input device."), exifId, captureCond, unsignedShort, 1, - print0xa217}, + N_("Indicates the image sensor type on the camera or input device."), IfdId::exifId, SectionId::captureCond, + unsignedShort, 1, print0xa217}, {0xa300, "FileSource", N_("File Source"), N_("Indicates the image source. If a DSC recorded the image, " "this tag value of this tag always be set to 3, indicating " "that the image was recorded on a DSC."), - exifId, captureCond, undefined, 1, print0xa300}, + IfdId::exifId, SectionId::captureCond, undefined, 1, print0xa300}, {0xa301, "SceneType", N_("Scene Type"), N_("Indicates the type of scene. If a DSC recorded the image, " "this tag value must always be set to 1, indicating that the " "image was directly photographed."), - exifId, captureCond, undefined, 1, print0xa301}, + IfdId::exifId, SectionId::captureCond, undefined, 1, print0xa301}, {0xa302, "CFAPattern", N_("Color Filter Array Pattern"), N_("Indicates the color filter array (CFA) geometric pattern of the " "image sensor when a one-chip color area sensor is used. " "It does not apply to all sensing methods."), - exifId, captureCond, undefined, 0, printValue}, + IfdId::exifId, SectionId::captureCond, undefined, 0, printValue}, {0xa401, "CustomRendered", N_("Custom Rendered"), N_("This tag indicates the use of special processing on image " "data, such as rendering geared to output. When special " "processing is performed, the reader is expected to disable " "or minimize any further processing."), - exifId, captureCond, unsignedShort, 1, print0xa401}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa401}, {0xa402, "ExposureMode", N_("Exposure Mode"), N_("This tag indicates the exposure mode set when the image was " "shot. In auto-bracketing mode, the camera shoots a series of " "frames of the same scene at different exposure settings."), - exifId, captureCond, unsignedShort, 1, print0xa402}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa402}, {0xa403, "WhiteBalance", N_("White Balance"), - N_("This tag indicates the white balance mode set when the image was shot."), exifId, captureCond, unsignedShort, - 1, print0xa403}, + N_("This tag indicates the white balance mode set when the image was shot."), IfdId::exifId, + SectionId::captureCond, unsignedShort, 1, print0xa403}, {0xa404, "DigitalZoomRatio", N_("Digital Zoom Ratio"), N_("This tag indicates the digital zoom ratio when the image was " "shot. If the numerator of the recorded value is 0, this " "indicates that digital zoom was not used."), - exifId, captureCond, unsignedRational, 1, print0xa404}, + IfdId::exifId, SectionId::captureCond, unsignedRational, 1, print0xa404}, {0xa405, "FocalLengthIn35mmFilm", N_("Focal Length In 35mm Film"), N_("This tag indicates the equivalent focal length assuming a " "35mm film camera, in mm. A value of 0 means the focal " "length is unknown. Note that this tag differs from the " " tag."), - exifId, captureCond, unsignedShort, 1, print0xa405}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa405}, {0xa406, "SceneCaptureType", N_("Scene Capture Type"), N_("This tag indicates the type of scene that was shot. It can " "also be used to record the mode in which the image was " "shot. Note that this differs from the tag."), - exifId, captureCond, unsignedShort, 1, print0xa406}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa406}, {0xa407, "GainControl", N_("Gain Control"), N_("This tag indicates the degree of overall image gain adjustment."), - exifId, captureCond, unsignedShort, 1, print0xa407}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa407}, {0xa408, "Contrast", N_("Contrast"), N_("This tag indicates the direction of contrast processing " "applied by the camera when the image was shot."), - exifId, captureCond, unsignedShort, 1, printNormalSoftHard}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, printNormalSoftHard}, {0xa409, "Saturation", N_("Saturation"), N_("This tag indicates the direction of saturation processing " "applied by the camera when the image was shot."), - exifId, captureCond, unsignedShort, 1, print0xa409}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, print0xa409}, {0xa40a, "Sharpness", N_("Sharpness"), N_("This tag indicates the direction of sharpness processing " "applied by the camera when the image was shot."), - exifId, captureCond, unsignedShort, 1, printNormalSoftHard}, + IfdId::exifId, SectionId::captureCond, unsignedShort, 1, printNormalSoftHard}, {0xa40b, "DeviceSettingDescription", N_("Device Setting Description"), N_("This tag indicates information on the picture-taking " "conditions of a particular camera model. The tag is used " "only to indicate the picture-taking conditions in the reader."), - exifId, captureCond, undefined, 0, printValue}, + IfdId::exifId, SectionId::captureCond, undefined, 0, printValue}, {0xa40c, "SubjectDistanceRange", N_("Subject Distance Range"), - N_("This tag indicates the distance to the subject."), exifId, captureCond, unsignedShort, 1, print0xa40c}, + N_("This tag indicates the distance to the subject."), IfdId::exifId, SectionId::captureCond, unsignedShort, 1, + print0xa40c}, {0xa420, "ImageUniqueID", N_("Image Unique ID"), N_("This tag indicates an identifier assigned uniquely to " "each image. It is recorded as an ASCII string equivalent " "to hexadecimal notation and 128-bit fixed length."), - exifId, otherTags, asciiString, 33, printValue}, + IfdId::exifId, SectionId::otherTags, asciiString, 33, printValue}, {0xa430, "CameraOwnerName", N_("Camera Owner Name"), N_("This tag records the owner of a camera used in " "photography as an ASCII string."), - exifId, otherTags, asciiString, 0, printValue}, + IfdId::exifId, SectionId::otherTags, asciiString, 0, printValue}, {0xa431, "BodySerialNumber", N_("Body Serial Number"), N_("This tag records the serial number of the body of the camera " "that was used in photography as an ASCII string."), - exifId, otherTags, asciiString, 0, printValue}, + IfdId::exifId, SectionId::otherTags, asciiString, 0, printValue}, {0xa432, "LensSpecification", N_("Lens Specification"), N_("This tag notes minimum focal length, maximum focal length, " "minimum F number in the minimum focal length, and minimum F number " "in the maximum focal length, which are specification information " "for the lens that was used in photography. When the minimum F " "number is unknown, the notation is 0/0"), - exifId, otherTags, unsignedRational, 4, printValue}, - {0xa433, "LensMake", N_("Lens Make"), N_("This tag records the lens manufactor as an ASCII string."), exifId, - otherTags, asciiString, 0, printValue}, + IfdId::exifId, SectionId::otherTags, unsignedRational, 4, printValue}, + {0xa433, "LensMake", N_("Lens Make"), N_("This tag records the lens manufactor as an ASCII string."), IfdId::exifId, + SectionId::otherTags, asciiString, 0, printValue}, {0xa434, "LensModel", N_("Lens Model"), N_("This tag records the lens's model name and model number as an " "ASCII string."), - exifId, otherTags, asciiString, 0, printValue}, + IfdId::exifId, SectionId::otherTags, asciiString, 0, printValue}, {0xa435, "LensSerialNumber", N_("Lens Serial Number"), N_("This tag records the serial number of the interchangeable lens " "that was used in photography as an ASCII string."), - exifId, otherTags, asciiString, 0, printValue}, + IfdId::exifId, SectionId::otherTags, asciiString, 0, printValue}, {0xa460, "CompositeImage", N_("Composite Image"), - N_("Indicates whether the recorded image is a composite image or not."), exifId, captureCond, unsignedShort, 1, - EXV_PRINT_TAG(exifCompositeImage)}, // Exif 2.32 + N_("Indicates whether the recorded image is a composite image or not."), IfdId::exifId, SectionId::captureCond, + unsignedShort, 1, EXV_PRINT_TAG(exifCompositeImage)}, // Exif 2.32 {0xa461, "SourceImageNumberOfCompositeImage", N_("Source Image Number Of Composite Image"), N_("Indicates the number of the source images (tentatively recorded images) captured for a composite Image."), - exifId, captureCond, unsignedShort, 2, printValue}, // Exif 2.32 + IfdId::exifId, SectionId::captureCond, unsignedShort, 2, printValue}, // Exif 2.32 {0xa462, "SourceExposureTimesOfCompositeImage", N_("Source Exposure Times Of Composite Image"), N_("For a composite image, records the parameters relating exposure time of the exposures for generating the " "said composite image, such as respective exposure times of captured source images (tentatively recorded " "images)."), - exifId, captureCond, undefined, 0, printValue}, // Exif 2.32 + IfdId::exifId, SectionId::captureCond, undefined, 0, printValue}, // Exif 2.32 {0xa500, "Gamma", N_("Gamma"), N_("Indicates the value of coefficient gamma. The formula of transfer function used for image reproduction " "is expressed as follows: (reproduced value) = (input value)^gamma. Both reproduced value and input value " "indicate normalized value, whose minimum value is 0 and maximum value is 1."), - exifId, imgCharacter, unsignedRational, 1, printFloat}, + IfdId::exifId, SectionId::imgCharacter, unsignedRational, 1, printFloat}, // End of list marker - {0xffff, "(UnknownExifTag)", N_("Unknown Exif tag"), N_("Unknown Exif tag"), exifId, sectionIdNotSet, asciiString, - -1, printValue}, + {0xffff, "(UnknownExifTag)", N_("Unknown Exif tag"), N_("Unknown Exif tag"), IfdId::exifId, + SectionId::sectionIdNotSet, asciiString, -1, printValue}, }; const TagInfo* exifTagList() { @@ -2068,11 +2073,11 @@ constexpr TagInfo gpsTagInfo[] = { "present. (Note: The tag is given in bytes, " "unlike the tag. When the version is " "2.0.0.0, the tag value is 02000000.H)."), - gpsId, gpsTags, unsignedByte, 4, print0x0000}, + IfdId::gpsId, SectionId::gpsTags, unsignedByte, 4, print0x0000}, {0x0001, "GPSLatitudeRef", N_("GPS Latitude Reference"), N_("Indicates whether the latitude is north or south latitude. The " "ASCII value 'N' indicates north latitude, and 'S' is south latitude."), - gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)}, {0x0002, "GPSLatitude", N_("GPS Latitude"), N_("Indicates the latitude. The latitude is expressed as three " "RATIONAL values giving the degrees, minutes, and seconds, " @@ -2080,11 +2085,11 @@ constexpr TagInfo gpsTagInfo[] = { "the format is dd/1,mm/1,ss/1. When degrees and minutes are used " "and, for example, fractions of minutes are given up to two " "decimal places, the format is dd/1,mmmm/100,0/1."), - gpsId, gpsTags, unsignedRational, 3, printDegrees}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 3, printDegrees}, {0x0003, "GPSLongitudeRef", N_("GPS Longitude Reference"), N_("Indicates whether the longitude is east or west longitude. " "ASCII 'E' indicates east longitude, and 'W' is west longitude."), - gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)}, {0x0004, "GPSLongitude", N_("GPS Longitude"), N_("Indicates the longitude. The longitude is expressed as three " "RATIONAL values giving the degrees, minutes, and seconds, " @@ -2092,7 +2097,7 @@ constexpr TagInfo gpsTagInfo[] = { "the format is ddd/1,mm/1,ss/1. When degrees and minutes are " "used and, for example, fractions of minutes are given up to " "two decimal places, the format is ddd/1,mmmm/100,0/1."), - gpsId, gpsTags, unsignedRational, 3, printDegrees}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 3, printDegrees}, {0x0005, "GPSAltitudeRef", N_("GPS Altitude Reference"), N_("Indicates the altitude used as the reference altitude. If the " "reference is sea level and the altitude is above sea level, 0 " @@ -2100,66 +2105,66 @@ constexpr TagInfo gpsTagInfo[] = { "and the altitude is indicated as an absolute value in the " "GSPAltitude tag. The reference unit is meters. Note that this tag " "is BYTE type, unlike other reference tags."), - gpsId, gpsTags, unsignedByte, 1, print0x0005}, + IfdId::gpsId, SectionId::gpsTags, unsignedByte, 1, print0x0005}, {0x0006, "GPSAltitude", N_("GPS Altitude"), N_("Indicates the altitude based on the reference in GPSAltitudeRef. " "Altitude is expressed as one RATIONAL value. The reference unit is meters."), - gpsId, gpsTags, unsignedRational, 1, print0x0006}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, print0x0006}, {0x0007, "GPSTimeStamp", N_("GPS Time Stamp"), N_("Indicates the time as UTC (Coordinated Universal Time). " " is expressed as three RATIONAL values " "giving the hour, minute, and second (atomic clock)."), - gpsId, gpsTags, unsignedRational, 3, print0x0007}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 3, print0x0007}, {0x0008, "GPSSatellites", N_("GPS Satellites"), N_("Indicates the GPS satellites used for measurements. This tag can be used " "to describe the number of satellites, their ID number, angle of elevation, " "azimuth, SNR and other information in ASCII notation. The format is not " "specified. If the GPS receiver is incapable of taking measurements, value " "of the tag is set to NULL."), - gpsId, gpsTags, asciiString, 0, printValue}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 0, printValue}, {0x0009, "GPSStatus", N_("GPS Status"), N_("Indicates the status of the GPS receiver when the image is recorded. " "\"A\" means measurement is in progress, and \"V\" means the measurement " "is Interoperability."), - gpsId, gpsTags, asciiString, 2, print0x0009}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, print0x0009}, {0x000a, "GPSMeasureMode", N_("GPS Measure Mode"), N_("Indicates the GPS measurement mode. \"2\" means two-dimensional measurement and \"3\" " "means three-dimensional measurement is in progress."), - gpsId, gpsTags, asciiString, 2, print0x000a}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, print0x000a}, {0x000b, "GPSDOP", N_("GPS Data Degree of Precision"), N_("Indicates the GPS DOP (data degree of precision). An HDOP value is written " "during two-dimensional measurement, and PDOP during three-dimensional measurement."), - gpsId, gpsTags, unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x000c, "GPSSpeedRef", N_("GPS Speed Reference"), N_("Indicates the unit used to express the GPS receiver speed of movement. " "\"K\" \"M\" and \"N\" represents kilometers per hour, miles per hour, and knots."), - gpsId, gpsTags, asciiString, 2, print0x000c}, - {0x000d, "GPSSpeed", N_("GPS Speed"), N_("Indicates the speed of GPS receiver movement."), gpsId, gpsTags, - unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, print0x000c}, + {0x000d, "GPSSpeed", N_("GPS Speed"), N_("Indicates the speed of GPS receiver movement."), IfdId::gpsId, + SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x000e, "GPSTrackRef", N_("GPS Track Ref"), N_("Indicates the reference for giving the direction of GPS receiver movement. " "\"T\" denotes true direction and \"M\" is magnetic direction."), - gpsId, gpsTags, asciiString, 2, printGPSDirRef}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, printGPSDirRef}, {0x000f, "GPSTrack", N_("GPS Track"), N_("Indicates the direction of GPS receiver movement. The range of values is " "from 0.00 to 359.99."), - gpsId, gpsTags, unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x0010, "GPSImgDirectionRef", N_("GPS Image Direction Reference"), N_("Indicates the reference for giving the direction of the image when it is captured. " "\"T\" denotes true direction and \"M\" is magnetic direction."), - gpsId, gpsTags, asciiString, 2, printGPSDirRef}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, printGPSDirRef}, {0x0011, "GPSImgDirection", N_("GPS Image Direction"), N_("Indicates the direction of the image when it was captured. The range of values " "is from 0.00 to 359.99."), - gpsId, gpsTags, unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x0012, "GPSMapDatum", N_("GPS Map Datum"), N_("Indicates the geodetic survey data used by the GPS receiver. If the survey data " "is restricted to Japan, the value of this tag is \"TOKYO\" or \"WGS-84\"."), - gpsId, gpsTags, asciiString, 0, printValue}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 0, printValue}, {0x0013, "GPSDestLatitudeRef", N_("GPS Destination Latitude Reference"), N_("Indicates whether the latitude of the destination point is north or south latitude. " "The ASCII value \"N\" indicates north latitude, and \"S\" is south latitude."), - gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLatitudeRef)}, {0x0014, "GPSDestLatitude", N_("GPS Destination Latitude"), N_("Indicates the latitude of the destination point. The latitude is expressed as " "three RATIONAL values giving the degrees, minutes, and seconds, respectively. " @@ -2167,53 +2172,53 @@ constexpr TagInfo gpsTagInfo[] = { "be dd/1,mm/1,ss/1. When degrees and minutes are used and, for example, " "fractions of minutes are given up to two decimal places, the format would be " "dd/1,mmmm/100,0/1."), - gpsId, gpsTags, unsignedRational, 3, printDegrees}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 3, printDegrees}, {0x0015, "GPSDestLongitudeRef", N_("GPS Destination Longitude Reference"), N_("Indicates whether the longitude of the destination point is east or west longitude. " "ASCII \"E\" indicates east longitude, and \"W\" is west longitude."), - gpsId, gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, EXV_PRINT_TAG(exifGPSLongitudeRef)}, {0x0016, "GPSDestLongitude", N_("GPS Destination Longitude"), N_("Indicates the longitude of the destination point. The longitude is expressed " "as three RATIONAL values giving the degrees, minutes, and seconds, respectively. " "If longitude is expressed as degrees, minutes and seconds, a typical format would be " "ddd/1,mm/1,ss/1. When degrees and minutes are used and, for example, fractions of " "minutes are given up to two decimal places, the format would be ddd/1,mmmm/100,0/1."), - gpsId, gpsTags, unsignedRational, 3, printDegrees}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 3, printDegrees}, {0x0017, "GPSDestBearingRef", N_("GPS Destination Bearing Reference"), N_("Indicates the reference used for giving the bearing to the destination point. " "\"T\" denotes true direction and \"M\" is magnetic direction."), - gpsId, gpsTags, asciiString, 2, printGPSDirRef}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, printGPSDirRef}, {0x0018, "GPSDestBearing", N_("GPS Destination Bearing"), N_("Indicates the bearing to the destination point. The range of values is from " "0.00 to 359.99."), - gpsId, gpsTags, unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x0019, "GPSDestDistanceRef", N_("GPS Destination Distance Reference"), N_("Indicates the unit used to express the distance to the destination point. " "\"K\", \"M\" and \"N\" represent kilometers, miles and nautical miles."), - gpsId, gpsTags, asciiString, 2, print0x0019}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 2, print0x0019}, {0x001a, "GPSDestDistance", N_("GPS Destination Distance"), N_("Indicates the distance to the destination point."), - gpsId, gpsTags, unsignedRational, 1, printFloat}, + IfdId::gpsId, SectionId::gpsTags, unsignedRational, 1, printFloat}, {0x001b, "GPSProcessingMethod", N_("GPS Processing Method"), N_("A character string recording the name of the method used for location finding. " "The string encoding is defined using the same scheme as UserComment."), - gpsId, gpsTags, comment, 0, printValue}, + IfdId::gpsId, SectionId::gpsTags, comment, 0, printValue}, {0x001c, "GPSAreaInformation", N_("GPS Area Information"), N_("A character string recording the name of the GPS area." "The string encoding is defined using the same scheme as UserComment."), - gpsId, gpsTags, comment, 0, printValue}, + IfdId::gpsId, SectionId::gpsTags, comment, 0, printValue}, {0x001d, "GPSDateStamp", N_("GPS Date Stamp"), N_("A character string recording date and time information relative to UTC " "(Coordinated Universal Time). The format is \"YYYY:MM:DD.\"."), - gpsId, gpsTags, asciiString, 11, printValue}, + IfdId::gpsId, SectionId::gpsTags, asciiString, 11, printValue}, {0x001e, "GPSDifferential", N_("GPS Differential"), - N_("Indicates whether differential correction is applied to the GPS receiver."), gpsId, gpsTags, unsignedShort, 1, - print0x001e}, + N_("Indicates whether differential correction is applied to the GPS receiver."), IfdId::gpsId, SectionId::gpsTags, + unsignedShort, 1, print0x001e}, {0x001f, "GPSHPositioningError", N_("GPS Horizontal positioning error"), - N_("This tag indicates horizontal positioning errors in meters."), gpsId, gpsTags, unsignedRational, 1, - printFloat}, + N_("This tag indicates horizontal positioning errors in meters."), IfdId::gpsId, SectionId::gpsTags, + unsignedRational, 1, printFloat}, // End of list marker - {0xffff, "(UnknownGpsTag)", N_("Unknown GPSInfo tag"), N_("Unknown GPSInfo tag"), gpsId, gpsTags, asciiString, -1, - printValue}, + {0xffff, "(UnknownGpsTag)", N_("Unknown GPSInfo tag"), N_("Unknown GPSInfo tag"), IfdId::gpsId, SectionId::gpsTags, + asciiString, -1, printValue}, }; const TagInfo* gpsTagList() { @@ -2222,42 +2227,47 @@ const TagInfo* gpsTagList() { // MPF Tags http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/MPF.html constexpr TagInfo mpfTagInfo[] = { - {0xb000, "MPFVersion", N_("MPFVersion"), N_("MPF Version"), mpfId, mpfTags, asciiString, 0, printValue}, - {0xb001, "MPFNumberOfImages", N_("MPFNumberOfImages"), N_("MPF Number of Images"), mpfId, mpfTags, undefined, -1, - printExifVersion}, - {0xb002, "MPFImageList", N_("MPFImageList"), N_("MPF Image List"), mpfId, mpfTags, asciiString, 0, printValue}, - {0xb003, "MPFImageUIDList", N_("MPFImageUIDList "), N_("MPF Image UID List"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb004, "MPFTotalFrames", N_("MPFTotalFrames"), N_("MPF Total Frames"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb101, "MPFIndividualNum", N_("MPFIndividualNum"), N_("MPF Individual Num"), mpfId, mpfTags, unsignedLong, 1, + {0xb000, "MPFVersion", N_("MPFVersion"), N_("MPF Version"), IfdId::mpfId, SectionId::mpfTags, asciiString, 0, printValue}, - {0xb201, "MPFPanOrientation", N_("MPFPanOrientation"), N_("MPFPanOrientation"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb202, "MPFPanOverlapH", N_("MPFPanOverlapH"), N_("MPF Pan Overlap Horizonal"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb203, "MPFPanOverlapV", N_("MPFPanOverlapV"), N_("MPF Pan Overlap Vertical"), mpfId, mpfTags, unsignedLong, 1, + {0xb001, "MPFNumberOfImages", N_("MPFNumberOfImages"), N_("MPF Number of Images"), IfdId::mpfId, SectionId::mpfTags, + undefined, -1, printExifVersion}, + {0xb002, "MPFImageList", N_("MPFImageList"), N_("MPF Image List"), IfdId::mpfId, SectionId::mpfTags, asciiString, 0, printValue}, - {0xb204, "MPFBaseViewpointNum", N_("MPFBaseViewpointNum"), N_("MPF Base Viewpoint Number"), mpfId, mpfTags, + {0xb003, "MPFImageUIDList", N_("MPFImageUIDList "), N_("MPF Image UID List"), IfdId::mpfId, SectionId::mpfTags, unsignedLong, 1, printValue}, - {0xb205, "MPFConvergenceAngle", N_("MPFConvergenceAngle"), N_("MPF Convergence Angle"), mpfId, mpfTags, + {0xb004, "MPFTotalFrames", N_("MPFTotalFrames"), N_("MPF Total Frames"), IfdId::mpfId, SectionId::mpfTags, unsignedLong, 1, printValue}, - {0xb206, "MPFBaselineLength", N_("MPFBaselineLength"), N_("MPF Baseline Length"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb207, "MPFVerticalDivergence", N_("MPFVerticalDivergence"), N_("MPF Vertical Divergence"), mpfId, mpfTags, + {0xb101, "MPFIndividualNum", N_("MPFIndividualNum"), N_("MPF Individual Num"), IfdId::mpfId, SectionId::mpfTags, unsignedLong, 1, printValue}, - {0xb208, "MPFAxisDistanceX", N_("MPFAxisDistanceX"), N_("MPF Axis Distance X"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb209, "MPFAxisDistanceY", N_("MPFAxisDistanceY"), N_("MPF Axis Distance Y"), mpfId, mpfTags, unsignedLong, 1, - printValue}, - {0xb20a, "MPFAxisDistanceZ", N_("MPFAxisDistanceZ"), N_("MPF Axis Distance Z"), mpfId, mpfTags, unsignedLong, 1, + {0xb201, "MPFPanOrientation", N_("MPFPanOrientation"), N_("MPFPanOrientation"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb202, "MPFPanOverlapH", N_("MPFPanOverlapH"), N_("MPF Pan Overlap Horizonal"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb203, "MPFPanOverlapV", N_("MPFPanOverlapV"), N_("MPF Pan Overlap Vertical"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb204, "MPFBaseViewpointNum", N_("MPFBaseViewpointNum"), N_("MPF Base Viewpoint Number"), IfdId::mpfId, + SectionId::mpfTags, unsignedLong, 1, printValue}, + {0xb205, "MPFConvergenceAngle", N_("MPFConvergenceAngle"), N_("MPF Convergence Angle"), IfdId::mpfId, + SectionId::mpfTags, unsignedLong, 1, printValue}, + {0xb206, "MPFBaselineLength", N_("MPFBaselineLength"), N_("MPF Baseline Length"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb207, "MPFVerticalDivergence", N_("MPFVerticalDivergence"), N_("MPF Vertical Divergence"), IfdId::mpfId, + SectionId::mpfTags, unsignedLong, 1, printValue}, + {0xb208, "MPFAxisDistanceX", N_("MPFAxisDistanceX"), N_("MPF Axis Distance X"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb209, "MPFAxisDistanceY", N_("MPFAxisDistanceY"), N_("MPF Axis Distance Y"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb20a, "MPFAxisDistanceZ", N_("MPFAxisDistanceZ"), N_("MPF Axis Distance Z"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb20b, "MPFYawAngle", N_("MPFYawAngle"), N_("MPF Yaw Angle"), IfdId::mpfId, SectionId::mpfTags, unsignedLong, 1, printValue}, - {0xb20b, "MPFYawAngle", N_("MPFYawAngle"), N_("MPF Yaw Angle"), mpfId, mpfTags, unsignedLong, 1, printValue}, - {0xb20c, "MPFPitchAngle", N_("MPFPitchAngle"), N_("MPF Pitch Angle"), mpfId, mpfTags, unsignedLong, 1, printValue}, - {0xb20d, "MPFRollAngle", N_("MPFRollAngle"), N_("MPF Roll Angle"), mpfId, mpfTags, unsignedLong, 1, printValue}, + {0xb20c, "MPFPitchAngle", N_("MPFPitchAngle"), N_("MPF Pitch Angle"), IfdId::mpfId, SectionId::mpfTags, + unsignedLong, 1, printValue}, + {0xb20d, "MPFRollAngle", N_("MPFRollAngle"), N_("MPF Roll Angle"), IfdId::mpfId, SectionId::mpfTags, unsignedLong, + 1, printValue}, // End of list marker - {0xffff, "(UnknownMpfTag)", N_("Unknown MPF tag"), N_("Unknown MPF tag"), mpfId, mpfTags, asciiString, -1, - printValue}, + {0xffff, "(UnknownMpfTag)", N_("Unknown MPF tag"), N_("Unknown MPF tag"), IfdId::mpfId, SectionId::mpfTags, + asciiString, -1, printValue}, }; const TagInfo* mpfTagList() { @@ -2272,18 +2282,18 @@ constexpr TagInfo iopTagInfo[] = { "including the termination code (NULL). see the separate " "volume of Recommended Exif Interoperability Rules (ExifR98) " "for other tags used for ExifR98."), - iopId, iopTags, asciiString, 0, printValue}, - {0x0002, "InteroperabilityVersion", N_("Interoperability Version"), N_("Interoperability version"), iopId, iopTags, - undefined, -1, printExifVersion}, - {0x1000, "RelatedImageFileFormat", N_("Related Image File Format"), N_("File format of image file"), iopId, iopTags, - asciiString, 0, printValue}, - {0x1001, "RelatedImageWidth", N_("Related Image Width"), N_("Image width"), iopId, iopTags, unsignedLong, 1, - printValue}, - {0x1002, "RelatedImageLength", N_("Related Image Length"), N_("Image height"), iopId, iopTags, unsignedLong, 1, - printValue}, + IfdId::iopId, SectionId::iopTags, asciiString, 0, printValue}, + {0x0002, "InteroperabilityVersion", N_("Interoperability Version"), N_("Interoperability version"), IfdId::iopId, + SectionId::iopTags, undefined, -1, printExifVersion}, + {0x1000, "RelatedImageFileFormat", N_("Related Image File Format"), N_("File format of image file"), IfdId::iopId, + SectionId::iopTags, asciiString, 0, printValue}, + {0x1001, "RelatedImageWidth", N_("Related Image Width"), N_("Image width"), IfdId::iopId, SectionId::iopTags, + unsignedLong, 1, printValue}, + {0x1002, "RelatedImageLength", N_("Related Image Length"), N_("Image height"), IfdId::iopId, SectionId::iopTags, + unsignedLong, 1, printValue}, // End of list marker - {0xffff, "(UnknownIopTag)", N_("Unknown Exif Interoperability tag"), N_("Unknown Exif Interoperability tag"), iopId, - iopTags, asciiString, -1, printValue}, + {0xffff, "(UnknownIopTag)", N_("Unknown Exif Interoperability tag"), N_("Unknown Exif Interoperability tag"), + IfdId::iopId, SectionId::iopTags, asciiString, -1, printValue}, }; const TagInfo* iopTagList() { @@ -2292,14 +2302,14 @@ const TagInfo* iopTagList() { // Synthesized Exiv2 Makernote info Tags (read-only) constexpr TagInfo mnTagInfo[] = { - {0x0001, "Offset", N_("Offset"), N_("Offset of the makernote from the start of the TIFF header."), mnId, makerTags, - unsignedLong, 1, printValue}, + {0x0001, "Offset", N_("Offset"), N_("Offset of the makernote from the start of the TIFF header."), IfdId::mnId, + SectionId::makerTags, unsignedLong, 1, printValue}, {0x0002, "ByteOrder", N_("Byte Order"), - N_("Byte order used to encode MakerNote tags, 'MM' (big-endian) or 'II' (little-endian)."), mnId, makerTags, - asciiString, 0, printValue}, + N_("Byte order used to encode MakerNote tags, 'MM' (big-endian) or 'II' (little-endian)."), IfdId::mnId, + SectionId::makerTags, asciiString, 0, printValue}, // End of list marker - {0xffff, "(UnknownMnTag)", N_("Unknown Exiv2 Makernote info tag"), N_("Unknown Exiv2 Makernote info tag"), mnId, - makerTags, asciiString, -1, printValue}, + {0xffff, "(UnknownMnTag)", N_("Unknown Exiv2 Makernote info tag"), N_("Unknown Exiv2 Makernote info tag"), + IfdId::mnId, SectionId::makerTags, asciiString, -1, printValue}, }; const TagInfo* mnTagList() { @@ -2318,25 +2328,25 @@ bool isMakerIfd(IfdId ifdId) { bool isExifIfd(IfdId ifdId) { bool rc; switch (ifdId) { - case ifd0Id: - case exifId: - case gpsId: - case iopId: - case ifd1Id: - case ifd2Id: - case ifd3Id: - case mpfId: - case subImage1Id: - case subImage2Id: - case subImage3Id: - case subImage4Id: - case subImage5Id: - case subImage6Id: - case subImage7Id: - case subImage8Id: - case subImage9Id: - case subThumb1Id: - case panaRawId: + case IfdId::ifd0Id: + case IfdId::exifId: + case IfdId::gpsId: + case IfdId::iopId: + case IfdId::ifd1Id: + case IfdId::ifd2Id: + case IfdId::ifd3Id: + case IfdId::mpfId: + case IfdId::subImage1Id: + case IfdId::subImage2Id: + case IfdId::subImage3Id: + case IfdId::subImage4Id: + case IfdId::subImage5Id: + case IfdId::subImage6Id: + case IfdId::subImage7Id: + case IfdId::subImage8Id: + case IfdId::subImage9Id: + case IfdId::subThumb1Id: + case IfdId::panaRawId: rc = true; break; default: @@ -2390,7 +2400,7 @@ const TagInfo* tagInfo(const std::string& tagName, IfdId ifdId) { } // tagInfo IfdId groupId(const std::string& groupName) { - IfdId ifdId = ifdIdNotSet; + IfdId ifdId = IfdId::ifdIdNotSet; const GroupInfo* ii = find(groupInfo, GroupInfo::GroupName(groupName)); if (ii) ifdId = static_cast(ii->ifdId_); diff --git a/src/tiffcomposite_int.cpp b/src/tiffcomposite_int.cpp index f488c5e6..2bed3790 100644 --- a/src/tiffcomposite_int.cpp +++ b/src/tiffcomposite_int.cpp @@ -456,7 +456,7 @@ TiffComponent* TiffDirectory::doAddPath(uint16_t tag, TiffPath& tiffPath, TiffCo // composite tag on the stack or the tag to add is the MakerNote tag. // This is used to prevent duplicate entries. Sub-IFDs also, but the > 1 // condition takes care of them, see below. - if (tiffPath.size() > 1 || (tpi.extendedTag() == 0x927c && tpi.group() == exifId)) { + if (tiffPath.size() > 1 || (tpi.extendedTag() == 0x927c && tpi.group() == IfdId::exifId)) { if (tpi.extendedTag() == Tag::next) { tc = pNext_; } else { @@ -841,7 +841,7 @@ uint32_t TiffDirectory::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64 return 0; // Remember the offset of the CR2 RAW IFD - if (group() == ifd3Id) { + if (group() == IfdId::ifd3Id) { #ifdef EXIV2_DEBUG_MESSAGES std::cerr << "Directory " << groupName(group()) << " offset is 0x" << std::setw(8) << std::setfill('0') << std::hex << offset << std::dec << "\n"; @@ -853,7 +853,7 @@ uint32_t TiffDirectory::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int64 // TIFF standard requires IFD entries to be sorted in ascending order by tag. // Not sorting makernote directories sometimes preserves them better. - if (group() < mnId) { + if (group() < IfdId::mnId) { std::sort(components_.begin(), components_.end(), cmpTagLt); } // Size of IFD values and additional data @@ -1025,7 +1025,7 @@ uint32_t TiffImageEntry::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int6 uint32_t dataIdx, uint32_t& imageIdx) { uint32_t o2 = imageIdx; // For makernotes, write TIFF image data to the data area - if (group() > mnId) + if (group() > IfdId::mnId) o2 = static_cast(offset + dataIdx); #ifdef EXIV2_DEBUG_MESSAGES std::cerr << "TiffImageEntry, Directory " << groupName(group()) << ", entry 0x" << std::setw(4) << std::setfill('0') @@ -1036,8 +1036,8 @@ uint32_t TiffImageEntry::doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, int6 for (auto&& strip : strips_) { idx += writeOffset(buf.data(idx), o2, tiffType(), byteOrder); o2 += strip.second; - o2 += strip.second & 1; // Align strip data to word boundary - if (!(group() > mnId)) { // Todo: FIX THIS!! SHOULDN'T USE > + o2 += strip.second & 1; // Align strip data to word boundary + if (!(group() > IfdId::mnId)) { // Todo: FIX THIS!! SHOULDN'T USE > imageIdx += strip.second; imageIdx += strip.second & 1; // Align strip data to word boundary } @@ -1172,7 +1172,7 @@ uint32_t TiffImageEntry::doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, uint32_t /*dataIdx*/, uint32_t& /*imageIdx*/) const { uint32_t len = 0; // For makernotes, write TIFF image data to the data area - if (group() > mnId) { // Todo: FIX THIS HACK!!! + if (group() > IfdId::mnId) { // Todo: FIX THIS HACK!!! len = writeImage(ioWrapper, byteOrder); } return len; @@ -1404,7 +1404,7 @@ size_t TiffEntryBase::doSizeData() const { size_t TiffImageEntry::doSizeData() const { size_t len = 0; // For makernotes, TIFF image data is written to the data area - if (group() > mnId) { // Todo: Fix this hack!! + if (group() > IfdId::mnId) { // Todo: Fix this hack!! len = sizeImage(); } return len; @@ -1473,7 +1473,9 @@ size_t TiffImageEntry::doSizeImage() const { static const TagInfo* findTagInfo(uint16_t tag, IfdId group) { const TagInfo* result = nullptr; - const TagInfo* tags = group == exifId ? Internal::exifTagList() : group == gpsId ? Internal::gpsTagList() : nullptr; + const TagInfo* tags = group == IfdId::exifId ? Internal::exifTagList() + : group == IfdId::gpsId ? Internal::gpsTagList() + : nullptr; if (tags) { for (size_t idx = 0; !result && tags[idx].tag_ != 0xffff; ++idx) { if (tags[idx].tag_ == tag) { @@ -1497,7 +1499,7 @@ TypeId toTypeId(TiffType tiffType, uint16_t tag, IfdId group) { // http://dev.exiv2.org/boards/3/topics/1337 change unsignedByte to signedByte // Exif.NikonAFT.AFFineTuneAdj || Exif.Pentax.Temperature if (ti == Exiv2::unsignedByte) { - if ((tag == 0x0002 && group == nikonAFTId) || (tag == 0x0047 && group == pentaxId)) { + if ((tag == 0x0002 && group == IfdId::nikonAFTId) || (tag == 0x0047 && group == IfdId::pentaxId)) { ti = Exiv2::signedByte; } } @@ -1530,7 +1532,7 @@ TiffComponent::UniquePtr newTiffEntry(uint16_t tag, IfdId group) { } TiffComponent::UniquePtr newTiffMnEntry(uint16_t tag, IfdId group) { - return std::make_unique(tag, group, mnId); + return std::make_unique(tag, group, IfdId::mnId); } TiffComponent::UniquePtr newTiffBinaryElement(uint16_t tag, IfdId group) { diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index 1e6938d4..518bd5b8 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -223,7 +223,7 @@ WriteMethod TiffParser::encode(BasicIo& io, const byte* pData, size_t size, Byte // Delete IFDs which do not occur in TIFF images static constexpr auto filteredIfds = std::array{ - panaRawId, + IfdId::panaRawId, }; for (auto&& filteredIfd : filteredIfds) { #ifdef EXIV2_DEBUG_MESSAGES diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index 1b34a324..67e0008b 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -21,7 +21,7 @@ namespace Exiv2::Internal { constexpr CryptFct notEncrypted = nullptr; //! Canon Camera Settings binary array - configuration -constexpr ArrayCfg canonCsCfg = {canonCsId, // Group for the elements +constexpr ArrayCfg canonCsCfg = {IfdId::canonCsId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -36,7 +36,7 @@ constexpr ArrayDef canonCsDef[] = { }; //! Canon Shot Info binary array - configuration -constexpr ArrayCfg canonSiCfg = {canonSiId, // Group for the elements +constexpr ArrayCfg canonSiCfg = {IfdId::canonSiId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -46,7 +46,7 @@ constexpr ArrayCfg canonSiCfg = {canonSiId, // Group for the elements {0, ttUnsignedShort, 1}}; //! Canon Panorama binary array - configuration -constexpr ArrayCfg canonPaCfg = {canonPaId, // Group for the elements +constexpr ArrayCfg canonPaCfg = {IfdId::canonPaId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -56,7 +56,7 @@ constexpr ArrayCfg canonPaCfg = {canonPaId, // Group for the elements {0, ttUnsignedShort, 1}}; //! Canon Custom Function binary array - configuration -constexpr ArrayCfg canonCfCfg = {canonCfId, // Group for the elements +constexpr ArrayCfg canonCfCfg = {IfdId::canonCfId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -66,7 +66,7 @@ constexpr ArrayCfg canonCfCfg = {canonCfId, // Group for the elements {0, ttUnsignedShort, 1}}; //! Canon Picture Info binary array - configuration -constexpr ArrayCfg canonPiCfg = {canonPiId, // Group for the elements +constexpr ArrayCfg canonPiCfg = {IfdId::canonPiId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -76,7 +76,7 @@ constexpr ArrayCfg canonPiCfg = {canonPiId, // Group for the elements {0, ttUnsignedShort, 1}}; //! Canon Time Info binary array - configuration -constexpr ArrayCfg canonTiCfg = {canonTiId, // Group for the elements +constexpr ArrayCfg canonTiCfg = {IfdId::canonTiId, // Group for the elements invalidByteOrder, // Use byte order from parent ttSignedLong, // Type for array entry and size element notEncrypted, // Not encrypted @@ -86,7 +86,7 @@ constexpr ArrayCfg canonTiCfg = {canonTiId, // Group for the elements {0, ttSignedLong, 1}}; //! Canon File Info binary array - configuration -constexpr ArrayCfg canonFiCfg = {canonFiId, // Group for the elements +constexpr ArrayCfg canonFiCfg = {IfdId::canonFiId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -98,7 +98,7 @@ constexpr ArrayCfg canonFiCfg = {canonFiId, // Group for the elements constexpr ArrayDef canonFiDef[] = {{2, ttUnsignedLong, 1}}; //! Canon Processing Info binary array - configuration -constexpr ArrayCfg canonPrCfg = {canonPrId, // Group for the elements +constexpr ArrayCfg canonPrCfg = {IfdId::canonPrId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUnsignedShort, // Type for array entry and size element notEncrypted, // Not encrypted @@ -108,37 +108,37 @@ constexpr ArrayCfg canonPrCfg = {canonPrId, // Group for the elements {0, ttSignedShort, 1}}; //! Canon canonAfMiAdj Info binary array - configuration -extern const ArrayCfg canonAfMiAdjCfg = {canonAfMiAdjId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonAfMiAdjCfg = {IfdId::canonAfMiAdjId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon Vignetting Correction 2 Info binary array - configuration -extern const ArrayCfg canonVigCor2Cfg = {canonVigCor2Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonVigCor2Cfg = {IfdId::canonVigCor2Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon Lighting Optimization Info binary array - configuration -extern const ArrayCfg canonLiOpCfg = {canonLiOpId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonLiOpCfg = {IfdId::canonLiOpId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon LensInfo binary array - configuration -extern const ArrayCfg canonLeCfg = {canonLeId, // Group for the elements +extern const ArrayCfg canonLeCfg = {IfdId::canonLeId, // Group for the elements invalidByteOrder, // Use byte order from parent ttSignedLong, // Type for array entry and size element notEncrypted, // Not encrypted @@ -148,7 +148,7 @@ extern const ArrayCfg canonLeCfg = {canonLeId, // Group for the elements {0, ttSignedLong, 1}}; //! Canon Ambience Selction Info binary array - configuration -extern const ArrayCfg canonAmCfg = {canonAmId, // Group for the elements +extern const ArrayCfg canonAmCfg = {IfdId::canonAmId, // Group for the elements invalidByteOrder, // Use byte order from parent ttSignedLong, // Type for array entry and size element notEncrypted, // Not encrypted @@ -158,7 +158,7 @@ extern const ArrayCfg canonAmCfg = {canonAmId, // Group for the elements {0, ttSignedLong, 1}}; //! Canon MultiExposure Selction Info binary array - configuration -extern const ArrayCfg canonMeCfg = {canonMeId, // Group for the elements +extern const ArrayCfg canonMeCfg = {IfdId::canonMeId, // Group for the elements invalidByteOrder, // Use byte order from parent ttSignedLong, // Type for array entry and size element notEncrypted, // Not encrypted @@ -168,47 +168,47 @@ extern const ArrayCfg canonMeCfg = {canonMeId, // Group for the elements {0, ttSignedLong, 1}}; //! Canon Filter Info binary array - configuration -extern const ArrayCfg canonFilCfg = {canonFilId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonFilCfg = {IfdId::canonFilId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon Hdr Info binary array - configuration -extern const ArrayCfg canonHdrCfg = {canonHdrId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonHdrCfg = {IfdId::canonHdrId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon AF Config Info binary array - configuration -extern const ArrayCfg canonAfCCfg = {canonAfCId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonAfCCfg = {IfdId::canonAfCId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttSignedLong, 1}}; //! Canon RawBurst Info binary array - configuration -extern const ArrayCfg canonRawBCfg = {canonRawBId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttSignedLong, // Type for array entry and size element - notEncrypted, // Not encrypted - true, // Has a size element - false, // No fillers - false, // Don't concatenate gaps +extern const ArrayCfg canonRawBCfg = {IfdId::canonRawBId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttSignedLong, // Type for array entry and size element + notEncrypted, // Not encrypted + true, // Has a size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedLong, 1}}; //! Nikon Vibration Reduction binary array - configuration -constexpr ArrayCfg nikonVrCfg = {nikonVrId, // Group for the elements +constexpr ArrayCfg nikonVrCfg = {IfdId::nikonVrId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -223,7 +223,7 @@ constexpr ArrayDef nikonVrDef[] = { }; //! Nikon Picture Control binary array - configuration -constexpr ArrayCfg nikonPcCfg = {nikonPcId, // Group for the elements +constexpr ArrayCfg nikonPcCfg = {IfdId::nikonPcId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -241,7 +241,7 @@ constexpr ArrayDef nikonPcDef[] = { }; //! Nikon World Time binary array - configuration -constexpr ArrayCfg nikonWtCfg = {nikonWtId, // Group for the elements +constexpr ArrayCfg nikonWtCfg = {IfdId::nikonWtId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -253,13 +253,13 @@ constexpr ArrayCfg nikonWtCfg = {nikonWtId, // Group for the elements constexpr ArrayDef nikonWtDef[] = {{0, ttSignedShort, 1}, {2, ttUnsignedByte, 1}, {3, ttUnsignedByte, 1}}; //! Nikon ISO info binary array - configuration -constexpr ArrayCfg nikonIiCfg = {nikonIiId, // Group for the elements - bigEndian, // Byte order - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonIiCfg = {IfdId::nikonIiId, // Group for the elements + bigEndian, // Byte order + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon ISO info binary array - definition constexpr ArrayDef nikonIiDef[] = { @@ -271,7 +271,7 @@ constexpr ArrayDef nikonIiDef[] = { }; //! Nikon Auto Focus binary array - configuration -constexpr ArrayCfg nikonAfCfg = {nikonAfId, // Group for the elements +constexpr ArrayCfg nikonAfCfg = {IfdId::nikonAfId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -285,13 +285,13 @@ constexpr ArrayDef nikonAfDef[] = { }; //! Nikon Auto Focus 21 binary array - configuration -constexpr ArrayCfg nikonAf21Cfg = {nikonAf21Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonAf21Cfg = {IfdId::nikonAf21Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Auto Focus 21 binary array - definition constexpr ArrayDef nikonAf21Def[] = { @@ -310,13 +310,13 @@ constexpr ArrayDef nikonAf21Def[] = { {28, ttUnsignedByte, 1}, // ContrastDetectAFInFocus }; //! Nikon Auto Focus 22 binary array - configuration -constexpr ArrayCfg nikonAf22Cfg = {nikonAf22Id, // Group for the elements - invalidByteOrder, // Byte order - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonAf22Cfg = {IfdId::nikonAf22Id, // Group for the elements + invalidByteOrder, // Byte order + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Auto Focus 22 binary array - definition constexpr ArrayDef nikonAf22Def[] = { @@ -343,13 +343,13 @@ constexpr ArraySet nikonAf2Set[] = { }; //! Nikon AF Fine Tune binary array - configuration -constexpr ArrayCfg nikonAFTCfg = {nikonAFTId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonAFTCfg = {IfdId::nikonAFTId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon AF Fine Tune binary array - definition constexpr ArrayDef nikonAFTDef[] = { @@ -359,7 +359,7 @@ constexpr ArrayDef nikonAFTDef[] = { }; //! Nikon File Info binary array - configuration -constexpr ArrayCfg nikonFiCfg = {nikonFiId, // Group for the elements +constexpr ArrayCfg nikonFiCfg = {IfdId::nikonFiId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -375,7 +375,7 @@ constexpr ArrayDef nikonFiDef[] = { }; //! Nikon Multi Exposure binary array - configuration -constexpr ArrayCfg nikonMeCfg = {nikonMeId, // Group for the elements +constexpr ArrayCfg nikonMeCfg = {IfdId::nikonMeId, // Group for the elements invalidByteOrder, // Use byte order from parent ttUndefined, // Type for array entry notEncrypted, // Not encrypted @@ -392,13 +392,13 @@ constexpr ArrayDef nikonMeDef[] = { }; //! Nikon Flash Info binary array - configuration 1 -constexpr ArrayCfg nikonFl1Cfg = {nikonFl1Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonFl1Cfg = {IfdId::nikonFl1Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Flash Info binary array - definition 1 constexpr ArrayDef nikonFl1Def[] = { @@ -414,13 +414,13 @@ constexpr ArrayDef nikonFl1Def[] = { {16, ttUnsignedByte, 1} // FlashGroupBControlMode }; //! Nikon Flash Info binary array - configuration 2 -constexpr ArrayCfg nikonFl2Cfg = {nikonFl2Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonFl2Cfg = {IfdId::nikonFl2Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Flash Info binary array - definition 2 constexpr ArrayDef nikonFl2Def[] = { @@ -434,13 +434,13 @@ constexpr ArrayDef nikonFl2Def[] = { {15, ttUnsignedByte, 1}, // FlashGNDistance }; //! Nikon Flash Info binary array - configuration 3 -constexpr ArrayCfg nikonFl3Cfg = {nikonFl3Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonFl3Cfg = {IfdId::nikonFl3Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Flash Info binary array - definition constexpr ArrayDef nikonFl3Def[] = { @@ -455,13 +455,13 @@ constexpr ArrayDef nikonFl3Def[] = { {16, ttUnsignedByte, 1}, // FlashColorFilter }; //! Nikon Flash Info 7 (0107 and 0108) binary array - configuration -constexpr ArrayCfg nikonFl7Cfg = {nikonFl7Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonFl7Cfg = {IfdId::nikonFl7Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Flash Info 7 (0107 and 0108) binary array - definition constexpr ArrayDef nikonFl7Def[] = { @@ -491,13 +491,13 @@ constexpr ArraySet nikonFlSet[] = { }; //! Nikon Shot Info binary array - configuration 1 (D80) -constexpr ArrayCfg nikonSi1Cfg = {nikonSi1Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonSi1Cfg = {IfdId::nikonSi1Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Shot Info binary array - definition 1 (D80) constexpr ArrayDef nikonSi1Def[] = { @@ -506,13 +506,13 @@ constexpr ArrayDef nikonSi1Def[] = { {1155, ttUnsignedByte, 1} // The array contains 1156 bytes }; //! Nikon Shot Info binary array - configuration 2 (D40) -constexpr ArrayCfg nikonSi2Cfg = {nikonSi2Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonSi2Cfg = {IfdId::nikonSi2Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Shot Info binary array - definition 2 (D40) constexpr ArrayDef nikonSi2Def[] = { @@ -522,13 +522,13 @@ constexpr ArrayDef nikonSi2Def[] = { {1112, ttUnsignedByte, 1} // The array contains 1113 bytes }; //! Nikon Shot Info binary array - configuration 3 (D300a) -constexpr ArrayCfg nikonSi3Cfg = {nikonSi3Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonSi3Cfg = {IfdId::nikonSi3Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Shot Info binary array - definition 3 (D300a) constexpr ArrayDef nikonSi3Def[] = { @@ -539,13 +539,13 @@ constexpr ArrayDef nikonSi3Def[] = { {814, ttUndefined, 4478} // The array contains 5291 bytes }; //! Nikon Shot Info binary array - configuration 4 (D300b) -constexpr ArrayCfg nikonSi4Cfg = {nikonSi4Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonSi4Cfg = {IfdId::nikonSi4Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Shot Info binary array - definition 4 (D300b) constexpr ArrayDef nikonSi4Def[] = { @@ -555,13 +555,13 @@ constexpr ArrayDef nikonSi4Def[] = { {826, ttUndefined, 4478} // The array contains 5303 bytes }; //! Nikon Shot Info binary array - configuration 5 (ver 02.xx) -constexpr ArrayCfg nikonSi5Cfg = {nikonSi5Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - false, // Write all tags (don't know how many) - true, // Concatenate gaps +constexpr ArrayCfg nikonSi5Cfg = {IfdId::nikonSi5Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + false, // Write all tags (don't know how many) + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Shot Info binary array - definition 5 (ver 01.xx and ver 02.xx) constexpr ArrayDef nikonSi5Def[] = { @@ -576,13 +576,13 @@ constexpr ArrayDef nikonSi5Def[] = { {630, ttUnsignedLong, 1} // ShutterCount }; //! Nikon Shot Info binary array - configuration 6 (ver 01.xx) -constexpr ArrayCfg nikonSi6Cfg = {nikonSi6Id, // Group for the elements - bigEndian, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Encryption function - false, // No size element - false, // Write all tags (don't know how many) - true, // Concatenate gaps +constexpr ArrayCfg nikonSi6Cfg = {IfdId::nikonSi6Id, // Group for the elements + bigEndian, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Encryption function + false, // No size element + false, // Write all tags (don't know how many) + true, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Lens Data configurations and definitions constexpr ArraySet nikonSiSet[] = { @@ -595,40 +595,40 @@ constexpr ArraySet nikonSiSet[] = { }; //! Nikon Lens Data binary array - configuration 1 -constexpr ArrayCfg nikonLd1Cfg = {nikonLd1Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Encryption function - false, // No size element - true, // Write all tags - false, // Concatenate gaps +constexpr ArrayCfg nikonLd1Cfg = {IfdId::nikonLd1Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Encryption function + false, // No size element + true, // Write all tags + false, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Lens Data binary array - configuration 2 -constexpr ArrayCfg nikonLd2Cfg = {nikonLd2Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - false, // Concatenate gaps +constexpr ArrayCfg nikonLd2Cfg = {IfdId::nikonLd2Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + false, // Concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Lens Data binary array - configuration 3 -constexpr ArrayCfg nikonLd3Cfg = {nikonLd3Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - false, // Don't concatenate gaps +constexpr ArrayCfg nikonLd3Cfg = {IfdId::nikonLd3Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Lens Data binary array - configuration 3 -constexpr ArrayCfg nikonLd4Cfg = {nikonLd4Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - true, // Write all tags - false, // Don't concatenate gaps +constexpr ArrayCfg nikonLd4Cfg = {IfdId::nikonLd4Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + true, // Write all tags + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; //! Nikon Lens Data binary array - definition constexpr ArrayDef nikonLdDef[] = { @@ -651,58 +651,58 @@ constexpr ArraySet nikonLdSet[] = { }; //! Nikon Color Balance binary array - configuration 1 -constexpr ArrayCfg nikonCb1Cfg = {nikonCb1Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb1Cfg = {IfdId::nikonCb1Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - configuration 2 -constexpr ArrayCfg nikonCb2Cfg = {nikonCb2Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb2Cfg = {IfdId::nikonCb2Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - configuration 2a -constexpr ArrayCfg nikonCb2aCfg = {nikonCb2aId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb2aCfg = {IfdId::nikonCb2aId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - configuration 2b -constexpr ArrayCfg nikonCb2bCfg = {nikonCb2bId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb2bCfg = {IfdId::nikonCb2bId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - configuration 3 -constexpr ArrayCfg nikonCb3Cfg = {nikonCb3Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - notEncrypted, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb3Cfg = {IfdId::nikonCb3Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + notEncrypted, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - configuration 4 -constexpr ArrayCfg nikonCb4Cfg = {nikonCb4Id, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUndefined, // Type for array entry - nikonCrypt, // Encryption function - false, // No size element - false, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg nikonCb4Cfg = {IfdId::nikonCb4Id, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUndefined, // Type for array entry + nikonCrypt, // Encryption function + false, // No size element + false, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Nikon Color Balance binary array - definition 1 (D100) constexpr ArrayDef nikonCb1Def[] = { @@ -746,33 +746,33 @@ constexpr ArraySet nikonCbSet[] = { }; //! Minolta Camera Settings (old) binary array - configuration -constexpr ArrayCfg minoCsoCfg = {minoltaCsOldId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg minoCsoCfg = {IfdId::minoltaCsOldId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedLong, 1}}; //! Minolta Camera Settings (new) binary array - configuration -constexpr ArrayCfg minoCsnCfg = {minoltaCsNewId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg minoCsnCfg = {IfdId::minoltaCsNewId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedLong, 1}}; //! Minolta 7D Camera Settings binary array - configuration -constexpr ArrayCfg minoCs7Cfg = {minoltaCs7DId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg minoCs7Cfg = {IfdId::minoltaCs7DId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Minolta 7D Camera Settings binary array - definition constexpr ArrayDef minoCs7Def[] = { @@ -781,13 +781,13 @@ constexpr ArrayDef minoCs7Def[] = { }; //! Minolta 5D Camera Settings binary array - configuration -constexpr ArrayCfg minoCs5Cfg = {minoltaCs5DId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg minoCs5Cfg = {IfdId::minoltaCs5DId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Minolta 5D Camera Settings binary array - definition constexpr ArrayDef minoCs5Def[] = { @@ -800,31 +800,31 @@ constexpr ArrayDef minoCs5Def[] = { // setting in all four configurations. //! Sony1 Camera Settings binary array - configuration -constexpr ArrayCfg sony1CsCfg = {sony1CsId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1CsCfg = {IfdId::sony1CsId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Sony1 Camera Settings 2 binary array - configuration -constexpr ArrayCfg sony1Cs2Cfg = {sony1Cs2Id, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1Cs2Cfg = {IfdId::sony1Cs2Id, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; -constexpr ArrayCfg sony2FpCfg = {sony2FpId, // Group for the elements - bigEndian, // Big endian - ttUnsignedByte, // Type for array entry and size element - sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony2FpCfg = {IfdId::sony2FpId, // Group for the elements + bigEndian, // Big endian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sony2FpDef[] = { {0x4, ttSignedByte, 1}, // Exif.Sony2Fp.AmbientTemperature @@ -838,26 +838,26 @@ constexpr ArraySet sony2FpSet[] = { {sony2FpCfg, sony2FpDef, std::size(sony2FpDef)}, }; -constexpr ArrayCfg sonyMisc1Cfg = {sonyMisc1Id, // Group for the elements - bigEndian, // Big endian - ttUnsignedByte, // Type for array entry and size element - sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sonyMisc1Cfg = {IfdId::sonyMisc1Id, // Group for the elements + bigEndian, // Big endian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sonyMisc1Def[] = { {0x05, ttSignedByte, 1}, // Exif.SonyMisc1.CameraTemperature }; -constexpr ArrayCfg sonyMisc2bCfg = {sonyMisc2bId, // Group for the elements - littleEndian, // Little endian - ttUnsignedByte, // Type for array entry and size element - sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sonyMisc2bCfg = {IfdId::sonyMisc2bId, // Group for the elements + littleEndian, // Little endian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sonyMisc2bDef[] = { @@ -872,13 +872,13 @@ constexpr ArraySet sonyMisc2bSet[] = { {sonyMisc2bCfg, sonyMisc2bDef, std::size(sonyMisc2bDef)}, }; -constexpr ArrayCfg sonyMisc3cCfg = {sonyMisc3cId, // Group for the elements - littleEndian, // Little endian - ttUnsignedByte, // Type for array entry and size element - sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sonyMisc3cCfg = {IfdId::sonyMisc3cId, // Group for the elements + littleEndian, // Little endian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sonyMisc3cDef[] = { @@ -899,13 +899,13 @@ constexpr ArraySet sonyMisc3cSet[] = { {sonyMisc3cCfg, sonyMisc3cDef, std::size(sonyMisc3cDef)}, }; -constexpr ArrayCfg sonySInfo1Cfg = {sonySInfo1Id, // Group for the elements - littleEndian, // Little endian - ttUnsignedByte, // Type for array entry and size element - notEncrypted, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sonySInfo1Cfg = {IfdId::sonySInfo1Id, // Group for the elements + littleEndian, // Little endian + ttUnsignedByte, // Type for array entry and size element + notEncrypted, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sonySInfo1Def[] = { {6, ttAsciiString, 20}, // Exif.SonySInfo1.SonyDateTime @@ -916,13 +916,13 @@ constexpr ArrayDef sonySInfo1Def[] = { // }; -constexpr ArrayCfg sony2010eCfg = {sony2010eId, // Group for the elements - invalidByteOrder, // inherit from file. Usually littleEndian - ttUnsignedByte, // Type for array entry and size element - sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony2010eCfg = {IfdId::sony2010eId, // Group for the elements + invalidByteOrder, // inherit from file. Usually littleEndian + ttUnsignedByte, // Type for array entry and size element + sonyTagDecipher, // (uint16_t, const byte*, uint32_t, TiffComponent* const); + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedByte, 1}}; constexpr ArrayDef sony2010eDef[] = { {0, ttUnsignedLong, 1}, // Exif.Sony2010. SequenceImageNumber @@ -973,22 +973,22 @@ constexpr ArrayDef sonyCsDef[] = { {12, ttSignedShort, 1} // Exif.Sony[12]Cs.WhiteBalanceFineTune }; //! Sony2 Camera Settings binary array - configuration -constexpr ArrayCfg sony2CsCfg = {sony2CsId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony2CsCfg = {IfdId::sony2CsId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Sony2 Camera Settings 2 binary array - configuration -constexpr ArrayCfg sony2Cs2Cfg = {sony2Cs2Id, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony2Cs2Cfg = {IfdId::sony2Cs2Id, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Sony[12] Camera Settings 2 binary array - definition constexpr ArrayDef sonyCs2Def[] = { @@ -1006,43 +1006,43 @@ constexpr ArraySet sony2CsSet[] = { }; //! Sony Minolta Camera Settings (old) binary array - configuration -constexpr ArrayCfg sony1MCsoCfg = {sony1MltCsOldId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1MCsoCfg = {IfdId::sony1MltCsOldId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedLong, 1}}; //! Sony Minolta Camera Settings (new) binary array - configuration -constexpr ArrayCfg sony1MCsnCfg = {sony1MltCsNewId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1MCsnCfg = {IfdId::sony1MltCsNewId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedLong, 1}}; //! Sony Minolta 7D Camera Settings binary array - configuration -constexpr ArrayCfg sony1MCs7Cfg = {sony1MltCs7DId, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1MCs7Cfg = {IfdId::sony1MltCs7DId, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Sony Minolta A100 Camera Settings binary array - configuration -constexpr ArrayCfg sony1MCsA100Cfg = {sony1MltCsA100Id, // Group for the elements - bigEndian, // Big endian - ttUndefined, // Type for array entry and size element - notEncrypted, // Not encrypted - false, // No size element - false, // No fillers - false, // Don't concatenate gaps +constexpr ArrayCfg sony1MCsA100Cfg = {IfdId::sony1MltCsA100Id, // Group for the elements + bigEndian, // Big endian + ttUndefined, // Type for array entry and size element + notEncrypted, // Not encrypted + false, // No size element + false, // No fillers + false, // Don't concatenate gaps {0, ttUnsignedShort, 1}}; //! Sony Minolta A100 Camera Settings binary array - definition constexpr ArrayDef sony1MCsA100Def[] = { @@ -1052,13 +1052,13 @@ constexpr ArrayDef sony1MCsA100Def[] = { }; //! Samsung PictureWizard binary array - configuration -constexpr ArrayCfg samsungPwCfg = {samsungPwId, // Group for the elements - invalidByteOrder, // Use byte order from parent - ttUnsignedShort, // Type for array entry - notEncrypted, // Not encrypted - false, // No size element - true, // Write all tags - true, // Concatenate gaps +constexpr ArrayCfg samsungPwCfg = {IfdId::samsungPwId, // Group for the elements + invalidByteOrder, // Use byte order from parent + ttUnsignedShort, // Type for array entry + notEncrypted, // Not encrypted + false, // No size element + true, // Write all tags + true, // Concatenate gaps {0, ttUnsignedShort, 1}}; //! Samsung PictureWizard binary array - definition constexpr ArrayDef samsungPwDef[] = { @@ -1081,139 +1081,139 @@ constexpr ArrayDef samsungPwDef[] = { const TiffTreeStruct TiffCreator::tiffTreeStruct_[] = { // root group parent group parent tag //--------- ----------------- ----------------- ---------- - {Tag::root, ifdIdNotSet, ifdIdNotSet, Tag::root}, - {Tag::root, ifd0Id, ifdIdNotSet, Tag::root}, - {Tag::root, subImage1Id, ifd0Id, 0x014a}, - {Tag::root, subImage2Id, ifd0Id, 0x014a}, - {Tag::root, subImage3Id, ifd0Id, 0x014a}, - {Tag::root, subImage4Id, ifd0Id, 0x014a}, - {Tag::root, subImage5Id, ifd0Id, 0x014a}, - {Tag::root, subImage6Id, ifd0Id, 0x014a}, - {Tag::root, subImage7Id, ifd0Id, 0x014a}, - {Tag::root, subImage8Id, ifd0Id, 0x014a}, - {Tag::root, subImage9Id, ifd0Id, 0x014a}, - {Tag::root, exifId, ifd0Id, 0x8769}, - {Tag::root, gpsId, ifd0Id, 0x8825}, - {Tag::root, iopId, exifId, 0xa005}, - {Tag::root, ifd1Id, ifd0Id, Tag::next}, - {Tag::root, ifd2Id, ifd1Id, Tag::next}, - {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}, - {Tag::root, olympusRd2Id, olympus2Id, 0x2031}, - {Tag::root, olympusIpId, olympus2Id, 0x2040}, - {Tag::root, olympusFiId, olympus2Id, 0x2050}, - {Tag::root, olympusFe1Id, olympus2Id, 0x2100}, - {Tag::root, olympusFe2Id, olympus2Id, 0x2200}, - {Tag::root, olympusFe3Id, olympus2Id, 0x2300}, - {Tag::root, olympusFe4Id, olympus2Id, 0x2400}, - {Tag::root, olympusFe5Id, olympus2Id, 0x2500}, - {Tag::root, olympusFe6Id, olympus2Id, 0x2600}, - {Tag::root, olympusFe7Id, olympus2Id, 0x2700}, - {Tag::root, olympusFe8Id, olympus2Id, 0x2800}, - {Tag::root, olympusFe9Id, olympus2Id, 0x2900}, - {Tag::root, olympusRiId, olympus2Id, 0x3000}, - {Tag::root, fujiId, exifId, 0x927c}, - {Tag::root, canonId, exifId, 0x927c}, - {Tag::root, canonCsId, canonId, 0x0001}, - {Tag::root, canonSiId, canonId, 0x0004}, - {Tag::root, canonPaId, canonId, 0x0005}, - {Tag::root, canonCfId, canonId, 0x000f}, - {Tag::root, canonPiId, canonId, 0x0012}, - {Tag::root, canonTiId, canonId, 0x0035}, - {Tag::root, canonFiId, canonId, 0x0093}, - {Tag::root, canonPrId, canonId, 0x00a0}, - {Tag::root, canonAfMiAdjId, canonId, 0x4013}, - {Tag::root, canonVigCor2Id, canonId, 0x4016}, - {Tag::root, canonLiOpId, canonId, 0x4018}, - {Tag::root, canonLeId, canonId, 0x4019}, - {Tag::root, canonAmId, canonId, 0x4020}, - {Tag::root, canonMeId, canonId, 0x4021}, - {Tag::root, canonFilId, canonId, 0x4024}, - {Tag::root, canonHdrId, canonId, 0x4025}, - {Tag::root, canonAfCId, canonId, 0x4028}, - {Tag::root, canonRawBId, canonId, 0x403f}, - {Tag::root, nikon1Id, exifId, 0x927c}, - {Tag::root, nikon2Id, exifId, 0x927c}, - {Tag::root, nikon3Id, exifId, 0x927c}, - {Tag::root, nikonPvId, nikon3Id, 0x0011}, - {Tag::root, nikonVrId, nikon3Id, 0x001f}, - {Tag::root, nikonPcId, nikon3Id, 0x0023}, - {Tag::root, nikonWtId, nikon3Id, 0x0024}, - {Tag::root, nikonIiId, nikon3Id, 0x0025}, - {Tag::root, nikonAfId, nikon3Id, 0x0088}, - {Tag::root, nikonSi1Id, nikon3Id, 0x0091}, - {Tag::root, nikonSi2Id, nikon3Id, 0x0091}, - {Tag::root, nikonSi3Id, nikon3Id, 0x0091}, - {Tag::root, nikonSi4Id, nikon3Id, 0x0091}, - {Tag::root, nikonSi5Id, nikon3Id, 0x0091}, - {Tag::root, nikonSi6Id, nikon3Id, 0x0091}, - {Tag::root, nikonCb1Id, nikon3Id, 0x0097}, - {Tag::root, nikonCb2Id, nikon3Id, 0x0097}, - {Tag::root, nikonCb2aId, nikon3Id, 0x0097}, - {Tag::root, nikonCb2bId, nikon3Id, 0x0097}, - {Tag::root, nikonCb3Id, nikon3Id, 0x0097}, - {Tag::root, nikonCb4Id, nikon3Id, 0x0097}, - {Tag::root, nikonLd1Id, nikon3Id, 0x0098}, - {Tag::root, nikonLd2Id, nikon3Id, 0x0098}, - {Tag::root, nikonLd3Id, nikon3Id, 0x0098}, - {Tag::root, nikonLd4Id, nikon3Id, 0x0098}, - {Tag::root, nikonMeId, nikon3Id, 0x00b0}, - {Tag::root, nikonAf21Id, nikon3Id, 0x00b7}, - {Tag::root, nikonAf22Id, nikon3Id, 0x00b7}, - {Tag::root, nikonFiId, nikon3Id, 0x00b8}, - {Tag::root, nikonAFTId, nikon3Id, 0x00b9}, - {Tag::root, nikonFl1Id, nikon3Id, 0x00a8}, - {Tag::root, nikonFl2Id, nikon3Id, 0x00a8}, - {Tag::root, nikonFl3Id, nikon3Id, 0x00a8}, - {Tag::root, nikonFl7Id, nikon3Id, 0x00a8}, - {Tag::root, panasonicId, exifId, 0x927c}, - {Tag::root, pentaxId, exifId, 0x927c}, - {Tag::root, pentaxDngId, ifd0Id, 0xc634}, - {Tag::root, samsung2Id, exifId, 0x927c}, - {Tag::root, samsungPwId, samsung2Id, 0x0021}, - {Tag::root, samsungPvId, samsung2Id, 0x0035}, - {Tag::root, sigmaId, exifId, 0x927c}, - {Tag::root, sony1Id, exifId, 0x927c}, - {Tag::root, sony2010eId, sony1Id, 0x2010}, - {Tag::root, sony2FpId, sony1Id, 0x9402}, - {Tag::root, sonyMisc1Id, sony1Id, 0x9403}, - {Tag::root, sonyMisc2bId, sony1Id, 0x9404}, - {Tag::root, sonyMisc3cId, sony1Id, 0x9400}, - {Tag::root, sonySInfo1Id, sony1Id, 0x3000}, - {Tag::root, sony1CsId, sony1Id, 0x0114}, - {Tag::root, sony1Cs2Id, sony1Id, 0x0114}, - {Tag::root, sonyMltId, sony1Id, 0xb028}, - {Tag::root, sony1MltCsOldId, sonyMltId, 0x0001}, - {Tag::root, sony1MltCsNewId, sonyMltId, 0x0003}, - {Tag::root, sony1MltCs7DId, sonyMltId, 0x0004}, - {Tag::root, sony1MltCsA100Id, sonyMltId, 0x0114}, - {Tag::root, sony2Id, exifId, 0x927c}, - {Tag::root, sony2010eId, sony2Id, 0x2010}, - {Tag::root, sony2FpId, sony2Id, 0x9402}, - {Tag::root, sonyMisc1Id, sony2Id, 0x9403}, - {Tag::root, sonyMisc2bId, sony2Id, 0x9404}, - {Tag::root, sonyMisc3cId, sony2Id, 0x9400}, - {Tag::root, sonySInfo1Id, sony2Id, 0x3000}, - {Tag::root, sony2CsId, sony2Id, 0x0114}, - {Tag::root, sony2Cs2Id, sony2Id, 0x0114}, - {Tag::root, minoltaId, exifId, 0x927c}, - {Tag::root, minoltaCsOldId, minoltaId, 0x0001}, - {Tag::root, minoltaCsNewId, minoltaId, 0x0003}, - {Tag::root, minoltaCs7DId, minoltaId, 0x0004}, - {Tag::root, minoltaCs5DId, minoltaId, 0x0114}, - {Tag::root, casioId, exifId, 0x927c}, - {Tag::root, casio2Id, exifId, 0x927c}, + {Tag::root, IfdId::ifdIdNotSet, IfdId::ifdIdNotSet, Tag::root}, + {Tag::root, IfdId::ifd0Id, IfdId::ifdIdNotSet, Tag::root}, + {Tag::root, IfdId::subImage1Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage2Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage3Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage4Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage5Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage6Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage7Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage8Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::subImage9Id, IfdId::ifd0Id, 0x014a}, + {Tag::root, IfdId::exifId, IfdId::ifd0Id, 0x8769}, + {Tag::root, IfdId::gpsId, IfdId::ifd0Id, 0x8825}, + {Tag::root, IfdId::iopId, IfdId::exifId, 0xa005}, + {Tag::root, IfdId::ifd1Id, IfdId::ifd0Id, Tag::next}, + {Tag::root, IfdId::ifd2Id, IfdId::ifd1Id, Tag::next}, + {Tag::root, IfdId::ifd3Id, IfdId::ifd2Id, Tag::next}, + {Tag::root, IfdId::olympusId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::olympus2Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::subThumb1Id, IfdId::ifd1Id, 0x014a}, + {Tag::root, IfdId::olympusEqId, IfdId::olympus2Id, 0x2010}, + {Tag::root, IfdId::olympusCsId, IfdId::olympus2Id, 0x2020}, + {Tag::root, IfdId::olympusRdId, IfdId::olympus2Id, 0x2030}, + {Tag::root, IfdId::olympusRd2Id, IfdId::olympus2Id, 0x2031}, + {Tag::root, IfdId::olympusIpId, IfdId::olympus2Id, 0x2040}, + {Tag::root, IfdId::olympusFiId, IfdId::olympus2Id, 0x2050}, + {Tag::root, IfdId::olympusFe1Id, IfdId::olympus2Id, 0x2100}, + {Tag::root, IfdId::olympusFe2Id, IfdId::olympus2Id, 0x2200}, + {Tag::root, IfdId::olympusFe3Id, IfdId::olympus2Id, 0x2300}, + {Tag::root, IfdId::olympusFe4Id, IfdId::olympus2Id, 0x2400}, + {Tag::root, IfdId::olympusFe5Id, IfdId::olympus2Id, 0x2500}, + {Tag::root, IfdId::olympusFe6Id, IfdId::olympus2Id, 0x2600}, + {Tag::root, IfdId::olympusFe7Id, IfdId::olympus2Id, 0x2700}, + {Tag::root, IfdId::olympusFe8Id, IfdId::olympus2Id, 0x2800}, + {Tag::root, IfdId::olympusFe9Id, IfdId::olympus2Id, 0x2900}, + {Tag::root, IfdId::olympusRiId, IfdId::olympus2Id, 0x3000}, + {Tag::root, IfdId::fujiId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::canonId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::canonCsId, IfdId::canonId, 0x0001}, + {Tag::root, IfdId::canonSiId, IfdId::canonId, 0x0004}, + {Tag::root, IfdId::canonPaId, IfdId::canonId, 0x0005}, + {Tag::root, IfdId::canonCfId, IfdId::canonId, 0x000f}, + {Tag::root, IfdId::canonPiId, IfdId::canonId, 0x0012}, + {Tag::root, IfdId::canonTiId, IfdId::canonId, 0x0035}, + {Tag::root, IfdId::canonFiId, IfdId::canonId, 0x0093}, + {Tag::root, IfdId::canonPrId, IfdId::canonId, 0x00a0}, + {Tag::root, IfdId::canonAfMiAdjId, IfdId::canonId, 0x4013}, + {Tag::root, IfdId::canonVigCor2Id, IfdId::canonId, 0x4016}, + {Tag::root, IfdId::canonLiOpId, IfdId::canonId, 0x4018}, + {Tag::root, IfdId::canonLeId, IfdId::canonId, 0x4019}, + {Tag::root, IfdId::canonAmId, IfdId::canonId, 0x4020}, + {Tag::root, IfdId::canonMeId, IfdId::canonId, 0x4021}, + {Tag::root, IfdId::canonFilId, IfdId::canonId, 0x4024}, + {Tag::root, IfdId::canonHdrId, IfdId::canonId, 0x4025}, + {Tag::root, IfdId::canonAfCId, IfdId::canonId, 0x4028}, + {Tag::root, IfdId::canonRawBId, IfdId::canonId, 0x403f}, + {Tag::root, IfdId::nikon1Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::nikon2Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::nikon3Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::nikonPvId, IfdId::nikon3Id, 0x0011}, + {Tag::root, IfdId::nikonVrId, IfdId::nikon3Id, 0x001f}, + {Tag::root, IfdId::nikonPcId, IfdId::nikon3Id, 0x0023}, + {Tag::root, IfdId::nikonWtId, IfdId::nikon3Id, 0x0024}, + {Tag::root, IfdId::nikonIiId, IfdId::nikon3Id, 0x0025}, + {Tag::root, IfdId::nikonAfId, IfdId::nikon3Id, 0x0088}, + {Tag::root, IfdId::nikonSi1Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonSi2Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonSi3Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonSi4Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonSi5Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonSi6Id, IfdId::nikon3Id, 0x0091}, + {Tag::root, IfdId::nikonCb1Id, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonCb2Id, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonCb2aId, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonCb2bId, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonCb3Id, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonCb4Id, IfdId::nikon3Id, 0x0097}, + {Tag::root, IfdId::nikonLd1Id, IfdId::nikon3Id, 0x0098}, + {Tag::root, IfdId::nikonLd2Id, IfdId::nikon3Id, 0x0098}, + {Tag::root, IfdId::nikonLd3Id, IfdId::nikon3Id, 0x0098}, + {Tag::root, IfdId::nikonLd4Id, IfdId::nikon3Id, 0x0098}, + {Tag::root, IfdId::nikonMeId, IfdId::nikon3Id, 0x00b0}, + {Tag::root, IfdId::nikonAf21Id, IfdId::nikon3Id, 0x00b7}, + {Tag::root, IfdId::nikonAf22Id, IfdId::nikon3Id, 0x00b7}, + {Tag::root, IfdId::nikonFiId, IfdId::nikon3Id, 0x00b8}, + {Tag::root, IfdId::nikonAFTId, IfdId::nikon3Id, 0x00b9}, + {Tag::root, IfdId::nikonFl1Id, IfdId::nikon3Id, 0x00a8}, + {Tag::root, IfdId::nikonFl2Id, IfdId::nikon3Id, 0x00a8}, + {Tag::root, IfdId::nikonFl3Id, IfdId::nikon3Id, 0x00a8}, + {Tag::root, IfdId::nikonFl7Id, IfdId::nikon3Id, 0x00a8}, + {Tag::root, IfdId::panasonicId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::pentaxId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::pentaxDngId, IfdId::ifd0Id, 0xc634}, + {Tag::root, IfdId::samsung2Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::samsungPwId, IfdId::samsung2Id, 0x0021}, + {Tag::root, IfdId::samsungPvId, IfdId::samsung2Id, 0x0035}, + {Tag::root, IfdId::sigmaId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::sony1Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::sony2010eId, IfdId::sony1Id, 0x2010}, + {Tag::root, IfdId::sony2FpId, IfdId::sony1Id, 0x9402}, + {Tag::root, IfdId::sonyMisc1Id, IfdId::sony1Id, 0x9403}, + {Tag::root, IfdId::sonyMisc2bId, IfdId::sony1Id, 0x9404}, + {Tag::root, IfdId::sonyMisc3cId, IfdId::sony1Id, 0x9400}, + {Tag::root, IfdId::sonySInfo1Id, IfdId::sony1Id, 0x3000}, + {Tag::root, IfdId::sony1CsId, IfdId::sony1Id, 0x0114}, + {Tag::root, IfdId::sony1Cs2Id, IfdId::sony1Id, 0x0114}, + {Tag::root, IfdId::sonyMltId, IfdId::sony1Id, 0xb028}, + {Tag::root, IfdId::sony1MltCsOldId, IfdId::sonyMltId, 0x0001}, + {Tag::root, IfdId::sony1MltCsNewId, IfdId::sonyMltId, 0x0003}, + {Tag::root, IfdId::sony1MltCs7DId, IfdId::sonyMltId, 0x0004}, + {Tag::root, IfdId::sony1MltCsA100Id, IfdId::sonyMltId, 0x0114}, + {Tag::root, IfdId::sony2Id, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::sony2010eId, IfdId::sony2Id, 0x2010}, + {Tag::root, IfdId::sony2FpId, IfdId::sony2Id, 0x9402}, + {Tag::root, IfdId::sonyMisc1Id, IfdId::sony2Id, 0x9403}, + {Tag::root, IfdId::sonyMisc2bId, IfdId::sony2Id, 0x9404}, + {Tag::root, IfdId::sonyMisc3cId, IfdId::sony2Id, 0x9400}, + {Tag::root, IfdId::sonySInfo1Id, IfdId::sony2Id, 0x3000}, + {Tag::root, IfdId::sony2CsId, IfdId::sony2Id, 0x0114}, + {Tag::root, IfdId::sony2Cs2Id, IfdId::sony2Id, 0x0114}, + {Tag::root, IfdId::minoltaId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::minoltaCsOldId, IfdId::minoltaId, 0x0001}, + {Tag::root, IfdId::minoltaCsNewId, IfdId::minoltaId, 0x0003}, + {Tag::root, IfdId::minoltaCs7DId, IfdId::minoltaId, 0x0004}, + {Tag::root, IfdId::minoltaCs5DId, IfdId::minoltaId, 0x0114}, + {Tag::root, IfdId::casioId, IfdId::exifId, 0x927c}, + {Tag::root, IfdId::casio2Id, IfdId::exifId, 0x927c}, // --------------------------------------------------------- // Panasonic RW2 raw images - {Tag::pana, ifdIdNotSet, ifdIdNotSet, Tag::pana}, - {Tag::pana, panaRawId, ifdIdNotSet, Tag::pana}, - {Tag::pana, exifId, panaRawId, 0x8769}, - {Tag::pana, gpsId, panaRawId, 0x8825}}; + {Tag::pana, IfdId::ifdIdNotSet, IfdId::ifdIdNotSet, Tag::pana}, + {Tag::pana, IfdId::panaRawId, IfdId::ifdIdNotSet, Tag::pana}, + {Tag::pana, IfdId::exifId, IfdId::panaRawId, 0x8769}, + {Tag::pana, IfdId::gpsId, IfdId::panaRawId, 0x8825}}; /* This table describes the layout of each known TIFF group (including @@ -1231,555 +1231,555 @@ const TiffGroupStruct TiffCreator::tiffGroupStruct_[] = { // ext. tag group create function //--------- ----------------- ----------------------------------------- // Root directory - {Tag::root, ifdIdNotSet, newTiffDirectory}, + {Tag::root, IfdId::ifdIdNotSet, newTiffDirectory}, // Fujifilm RAF #1402. Use different root when parsing embedded tiff. - {Tag::fuji, ifdIdNotSet, newTiffDirectory}, - {0xf000, fujiId, newTiffSubIfd}, + {Tag::fuji, IfdId::ifdIdNotSet, newTiffDirectory}, + {0xf000, IfdId::fujiId, newTiffSubIfd}, // CR3 images #1475 - {Tag::cmt2, ifdIdNotSet, newTiffDirectory}, - {Tag::cmt3, ifdIdNotSet, newTiffDirectory}, - {Tag::cmt4, ifdIdNotSet, newTiffDirectory}, + {Tag::cmt2, IfdId::ifdIdNotSet, newTiffDirectory}, + {Tag::cmt3, IfdId::ifdIdNotSet, newTiffDirectory}, + {Tag::cmt4, IfdId::ifdIdNotSet, newTiffDirectory}, // IFD0 - {0x8769, ifd0Id, newTiffSubIfd}, - {0x8825, ifd0Id, newTiffSubIfd}, - {0x0111, ifd0Id, newTiffImageData<0x0117, ifd0Id>}, - {0x0117, ifd0Id, newTiffImageSize<0x0111, ifd0Id>}, - {0x0144, ifd0Id, newTiffImageData<0x0145, ifd0Id>}, - {0x0145, ifd0Id, newTiffImageSize<0x0144, ifd0Id>}, - {0x0201, ifd0Id, newTiffImageData<0x0202, ifd0Id>}, - {0x0202, ifd0Id, newTiffImageSize<0x0201, ifd0Id>}, - {0x014a, ifd0Id, newTiffSubIfd}, - {0xc634, ifd0Id, newTiffMnEntry}, - {Tag::next, ifd0Id, newTiffDirectory}, - {Tag::all, ifd0Id, newTiffEntry}, + {0x8769, IfdId::ifd0Id, newTiffSubIfd}, + {0x8825, IfdId::ifd0Id, newTiffSubIfd}, + {0x0111, IfdId::ifd0Id, newTiffImageData<0x0117, IfdId::ifd0Id>}, + {0x0117, IfdId::ifd0Id, newTiffImageSize<0x0111, IfdId::ifd0Id>}, + {0x0144, IfdId::ifd0Id, newTiffImageData<0x0145, IfdId::ifd0Id>}, + {0x0145, IfdId::ifd0Id, newTiffImageSize<0x0144, IfdId::ifd0Id>}, + {0x0201, IfdId::ifd0Id, newTiffImageData<0x0202, IfdId::ifd0Id>}, + {0x0202, IfdId::ifd0Id, newTiffImageSize<0x0201, IfdId::ifd0Id>}, + {0x014a, IfdId::ifd0Id, newTiffSubIfd}, + {0xc634, IfdId::ifd0Id, newTiffMnEntry}, + {Tag::next, IfdId::ifd0Id, newTiffDirectory}, + {Tag::all, IfdId::ifd0Id, newTiffEntry}, // Subdir subImage1 - {0x0111, subImage1Id, newTiffImageData<0x0117, subImage1Id>}, - {0x0117, subImage1Id, newTiffImageSize<0x0111, subImage1Id>}, - {0x0144, subImage1Id, newTiffImageData<0x0145, subImage1Id>}, - {0x0145, subImage1Id, newTiffImageSize<0x0144, subImage1Id>}, - {0x0201, subImage1Id, newTiffImageData<0x0202, subImage1Id>}, - {0x0202, subImage1Id, newTiffImageSize<0x0201, subImage1Id>}, - {Tag::next, subImage1Id, ignoreTiffComponent}, - {Tag::all, subImage1Id, newTiffEntry}, + {0x0111, IfdId::subImage1Id, newTiffImageData<0x0117, IfdId::subImage1Id>}, + {0x0117, IfdId::subImage1Id, newTiffImageSize<0x0111, IfdId::subImage1Id>}, + {0x0144, IfdId::subImage1Id, newTiffImageData<0x0145, IfdId::subImage1Id>}, + {0x0145, IfdId::subImage1Id, newTiffImageSize<0x0144, IfdId::subImage1Id>}, + {0x0201, IfdId::subImage1Id, newTiffImageData<0x0202, IfdId::subImage1Id>}, + {0x0202, IfdId::subImage1Id, newTiffImageSize<0x0201, IfdId::subImage1Id>}, + {Tag::next, IfdId::subImage1Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage1Id, newTiffEntry}, // Subdir subImage2 - {0x0111, subImage2Id, newTiffImageData<0x0117, subImage2Id>}, - {0x0117, subImage2Id, newTiffImageSize<0x0111, subImage2Id>}, - {0x0144, subImage2Id, newTiffImageData<0x0145, subImage2Id>}, - {0x0145, subImage2Id, newTiffImageSize<0x0144, subImage2Id>}, - {0x0201, subImage2Id, newTiffImageData<0x0202, subImage2Id>}, - {0x0202, subImage2Id, newTiffImageSize<0x0201, subImage2Id>}, - {Tag::next, subImage2Id, ignoreTiffComponent}, - {Tag::all, subImage2Id, newTiffEntry}, + {0x0111, IfdId::subImage2Id, newTiffImageData<0x0117, IfdId::subImage2Id>}, + {0x0117, IfdId::subImage2Id, newTiffImageSize<0x0111, IfdId::subImage2Id>}, + {0x0144, IfdId::subImage2Id, newTiffImageData<0x0145, IfdId::subImage2Id>}, + {0x0145, IfdId::subImage2Id, newTiffImageSize<0x0144, IfdId::subImage2Id>}, + {0x0201, IfdId::subImage2Id, newTiffImageData<0x0202, IfdId::subImage2Id>}, + {0x0202, IfdId::subImage2Id, newTiffImageSize<0x0201, IfdId::subImage2Id>}, + {Tag::next, IfdId::subImage2Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage2Id, newTiffEntry}, // Subdir subImage3 - {0x0111, subImage3Id, newTiffImageData<0x0117, subImage3Id>}, - {0x0117, subImage3Id, newTiffImageSize<0x0111, subImage3Id>}, - {0x0144, subImage3Id, newTiffImageData<0x0145, subImage3Id>}, - {0x0145, subImage3Id, newTiffImageSize<0x0144, subImage3Id>}, - {0x0201, subImage3Id, newTiffImageData<0x0202, subImage3Id>}, - {0x0202, subImage3Id, newTiffImageSize<0x0201, subImage3Id>}, - {Tag::next, subImage3Id, ignoreTiffComponent}, - {Tag::all, subImage3Id, newTiffEntry}, + {0x0111, IfdId::subImage3Id, newTiffImageData<0x0117, IfdId::subImage3Id>}, + {0x0117, IfdId::subImage3Id, newTiffImageSize<0x0111, IfdId::subImage3Id>}, + {0x0144, IfdId::subImage3Id, newTiffImageData<0x0145, IfdId::subImage3Id>}, + {0x0145, IfdId::subImage3Id, newTiffImageSize<0x0144, IfdId::subImage3Id>}, + {0x0201, IfdId::subImage3Id, newTiffImageData<0x0202, IfdId::subImage3Id>}, + {0x0202, IfdId::subImage3Id, newTiffImageSize<0x0201, IfdId::subImage3Id>}, + {Tag::next, IfdId::subImage3Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage3Id, newTiffEntry}, // Subdir subImage4 - {0x0111, subImage4Id, newTiffImageData<0x0117, subImage4Id>}, - {0x0117, subImage4Id, newTiffImageSize<0x0111, subImage4Id>}, - {0x0144, subImage4Id, newTiffImageData<0x0145, subImage4Id>}, - {0x0145, subImage4Id, newTiffImageSize<0x0144, subImage4Id>}, - {0x0201, subImage4Id, newTiffImageData<0x0202, subImage4Id>}, - {0x0202, subImage4Id, newTiffImageSize<0x0201, subImage4Id>}, - {Tag::next, subImage4Id, ignoreTiffComponent}, - {Tag::all, subImage4Id, newTiffEntry}, + {0x0111, IfdId::subImage4Id, newTiffImageData<0x0117, IfdId::subImage4Id>}, + {0x0117, IfdId::subImage4Id, newTiffImageSize<0x0111, IfdId::subImage4Id>}, + {0x0144, IfdId::subImage4Id, newTiffImageData<0x0145, IfdId::subImage4Id>}, + {0x0145, IfdId::subImage4Id, newTiffImageSize<0x0144, IfdId::subImage4Id>}, + {0x0201, IfdId::subImage4Id, newTiffImageData<0x0202, IfdId::subImage4Id>}, + {0x0202, IfdId::subImage4Id, newTiffImageSize<0x0201, IfdId::subImage4Id>}, + {Tag::next, IfdId::subImage4Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage4Id, newTiffEntry}, // Subdir subImage5 - {0x0111, subImage5Id, newTiffImageData<0x0117, subImage5Id>}, - {0x0117, subImage5Id, newTiffImageSize<0x0111, subImage5Id>}, - {0x0144, subImage5Id, newTiffImageData<0x0145, subImage5Id>}, - {0x0145, subImage5Id, newTiffImageSize<0x0144, subImage5Id>}, - {0x0201, subImage5Id, newTiffImageData<0x0202, subImage5Id>}, - {0x0202, subImage5Id, newTiffImageSize<0x0201, subImage5Id>}, - {Tag::next, subImage5Id, ignoreTiffComponent}, - {Tag::all, subImage5Id, newTiffEntry}, + {0x0111, IfdId::subImage5Id, newTiffImageData<0x0117, IfdId::subImage5Id>}, + {0x0117, IfdId::subImage5Id, newTiffImageSize<0x0111, IfdId::subImage5Id>}, + {0x0144, IfdId::subImage5Id, newTiffImageData<0x0145, IfdId::subImage5Id>}, + {0x0145, IfdId::subImage5Id, newTiffImageSize<0x0144, IfdId::subImage5Id>}, + {0x0201, IfdId::subImage5Id, newTiffImageData<0x0202, IfdId::subImage5Id>}, + {0x0202, IfdId::subImage5Id, newTiffImageSize<0x0201, IfdId::subImage5Id>}, + {Tag::next, IfdId::subImage5Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage5Id, newTiffEntry}, // Subdir subImage6 - {0x0111, subImage6Id, newTiffImageData<0x0117, subImage6Id>}, - {0x0117, subImage6Id, newTiffImageSize<0x0111, subImage6Id>}, - {0x0144, subImage6Id, newTiffImageData<0x0145, subImage6Id>}, - {0x0145, subImage6Id, newTiffImageSize<0x0144, subImage6Id>}, - {0x0201, subImage6Id, newTiffImageData<0x0202, subImage6Id>}, - {0x0202, subImage6Id, newTiffImageSize<0x0201, subImage6Id>}, - {Tag::next, subImage6Id, ignoreTiffComponent}, - {Tag::all, subImage6Id, newTiffEntry}, + {0x0111, IfdId::subImage6Id, newTiffImageData<0x0117, IfdId::subImage6Id>}, + {0x0117, IfdId::subImage6Id, newTiffImageSize<0x0111, IfdId::subImage6Id>}, + {0x0144, IfdId::subImage6Id, newTiffImageData<0x0145, IfdId::subImage6Id>}, + {0x0145, IfdId::subImage6Id, newTiffImageSize<0x0144, IfdId::subImage6Id>}, + {0x0201, IfdId::subImage6Id, newTiffImageData<0x0202, IfdId::subImage6Id>}, + {0x0202, IfdId::subImage6Id, newTiffImageSize<0x0201, IfdId::subImage6Id>}, + {Tag::next, IfdId::subImage6Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage6Id, newTiffEntry}, // Subdir subImage7 - {0x0111, subImage7Id, newTiffImageData<0x0117, subImage7Id>}, - {0x0117, subImage7Id, newTiffImageSize<0x0111, subImage7Id>}, - {0x0144, subImage7Id, newTiffImageData<0x0145, subImage7Id>}, - {0x0145, subImage7Id, newTiffImageSize<0x0144, subImage7Id>}, - {0x0201, subImage7Id, newTiffImageData<0x0202, subImage7Id>}, - {0x0202, subImage7Id, newTiffImageSize<0x0201, subImage7Id>}, - {Tag::next, subImage7Id, ignoreTiffComponent}, - {Tag::all, subImage7Id, newTiffEntry}, + {0x0111, IfdId::subImage7Id, newTiffImageData<0x0117, IfdId::subImage7Id>}, + {0x0117, IfdId::subImage7Id, newTiffImageSize<0x0111, IfdId::subImage7Id>}, + {0x0144, IfdId::subImage7Id, newTiffImageData<0x0145, IfdId::subImage7Id>}, + {0x0145, IfdId::subImage7Id, newTiffImageSize<0x0144, IfdId::subImage7Id>}, + {0x0201, IfdId::subImage7Id, newTiffImageData<0x0202, IfdId::subImage7Id>}, + {0x0202, IfdId::subImage7Id, newTiffImageSize<0x0201, IfdId::subImage7Id>}, + {Tag::next, IfdId::subImage7Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage7Id, newTiffEntry}, // Subdir subImage8 - {0x0111, subImage8Id, newTiffImageData<0x0117, subImage8Id>}, - {0x0117, subImage8Id, newTiffImageSize<0x0111, subImage8Id>}, - {0x0144, subImage8Id, newTiffImageData<0x0145, subImage8Id>}, - {0x0145, subImage8Id, newTiffImageSize<0x0144, subImage8Id>}, - {0x0201, subImage8Id, newTiffImageData<0x0202, subImage8Id>}, - {0x0202, subImage8Id, newTiffImageSize<0x0201, subImage8Id>}, - {Tag::next, subImage8Id, ignoreTiffComponent}, - {Tag::all, subImage8Id, newTiffEntry}, + {0x0111, IfdId::subImage8Id, newTiffImageData<0x0117, IfdId::subImage8Id>}, + {0x0117, IfdId::subImage8Id, newTiffImageSize<0x0111, IfdId::subImage8Id>}, + {0x0144, IfdId::subImage8Id, newTiffImageData<0x0145, IfdId::subImage8Id>}, + {0x0145, IfdId::subImage8Id, newTiffImageSize<0x0144, IfdId::subImage8Id>}, + {0x0201, IfdId::subImage8Id, newTiffImageData<0x0202, IfdId::subImage8Id>}, + {0x0202, IfdId::subImage8Id, newTiffImageSize<0x0201, IfdId::subImage8Id>}, + {Tag::next, IfdId::subImage8Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage8Id, newTiffEntry}, // Subdir subImage9 - {0x0111, subImage9Id, newTiffImageData<0x0117, subImage9Id>}, - {0x0117, subImage9Id, newTiffImageSize<0x0111, subImage9Id>}, - {0x0144, subImage9Id, newTiffImageData<0x0145, subImage9Id>}, - {0x0145, subImage9Id, newTiffImageSize<0x0144, subImage9Id>}, - {0x0201, subImage9Id, newTiffImageData<0x0202, subImage9Id>}, - {0x0202, subImage9Id, newTiffImageSize<0x0201, subImage9Id>}, - {Tag::next, subImage9Id, ignoreTiffComponent}, - {Tag::all, subImage9Id, newTiffEntry}, + {0x0111, IfdId::subImage9Id, newTiffImageData<0x0117, IfdId::subImage9Id>}, + {0x0117, IfdId::subImage9Id, newTiffImageSize<0x0111, IfdId::subImage9Id>}, + {0x0144, IfdId::subImage9Id, newTiffImageData<0x0145, IfdId::subImage9Id>}, + {0x0145, IfdId::subImage9Id, newTiffImageSize<0x0144, IfdId::subImage9Id>}, + {0x0201, IfdId::subImage9Id, newTiffImageData<0x0202, IfdId::subImage9Id>}, + {0x0202, IfdId::subImage9Id, newTiffImageSize<0x0201, IfdId::subImage9Id>}, + {Tag::next, IfdId::subImage9Id, ignoreTiffComponent}, + {Tag::all, IfdId::subImage9Id, newTiffEntry}, // Exif subdir - {0xa005, exifId, newTiffSubIfd}, - {0x927c, exifId, newTiffMnEntry}, - {Tag::next, exifId, ignoreTiffComponent}, - {Tag::all, exifId, newTiffEntry}, + {0xa005, IfdId::exifId, newTiffSubIfd}, + {0x927c, IfdId::exifId, newTiffMnEntry}, + {Tag::next, IfdId::exifId, ignoreTiffComponent}, + {Tag::all, IfdId::exifId, newTiffEntry}, // GPS subdir - {Tag::next, gpsId, ignoreTiffComponent}, - {Tag::all, gpsId, newTiffEntry}, + {Tag::next, IfdId::gpsId, ignoreTiffComponent}, + {Tag::all, IfdId::gpsId, newTiffEntry}, // IOP subdir - {Tag::next, iopId, ignoreTiffComponent}, - {Tag::all, iopId, newTiffEntry}, + {Tag::next, IfdId::iopId, ignoreTiffComponent}, + {Tag::all, IfdId::iopId, newTiffEntry}, // IFD1 - {0x0111, ifd1Id, newTiffThumbData<0x0117, ifd1Id>}, - {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}, + {0x0111, IfdId::ifd1Id, newTiffThumbData<0x0117, IfdId::ifd1Id>}, + {0x0117, IfdId::ifd1Id, newTiffThumbSize<0x0111, IfdId::ifd1Id>}, + {0x0144, IfdId::ifd1Id, newTiffImageData<0x0145, IfdId::ifd1Id>}, + {0x0145, IfdId::ifd1Id, newTiffImageSize<0x0144, IfdId::ifd1Id>}, + {0x014a, IfdId::ifd1Id, newTiffSubIfd}, + {0x0201, IfdId::ifd1Id, newTiffThumbData<0x0202, IfdId::ifd1Id>}, + {0x0202, IfdId::ifd1Id, newTiffThumbSize<0x0201, IfdId::ifd1Id>}, + {Tag::next, IfdId::ifd1Id, newTiffDirectory}, + {Tag::all, IfdId::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, ignoreTiffComponent}, - {Tag::all, subThumb1Id, newTiffEntry}, + {0x0111, IfdId::subThumb1Id, newTiffImageData<0x0117, IfdId::subThumb1Id>}, + {0x0117, IfdId::subThumb1Id, newTiffImageSize<0x0111, IfdId::subThumb1Id>}, + {0x0144, IfdId::subThumb1Id, newTiffImageData<0x0145, IfdId::subThumb1Id>}, + {0x0145, IfdId::subThumb1Id, newTiffImageSize<0x0144, IfdId::subThumb1Id>}, + {0x0201, IfdId::subThumb1Id, newTiffImageData<0x0202, IfdId::subThumb1Id>}, + {0x0202, IfdId::subThumb1Id, newTiffImageSize<0x0201, IfdId::subThumb1Id>}, + {Tag::next, IfdId::subThumb1Id, ignoreTiffComponent}, + {Tag::all, IfdId::subThumb1Id, newTiffEntry}, // IFD2 (eg, in Pentax PEF and Canon CR2 files) - {0x0111, ifd2Id, newTiffImageData<0x0117, ifd2Id>}, - {0x0117, ifd2Id, newTiffImageSize<0x0111, ifd2Id>}, - {0x0144, ifd1Id, newTiffImageData<0x0145, ifd2Id>}, - {0x0145, ifd1Id, newTiffImageSize<0x0144, ifd2Id>}, - {0x0201, ifd2Id, newTiffImageData<0x0202, ifd2Id>}, - {0x0202, ifd2Id, newTiffImageSize<0x0201, ifd2Id>}, - {Tag::next, ifd2Id, newTiffDirectory}, - {Tag::all, ifd2Id, newTiffEntry}, + {0x0111, IfdId::ifd2Id, newTiffImageData<0x0117, IfdId::ifd2Id>}, + {0x0117, IfdId::ifd2Id, newTiffImageSize<0x0111, IfdId::ifd2Id>}, + {0x0144, IfdId::ifd1Id, newTiffImageData<0x0145, IfdId::ifd2Id>}, + {0x0145, IfdId::ifd1Id, newTiffImageSize<0x0144, IfdId::ifd2Id>}, + {0x0201, IfdId::ifd2Id, newTiffImageData<0x0202, IfdId::ifd2Id>}, + {0x0202, IfdId::ifd2Id, newTiffImageSize<0x0201, IfdId::ifd2Id>}, + {Tag::next, IfdId::ifd2Id, newTiffDirectory}, + {Tag::all, IfdId::ifd2Id, newTiffEntry}, // IFD3 (eg, in Canon CR2 files) - {0x0111, ifd3Id, newTiffImageData<0x0117, ifd3Id>}, - {0x0117, ifd3Id, newTiffImageSize<0x0111, ifd3Id>}, - {0x0144, ifd1Id, newTiffImageData<0x0145, ifd3Id>}, - {0x0145, ifd1Id, newTiffImageSize<0x0144, ifd3Id>}, - {0x0201, ifd3Id, newTiffImageData<0x0202, ifd3Id>}, - {0x0202, ifd3Id, newTiffImageSize<0x0201, ifd3Id>}, - {Tag::next, ifd3Id, ignoreTiffComponent}, - {Tag::all, ifd3Id, newTiffEntry}, + {0x0111, IfdId::ifd3Id, newTiffImageData<0x0117, IfdId::ifd3Id>}, + {0x0117, IfdId::ifd3Id, newTiffImageSize<0x0111, IfdId::ifd3Id>}, + {0x0144, IfdId::ifd1Id, newTiffImageData<0x0145, IfdId::ifd3Id>}, + {0x0145, IfdId::ifd1Id, newTiffImageSize<0x0144, IfdId::ifd3Id>}, + {0x0201, IfdId::ifd3Id, newTiffImageData<0x0202, IfdId::ifd3Id>}, + {0x0202, IfdId::ifd3Id, newTiffImageSize<0x0201, IfdId::ifd3Id>}, + {Tag::next, IfdId::ifd3Id, ignoreTiffComponent}, + {Tag::all, IfdId::ifd3Id, newTiffEntry}, // Olympus makernote - some Olympus cameras use Minolta structures // Todo: Adding such tags will not work (maybe result in a Minolta makernote), need separate groups - {0x0001, olympusId, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, - {0x0003, olympusId, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, - {Tag::next, olympusId, ignoreTiffComponent}, - {Tag::all, olympusId, newTiffEntry}, + {0x0001, IfdId::olympusId, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, + {0x0003, IfdId::olympusId, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, + {Tag::next, IfdId::olympusId, ignoreTiffComponent}, + {Tag::all, IfdId::olympusId, newTiffEntry}, // Olympus2 makernote - {0x0001, olympus2Id, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, - {0x0003, olympus2Id, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, - {0x2010, olympus2Id, newTiffSubIfd}, - {0x2020, olympus2Id, newTiffSubIfd}, - {0x2030, olympus2Id, newTiffSubIfd}, - {0x2031, olympus2Id, newTiffSubIfd}, - {0x2040, olympus2Id, newTiffSubIfd}, - {0x2050, olympus2Id, newTiffSubIfd}, - {0x2100, olympus2Id, newTiffSubIfd}, - {0x2200, olympus2Id, newTiffSubIfd}, - {0x2300, olympus2Id, newTiffSubIfd}, - {0x2400, olympus2Id, newTiffSubIfd}, - {0x2500, olympus2Id, newTiffSubIfd}, - {0x2600, olympus2Id, newTiffSubIfd}, - {0x2700, olympus2Id, newTiffSubIfd}, - {0x2800, olympus2Id, newTiffSubIfd}, - {0x2900, olympus2Id, newTiffSubIfd}, - {0x3000, olympus2Id, newTiffSubIfd}, - {Tag::next, olympus2Id, ignoreTiffComponent}, - {Tag::all, olympus2Id, newTiffEntry}, + {0x0001, IfdId::olympus2Id, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, + {0x0003, IfdId::olympus2Id, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, + {0x2010, IfdId::olympus2Id, newTiffSubIfd}, + {0x2020, IfdId::olympus2Id, newTiffSubIfd}, + {0x2030, IfdId::olympus2Id, newTiffSubIfd}, + {0x2031, IfdId::olympus2Id, newTiffSubIfd}, + {0x2040, IfdId::olympus2Id, newTiffSubIfd}, + {0x2050, IfdId::olympus2Id, newTiffSubIfd}, + {0x2100, IfdId::olympus2Id, newTiffSubIfd}, + {0x2200, IfdId::olympus2Id, newTiffSubIfd}, + {0x2300, IfdId::olympus2Id, newTiffSubIfd}, + {0x2400, IfdId::olympus2Id, newTiffSubIfd}, + {0x2500, IfdId::olympus2Id, newTiffSubIfd}, + {0x2600, IfdId::olympus2Id, newTiffSubIfd}, + {0x2700, IfdId::olympus2Id, newTiffSubIfd}, + {0x2800, IfdId::olympus2Id, newTiffSubIfd}, + {0x2900, IfdId::olympus2Id, newTiffSubIfd}, + {0x3000, IfdId::olympus2Id, newTiffSubIfd}, + {Tag::next, IfdId::olympus2Id, ignoreTiffComponent}, + {Tag::all, IfdId::olympus2Id, newTiffEntry}, // Olympus2 equipment subdir - {Tag::all, olympusEqId, newTiffEntry}, + {Tag::all, IfdId::olympusEqId, newTiffEntry}, // Olympus2 camera settings subdir - {0x0101, olympusCsId, newTiffImageData<0x0102, olympusCsId>}, - {0x0102, olympusCsId, newTiffImageSize<0x0101, olympusCsId>}, - {Tag::all, olympusCsId, newTiffEntry}, + {0x0101, IfdId::olympusCsId, newTiffImageData<0x0102, IfdId::olympusCsId>}, + {0x0102, IfdId::olympusCsId, newTiffImageSize<0x0101, IfdId::olympusCsId>}, + {Tag::all, IfdId::olympusCsId, newTiffEntry}, // Olympus2 raw development subdir - {Tag::all, olympusRdId, newTiffEntry}, + {Tag::all, IfdId::olympusRdId, newTiffEntry}, // Olympus2 raw development 2 subdir - {Tag::all, olympusRd2Id, newTiffEntry}, + {Tag::all, IfdId::olympusRd2Id, newTiffEntry}, // Olympus2 image processing subdir - {Tag::all, olympusIpId, newTiffEntry}, + {Tag::all, IfdId::olympusIpId, newTiffEntry}, // Olympus2 focus info subdir - {Tag::all, olympusFiId, newTiffEntry}, + {Tag::all, IfdId::olympusFiId, newTiffEntry}, // Olympus2 FE 1 subdir - {Tag::all, olympusFe1Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe1Id, newTiffEntry}, // Olympus2 FE 2 subdir - {Tag::all, olympusFe2Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe2Id, newTiffEntry}, // Olympus2 FE 3 subdir - {Tag::all, olympusFe3Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe3Id, newTiffEntry}, // Olympus2 FE 4 subdir - {Tag::all, olympusFe4Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe4Id, newTiffEntry}, // Olympus2 FE 5 subdir - {Tag::all, olympusFe5Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe5Id, newTiffEntry}, // Olympus2 FE 6 subdir - {Tag::all, olympusFe6Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe6Id, newTiffEntry}, // Olympus2 FE 7 subdir - {Tag::all, olympusFe7Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe7Id, newTiffEntry}, // Olympus2 FE 8 subdir - {Tag::all, olympusFe8Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe8Id, newTiffEntry}, // Olympus2 FE 9 subdir - {Tag::all, olympusFe9Id, newTiffEntry}, + {Tag::all, IfdId::olympusFe9Id, newTiffEntry}, // Olympus2 Raw Info subdir - {Tag::all, olympusRiId, newTiffEntry}, + {Tag::all, IfdId::olympusRiId, newTiffEntry}, // Fujifilm makernote - {Tag::next, fujiId, ignoreTiffComponent}, - {Tag::all, fujiId, newTiffEntry}, + {Tag::next, IfdId::fujiId, ignoreTiffComponent}, + {Tag::all, IfdId::fujiId, newTiffEntry}, // Canon makernote - {0x0001, canonId, EXV_BINARY_ARRAY(canonCsCfg, canonCsDef)}, - {0x0004, canonId, EXV_SIMPLE_BINARY_ARRAY(canonSiCfg)}, - {0x0005, canonId, EXV_SIMPLE_BINARY_ARRAY(canonPaCfg)}, - {0x000f, canonId, EXV_SIMPLE_BINARY_ARRAY(canonCfCfg)}, - {0x0012, canonId, EXV_SIMPLE_BINARY_ARRAY(canonPiCfg)}, - {0x0035, canonId, EXV_SIMPLE_BINARY_ARRAY(canonTiCfg)}, - {0x0093, canonId, EXV_BINARY_ARRAY(canonFiCfg, canonFiDef)}, - {0x00a0, canonId, EXV_SIMPLE_BINARY_ARRAY(canonPrCfg)}, - {0x4013, canonId, EXV_SIMPLE_BINARY_ARRAY(canonAfMiAdjCfg)}, - // { 0x4015, canonId, EXV_SIMPLE_BINARY_ARRAY(canonVigCorCfg) }, - {0x4016, canonId, EXV_SIMPLE_BINARY_ARRAY(canonVigCor2Cfg)}, - {0x4018, canonId, EXV_SIMPLE_BINARY_ARRAY(canonLiOpCfg)}, - {0x4019, canonId, EXV_SIMPLE_BINARY_ARRAY(canonLeCfg)}, - {0x4020, canonId, EXV_SIMPLE_BINARY_ARRAY(canonAmCfg)}, - {0x4021, canonId, EXV_SIMPLE_BINARY_ARRAY(canonMeCfg)}, - {0x4024, canonId, EXV_SIMPLE_BINARY_ARRAY(canonFilCfg)}, - {0x4025, canonId, EXV_SIMPLE_BINARY_ARRAY(canonHdrCfg)}, - {0x4028, canonId, EXV_SIMPLE_BINARY_ARRAY(canonAfCCfg)}, - {0x403f, canonId, EXV_SIMPLE_BINARY_ARRAY(canonRawBCfg)}, - {Tag::next, canonId, ignoreTiffComponent}, - {Tag::all, canonId, newTiffEntry}, + {0x0001, IfdId::canonId, EXV_BINARY_ARRAY(canonCsCfg, canonCsDef)}, + {0x0004, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonSiCfg)}, + {0x0005, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonPaCfg)}, + {0x000f, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonCfCfg)}, + {0x0012, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonPiCfg)}, + {0x0035, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonTiCfg)}, + {0x0093, IfdId::canonId, EXV_BINARY_ARRAY(canonFiCfg, canonFiDef)}, + {0x00a0, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonPrCfg)}, + {0x4013, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonAfMiAdjCfg)}, + // { 0x4015, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonVigCorCfg) }, + {0x4016, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonVigCor2Cfg)}, + {0x4018, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonLiOpCfg)}, + {0x4019, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonLeCfg)}, + {0x4020, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonAmCfg)}, + {0x4021, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonMeCfg)}, + {0x4024, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonFilCfg)}, + {0x4025, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonHdrCfg)}, + {0x4028, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonAfCCfg)}, + {0x403f, IfdId::canonId, EXV_SIMPLE_BINARY_ARRAY(canonRawBCfg)}, + {Tag::next, IfdId::canonId, ignoreTiffComponent}, + {Tag::all, IfdId::canonId, newTiffEntry}, // Canon makernote composite tags - {Tag::all, canonCsId, newTiffBinaryElement}, - {Tag::all, canonSiId, newTiffBinaryElement}, - {Tag::all, canonPaId, newTiffBinaryElement}, - {Tag::all, canonCfId, newTiffBinaryElement}, - {Tag::all, canonPiId, newTiffBinaryElement}, - {Tag::all, canonTiId, newTiffBinaryElement}, - {Tag::all, canonFiId, newTiffBinaryElement}, - {Tag::all, canonPrId, newTiffBinaryElement}, - {Tag::all, canonAfMiAdjId, newTiffBinaryElement}, - // { Tag::all, canonVigCorId, newTiffBinaryElement }, - {Tag::all, canonVigCor2Id, newTiffBinaryElement}, - {Tag::all, canonLiOpId, newTiffBinaryElement}, - {Tag::all, canonLeId, newTiffBinaryElement}, - {Tag::all, canonAmId, newTiffBinaryElement}, - {Tag::all, canonMeId, newTiffBinaryElement}, - {Tag::all, canonFilId, newTiffBinaryElement}, - {Tag::all, canonHdrId, newTiffBinaryElement}, - {Tag::all, canonAfCId, newTiffBinaryElement}, - {Tag::all, canonRawBId, newTiffBinaryElement}, + {Tag::all, IfdId::canonCsId, newTiffBinaryElement}, + {Tag::all, IfdId::canonSiId, newTiffBinaryElement}, + {Tag::all, IfdId::canonPaId, newTiffBinaryElement}, + {Tag::all, IfdId::canonCfId, newTiffBinaryElement}, + {Tag::all, IfdId::canonPiId, newTiffBinaryElement}, + {Tag::all, IfdId::canonTiId, newTiffBinaryElement}, + {Tag::all, IfdId::canonFiId, newTiffBinaryElement}, + {Tag::all, IfdId::canonPrId, newTiffBinaryElement}, + {Tag::all, IfdId::canonAfMiAdjId, newTiffBinaryElement}, + // { Tag::all, IfdId::canonVigCorId, newTiffBinaryElement }, + {Tag::all, IfdId::canonVigCor2Id, newTiffBinaryElement}, + {Tag::all, IfdId::canonLiOpId, newTiffBinaryElement}, + {Tag::all, IfdId::canonLeId, newTiffBinaryElement}, + {Tag::all, IfdId::canonAmId, newTiffBinaryElement}, + {Tag::all, IfdId::canonMeId, newTiffBinaryElement}, + {Tag::all, IfdId::canonFilId, newTiffBinaryElement}, + {Tag::all, IfdId::canonHdrId, newTiffBinaryElement}, + {Tag::all, IfdId::canonAfCId, newTiffBinaryElement}, + {Tag::all, IfdId::canonRawBId, newTiffBinaryElement}, // Nikon1 makernote - {Tag::next, nikon1Id, ignoreTiffComponent}, - {Tag::all, nikon1Id, newTiffEntry}, + {Tag::next, IfdId::nikon1Id, ignoreTiffComponent}, + {Tag::all, IfdId::nikon1Id, newTiffEntry}, // Nikon2 makernote - {Tag::next, nikon2Id, ignoreTiffComponent}, - {Tag::all, nikon2Id, newTiffEntry}, + {Tag::next, IfdId::nikon2Id, ignoreTiffComponent}, + {Tag::all, IfdId::nikon2Id, newTiffEntry}, // Nikon3 makernote - {Tag::next, nikon3Id, ignoreTiffComponent}, - {0x0011, nikon3Id, newTiffSubIfd}, - {0x001f, nikon3Id, EXV_BINARY_ARRAY(nikonVrCfg, nikonVrDef)}, - {0x0023, nikon3Id, EXV_BINARY_ARRAY(nikonPcCfg, nikonPcDef)}, - {0x0024, nikon3Id, EXV_BINARY_ARRAY(nikonWtCfg, nikonWtDef)}, - {0x0025, nikon3Id, EXV_BINARY_ARRAY(nikonIiCfg, nikonIiDef)}, - {0x0088, nikon3Id, EXV_BINARY_ARRAY(nikonAfCfg, nikonAfDef)}, - {0x0091, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonSiSet, nikonSelector)}, - {0x0097, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonCbSet, nikonSelector)}, - {0x0098, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonLdSet, nikonSelector)}, - {0x00a8, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonFlSet, nikonSelector)}, - {0x00b0, nikon3Id, EXV_BINARY_ARRAY(nikonMeCfg, nikonMeDef)}, - {0x00b7, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonAf2Set, nikonSelector)}, - {0x00b8, nikon3Id, EXV_BINARY_ARRAY(nikonFiCfg, nikonFiDef)}, - {0x00b9, nikon3Id, EXV_BINARY_ARRAY(nikonAFTCfg, nikonAFTDef)}, - {Tag::all, nikon3Id, newTiffEntry}, + {Tag::next, IfdId::nikon3Id, ignoreTiffComponent}, + {0x0011, IfdId::nikon3Id, newTiffSubIfd}, + {0x001f, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonVrCfg, nikonVrDef)}, + {0x0023, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonPcCfg, nikonPcDef)}, + {0x0024, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonWtCfg, nikonWtDef)}, + {0x0025, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonIiCfg, nikonIiDef)}, + {0x0088, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonAfCfg, nikonAfDef)}, + {0x0091, IfdId::nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonSiSet, nikonSelector)}, + {0x0097, IfdId::nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonCbSet, nikonSelector)}, + {0x0098, IfdId::nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonLdSet, nikonSelector)}, + {0x00a8, IfdId::nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonFlSet, nikonSelector)}, + {0x00b0, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonMeCfg, nikonMeDef)}, + {0x00b7, IfdId::nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonAf2Set, nikonSelector)}, + {0x00b8, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonFiCfg, nikonFiDef)}, + {0x00b9, IfdId::nikon3Id, EXV_BINARY_ARRAY(nikonAFTCfg, nikonAFTDef)}, + {Tag::all, IfdId::nikon3Id, newTiffEntry}, // Nikon3 makernote preview subdir - {0x0201, nikonPvId, newTiffThumbData<0x0202, nikonPvId>}, - {0x0202, nikonPvId, newTiffThumbSize<0x0201, nikonPvId>}, - {Tag::next, nikonPvId, ignoreTiffComponent}, - {Tag::all, nikonPvId, newTiffEntry}, + {0x0201, IfdId::nikonPvId, newTiffThumbData<0x0202, IfdId::nikonPvId>}, + {0x0202, IfdId::nikonPvId, newTiffThumbSize<0x0201, IfdId::nikonPvId>}, + {Tag::next, IfdId::nikonPvId, ignoreTiffComponent}, + {Tag::all, IfdId::nikonPvId, newTiffEntry}, // Nikon3 vibration reduction - {Tag::all, nikonVrId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonVrId, newTiffBinaryElement}, // Nikon3 picture control - {Tag::all, nikonPcId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonPcId, newTiffBinaryElement}, // Nikon3 world time - {Tag::all, nikonWtId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonWtId, newTiffBinaryElement}, // Nikon3 ISO info - {Tag::all, nikonIiId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonIiId, newTiffBinaryElement}, // Nikon3 auto focus - {Tag::all, nikonAfId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonAfId, newTiffBinaryElement}, // Nikon3 auto focus 2 - {Tag::all, nikonAf21Id, newTiffBinaryElement}, - {Tag::all, nikonAf22Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonAf21Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonAf22Id, newTiffBinaryElement}, // Nikon3 AF Fine Tune - {Tag::all, nikonAFTId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonAFTId, newTiffBinaryElement}, // Nikon3 file info - {Tag::all, nikonFiId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonFiId, newTiffBinaryElement}, // Nikon3 multi exposure - {Tag::all, nikonMeId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonMeId, newTiffBinaryElement}, // Nikon3 flash info - {Tag::all, nikonFl1Id, newTiffBinaryElement}, - {Tag::all, nikonFl2Id, newTiffBinaryElement}, - {Tag::all, nikonFl3Id, newTiffBinaryElement}, - {Tag::all, nikonFl7Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonFl1Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonFl2Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonFl3Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonFl7Id, newTiffBinaryElement}, // Nikon3 shot info - {Tag::all, nikonSi1Id, newTiffBinaryElement}, - {Tag::all, nikonSi2Id, newTiffBinaryElement}, - {Tag::all, nikonSi3Id, newTiffBinaryElement}, - {Tag::all, nikonSi4Id, newTiffBinaryElement}, - {Tag::all, nikonSi5Id, newTiffBinaryElement}, - {Tag::all, nikonSi6Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi1Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi2Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi3Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi4Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi5Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonSi6Id, newTiffBinaryElement}, // Nikon3 color balance - {Tag::all, nikonCb1Id, newTiffBinaryElement}, - {Tag::all, nikonCb2Id, newTiffBinaryElement}, - {Tag::all, nikonCb2aId, newTiffBinaryElement}, - {Tag::all, nikonCb2bId, newTiffBinaryElement}, - {Tag::all, nikonCb3Id, newTiffBinaryElement}, - {Tag::all, nikonCb4Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb1Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb2Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb2aId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb2bId, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb3Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonCb4Id, newTiffBinaryElement}, // Nikon3 lens data - {Tag::all, nikonLd1Id, newTiffBinaryElement}, - {Tag::all, nikonLd2Id, newTiffBinaryElement}, - {Tag::all, nikonLd3Id, newTiffBinaryElement}, - {Tag::all, nikonLd4Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonLd1Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonLd2Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonLd3Id, newTiffBinaryElement}, + {Tag::all, IfdId::nikonLd4Id, newTiffBinaryElement}, // Panasonic makernote - {Tag::next, panasonicId, ignoreTiffComponent}, - {Tag::all, panasonicId, newTiffEntry}, + {Tag::next, IfdId::panasonicId, ignoreTiffComponent}, + {Tag::all, IfdId::panasonicId, newTiffEntry}, // Pentax DNG makernote - {0x0003, pentaxDngId, newTiffThumbSize<0x0004, pentaxDngId>}, - {0x0004, pentaxDngId, newTiffThumbData<0x0003, pentaxDngId>}, - {Tag::next, pentaxDngId, ignoreTiffComponent}, - {Tag::all, pentaxDngId, newTiffEntry}, + {0x0003, IfdId::pentaxDngId, newTiffThumbSize<0x0004, IfdId::pentaxDngId>}, + {0x0004, IfdId::pentaxDngId, newTiffThumbData<0x0003, IfdId::pentaxDngId>}, + {Tag::next, IfdId::pentaxDngId, ignoreTiffComponent}, + {Tag::all, IfdId::pentaxDngId, newTiffEntry}, // Pentax makernote - {0x0003, pentaxId, newTiffThumbSize<0x0004, pentaxId>}, - {0x0004, pentaxId, newTiffThumbData<0x0003, pentaxId>}, - {Tag::next, pentaxId, ignoreTiffComponent}, - {Tag::all, pentaxId, newTiffEntry}, + {0x0003, IfdId::pentaxId, newTiffThumbSize<0x0004, IfdId::pentaxId>}, + {0x0004, IfdId::pentaxId, newTiffThumbData<0x0003, IfdId::pentaxId>}, + {Tag::next, IfdId::pentaxId, ignoreTiffComponent}, + {Tag::all, IfdId::pentaxId, newTiffEntry}, // Samsung2 makernote - {0x0021, samsung2Id, EXV_BINARY_ARRAY(samsungPwCfg, samsungPwDef)}, - {0x0035, samsung2Id, newTiffSubIfd}, - {Tag::next, samsung2Id, ignoreTiffComponent}, - {Tag::all, samsung2Id, newTiffEntry}, + {0x0021, IfdId::samsung2Id, EXV_BINARY_ARRAY(samsungPwCfg, samsungPwDef)}, + {0x0035, IfdId::samsung2Id, newTiffSubIfd}, + {Tag::next, IfdId::samsung2Id, ignoreTiffComponent}, + {Tag::all, IfdId::samsung2Id, newTiffEntry}, // Samsung PictureWizard binary array - {Tag::all, samsungPwId, newTiffBinaryElement}, + {Tag::all, IfdId::samsungPwId, newTiffBinaryElement}, // Samsung2 makernote preview subdir - {0x0201, samsungPvId, newTiffThumbData<0x0202, samsungPvId>}, - {0x0202, samsungPvId, newTiffThumbSize<0x0201, samsungPvId>}, - {Tag::next, samsungPvId, ignoreTiffComponent}, - {Tag::all, samsungPvId, newTiffEntry}, + {0x0201, IfdId::samsungPvId, newTiffThumbData<0x0202, IfdId::samsungPvId>}, + {0x0202, IfdId::samsungPvId, newTiffThumbSize<0x0201, IfdId::samsungPvId>}, + {Tag::next, IfdId::samsungPvId, ignoreTiffComponent}, + {Tag::all, IfdId::samsungPvId, newTiffEntry}, // Sigma/Foveon makernote - {Tag::next, sigmaId, ignoreTiffComponent}, - {Tag::all, sigmaId, newTiffEntry}, + {Tag::next, IfdId::sigmaId, ignoreTiffComponent}, + {Tag::all, IfdId::sigmaId, newTiffEntry}, - {Tag::all, sony2010eId, newTiffBinaryElement}, - {0x2010, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony2010eSet, sony2010eSelector)}, + {Tag::all, IfdId::sony2010eId, newTiffBinaryElement}, + {0x2010, IfdId::sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony2010eSet, sony2010eSelector)}, // Tag 0x9402 Sony2Fp Focus Position - {Tag::all, sony2FpId, newTiffBinaryElement}, - {0x9402, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony2FpSet, sony2FpSelector)}, + {Tag::all, IfdId::sony2FpId, newTiffBinaryElement}, + {0x9402, IfdId::sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony2FpSet, sony2FpSelector)}, // Tag 0x9404 SonyMisc2b - {Tag::all, sonyMisc2bId, newTiffBinaryElement}, - {0x9404, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector)}, + {Tag::all, IfdId::sonyMisc2bId, newTiffBinaryElement}, + {0x9404, IfdId::sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector)}, // Tag 0x9400 SonyMisc3c - {Tag::all, sonyMisc3cId, newTiffBinaryElement}, - {0x9400, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector)}, + {Tag::all, IfdId::sonyMisc3cId, newTiffBinaryElement}, + {0x9400, IfdId::sony1Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector)}, // Tag 0x9403 SonyMisc1 - {Tag::all, sonyMisc1Id, newTiffBinaryElement}, - {0x9403, sony1Id, EXV_BINARY_ARRAY(sonyMisc1Cfg, sonyMisc1Def)}, + {Tag::all, IfdId::sonyMisc1Id, newTiffBinaryElement}, + {0x9403, IfdId::sony1Id, EXV_BINARY_ARRAY(sonyMisc1Cfg, sonyMisc1Def)}, // Tag 0x3000 SonySInfo1 - {Tag::all, sonySInfo1Id, newTiffBinaryElement}, - {0x3000, sony1Id, EXV_BINARY_ARRAY(sonySInfo1Cfg, sonySInfo1Def)}, + {Tag::all, IfdId::sonySInfo1Id, newTiffBinaryElement}, + {0x3000, IfdId::sony1Id, EXV_BINARY_ARRAY(sonySInfo1Cfg, sonySInfo1Def)}, // Sony1 makernote - {0x0114, sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony1CsSet, sonyCsSelector)}, - {0xb028, sony1Id, newTiffSubIfd}, - {Tag::next, sony1Id, ignoreTiffComponent}, - {Tag::all, sony1Id, newTiffEntry}, + {0x0114, IfdId::sony1Id, EXV_COMPLEX_BINARY_ARRAY(sony1CsSet, sonyCsSelector)}, + {0xb028, IfdId::sony1Id, newTiffSubIfd}, + {Tag::next, IfdId::sony1Id, ignoreTiffComponent}, + {Tag::all, IfdId::sony1Id, newTiffEntry}, // Sony1 camera settings - {Tag::all, sony1CsId, newTiffBinaryElement}, - {Tag::all, sony1Cs2Id, newTiffBinaryElement}, + {Tag::all, IfdId::sony1CsId, newTiffBinaryElement}, + {Tag::all, IfdId::sony1Cs2Id, newTiffBinaryElement}, - {Tag::all, sony2010eId, newTiffBinaryElement}, - {0x2010, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2010eSet, sony2010eSelector)}, + {Tag::all, IfdId::sony2010eId, newTiffBinaryElement}, + {0x2010, IfdId::sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2010eSet, sony2010eSelector)}, // Tag 0x9402 Sony2Fp Focus Position - {Tag::all, sony2FpId, newTiffBinaryElement}, - {0x9402, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2FpSet, sony2FpSelector)}, + {Tag::all, IfdId::sony2FpId, newTiffBinaryElement}, + {0x9402, IfdId::sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2FpSet, sony2FpSelector)}, // Tag 0x9403 SonyMisc1 - {Tag::all, sonyMisc1Id, newTiffBinaryElement}, - {0x9403, sony2Id, EXV_BINARY_ARRAY(sonyMisc1Cfg, sonyMisc1Def)}, + {Tag::all, IfdId::sonyMisc1Id, newTiffBinaryElement}, + {0x9403, IfdId::sony2Id, EXV_BINARY_ARRAY(sonyMisc1Cfg, sonyMisc1Def)}, // Tag 0x9404 SonyMisc2b - {Tag::all, sonyMisc2bId, newTiffBinaryElement}, - {0x9404, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector)}, + {Tag::all, IfdId::sonyMisc2bId, newTiffBinaryElement}, + {0x9404, IfdId::sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc2bSet, sonyMisc2bSelector)}, // Tag 0x9400 SonyMisc3c - {Tag::all, sonyMisc3cId, newTiffBinaryElement}, - {0x9400, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector)}, + {Tag::all, IfdId::sonyMisc3cId, newTiffBinaryElement}, + {0x9400, IfdId::sony2Id, EXV_COMPLEX_BINARY_ARRAY(sonyMisc3cSet, sonyMisc3cSelector)}, // Tag 0x3000 SonySInfo1 - {Tag::all, sonySInfo1Id, newTiffBinaryElement}, - {0x3000, sony2Id, EXV_BINARY_ARRAY(sonySInfo1Cfg, sonySInfo1Def)}, + {Tag::all, IfdId::sonySInfo1Id, newTiffBinaryElement}, + {0x3000, IfdId::sony2Id, EXV_BINARY_ARRAY(sonySInfo1Cfg, sonySInfo1Def)}, // Sony2 makernote - {0x0114, sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2CsSet, sonyCsSelector)}, - {Tag::next, sony2Id, ignoreTiffComponent}, - {Tag::all, sony2Id, newTiffEntry}, + {0x0114, IfdId::sony2Id, EXV_COMPLEX_BINARY_ARRAY(sony2CsSet, sonyCsSelector)}, + {Tag::next, IfdId::sony2Id, ignoreTiffComponent}, + {Tag::all, IfdId::sony2Id, newTiffEntry}, // Sony2 camera settings - {Tag::all, sony2CsId, newTiffBinaryElement}, - {Tag::all, sony2Cs2Id, newTiffBinaryElement}, + {Tag::all, IfdId::sony2CsId, newTiffBinaryElement}, + {Tag::all, IfdId::sony2Cs2Id, newTiffBinaryElement}, // Sony1 Minolta makernote - {0x0001, sonyMltId, EXV_SIMPLE_BINARY_ARRAY(sony1MCsoCfg)}, - {0x0003, sonyMltId, EXV_SIMPLE_BINARY_ARRAY(sony1MCsnCfg)}, - {0x0004, sonyMltId, EXV_BINARY_ARRAY(sony1MCs7Cfg, minoCs7Def)}, // minoCs7Def [sic] - {0x0088, sonyMltId, newTiffThumbData<0x0089, sonyMltId>}, - {0x0089, sonyMltId, newTiffThumbSize<0x0088, sonyMltId>}, - {0x0114, sonyMltId, EXV_BINARY_ARRAY(sony1MCsA100Cfg, sony1MCsA100Def)}, - {Tag::next, sonyMltId, ignoreTiffComponent}, - {Tag::all, sonyMltId, newTiffEntry}, + {0x0001, IfdId::sonyMltId, EXV_SIMPLE_BINARY_ARRAY(sony1MCsoCfg)}, + {0x0003, IfdId::sonyMltId, EXV_SIMPLE_BINARY_ARRAY(sony1MCsnCfg)}, + {0x0004, IfdId::sonyMltId, EXV_BINARY_ARRAY(sony1MCs7Cfg, minoCs7Def)}, // minoCs7Def [sic] + {0x0088, IfdId::sonyMltId, newTiffThumbData<0x0089, IfdId::sonyMltId>}, + {0x0089, IfdId::sonyMltId, newTiffThumbSize<0x0088, IfdId::sonyMltId>}, + {0x0114, IfdId::sonyMltId, EXV_BINARY_ARRAY(sony1MCsA100Cfg, sony1MCsA100Def)}, + {Tag::next, IfdId::sonyMltId, ignoreTiffComponent}, + {Tag::all, IfdId::sonyMltId, newTiffEntry}, // Sony1 Minolta makernote composite tags - {Tag::all, sony1MltCsOldId, newTiffBinaryElement}, - {Tag::all, sony1MltCsNewId, newTiffBinaryElement}, - {Tag::all, sony1MltCs7DId, newTiffBinaryElement}, - {Tag::all, sony1MltCsA100Id, newTiffBinaryElement}, + {Tag::all, IfdId::sony1MltCsOldId, newTiffBinaryElement}, + {Tag::all, IfdId::sony1MltCsNewId, newTiffBinaryElement}, + {Tag::all, IfdId::sony1MltCs7DId, newTiffBinaryElement}, + {Tag::all, IfdId::sony1MltCsA100Id, newTiffBinaryElement}, // Minolta makernote - {0x0001, minoltaId, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, - {0x0003, minoltaId, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, - {0x0004, minoltaId, EXV_BINARY_ARRAY(minoCs7Cfg, minoCs7Def)}, - {0x0088, minoltaId, newTiffThumbData<0x0089, minoltaId>}, - {0x0089, minoltaId, newTiffThumbSize<0x0088, minoltaId>}, - {0x0114, minoltaId, EXV_BINARY_ARRAY(minoCs5Cfg, minoCs5Def)}, - {Tag::next, minoltaId, ignoreTiffComponent}, - {Tag::all, minoltaId, newTiffEntry}, + {0x0001, IfdId::minoltaId, EXV_SIMPLE_BINARY_ARRAY(minoCsoCfg)}, + {0x0003, IfdId::minoltaId, EXV_SIMPLE_BINARY_ARRAY(minoCsnCfg)}, + {0x0004, IfdId::minoltaId, EXV_BINARY_ARRAY(minoCs7Cfg, minoCs7Def)}, + {0x0088, IfdId::minoltaId, newTiffThumbData<0x0089, IfdId::minoltaId>}, + {0x0089, IfdId::minoltaId, newTiffThumbSize<0x0088, IfdId::minoltaId>}, + {0x0114, IfdId::minoltaId, EXV_BINARY_ARRAY(minoCs5Cfg, minoCs5Def)}, + {Tag::next, IfdId::minoltaId, ignoreTiffComponent}, + {Tag::all, IfdId::minoltaId, newTiffEntry}, // Minolta makernote composite tags - {Tag::all, minoltaCsOldId, newTiffBinaryElement}, - {Tag::all, minoltaCsNewId, newTiffBinaryElement}, - {Tag::all, minoltaCs7DId, newTiffBinaryElement}, - {Tag::all, minoltaCs5DId, newTiffBinaryElement}, + {Tag::all, IfdId::minoltaCsOldId, newTiffBinaryElement}, + {Tag::all, IfdId::minoltaCsNewId, newTiffBinaryElement}, + {Tag::all, IfdId::minoltaCs7DId, newTiffBinaryElement}, + {Tag::all, IfdId::minoltaCs5DId, newTiffBinaryElement}, // ----------------------------------------------------------------------- // Root directory of Panasonic RAW images - {Tag::pana, ifdIdNotSet, newTiffDirectory}, + {Tag::pana, IfdId::ifdIdNotSet, newTiffDirectory}, // IFD0 of Panasonic RAW images - {0x8769, panaRawId, newTiffSubIfd}, - {0x8825, panaRawId, newTiffSubIfd}, - // { 0x0111, panaRawId, newTiffImageData<0x0117, panaRawId> }, - // { 0x0117, panaRawId, newTiffImageSize<0x0111, panaRawId> }, - {Tag::next, panaRawId, ignoreTiffComponent}, - {Tag::all, panaRawId, newTiffEntry}, + {0x8769, IfdId::panaRawId, newTiffSubIfd}, + {0x8825, IfdId::panaRawId, newTiffSubIfd}, + // { 0x0111, IfdId::panaRawId, newTiffImageData<0x0117, IfdId::panaRawId> }, + // { 0x0117, IfdId::panaRawId, newTiffImageSize<0x0111, IfdId::panaRawId> }, + {Tag::next, IfdId::panaRawId, ignoreTiffComponent}, + {Tag::all, IfdId::panaRawId, newTiffEntry}, // Casio makernote - {Tag::next, casioId, ignoreTiffComponent}, - {Tag::all, casioId, newTiffEntry}, + {Tag::next, IfdId::casioId, ignoreTiffComponent}, + {Tag::all, IfdId::casioId, newTiffEntry}, // Casio2 makernote - {Tag::next, casio2Id, ignoreTiffComponent}, - {Tag::all, casio2Id, newTiffEntry}, + {Tag::next, IfdId::casio2Id, ignoreTiffComponent}, + {Tag::all, IfdId::casio2Id, newTiffEntry}, // ----------------------------------------------------------------------- // Tags which are not de/encoded - {Tag::next, ignoreId, ignoreTiffComponent}, - {Tag::all, ignoreId, newTiffEntry}}; + {Tag::next, IfdId::ignoreId, ignoreTiffComponent}, + {Tag::all, IfdId::ignoreId, newTiffEntry}}; // TIFF mapping table for special decoding and encoding requirements const TiffMappingInfo TiffMapping::tiffMappingInfo_[] = { - {"*", Tag::all, ignoreId, nullptr, nullptr}, // Do not decode tags with group == ignoreId - {"*", 0x02bc, ifd0Id, &TiffDecoder::decodeXmp, nullptr /*done before the tree is traversed*/}, - {"*", 0x83bb, ifd0Id, &TiffDecoder::decodeIptc, nullptr /*done before the tree is traversed*/}, - {"*", 0x8649, ifd0Id, &TiffDecoder::decodeIptc, nullptr /*done before the tree is traversed*/}, - {"*", 0x0026, canonId, &TiffDecoder::decodeCanonAFInfo, nullptr /* Exiv2.Canon.AFInfo is read-only */}, + {"*", Tag::all, IfdId::ignoreId, nullptr, nullptr}, // Do not decode tags with group == IfdId::ignoreId + {"*", 0x02bc, IfdId::ifd0Id, &TiffDecoder::decodeXmp, nullptr /*done before the tree is traversed*/}, + {"*", 0x83bb, IfdId::ifd0Id, &TiffDecoder::decodeIptc, nullptr /*done before the tree is traversed*/}, + {"*", 0x8649, IfdId::ifd0Id, &TiffDecoder::decodeIptc, nullptr /*done before the tree is traversed*/}, + {"*", 0x0026, IfdId::canonId, &TiffDecoder::decodeCanonAFInfo, nullptr /* Exiv2.Canon.AFInfo is read-only */}, }; DecoderFct TiffMapping::findDecoder(const std::string& make, uint32_t extendedTag, IfdId group) { @@ -1834,7 +1834,7 @@ void TiffCreator::getPath(TiffPath& tiffPath, uint32_t extendedTag, IfdId group, ts = find(tiffTreeStruct_, TiffTreeStruct::Key(root, group)); extendedTag = ts->parentExtTag_; group = ts->parentGroup_; - } while (!(ts->root_ == root && ts->group_ == ifdIdNotSet)); + } while (!(ts->root_ == root && ts->group_ == IfdId::ifdIdNotSet)); } ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpData& xmpData, const byte* pData, @@ -1878,7 +1878,7 @@ WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size writeMethod = wmNonIntrusive; } if (writeMethod == wmIntrusive) { - auto createdTree = TiffCreator::create(root, ifdIdNotSet); + auto createdTree = TiffCreator::create(root, IfdId::ifdIdNotSet); if (parsedTree) { // Copy image tags from the original image to the composite TiffCopier copier(createdTree.get(), root, pHeader, &primaryGroups); @@ -1917,7 +1917,7 @@ TiffComponent::UniquePtr TiffParserWorker::parse(const byte* pData, size_t size, if (!pHeader->read(pData, size) || pHeader->offset() >= size) { throw Error(ErrorCode::kerNotAnImage, "TIFF"); } - auto rootDir = TiffCreator::create(root, ifdIdNotSet); + auto rootDir = TiffCreator::create(root, IfdId::ifdIdNotSet); if (rootDir) { rootDir->setStart(pData + pHeader->offset()); TiffRwState state(pHeader->byteOrder(), 0); @@ -1934,8 +1934,9 @@ void TiffParserWorker::findPrimaryGroups(PrimaryGroups& primaryGroups, TiffCompo return; static constexpr auto imageGroups = std::array{ - ifd0Id, ifd1Id, ifd2Id, ifd3Id, subImage1Id, subImage2Id, subImage3Id, - subImage4Id, subImage5Id, subImage6Id, subImage7Id, subImage8Id, subImage9Id, + IfdId::ifd0Id, IfdId::ifd1Id, IfdId::ifd2Id, IfdId::ifd3Id, IfdId::subImage1Id, + IfdId::subImage2Id, IfdId::subImage3Id, IfdId::subImage4Id, IfdId::subImage5Id, IfdId::subImage6Id, + IfdId::subImage7Id, IfdId::subImage8Id, IfdId::subImage9Id, }; for (auto&& imageGroup : imageGroups) { @@ -2041,72 +2042,72 @@ bool TiffHeaderBase::isImageTag(uint16_t /*tag*/, IfdId /*group*/, const Primary bool isTiffImageTag(uint16_t tag, IfdId group) { //! List of TIFF image tags static const TiffImgTagStruct tiffImageTags[] = { - {0x00fe, ifd0Id}, // Exif.Image.NewSubfileType - {0x00ff, ifd0Id}, // Exif.Image.SubfileType - {0x0100, ifd0Id}, // Exif.Image.ImageWidth - {0x0101, ifd0Id}, // Exif.Image.ImageLength - {0x0102, ifd0Id}, // Exif.Image.BitsPerSample - {0x0103, ifd0Id}, // Exif.Image.Compression - {0x0106, ifd0Id}, // Exif.Image.PhotometricInterpretation - {0x010a, ifd0Id}, // Exif.Image.FillOrder - {0x0111, ifd0Id}, // Exif.Image.StripOffsets - {0x0115, ifd0Id}, // Exif.Image.SamplesPerPixel - {0x0116, ifd0Id}, // Exif.Image.RowsPerStrip - {0x0117, ifd0Id}, // Exif.Image.StripByteCounts - {0x011a, ifd0Id}, // Exif.Image.XResolution - {0x011b, ifd0Id}, // Exif.Image.YResolution - {0x011c, ifd0Id}, // Exif.Image.PlanarConfiguration - {0x0122, ifd0Id}, // Exif.Image.GrayResponseUnit - {0x0123, ifd0Id}, // Exif.Image.GrayResponseCurve - {0x0124, ifd0Id}, // Exif.Image.T4Options - {0x0125, ifd0Id}, // Exif.Image.T6Options - {0x0128, ifd0Id}, // Exif.Image.ResolutionUnit - {0x0129, ifd0Id}, // Exif.Image.PageNumber - {0x012d, ifd0Id}, // Exif.Image.TransferFunction - {0x013d, ifd0Id}, // Exif.Image.Predictor - {0x013e, ifd0Id}, // Exif.Image.WhitePoint - {0x013f, ifd0Id}, // Exif.Image.PrimaryChromaticities - {0x0140, ifd0Id}, // Exif.Image.ColorMap - {0x0141, ifd0Id}, // Exif.Image.HalftoneHints - {0x0142, ifd0Id}, // Exif.Image.TileWidth - {0x0143, ifd0Id}, // Exif.Image.TileLength - {0x0144, ifd0Id}, // Exif.Image.TileOffsets - {0x0145, ifd0Id}, // Exif.Image.TileByteCounts - {0x014c, ifd0Id}, // Exif.Image.InkSet - {0x014d, ifd0Id}, // Exif.Image.InkNames - {0x014e, ifd0Id}, // Exif.Image.NumberOfInks - {0x0150, ifd0Id}, // Exif.Image.DotRange - {0x0151, ifd0Id}, // Exif.Image.TargetPrinter - {0x0152, ifd0Id}, // Exif.Image.ExtraSamples - {0x0153, ifd0Id}, // Exif.Image.SampleFormat - {0x0154, ifd0Id}, // Exif.Image.SMinSampleValue - {0x0155, ifd0Id}, // Exif.Image.SMaxSampleValue - {0x0156, ifd0Id}, // Exif.Image.TransferRange - {0x0157, ifd0Id}, // Exif.Image.ClipPath - {0x0158, ifd0Id}, // Exif.Image.XClipPathUnits - {0x0159, ifd0Id}, // Exif.Image.YClipPathUnits - {0x015a, ifd0Id}, // Exif.Image.Indexed - {0x015b, ifd0Id}, // Exif.Image.JPEGTables - {0x0200, ifd0Id}, // Exif.Image.JPEGProc - {0x0201, ifd0Id}, // Exif.Image.JPEGInterchangeFormat - {0x0202, ifd0Id}, // Exif.Image.JPEGInterchangeFormatLength - {0x0203, ifd0Id}, // Exif.Image.JPEGRestartInterval - {0x0205, ifd0Id}, // Exif.Image.JPEGLosslessPredictors - {0x0206, ifd0Id}, // Exif.Image.JPEGPointTransforms - {0x0207, ifd0Id}, // Exif.Image.JPEGQTables - {0x0208, ifd0Id}, // Exif.Image.JPEGDCTables - {0x0209, ifd0Id}, // Exif.Image.JPEGACTables - {0x0211, ifd0Id}, // Exif.Image.YCbCrCoefficients - {0x0212, ifd0Id}, // Exif.Image.YCbCrSubSampling - {0x0213, ifd0Id}, // Exif.Image.YCbCrPositioning - {0x0214, ifd0Id}, // Exif.Image.ReferenceBlackWhite - {0x828d, ifd0Id}, // Exif.Image.CFARepeatPatternDim - {0x828e, ifd0Id}, // Exif.Image.CFAPattern - // { 0x8773, ifd0Id }, // Exif.Image.InterColorProfile - {0x8824, ifd0Id}, // Exif.Image.SpectralSensitivity - {0x8828, ifd0Id}, // Exif.Image.OECF - {0x9102, ifd0Id}, // Exif.Image.CompressedBitsPerPixel - {0x9217, ifd0Id}, // Exif.Image.SensingMethod + {0x00fe, IfdId::ifd0Id}, // Exif.Image.NewSubfileType + {0x00ff, IfdId::ifd0Id}, // Exif.Image.SubfileType + {0x0100, IfdId::ifd0Id}, // Exif.Image.ImageWidth + {0x0101, IfdId::ifd0Id}, // Exif.Image.ImageLength + {0x0102, IfdId::ifd0Id}, // Exif.Image.BitsPerSample + {0x0103, IfdId::ifd0Id}, // Exif.Image.Compression + {0x0106, IfdId::ifd0Id}, // Exif.Image.PhotometricInterpretation + {0x010a, IfdId::ifd0Id}, // Exif.Image.FillOrder + {0x0111, IfdId::ifd0Id}, // Exif.Image.StripOffsets + {0x0115, IfdId::ifd0Id}, // Exif.Image.SamplesPerPixel + {0x0116, IfdId::ifd0Id}, // Exif.Image.RowsPerStrip + {0x0117, IfdId::ifd0Id}, // Exif.Image.StripByteCounts + {0x011a, IfdId::ifd0Id}, // Exif.Image.XResolution + {0x011b, IfdId::ifd0Id}, // Exif.Image.YResolution + {0x011c, IfdId::ifd0Id}, // Exif.Image.PlanarConfiguration + {0x0122, IfdId::ifd0Id}, // Exif.Image.GrayResponseUnit + {0x0123, IfdId::ifd0Id}, // Exif.Image.GrayResponseCurve + {0x0124, IfdId::ifd0Id}, // Exif.Image.T4Options + {0x0125, IfdId::ifd0Id}, // Exif.Image.T6Options + {0x0128, IfdId::ifd0Id}, // Exif.Image.ResolutionUnit + {0x0129, IfdId::ifd0Id}, // Exif.Image.PageNumber + {0x012d, IfdId::ifd0Id}, // Exif.Image.TransferFunction + {0x013d, IfdId::ifd0Id}, // Exif.Image.Predictor + {0x013e, IfdId::ifd0Id}, // Exif.Image.WhitePoint + {0x013f, IfdId::ifd0Id}, // Exif.Image.PrimaryChromaticities + {0x0140, IfdId::ifd0Id}, // Exif.Image.ColorMap + {0x0141, IfdId::ifd0Id}, // Exif.Image.HalftoneHints + {0x0142, IfdId::ifd0Id}, // Exif.Image.TileWidth + {0x0143, IfdId::ifd0Id}, // Exif.Image.TileLength + {0x0144, IfdId::ifd0Id}, // Exif.Image.TileOffsets + {0x0145, IfdId::ifd0Id}, // Exif.Image.TileByteCounts + {0x014c, IfdId::ifd0Id}, // Exif.Image.InkSet + {0x014d, IfdId::ifd0Id}, // Exif.Image.InkNames + {0x014e, IfdId::ifd0Id}, // Exif.Image.NumberOfInks + {0x0150, IfdId::ifd0Id}, // Exif.Image.DotRange + {0x0151, IfdId::ifd0Id}, // Exif.Image.TargetPrinter + {0x0152, IfdId::ifd0Id}, // Exif.Image.ExtraSamples + {0x0153, IfdId::ifd0Id}, // Exif.Image.SampleFormat + {0x0154, IfdId::ifd0Id}, // Exif.Image.SMinSampleValue + {0x0155, IfdId::ifd0Id}, // Exif.Image.SMaxSampleValue + {0x0156, IfdId::ifd0Id}, // Exif.Image.TransferRange + {0x0157, IfdId::ifd0Id}, // Exif.Image.ClipPath + {0x0158, IfdId::ifd0Id}, // Exif.Image.XClipPathUnits + {0x0159, IfdId::ifd0Id}, // Exif.Image.YClipPathUnits + {0x015a, IfdId::ifd0Id}, // Exif.Image.Indexed + {0x015b, IfdId::ifd0Id}, // Exif.Image.JPEGTables + {0x0200, IfdId::ifd0Id}, // Exif.Image.JPEGProc + {0x0201, IfdId::ifd0Id}, // Exif.Image.JPEGInterchangeFormat + {0x0202, IfdId::ifd0Id}, // Exif.Image.JPEGInterchangeFormatLength + {0x0203, IfdId::ifd0Id}, // Exif.Image.JPEGRestartInterval + {0x0205, IfdId::ifd0Id}, // Exif.Image.JPEGLosslessPredictors + {0x0206, IfdId::ifd0Id}, // Exif.Image.JPEGPointTransforms + {0x0207, IfdId::ifd0Id}, // Exif.Image.JPEGQTables + {0x0208, IfdId::ifd0Id}, // Exif.Image.JPEGDCTables + {0x0209, IfdId::ifd0Id}, // Exif.Image.JPEGACTables + {0x0211, IfdId::ifd0Id}, // Exif.Image.YCbCrCoefficients + {0x0212, IfdId::ifd0Id}, // Exif.Image.YCbCrSubSampling + {0x0213, IfdId::ifd0Id}, // Exif.Image.YCbCrPositioning + {0x0214, IfdId::ifd0Id}, // Exif.Image.ReferenceBlackWhite + {0x828d, IfdId::ifd0Id}, // Exif.Image.CFARepeatPatternDim + {0x828e, IfdId::ifd0Id}, // Exif.Image.CFAPattern + // { 0x8773, IfdId::ifd0Id }, // Exif.Image.InterColorProfile + {0x8824, IfdId::ifd0Id}, // Exif.Image.SpectralSensitivity + {0x8828, IfdId::ifd0Id}, // Exif.Image.OECF + {0x9102, IfdId::ifd0Id}, // Exif.Image.CompressedBitsPerPixel + {0x9217, IfdId::ifd0Id}, // Exif.Image.SensingMethod }; // If tag, group is one of the image tags listed above -> bingo! @@ -2146,7 +2147,7 @@ bool TiffHeader::isImageTag(uint16_t tag, IfdId group, const PrimaryGroups* pPri } // All tags of marked primary groups other than IFD0 are considered // image tags. That should take care of NEFs until we know better. - if (pPrimaryGroups && !pPrimaryGroups->empty() && group != ifd0Id) { + if (pPrimaryGroups && !pPrimaryGroups->empty() && group != IfdId::ifd0Id) { #ifdef EXIV2_DEBUG_MESSAGES ExifKey key(tag, groupName(group)); std::cerr << "Image tag: " << key << " (2)\n"; diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index c62e822b..07755868 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -201,7 +201,7 @@ TiffDecoder::TiffDecoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpDat make_ = exifData_.findKey(key)->toString(); } else { // Find camera make by looking for tag 0x010f in IFD0 - TiffFinder finder(0x010f, ifd0Id); + TiffFinder finder(0x010f, IfdId::ifd0Id); pRoot_->accept(finder); auto te = dynamic_cast(finder.result()); if (te && te->pValue()) { @@ -275,7 +275,7 @@ void TiffDecoder::decodeXmp(const TiffEntryBase* object) { const byte* pData = nullptr; size_t size = 0; - getObjData(pData, size, 0x02bc, ifd0Id, object); + getObjData(pData, size, 0x02bc, IfdId::ifd0Id, object); if (pData) { std::string xmpPacket; xmpPacket.assign(reinterpret_cast(pData), size); @@ -308,7 +308,7 @@ void TiffDecoder::decodeIptc(const TiffEntryBase* object) { // 1st choice: IPTCNAA const byte* pData = nullptr; size_t size = 0; - getObjData(pData, size, 0x83bb, ifd0Id, object); + getObjData(pData, size, 0x83bb, IfdId::ifd0Id, object); if (pData) { if (0 == IptcParser::decode(iptcData_, pData, size)) { return; @@ -324,7 +324,7 @@ void TiffDecoder::decodeIptc(const TiffEntryBase* object) { // ImageResources pData = nullptr; size = 0; - getObjData(pData, size, 0x8649, ifd0Id, object); + getObjData(pData, size, 0x8649, IfdId::ifd0Id, object); if (pData) { const byte* record = nullptr; uint32_t sizeHdr = 0; @@ -471,7 +471,7 @@ TiffEncoder::TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpD make_ = pos->toString(); } if (make_.empty() && pRoot_) { - TiffFinder finder(0x010f, ifd0Id); + TiffFinder finder(0x010f, IfdId::ifd0Id); pRoot_->accept(finder); auto te = dynamic_cast(finder.result()); if (te && te->pValue()) { @@ -935,7 +935,7 @@ void TiffEncoder::add(TiffComponent* pRootDir, TiffComponent* pSourceDir, uint32 for (auto i = exifData_.begin(); i != exifData_.end(); ++i) { IfdId group = groupId(i->groupName()); // Skip synthesized info tags - if (group == mnId) { + if (group == IfdId::mnId) { if (i->tag() == 0x0002) { posBo = i; } @@ -973,7 +973,7 @@ void TiffEncoder::add(TiffComponent* pRootDir, TiffComponent* pSourceDir, uint32 if (posBo == exifData_.end()) return; - TiffFinder finder(0x927c, exifId); + TiffFinder finder(0x927c, IfdId::exifId); pRootDir->accept(finder); auto te = dynamic_cast(finder.result()); if (te) { @@ -1158,7 +1158,7 @@ void TiffReader::visitSubIfd(TiffSubIfd* object) { object->count() >= 1) { // Todo: Fix hack uint32_t maxi = 9; - if (object->group() == ifd1Id) + if (object->group() == IfdId::ifd1Id) maxi = 1; for (uint32_t i = 0; i < object->count(); ++i) { uint32_t offset = getLong(object->pData() + 4 * i, byteOrder()); @@ -1177,7 +1177,8 @@ void TiffReader::visitSubIfd(TiffSubIfd* object) { break; } // If there are multiple dirs, group is incremented for each - auto td = std::make_unique(object->tag(), static_cast(object->newGroup_ + i)); + auto td = std::make_unique(object->tag(), + static_cast(static_cast(object->newGroup_) + i)); td->setStart(pData_ + baseOffset() + offset); object->addChild(std::move(td)); } @@ -1194,7 +1195,7 @@ void TiffReader::visitSubIfd(TiffSubIfd* object) { void TiffReader::visitMnEntry(TiffMnEntry* object) { readTiffEntry(object); // Find camera make - TiffFinder finder(0x010f, ifd0Id); + TiffFinder finder(0x010f, IfdId::ifd0Id); pRoot_->accept(finder); auto te = dynamic_cast(finder.result()); std::string make; diff --git a/src/tiffvisitor_int.hpp b/src/tiffvisitor_int.hpp index 40fbc45a..328bf5b0 100644 --- a/src/tiffvisitor_int.hpp +++ b/src/tiffvisitor_int.hpp @@ -655,7 +655,7 @@ class TiffReader : public TiffVisitor { private: using DirList = std::map; - using IdxSeq = std::map; + using IdxSeq = std::map; using PostList = std::vector; // DATA From dc4ae73013ba7e24a54e07119a27be5394bd44aa Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 12 Jul 2022 15:31:43 +0100 Subject: [PATCH 47/80] Add tag description option to exiv2 app (#2279) * Add `tagDesc()` to (Exif|Xmp|Iptc) Datums and Keys * Add `--Print d` option to exiv2 app * Add testing for all exiv2 application `--Print` options * Update manpage --- app/actions.cpp | 6 ++++ app/exiv2.cpp | 13 +++++--- app/exiv2app.hpp | 3 +- exiv2.md | 31 +++++++++---------- include/exiv2/datasets.hpp | 1 + include/exiv2/exif.hpp | 1 + include/exiv2/iptc.hpp | 1 + include/exiv2/metadatum.hpp | 4 +++ include/exiv2/properties.hpp | 1 + include/exiv2/tags.hpp | 3 +- include/exiv2/xmp_exiv2.hpp | 1 + src/datasets.cpp | 4 +++ src/exif.cpp | 4 +++ src/iptc.cpp | 4 +++ src/properties.cpp | 7 +++++ src/xmp.cpp | 4 +++ test/data/test_reference_files/exiv2-test.out | 9 ++++-- tests/bash_tests/test_pr_2279.py | 21 +++++++++++++ 18 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 tests/bash_tests/test_pr_2279.py diff --git a/app/actions.cpp b/app/actions.cpp index 1f5502dd..0cb99382 100644 --- a/app/actions.cpp +++ b/app/actions.cpp @@ -498,6 +498,12 @@ bool Print::printMetadatum(const Exiv2::Metadatum& md, const Exiv2::Image* pImag first = false; std::cout << std::setw(30) << std::setfill(' ') << std::left << md.tagLabel(); } + if (Params::instance().printItems_ & Params::prDesc) { + if (!first) + std::cout << " "; + first = false; + std::cout << std::setw(30) << std::setfill(' ') << std::left << md.tagDesc(); + } if (Params::instance().printItems_ & Params::prType) { if (!first) std::cout << " "; diff --git a/app/exiv2.cpp b/app/exiv2.cpp index 6f04e6e3..12e1d434 100644 --- a/app/exiv2.cpp +++ b/app/exiv2.cpp @@ -283,14 +283,16 @@ void Params::help(std::ostream& os) const { << _(" X : Extract \"raw\" XMP\n") << _(" -P flgs Print flags for fine control of tag lists ('print' action):\n") << _(" E : Exif tags\n") << _(" I : IPTC tags\n") << _(" X : XMP tags\n") - << _(" x : Tag number (Exif and IPTC only)\n") + << _(" x : Tag number for Exif or IPTC tags (in hexadecimal)\n") << _(" g : Group name (e.g. Exif.Photo.UserComment, Photo)\n") << _(" k : Key (e.g. Exif.Photo.UserComment)\n") << _(" l : Tag label (e.g. Exif.Photo.UserComment, 'User comment')\n") + << _(" d : Tag description\n") << _(" n : Tag name (e.g. Exif.Photo.UserComment, UserComment)\n") << _(" y : Type\n") - << _(" c : Number of components (count)\n") - << _(" s : Size in bytes (Ascii and Comment types include NULL)\n") - << _(" v : Plain data value, untranslated (vanilla)\n") + << _(" y : Type\n") << _(" c : Number of components (count)\n") + << _(" s : Size in bytes of vanilla value (may include NULL)\n") + << _(" v : Plain data value of untranslated (vanilla)\n") + << _(" V : Plain data value, data type and the word 'set'\n") << _(" t : Interpreted (translated) human readable values\n") << _(" h : Hex dump of the data\n") << _(" -d tgt1 Delete target(s) for the 'delete' action. Possible targets are:\n") @@ -720,6 +722,9 @@ int Params::evalPrintFlags(const std::string& optArg) { case 'V': printItems_ |= prSet | prKey | prType | prValue; break; + case 'd': + printItems_ |= prDesc; + break; default: std::cerr << progname() << ": " << _("Unrecognized print item") << " `" << i << "'\n"; rc = 1; diff --git a/app/exiv2app.hpp b/app/exiv2app.hpp index 5c278f9a..02fd72fc 100644 --- a/app/exiv2app.hpp +++ b/app/exiv2app.hpp @@ -151,7 +151,8 @@ class Params : public Util::Getopt { prValue = 256, prTrans = 512, prHex = 1024, - prSet = 2048 + prSet = 2048, + prDesc = 4096 }; //! Enumerates common targets, bitmap diff --git a/exiv2.md b/exiv2.md index 6049327f..86dd7fd2 100644 --- a/exiv2.md +++ b/exiv2.md @@ -566,34 +566,33 @@ as well as data columns included in the print output. Valid flags are: | g | Group name (e.g., for Exif.Photo.UserComment, outputs Photo) | | k | Key (e.g., Exif.Photo.UserComment) | | l | Tag label (human-readable tagname, e.g., for Exif.Photo.UserComment, outputs 'User comment') | -| n | Tagname (e.g., for Exif.Photo.UserComment, outputs UserComment) | +| d | Tag description | +| n | Tag name (e.g., for Exif.Photo.UserComment, outputs UserComment) | | y | Type (for available types, see [Exif/IPTC/XMP types](#exiv2_types)) | | c | Number of components (for single entry types, the number of **sizeof('type')** in 'size'. For multi-entry types, the number of entries. See [Exif/IPTC/XMP types](#exiv2_types)) | | s | Size in bytes of vanilla output (see note in [Exif 'Comment' values](#exif_comment_values)). Some types include a *NULL* character in the size (see [Exif/IPTC/XMP types](#exiv2_types)) | | v | Plain data value (vanilla values, i.e., untranslated) | -| V | Plain data value, data type and the word 'set ' (see ['MODIFY' COMMANDS](#modify_cmds))| +| V | Plain data value, data type and the word 'set' (see ['MODIFY' COMMANDS](#modify_cmds))| | t | Interpreted (translated) human-readable data values (includes plain vanilla values) | | h | Hex dump of the data | +**--Print** *flgs* can be combined with [--grep str](#grep_str) or +[--key key](#key_key) to further filter the output. +