@@ -97,6 +97,7 @@ const TiffMnRegistry TiffMnCreator::registry_[] = {
9797 {" Minolta" , minoltaId, newIfdMn, newIfdMn2},
9898 {" NIKON" , ifdIdNotSet, newNikonMn, nullptr }, // mnGroup_ is not used
9999 {" OLYMPUS" , ifdIdNotSet, newOlympusMn, nullptr }, // mnGroup_ is not used
100+ {" OM Digital" , olympus2Id, newOMSystemMn, newOMSystemMn2},
100101 {" Panasonic" , panasonicId, newPanasonicMn, newPanasonicMn2},
101102 {" PENTAX" , ifdIdNotSet, newPentaxMn, nullptr }, // mnGroup_ is not used
102103 {" RICOH" , ifdIdNotSet, newPentaxMn, nullptr }, // mnGroup_ is not used
@@ -232,6 +233,42 @@ size_t Olympus2MnHeader::write(IoWrapper& ioWrapper, ByteOrder /*byteOrder*/) co
232233 return sizeOfSignature ();
233234} // Olympus2MnHeader::write
234235
236+ const byte OMSystemMnHeader::signature_[] = {' O' , ' M' , ' ' , ' S' , ' Y' , ' S' , ' T' , ' E' ,
237+ ' M' , 0x00 , 0x00 , 0x00 , ' I' , ' I' , 0x04 , 0x00 };
238+
239+ size_t OMSystemMnHeader::sizeOfSignature () {
240+ return sizeof (signature_);
241+ }
242+
243+ OMSystemMnHeader::OMSystemMnHeader () {
244+ read (signature_, sizeOfSignature (), invalidByteOrder);
245+ }
246+
247+ size_t OMSystemMnHeader::size () const {
248+ return header_.size ();
249+ }
250+
251+ size_t OMSystemMnHeader::ifdOffset () const {
252+ return sizeOfSignature ();
253+ }
254+
255+ uint32_t OMSystemMnHeader::baseOffset (uint32_t mnOffset) const {
256+ return mnOffset;
257+ }
258+
259+ bool OMSystemMnHeader::read (const byte* pData, size_t size, ByteOrder /* byteOrder*/ ) {
260+ if (!pData || size < sizeOfSignature ())
261+ return false ;
262+ header_.alloc (sizeOfSignature ());
263+ std::copy_n (pData, header_.size (), header_.data ());
264+ return !(header_.size () < sizeOfSignature () || 0 != header_.cmpBytes (0 , signature_, sizeOfSignature () - 2 ));
265+ }
266+
267+ size_t OMSystemMnHeader::write (IoWrapper& ioWrapper, ByteOrder /* byteOrder*/ ) const {
268+ ioWrapper.write (signature_, sizeOfSignature ());
269+ return sizeOfSignature ();
270+ } // OMSystemMnHeader::write
271+
235272const byte FujiMnHeader::signature_[] = {' F' , ' U' , ' J' , ' I' , ' F' , ' I' , ' L' , ' M' , 0x0c , 0x00 , 0x00 , 0x00 };
236273const ByteOrder FujiMnHeader::byteOrder_ = littleEndian;
237274
@@ -630,6 +667,18 @@ TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
630667 return new TiffIfdMakernote (tag, group, mnGroup, new Olympus2MnHeader);
631668}
632669
670+ TiffComponent* newOMSystemMn (uint16_t tag, IfdId group, IfdId mnGroup, const byte* /* pData*/ , size_t size,
671+ ByteOrder /* byteOrder*/ ) {
672+ // Require at least the header and an IFD with 1 entry
673+ if (size < OMSystemMnHeader::sizeOfSignature () + 18 )
674+ return nullptr ;
675+ return newOMSystemMn2 (tag, group, mnGroup);
676+ }
677+
678+ TiffComponent* newOMSystemMn2 (uint16_t tag, IfdId group, IfdId mnGroup) {
679+ return new TiffIfdMakernote (tag, group, mnGroup, new OMSystemMnHeader);
680+ }
681+
633682TiffComponent* newFujiMn (uint16_t tag, IfdId group, IfdId mnGroup, const byte* /* pData*/ , size_t size,
634683 ByteOrder /* byteOrder*/ ) {
635684 // Require at least the header and an IFD with 1 entry
0 commit comments