72 magic != 42 && magic != 0x4f52 && magic != 0x5352 &&
74 ThrowTPE(
"Not a TIFF file (magic 42)");
76 auto root = std::make_unique<TiffRootIFD>(
83 IFDOffset = root->getSubIFDs().back()->getNextIFD()) {
84 std::unique_ptr<TiffIFD> subIFD;
86 subIFD = std::make_unique<TiffIFD>(root.get(), &ifds, bs, IFDOffset);
95 root->add(std::move(subIFD));
106 for (
const auto& decoder :
Map) {
110 std::tie(dChecker, dConstructor) = decoder;
115 if (!dChecker(root.get(), data))
118 return dConstructor(std::move(root), data);
121 ThrowTPE(
"No decoder found. Sorry.");
124template <
class Decoder>
127 return std::make_unique<Decoder>(std::move(root), data);
130#define DECODER(name) \
132 static_cast<TiffParser::checker_t>(&name::isAppropriateDecoder), \
135const std::array<std::pair<TiffParser::checker_t, TiffParser::constructor_t>,
assert(dim.area() >=area)
void skipBytes(size_type nbytes)
Endianness setByteOrder(Endianness endianness_)
RawParser(Buffer inputData)
std::unique_ptr< RawDecoder >(*)(TiffRootIFDOwner &&root, Buffer data) constructor_t
static TiffRootIFDOwner parse(TiffIFD *parent, Buffer data)
static const std::array< std::pair< checker_t, constructor_t >, 17 > Map
std::unique_ptr< RawDecoder > getDecoder(const CameraMetaData *meta=nullptr) override
static std::unique_ptr< RawDecoder > makeDecoder(TiffRootIFDOwner root, Buffer data)
static std::unique_ptr< RawDecoder > constructor(TiffRootIFDOwner &&root, Buffer data)
bool(*)(const TiffRootIFD *root, Buffer data) checker_t
std::unique_ptr< TiffRootIFD > TiffRootIFDOwner
Endianness getTiffByteOrder(ByteStream bs, uint32_t pos, const char *context="")