Index: exiv2-trunk/src/tags.cpp =================================================================== --- exiv2-trunk/src/tags.cpp (revision 2695) +++ exiv2-trunk/src/tags.cpp (working copy) @@ -160,6 +160,7 @@ { 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 }, Index: exiv2-trunk/src/tags_int.hpp =================================================================== --- exiv2-trunk/src/tags_int.hpp (revision 2695) +++ exiv2-trunk/src/tags_int.hpp (working copy) @@ -139,6 +139,7 @@ olympusRiId, panasonicId, pentaxId, + pentaxDngId, samsung2Id, samsungPvId, samsungPwId, Index: exiv2-trunk/src/makernote_int.hpp =================================================================== --- exiv2-trunk/src/makernote_int.hpp (revision 2695) +++ exiv2-trunk/src/makernote_int.hpp (working copy) @@ -361,6 +361,36 @@ }; // class PanasonicMnHeader + //! Header of an Pentax DNG Makernote + class PentaxDngMnHeader : public MnHeader { + public: + //! @name Creators + //@{ + //! Default constructor + PentaxDngMnHeader(); + //! Virtual destructor. + virtual ~PentaxDngMnHeader(); + //@} + //! @name Manipulators + //@{ + virtual bool read(const byte* pData, + uint32_t size, + ByteOrder byteOrder); + //@} + //! @name Accessors + //@{ + virtual uint32_t size() const; + virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const; + virtual uint32_t ifdOffset() const; + //@} + static uint32_t sizeOfSignature(); + + private: + DataBuf header_; //!< Data buffer for the makernote header + static const byte signature_[]; //!< Pentax DNG makernote header signature + + }; // class PentaxDngMnHeader + //! Header of an Pentax Makernote class PentaxMnHeader : public MnHeader { public: @@ -571,6 +601,11 @@ IfdId group, IfdId mnGroup); + //! Function to create an Pentax DNG makernote + TiffComponent* newPentaxDngMn2(uint16_t tag, + IfdId group, + IfdId mnGroup); + //! Function to create a Samsung makernote TiffComponent* newSamsungMn(uint16_t tag, IfdId group, Index: exiv2-trunk/src/tiffimage.cpp =================================================================== --- exiv2-trunk/src/tiffimage.cpp (revision 2695) +++ exiv2-trunk/src/tiffimage.cpp (working copy) @@ -1283,6 +1283,7 @@ { 0x0201, ifd0Id, newTiffImageData<0x0202, ifd0Id> }, { 0x0202, ifd0Id, newTiffImageSize<0x0201, ifd0Id> }, { 0x014a, ifd0Id, newTiffSubIfd }, + { 0xc634, ifd0Id, newTiffMnEntry }, { Tag::next, ifd0Id, newTiffDirectory }, { Tag::all, ifd0Id, newTiffEntry }, @@ -1623,6 +1624,12 @@ { Tag::next, panasonicId, newTiffDirectory }, { Tag::all, panasonicId, newTiffEntry }, + // Pentax DNG makernote + { 0x0003, pentaxDngId, newTiffThumbSize<0x0004, pentaxDngId> }, + { 0x0004, pentaxDngId, newTiffThumbData<0x0003, pentaxDngId> }, + { Tag::next, pentaxDngId, newTiffDirectory }, + { Tag::all, pentaxDngId, newTiffEntry }, + // Pentax makernote { 0x0003, pentaxId, newTiffThumbSize<0x0004, pentaxId> }, { 0x0004, pentaxId, newTiffThumbData<0x0003, pentaxId> }, Index: exiv2-trunk/src/makernote.cpp =================================================================== --- exiv2-trunk/src/makernote.cpp (revision 2695) +++ exiv2-trunk/src/makernote.cpp (working copy) @@ -69,7 +69,7 @@ { "NIKON", ifdIdNotSet, newNikonMn, 0 }, // mnGroup_ is not used { "OLYMPUS", ifdIdNotSet, newOlympusMn, 0 }, // mnGroup_ is not used { "Panasonic", panasonicId, newPanasonicMn, newPanasonicMn2 }, - { "PENTAX", pentaxId, newPentaxMn, newPentaxMn2 }, + { "PENTAX", ifdIdNotSet, newPentaxMn, 0 }, // mnGroup_ is not used { "SAMSUNG", samsung2Id, newSamsungMn, newSamsungMn2 }, { "SIGMA", sigmaId, newSigmaMn, newSigmaMn2 }, { "SONY", ifdIdNotSet, newSonyMn, 0 }, // mnGroup_ is not used @@ -80,7 +80,9 @@ { "-", sony1Id, 0, newSony1Mn2 }, { "-", sony2Id, 0, newSony2Mn2 }, { "-", olympusId, 0, newOlympusMn2 }, - { "-", olympus2Id, 0, newOlympus2Mn2 } + { "-", olympus2Id, 0, newOlympus2Mn2 }, + { "-", pentaxId, 0, newPentaxMn2 }, + { "-", pentaxDngId, 0, newPentaxDngMn2 } }; bool TiffMnRegistry::operator==(const std::string& key) const @@ -495,6 +497,55 @@ return sizeOfSignature(); } // PanasonicMnHeader::write + const byte PentaxDngMnHeader::signature_[] = { + 'P', 'E', 'N', 'T', 'A', 'X', ' ', 0x00, 'M', 'M' + }; + + uint32_t PentaxDngMnHeader::sizeOfSignature() + { + return sizeof(signature_); + } + + PentaxDngMnHeader::PentaxDngMnHeader() + { + read(signature_, sizeOfSignature(), invalidByteOrder); + } + + PentaxDngMnHeader::~PentaxDngMnHeader() + { + } + + uint32_t PentaxDngMnHeader::size() const + { + return header_.size_; + } + + uint32_t PentaxDngMnHeader::ifdOffset() const + { + return sizeOfSignature(); + } + + bool PentaxDngMnHeader::read(const byte* pData, + uint32_t size, + ByteOrder /*byteOrder*/) + { + if (!pData || size < sizeOfSignature()) return false; + header_.alloc(sizeOfSignature()); + std::memcpy(header_.pData_, pData, header_.size_); + if ( static_cast(header_.size_) < sizeOfSignature() + || 0 != memcmp(header_.pData_, signature_, 7)) { + return false; + } + return true; + } // PentaxDngMnHeader::read + + uint32_t PentaxDngMnHeader::write(IoWrapper& ioWrapper, + ByteOrder /*byteOrder*/) const + { + ioWrapper.write(signature_, sizeOfSignature()); + return sizeOfSignature(); + } // PentaxDngMnHeader::write + const byte PentaxMnHeader::signature_[] = { 'A', 'O', 'C', 0x00, 'M', 'M' }; @@ -809,14 +860,24 @@ TiffComponent* newPentaxMn(uint16_t tag, IfdId group, - IfdId mnGroup, - const byte* /*pData*/, + IfdId /*mnGroup*/, + const byte* pData, uint32_t size, ByteOrder /*byteOrder*/) { - // Require at least the header and an IFD with 1 entry - if (size < PentaxMnHeader::sizeOfSignature() + 18) return 0; - return newPentaxMn2(tag, group, mnGroup); + if (size > 8 && std::string(reinterpret_cast(pData), 8) + == std::string("PENTAX \0", 8)) { + // Require at least the header and an IFD with 1 entry + if (size < PentaxDngMnHeader::sizeOfSignature() + 18) return 0; + return newPentaxDngMn2(tag, group, pentaxId); + } else + 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 0; + return newPentaxMn2(tag, group, pentaxId); + } else + return 0; } TiffComponent* newPentaxMn2(uint16_t tag, @@ -826,6 +887,13 @@ return new TiffIfdMakernote(tag, group, mnGroup, new PentaxMnHeader); } + TiffComponent* newPentaxDngMn2(uint16_t tag, + IfdId group, + IfdId mnGroup) + { + return new TiffIfdMakernote(tag, group, mnGroup, new PentaxDngMnHeader); + } + TiffComponent* newSamsungMn(uint16_t tag, IfdId group, IfdId mnGroup,