bool isTiffType(BasicIo& iIo, bool advance) { const int32_t len = 8; byte buf[len]; iIo.read(buf, len); if (iIo.error() || iIo.eof()) { return false; } TiffHeade2 tiffHeader; bool rc = tiffHeader.read(buf, len); if (!advance || !rc) { iIo.seek(-len, BasicIo::cur); } return rc; }
bool Nikon3MnHeader::read(const byte* pData, uint32_t size, ByteOrder /*byteOrder*/) { assert (pData != 0); if (size < size_) return false; if (0 != memcmp(pData, signature_, 6)) return false; buf_.alloc(size_); std::memcpy(buf_.pData_, pData, buf_.size_); TiffHeade2 th; if (!th.read(buf_.pData_ + 10, 8)) return false; byteOrder_ = th.byteOrder(); start_ = 10 + th.offset(); return true; } // Nikon3MnHeader::read
TiffComponent* newNikonMn(uint16_t tag, uint16_t group, uint16_t /*mnGroup*/, const byte* pData, uint32_t size, ByteOrder /*byteOrder*/) { // If there is no "Nikon" string it must be Nikon1 format if (size < 6 || std::string(reinterpret_cast<const char*>(pData), 6) != std::string("Nikon\0", 6)) { return new TiffIfdMakernote(tag, group, Group::nikon1mn, 0); } // If the "Nikon" string is not followed by a TIFF header, we assume // Nikon2 format TiffHeade2 tiffHeader; if ( size < 18 || !tiffHeader.read(pData + 10, size - 10) || tiffHeader.tag() != 0x002a) { return new TiffIfdMakernote(tag, group, Group::nikon2mn, new Nikon2MnHeader); } // Else we have a Nikon3 makernote return new TiffIfdMakernote(tag, group, Group::nikon3mn, new Nikon3MnHeader); }