@@ -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,41 @@ 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' , ' M' , 0x00 , 0x00 , 0x00 , ' I' , ' I' , 0x04 , 0x00 };
237+
238+ size_t OMSystemMnHeader::sizeOfSignature () {
239+ return sizeof (signature_);
240+ }
241+
242+ OMSystemMnHeader::OMSystemMnHeader () {
243+ read (signature_, sizeOfSignature (), invalidByteOrder);
244+ }
245+
246+ size_t OMSystemMnHeader::size () const {
247+ return header_.size ();
248+ }
249+
250+ size_t OMSystemMnHeader::ifdOffset () const {
251+ return sizeOfSignature ();
252+ }
253+
254+ uint32_t OMSystemMnHeader::baseOffset (uint32_t mnOffset) const {
255+ return mnOffset;
256+ }
257+
258+ bool OMSystemMnHeader::read (const byte* pData, size_t size, ByteOrder /* byteOrder*/ ) {
259+ if (!pData || size < sizeOfSignature ())
260+ return false ;
261+ header_.alloc (sizeOfSignature ());
262+ std::copy_n (pData, header_.size (), header_.data ());
263+ return !(header_.size () < sizeOfSignature () || 0 != header_.cmpBytes (0 , signature_, sizeOfSignature () - 2 ));
264+ }
265+
266+ size_t OMSystemMnHeader::write (IoWrapper& ioWrapper, ByteOrder /* byteOrder*/ ) const {
267+ ioWrapper.write (signature_, sizeOfSignature ());
268+ return sizeOfSignature ();
269+ } // OMSystemMnHeader::write
270+
235271const byte FujiMnHeader::signature_[] = {' F' , ' U' , ' J' , ' I' , ' F' , ' I' , ' L' , ' M' , 0x0c , 0x00 , 0x00 , 0x00 };
236272const ByteOrder FujiMnHeader::byteOrder_ = littleEndian;
237273
@@ -630,6 +666,18 @@ TiffComponent* newOlympus2Mn2(uint16_t tag, IfdId group, IfdId mnGroup) {
630666 return new TiffIfdMakernote (tag, group, mnGroup, new Olympus2MnHeader);
631667}
632668
669+ TiffComponent* newOMSystemMn (uint16_t tag, IfdId group, IfdId mnGroup, const byte* /* pData*/ , size_t size,
670+ ByteOrder /* byteOrder*/ ) {
671+ // Require at least the header and an IFD with 1 entry
672+ if (size < OMSystemMnHeader::sizeOfSignature () + 18 )
673+ return nullptr ;
674+ return newOMSystemMn2 (tag, group, mnGroup);
675+ }
676+
677+ TiffComponent* newOMSystemMn2 (uint16_t tag, IfdId group, IfdId mnGroup) {
678+ return new TiffIfdMakernote (tag, group, mnGroup, new OMSystemMnHeader);
679+ }
680+
633681TiffComponent* newFujiMn (uint16_t tag, IfdId group, IfdId mnGroup, const byte* /* pData*/ , size_t size,
634682 ByteOrder /* byteOrder*/ ) {
635683 // Require at least the header and an IFD with 1 entry
0 commit comments