Exiv2
tiffcomposite_int.hpp
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #ifndef TIFFCOMPOSITE_INT_HPP_
4 #define TIFFCOMPOSITE_INT_HPP_
5 
6 // *****************************************************************************
7 // included header files
8 #include "tifffwd_int.hpp"
9 
10 #include <memory>
11 
12 // *****************************************************************************
13 // namespace extensions
14 namespace Exiv2 {
15 class BasicIo;
16 
17 namespace Internal {
18 // *****************************************************************************
19 // class definitions
20 
22 using TiffType = uint16_t;
23 
30 const TiffType ttUndefined = 7;
34 const TiffType ttTiffFloat = 11;
35 const TiffType ttTiffDouble = 12;
36 const TiffType ttTiffIfd = 13;
37 
39 TypeId toTypeId(TiffType tiffType, uint16_t tag, IfdId group);
41 TiffType toTiffType(TypeId typeId);
42 
46 namespace Tag {
47 const uint32_t none = 0x10000;
48 const uint32_t root = 0x20000;
49 const uint32_t next = 0x30000;
50 const uint32_t all = 0x40000;
51 const uint32_t pana = 0x80000;
52 const uint32_t fuji = 0x100000;
53 const uint32_t cmt2 = 0x110000;
54 const uint32_t cmt3 = 0x120000;
55 const uint32_t cmt4 = 0x130000;
56 } // namespace Tag
57 
62 class TiffPathItem {
63  public:
65 
66  constexpr TiffPathItem(uint32_t extendedTag, IfdId group) : extendedTag_(extendedTag), group_(group) {
68  }
70 
72 
73  [[nodiscard]] uint16_t tag() const {
75  return static_cast<uint16_t>(extendedTag_ & 0xffff);
76  }
78  [[nodiscard]] uint32_t extendedTag() const {
79  return extendedTag_;
80  }
82  [[nodiscard]] IfdId group() const {
83  return group_;
84  }
86 
87  private:
88  // DATA
89  uint32_t extendedTag_;
90  IfdId group_;
91 };
92 
102 class IoWrapper {
103  public:
105 
106 
112  IoWrapper(BasicIo& io, const byte* pHeader, size_t size, OffsetWriter* pow);
114 
116 
117 
123  size_t write(const byte* pData, size_t wcount);
130  int putb(byte data);
132  void setTarget(int id, size_t target);
134 
135  private:
136  // DATA
137  BasicIo& io_;
138  const byte* pHeader_;
139  size_t size_;
140  bool wroteHeader_{false};
141  OffsetWriter* pow_;
142 };
143 
153  public:
155  using UniquePtr = std::unique_ptr<TiffComponent>;
157  using Components = std::vector<UniquePtr>;
158 
160 
161  constexpr TiffComponent(uint16_t tag, IfdId group) : tag_(tag), group_(group) {
163  }
165  virtual ~TiffComponent() = default;
166  TiffComponent(const TiffComponent&) = default;
167  TiffComponent& operator=(const TiffComponent&) = default;
169 
171 
172 
184  TiffComponent* addPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot, UniquePtr object = nullptr);
190  TiffComponent* addChild(UniquePtr tiffComponent);
197  TiffComponent* addNext(UniquePtr tiffComponent);
204  void accept(TiffVisitor& visitor);
210  void setStart(const byte* pStart) {
211  pStart_ = const_cast<byte*>(pStart);
212  }
227  size_t write(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
228  size_t& imageIdx);
230 
232 
233  [[nodiscard]] uint16_t tag() const {
235  return tag_;
236  }
238  [[nodiscard]] IfdId group() const {
239  return group_;
240  }
242  [[nodiscard]] byte* start() const {
243  return pStart_;
244  }
250  [[nodiscard]] UniquePtr clone() const;
256  size_t writeData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t& imageIdx) const;
262  size_t writeImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
267  [[nodiscard]] size_t size() const;
271  [[nodiscard]] size_t count() const;
278  [[nodiscard]] size_t sizeData() const;
285  [[nodiscard]] size_t sizeImage() const;
289  // Todo: This is only implemented in TiffEntryBase. It is needed here so that
290  // we can sort components by tag and idx. Something is not quite right.
291  [[nodiscard]] virtual int idx() const;
293 
294  protected:
296 
297  virtual TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
299  TiffComponent::UniquePtr object);
301  virtual TiffComponent* doAddChild(UniquePtr tiffComponent);
303  virtual TiffComponent* doAddNext(UniquePtr tiffComponent);
305  virtual void doAccept(TiffVisitor& visitor) = 0;
307  virtual size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
308  size_t& imageIdx) = 0;
310 
312 
313  [[nodiscard]] virtual TiffComponent* doClone() const = 0;
316  virtual size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
317  size_t& imageIdx) const = 0;
319  virtual size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const = 0;
321  [[nodiscard]] virtual size_t doSize() const = 0;
323  [[nodiscard]] virtual size_t doCount() const = 0;
325  [[nodiscard]] virtual size_t doSizeData() const = 0;
327  [[nodiscard]] virtual size_t doSizeImage() const = 0;
329 
330  private:
331  // DATA
332  uint16_t tag_;
333  IfdId group_;
338  byte* pStart_{};
339 };
340 
343  struct Key;
352  bool operator==(const Key& key) const;
354  [[nodiscard]] uint16_t tag() const {
355  return static_cast<uint16_t>(extendedTag_ & 0xffff);
356  }
357 
358  // DATA
359  const char* make_;
360  uint32_t extendedTag_;
364 
365 }; // struct TiffMappingInfo
366 
369  std::string m_;
370  uint32_t e_;
372 };
373 
380 class TiffEntryBase : public TiffComponent {
381  friend class TiffReader;
382  friend class TiffEncoder;
383 
384  public:
386 
387  constexpr TiffEntryBase(uint16_t tag, IfdId group, TiffType tiffType = ttUndefined) :
389  TiffComponent(tag, group), tiffType_(tiffType) {
390  }
391 
393  ~TiffEntryBase() override = default;
395 
397 
398  TiffEntryBase& operator=(const TiffEntryBase&) = delete;
401 
403 
404 
411  void encode(TiffEncoder& encoder, const Exifdatum* datum);
413  void setOffset(size_t offset) {
414  offset_ = offset;
415  }
431  void setData(byte* pData, size_t size, std::shared_ptr<DataBuf> storage);
437  void setData(std::shared_ptr<DataBuf> buf);
443  void updateValue(Value::UniquePtr value, ByteOrder byteOrder);
449  void setValue(Value::UniquePtr value);
451 
453 
454  [[nodiscard]] TiffType tiffType() const {
456  return tiffType_;
457  }
462  [[nodiscard]] size_t offset() const {
463  return offset_;
464  }
468  [[nodiscard]] int idx() const override;
473  [[nodiscard]] const byte* pData() const {
474  return pData_;
475  }
477  [[nodiscard]] const Value* pValue() const {
478  return pValue_.get();
479  }
481 
482  protected:
484 
485  TiffEntryBase(const TiffEntryBase& rhs);
488 
490 
491  virtual void doEncode(TiffEncoder& encoder, const Exifdatum* datum) = 0;
494  void setCount(size_t count) {
495  count_ = count;
496  }
498  void setIdx(int idx) {
499  idx_ = idx;
500  }
506  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
507  size_t& imageIdx) override;
509 
511 
512  [[nodiscard]] size_t doCount() const override;
518  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
519  size_t& imageIdx) const override;
524  size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
526  [[nodiscard]] size_t doSize() const override;
528  [[nodiscard]] size_t doSizeData() const override;
530  [[nodiscard]] size_t doSizeImage() const override;
532 
534  static size_t writeOffset(byte* buf, size_t offset, TiffType tiffType, ByteOrder byteOrder);
535 
537  [[nodiscard]] std::shared_ptr<DataBuf> storage() const {
538  return storage_;
539  }
540 
541  private:
542  // DATA
543  TiffType tiffType_;
544  size_t count_{};
545  size_t offset_{};
546  size_t size_{};
547 
548  // Notes on the ownership model of pData_: pData_ is a always a
549  // pointer to a buffer owned by somebody else. Usually it is a
550  // pointer into a copy of the image file, but if
551  // TiffEntryBase::setData is used then it is a pointer into the
552  // storage_ DataBuf below.
553  byte* pData_{};
554 
555  int idx_{};
556  std::unique_ptr<Value> pValue_;
557 
558  // This DataBuf is only used when TiffEntryBase::setData is called.
559  // Otherwise, it remains empty. It is wrapped in a shared_ptr because
560  // TiffEntryBase has a clone method, which could lead to the DataBuf
561  // having multiple owners.
562  std::shared_ptr<DataBuf> storage_;
563 };
564 
568 class TiffEntry : public TiffEntryBase {
569  public:
571 
572  constexpr TiffEntry(uint16_t tag, IfdId group) : TiffEntryBase(tag, group) {
574  }
576 
577  protected:
579 
580  void doAccept(TiffVisitor& visitor) override;
581  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
583 
585 
586  [[nodiscard]] TiffEntry* doClone() const override;
588 };
589 
599  public:
601 
602  TiffDataEntryBase(uint16_t tag, IfdId group, uint16_t szTag, IfdId szGroup);
605 
607 
608 
617  virtual void setStrips(const Value* pSize, const byte* pData, size_t sizeData, size_t baseOffset) = 0;
619 
621 
622  [[nodiscard]] uint16_t szTag() const {
624  return szTag_;
625  }
627  [[nodiscard]] IfdId szGroup() const {
628  return szGroup_;
629  }
631 
632  private:
633  // DATA
634  uint16_t szTag_;
635  IfdId szGroup_;
636 };
637 
650  friend class TiffEncoder;
651 
652  public:
654 
656 
657  void setStrips(const Value* pSize, const byte* pData, size_t sizeData, size_t baseOffset) override;
659 
660  protected:
662 
663  void doAccept(TiffVisitor& visitor) override;
664  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
676  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
677  size_t& imageIdx) override;
679 
681 
682  [[nodiscard]] TiffDataEntry* doClone() const override;
687  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
688  size_t& imageIdx) const override;
689  // Using doWriteImage from base class
690  // Using doSize() from base class
692  [[nodiscard]] size_t doSizeData() const override;
693  // Using doSizeImage from base class
695 
696  private:
697  // DATA
698  byte* pDataArea_{};
699  size_t sizeDataArea_{};
700 };
701 
715  friend class TiffEncoder;
717 
718  public:
720 
721  void setStrips(const Value* pSize, const byte* pData, size_t sizeData, size_t baseOffset) override;
723 
724  protected:
726 
727  void doAccept(TiffVisitor& visitor) override;
728  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
734  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
735  size_t& imageIdx) override;
737 
739 
740  [[nodiscard]] TiffImageEntry* doClone() const override;
749  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
750  size_t& imageIdx) const override;
755  size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
757  [[nodiscard]] size_t doSize() const override;
759  [[nodiscard]] size_t doSizeData() const override;
761  [[nodiscard]] size_t doSizeImage() const override;
763 
764  private:
766  using Strips = std::vector<std::pair<const byte*, size_t>>;
767 
768  // DATA
769  Strips strips_;
770 };
771 
778 class TiffSizeEntry : public TiffEntryBase {
779  public:
781 
782  constexpr TiffSizeEntry(uint16_t tag, IfdId group, uint16_t dtTag, IfdId dtGroup) :
784  TiffEntryBase(tag, group), dtTag_(dtTag), dtGroup_(dtGroup) {
785  }
786 
788 
790 
791  [[nodiscard]] uint16_t dtTag() const {
793  return dtTag_;
794  }
796  [[nodiscard]] IfdId dtGroup() const {
797  return dtGroup_;
798  }
800 
801  protected:
803 
804  void doAccept(TiffVisitor& visitor) override;
805  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
807 
809 
810  [[nodiscard]] TiffSizeEntry* doClone() const override;
812 
813  private:
814  // DATA
815  uint16_t dtTag_;
816  IfdId dtGroup_;
817 };
818 
823 class TiffDirectory : public TiffComponent {
824  friend class TiffEncoder;
825  friend class TiffDecoder;
826 
827  public:
829 
830  TiffDirectory(uint16_t tag, IfdId group, bool hasNext = true);
833  ~TiffDirectory() override = default;
835 
837 
838  TiffDirectory& operator=(const TiffDirectory&) = delete;
841 
843 
844  [[nodiscard]] bool hasNext() const {
846  return hasNext_;
847  }
849 
850  protected:
852 
853  TiffDirectory(const TiffDirectory& rhs);
856 
858 
859  TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
860  TiffComponent::UniquePtr object) override;
861  TiffComponent* doAddChild(TiffComponent::UniquePtr tiffComponent) override;
862  TiffComponent* doAddNext(TiffComponent::UniquePtr tiffComponent) override;
863  void doAccept(TiffVisitor& visitor) override;
869  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
870  size_t& imageIdx) override;
872 
874 
875  [[nodiscard]] TiffDirectory* doClone() const override;
880  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
881  size_t& imageIdx) const override;
888  size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
893  [[nodiscard]] size_t doSize() const override;
898  [[nodiscard]] size_t doCount() const override;
903  [[nodiscard]] size_t doSizeData() const override;
908  [[nodiscard]] size_t doSizeImage() const override;
910 
911  private:
913 
914  static size_t writeDirEntry(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, TiffComponent* pTiffComponent,
916  size_t valueIdx, size_t dataIdx, size_t& imageIdx);
918 
919  // DATA
920  Components components_;
921  bool hasNext_;
922  UniquePtr pNext_;
923 };
924 
932 class TiffSubIfd : public TiffEntryBase {
933  friend class TiffReader;
934 
935  public:
937 
938  TiffSubIfd(uint16_t tag, IfdId group, IfdId newGroup);
941  ~TiffSubIfd() override = default;
943 
945 
946  TiffSubIfd(const TiffSubIfd& rhs);
948  TiffSubIfd& operator=(const TiffSubIfd&) = delete;
950 
951  protected:
953 
954  TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
955  TiffComponent::UniquePtr object) override;
956  TiffComponent* doAddChild(TiffComponent::UniquePtr tiffComponent) override;
957  void doAccept(TiffVisitor& visitor) override;
958  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
964  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
965  size_t& imageIdx) override;
967 
969 
970  [[nodiscard]] TiffSubIfd* doClone() const override;
975  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
976  size_t& imageIdx) const override;
981  size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
983  [[nodiscard]] size_t doSize() const override;
985  [[nodiscard]] size_t doSizeData() const override;
987  [[nodiscard]] size_t doSizeImage() const override;
989 
990  private:
992  using Ifds = std::vector<std::unique_ptr<TiffDirectory>>;
993 
994  // DATA
995  IfdId newGroup_;
996  Ifds ifds_;
997 };
998 
1006 class TiffMnEntry : public TiffEntryBase {
1007  friend class TiffReader;
1008  friend class TiffDecoder;
1009  friend class TiffEncoder;
1010 
1011  public:
1013 
1014  constexpr TiffMnEntry(uint16_t tag, IfdId group, IfdId mnGroup) :
1016  TiffEntryBase(tag, group, ttUndefined), mnGroup_(mnGroup) {
1017  }
1018 
1019  protected:
1021 
1022  TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
1023  TiffComponent::UniquePtr object) override;
1024  TiffComponent* doAddChild(TiffComponent::UniquePtr tiffComponent) override;
1025  TiffComponent* doAddNext(TiffComponent::UniquePtr tiffComponent) override;
1026  void doAccept(TiffVisitor& visitor) override;
1027  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
1032  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
1033  size_t& imageIdx) override;
1035 
1037 
1038  [[nodiscard]] TiffMnEntry* doClone() const override;
1040  [[nodiscard]] size_t doCount() const override;
1041  // Using doWriteData from base class
1042  // Using doWriteImage from base class
1047  [[nodiscard]] size_t doSize() const override;
1048  // Using doSizeData from base class
1049  // Using doSizeImage from base class
1051 
1052  private:
1053  // DATA
1054  IfdId mnGroup_;
1055  std::unique_ptr<TiffComponent> mn_;
1056 };
1057 
1068  friend class TiffReader;
1069 
1070  public:
1072 
1073  TiffIfdMakernote(uint16_t tag, IfdId group, IfdId mnGroup, std::unique_ptr<MnHeader> pHeader, bool hasNext = true);
1076  ~TiffIfdMakernote() override;
1078 
1092 
1094 
1095 
1100  bool readHeader(const byte* pData, size_t size, ByteOrder byteOrder);
1109  imageByteOrder_ = byteOrder;
1110  }
1112 
1114 
1115  [[nodiscard]] size_t sizeHeader() const;
1118  size_t writeHeader(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
1123  [[nodiscard]] size_t mnOffset() const;
1129  [[nodiscard]] size_t ifdOffset() const;
1136  [[nodiscard]] ByteOrder byteOrder() const;
1137 
1143  [[nodiscard]] size_t baseOffset() const;
1145 
1146  protected:
1148 
1149  TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
1150  TiffComponent::UniquePtr object) override;
1151  TiffComponent* doAddChild(TiffComponent::UniquePtr tiffComponent) override;
1152  TiffComponent* doAddNext(TiffComponent::UniquePtr tiffComponent) override;
1153  void doAccept(TiffVisitor& visitor) override;
1159  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
1160  size_t& imageIdx) override;
1162 
1164 
1165  [[nodiscard]] TiffIfdMakernote* doClone() const override;
1170  size_t doWriteData(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx,
1171  size_t& imageIdx) const override;
1176  size_t doWriteImage(IoWrapper& ioWrapper, ByteOrder byteOrder) const override;
1181  [[nodiscard]] size_t doSize() const override;
1187  [[nodiscard]] size_t doCount() const override;
1192  [[nodiscard]] size_t doSizeData() const override;
1197  [[nodiscard]] size_t doSizeImage() const override;
1199 
1200  private:
1201  // DATA
1202  std::unique_ptr<MnHeader> pHeader_;
1203  TiffDirectory ifd_;
1204  size_t mnOffset_{};
1205  ByteOrder imageByteOrder_{invalidByteOrder};
1206 };
1207 
1212 using CfgSelFct = int (*)(uint16_t, const byte*, size_t, TiffComponent*);
1213 
1215 using CryptFct = DataBuf (*)(uint16_t, const byte*, size_t, TiffComponent*);
1216 
1218 struct ArrayDef {
1220  bool operator==(size_t idx) const {
1221  return idx_ == idx;
1222  }
1224  [[nodiscard]] size_t size(uint16_t tag, IfdId group) const;
1225  // DATA
1226  size_t idx_;
1228  size_t count_;
1229 };
1230 
1232 struct ArrayCfg {
1237  [[nodiscard]] size_t tagStep() const {
1238  return elDefaultDef_.size(0, group_);
1239  }
1240  // DATA
1245  bool hasSize_;
1247  bool concat_;
1249 };
1250 
1252 struct ArraySet {
1254  const ArrayDef* def_;
1255  size_t defSize_;
1256 };
1257 
1264  public:
1266 
1267  TiffBinaryArray(uint16_t tag, IfdId group, const ArrayCfg& arrayCfg, const ArrayDef* arrayDef, size_t defSize);
1270  TiffBinaryArray(uint16_t tag, IfdId group, const ArraySet* arraySet, size_t setSize, CfgSelFct cfgSelFct);
1272  ~TiffBinaryArray() override = default;
1273  TiffBinaryArray& operator=(const TiffBinaryArray&) = delete;
1275 
1277 
1278  size_t addElement(size_t idx, const ArrayDef& def);
1291  bool initialize(IfdId group);
1302  bool initialize(TiffComponent* pRoot);
1304  void iniOrigDataBuf();
1306  bool updOrigDataBuf(const byte* pData, size_t size);
1308  void setDecoded(bool decoded) {
1309  decoded_ = decoded;
1310  }
1312 
1314 
1315  [[nodiscard]] const ArrayCfg* cfg() const {
1317  return arrayCfg_;
1318  }
1320  [[nodiscard]] const ArrayDef* def() const {
1321  return arrayDef_;
1322  }
1324  [[nodiscard]] size_t defSize() const {
1325  return defSize_;
1326  }
1328  [[nodiscard]] bool decoded() const {
1329  return decoded_;
1330  }
1332 
1333  protected:
1335 
1336  TiffBinaryArray(const TiffBinaryArray& rhs);
1339 
1341 
1342 
1345  TiffComponent* doAddPath(uint16_t tag, TiffPath& tiffPath, TiffComponent* pRoot,
1346  TiffComponent::UniquePtr object) override;
1350  TiffComponent* doAddChild(TiffComponent::UniquePtr tiffComponent) override;
1351  void doAccept(TiffVisitor& visitor) override;
1352  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
1356  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
1357  size_t& imageIdx) override;
1359 
1361 
1362  [[nodiscard]] TiffBinaryArray* doClone() const override;
1364  [[nodiscard]] size_t doCount() const override;
1365  // Using doWriteData from base class
1366  // Using doWriteImage from base class
1370  [[nodiscard]] size_t doSize() const override;
1371  // Using doSizeData from base class
1372  // Using doSizeImage from base class
1374 
1375  private:
1376  // DATA
1377  CfgSelFct cfgSelFct_{};
1378  const ArraySet* arraySet_{};
1379  const ArrayCfg* arrayCfg_{};
1381  const ArrayDef* arrayDef_{};
1382  size_t defSize_{};
1383  size_t setSize_{};
1384  Components elements_;
1385  byte* origData_{};
1386  size_t origSize_{};
1387  TiffComponent* pRoot_{};
1388  bool decoded_{};
1389 };
1390 
1396 
1397  public:
1399 
1400 
1403  void setElDef(const ArrayDef& def) {
1404  elDef_ = def;
1405  }
1409  void setElByteOrder(ByteOrder byteOrder) {
1410  elByteOrder_ = byteOrder;
1411  }
1413 
1415 
1416 
1419  [[nodiscard]] const ArrayDef* elDef() const {
1420  return &elDef_;
1421  }
1425  [[nodiscard]] ByteOrder elByteOrder() const {
1426  return elByteOrder_;
1427  }
1429 
1430  protected:
1432 
1433  void doAccept(TiffVisitor& visitor) override;
1434  void doEncode(TiffEncoder& encoder, const Exifdatum* datum) override;
1438  size_t doWrite(IoWrapper& ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx,
1439  size_t& imageIdx) override;
1441 
1443 
1444  [[nodiscard]] TiffBinaryElement* doClone() const override;
1448  [[nodiscard]] size_t doCount() const override;
1449  // Using doWriteData from base class
1450  // Using doWriteImage from base class
1455  [[nodiscard]] size_t doSize() const override;
1456  // Using doSizeData from base class
1457  // Using doSizeImage from base class
1459 
1460  private:
1461  // DATA
1462  ArrayDef elDef_{0, ttUndefined, 0};
1463  ByteOrder elByteOrder_{invalidByteOrder};
1464 };
1465 
1466 // *****************************************************************************
1467 // template, inline and free functions
1468 
1473 bool cmpTagLt(const TiffComponent::UniquePtr& lhs, const TiffComponent::UniquePtr& rhs);
1474 
1479 bool cmpGroupLt(const std::unique_ptr<TiffDirectory>& lhs, const std::unique_ptr<TiffDirectory>& rhs);
1480 
1482 TiffComponent::UniquePtr newTiffEntry(uint16_t tag, IfdId group);
1483 
1485 TiffComponent::UniquePtr newTiffMnEntry(uint16_t tag, IfdId group);
1486 
1489 
1491 template <IfdId newGroup>
1493  return std::make_unique<TiffDirectory>(tag, newGroup);
1494 }
1495 
1497 template <IfdId newGroup>
1499  return std::make_unique<TiffSubIfd>(tag, group, newGroup);
1500 }
1501 
1503 template <const ArrayCfg& arrayCfg, size_t N, const ArrayDef (&arrayDef)[N]>
1505  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, arrayDef, N);
1506 }
1507 
1509 template <const ArrayCfg& arrayCfg>
1511  return std::make_unique<TiffBinaryArray>(tag, group, arrayCfg, nullptr, 0);
1512 }
1513 
1515 template <size_t N, const ArraySet (&arraySet)[N], CfgSelFct cfgSelFct>
1517  return std::make_unique<TiffBinaryArray>(tag, group, arraySet, N, cfgSelFct);
1518 }
1519 
1521 template <uint16_t szTag, IfdId szGroup>
1523  return std::make_unique<TiffDataEntry>(tag, group, szTag, szGroup);
1524 }
1525 
1527 template <uint16_t dtTag, IfdId dtGroup>
1529  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
1530 }
1531 
1533 template <uint16_t szTag, IfdId szGroup>
1535  return std::make_unique<TiffImageEntry>(tag, group, szTag, szGroup);
1536 }
1537 
1539 template <uint16_t dtTag, IfdId dtGroup>
1541  // Todo: Same as newTiffThumbSize - consolidate (rename)?
1542  return std::make_unique<TiffSizeEntry>(tag, group, dtTag, dtGroup);
1543 }
1544 
1545 } // namespace Internal
1546 } // namespace Exiv2
1547 
1548 #endif // #ifndef TIFFCOMPOSITE_INT_HPP_
An interface for simple binary IO.
Definition: basicio.hpp:35
An Exif metadatum, consisting of an ExifKey and a Value and methods to manipulate these.
Definition: exif.hpp:41
Simple IO wrapper to ensure that the header is only written if there is any other data at all.
Definition: tiffcomposite_int.hpp:102
int putb(byte data)
Wraps the corresponding BasicIo::putb() method.
Definition: tiffcomposite_int.cpp:46
void setTarget(int id, size_t target)
Wrapper for OffsetWriter::setTarget(), using an int instead of the enum to reduce include deps.
Definition: tiffcomposite_int.cpp:54
size_t write(const byte *pData, size_t wcount)
Wraps the corresponding BasicIo::write() method.
Definition: tiffcomposite_int.cpp:38
IoWrapper(BasicIo &io, const byte *pHeader, size_t size, OffsetWriter *pow)
Definition: tiffcomposite_int.cpp:32
Class to insert pointers or offsets to computed addresses at specific locations in an image....
Definition: tiffimage_int.hpp:295
Composite to model an array of different tags. The tag types as well as other aspects of the array ar...
Definition: tiffcomposite_int.hpp:1263
const ArrayCfg * cfg() const
Return a pointer to the configuration.
Definition: tiffcomposite_int.hpp:1316
size_t addElement(size_t idx, const ArrayDef &def)
Add an element to the binary array, return the size of the element.
Definition: tiffcomposite_int.cpp:383
TiffBinaryArray * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:157
bool initialize(IfdId group)
Setup cfg and def for the component, in case of a complex binary array. Else do nothing....
Definition: tiffcomposite_int.cpp:341
void setDecoded(bool decoded)
Set a flag to indicate if the array was decoded.
Definition: tiffcomposite_int.hpp:1308
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:698
bool decoded() const
Return the flag which indicates if the array was decoded.
Definition: tiffcomposite_int.hpp:1328
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:675
const ArrayDef * def() const
Return a pointer to the definition.
Definition: tiffcomposite_int.hpp:1320
size_t doSize() const override
Implements size(). Todo: Document it!
Definition: tiffcomposite_int.cpp:1311
void iniOrigDataBuf()
Initialize the original data buffer and its size from the base entry.
Definition: tiffcomposite_int.cpp:369
~TiffBinaryArray() override=default
Virtual destructor.
TiffComponent * doAddChild(TiffComponent::UniquePtr tiffComponent) override
Implements addChild(). Todo: Document it!
Definition: tiffcomposite_int.cpp:577
bool updOrigDataBuf(const byte *pData, size_t size)
Update the original data buffer and its size, return true if successful.
Definition: tiffcomposite_int.cpp:374
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Todo: Document it!
Definition: tiffcomposite_int.cpp:1038
TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object) override
Implements addPath(). Todo: Document it!
Definition: tiffcomposite_int.cpp:506
size_t doCount() const override
Implements count(). Todo: Document it!
Definition: tiffcomposite_int.cpp:758
TiffBinaryArray(uint16_t tag, IfdId group, const ArrayCfg &arrayCfg, const ArrayDef *arrayDef, size_t defSize)
Constructor.
Definition: tiffcomposite_int.cpp:76
size_t defSize() const
Return the number of elements in the definition.
Definition: tiffcomposite_int.hpp:1324
Element of a TiffBinaryArray.
Definition: tiffcomposite_int.hpp:1394
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Todo: Document it!
Definition: tiffcomposite_int.cpp:1097
const ArrayDef * elDef() const
Return the array definition of this element.
Definition: tiffcomposite_int.hpp:1419
void setElDef(const ArrayDef &def)
Set the array definition for this element.
Definition: tiffcomposite_int.hpp:1403
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:694
size_t doCount() const override
Implements count(). Returns the count from the element definition.
Definition: tiffcomposite_int.cpp:778
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:686
void setElByteOrder(ByteOrder byteOrder)
Set the byte order of this element.
Definition: tiffcomposite_int.hpp:1409
size_t doSize() const override
Implements size(). Returns count * type-size, both taken from the element definition.
Definition: tiffcomposite_int.cpp:1340
ByteOrder elByteOrder() const
Return the byte order of this element.
Definition: tiffcomposite_int.hpp:1425
TiffBinaryElement * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:161
Interface class for components of a TIFF directory hierarchy (Composite pattern). Both TIFF directori...
Definition: tiffcomposite_int.hpp:152
std::vector< UniquePtr > Components
Container type to hold all metadata.
Definition: tiffcomposite_int.hpp:157
constexpr TiffComponent(uint16_t tag, IfdId group)
Constructor.
Definition: tiffcomposite_int.hpp:162
UniquePtr clone() const
Return an auto-pointer to a copy of itself (deep copy, but without any children). The caller owns thi...
Definition: tiffcomposite_int.cpp:121
virtual size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const =0
Implements writeImage().
virtual size_t doSize() const =0
Implements size().
virtual TiffComponent * doClone() const =0
Internal virtual copy constructor, implements clone().
virtual size_t doCount() const =0
Implements count().
uint16_t tag() const
Return the tag of this entry.
Definition: tiffcomposite_int.hpp:234
virtual size_t doSizeImage() const =0
Implements sizeImage().
void setStart(const byte *pStart)
Set a pointer to the start of the binary representation of the component in a memory buffer....
Definition: tiffcomposite_int.hpp:210
size_t write(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx)
Write a TiffComponent to a binary image.
Definition: tiffcomposite_int.cpp:782
TiffComponent * addChild(UniquePtr tiffComponent)
Add a child to the component. Default is to do nothing.
Definition: tiffcomposite_int.cpp:542
size_t sizeImage() const
Return the size in bytes of the image data of this component when written to a binary image....
Definition: tiffcomposite_int.cpp:1385
virtual size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const =0
Implements writeData().
size_t sizeData() const
Return the size in bytes of the IFD data of this component when written to a binary image....
Definition: tiffcomposite_int.cpp:1346
TiffComponent * addPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, UniquePtr object=nullptr)
Add a TIFF entry tag to the component. Components on the path to the entry are added if they don't ex...
Definition: tiffcomposite_int.cpp:399
virtual TiffComponent * doAddChild(UniquePtr tiffComponent)
Implements addChild(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:546
virtual ~TiffComponent()=default
Virtual destructor.
virtual void doAccept(TiffVisitor &visitor)=0
Implements accept().
size_t writeImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const
Write the image data of this component to a binary image. Return the number of bytes written....
Definition: tiffcomposite_int.cpp:1172
virtual size_t doSizeData() const =0
Implements sizeData().
virtual int idx() const
Return the unique id of the entry in the image.
Definition: tiffcomposite_int.cpp:165
byte * start() const
Return a pointer to the start of the binary representation of the component.
Definition: tiffcomposite_int.hpp:242
virtual TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object)
Implements addPath(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:404
std::unique_ptr< TiffComponent > UniquePtr
TiffComponent auto_ptr type.
Definition: tiffcomposite_int.hpp:155
size_t writeData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const
Write the IFD data of this component to a binary image. Return the number of bytes written....
Definition: tiffcomposite_int.cpp:1108
IfdId group() const
Return the group id of this component.
Definition: tiffcomposite_int.hpp:238
TiffComponent * addNext(UniquePtr tiffComponent)
Add a "next" component to the component. Default is to do nothing.
Definition: tiffcomposite_int.cpp:583
virtual TiffComponent * doAddNext(UniquePtr tiffComponent)
Implements addNext(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:587
virtual size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx)=0
Implements write().
size_t size() const
Return the size in bytes of the IFD value of this component when written to a binary image.
Definition: tiffcomposite_int.cpp:1258
void accept(TiffVisitor &visitor)
Interface to accept visitors (Visitor pattern). Visitors can perform operations on all components of ...
Definition: tiffcomposite_int.cpp:611
size_t count() const
Return the number of components in this component.
Definition: tiffcomposite_int.cpp:726
Interface for a standard TIFF IFD entry consisting of a value which is a set of offsets to a data are...
Definition: tiffcomposite_int.hpp:598
IfdId szGroup() const
Return the group of the entry which has the size.
Definition: tiffcomposite_int.hpp:627
TiffDataEntryBase(uint16_t tag, IfdId group, uint16_t szTag, IfdId szGroup)
Constructor.
Definition: tiffvisitor_int.cpp:341
virtual void setStrips(const Value *pSize, const byte *pData, size_t sizeData, size_t baseOffset)=0
Set the data areas ("strips").
uint16_t szTag() const
Return the group of the entry which has the size.
Definition: tiffcomposite_int.hpp:623
A standard TIFF IFD entry consisting of a value which is an offset to a data area and the data area....
Definition: tiffcomposite_int.hpp:649
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write pointers into the data area to the ioWrapper, relative to the offsets in th...
Definition: tiffcomposite_int.cpp:964
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
Implements writeData(). Write the data area to the ioWrapper. Return the number of bytes written.
Definition: tiffcomposite_int.cpp:1137
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:620
size_t doSizeData() const override
Implements sizeData(). Return the size of the data area.
Definition: tiffcomposite_int.cpp:1367
void setStrips(const Value *pSize, const byte *pData, size_t sizeData, size_t baseOffset) override
Set the data areas ("strips").
Definition: tiffcomposite_int.cpp:209
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:702
TiffDataEntry * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:129
TIFF composite visitor to decode metadata from the TIFF tree and add it to an Image,...
Definition: tiffvisitor_int.hpp:251
This class models a TIFF directory (Ifd). It is a composite component of the TIFF tree.
Definition: tiffcomposite_int.hpp:823
TiffDirectory(uint16_t tag, IfdId group, bool hasNext=true)
Default constructor.
Definition: tiffcomposite_int.cpp:62
TiffComponent * doAddChild(TiffComponent::UniquePtr tiffComponent) override
Implements addChild(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:550
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:632
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
This class does not really implement writeData(), it only has write(). This method must not be called...
Definition: tiffcomposite_int.cpp:1113
size_t doSizeImage() const override
Implements sizeImage(). Return the sum of the image sizes of all components plus that of the next-IFD...
Definition: tiffcomposite_int.cpp:1389
TiffDirectory & operator=(const TiffDirectory &)=delete
Assignment operator.
TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object) override
Implements addPath(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:409
size_t doSize() const override
Implements size(). Return the size of the TIFF directory, values and additional data,...
Definition: tiffcomposite_int.cpp:1262
bool hasNext() const
Return true if the directory has a next pointer.
Definition: tiffcomposite_int.hpp:845
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write the TIFF directory, values and additional data, including the next-IFD,...
Definition: tiffcomposite_int.cpp:787
size_t doSizeData() const override
This class does not really implement sizeData(), it only has size(). This method must not be called; ...
Definition: tiffcomposite_int.cpp:1350
size_t doCount() const override
Implements count(). Return the number of entries in the TIFF directory. Does not count entries which ...
Definition: tiffcomposite_int.cpp:730
~TiffDirectory() override=default
Virtual destructor.
TiffDirectory * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:141
TiffComponent * doAddNext(TiffComponent::UniquePtr tiffComponent) override
Implements addNext(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:591
size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const override
Implements writeImage(). Write the image data of the TIFF directory to the ioWrapper by forwarding th...
Definition: tiffcomposite_int.cpp:1176
TIFF composite visitor to encode metadata from an image to the TIFF tree. The metadata containers and...
Definition: tiffvisitor_int.hpp:343
This abstract base class provides the common functionality of an IFD directory entry and defines an e...
Definition: tiffcomposite_int.hpp:380
size_t doSize() const override
Implements size(). Return the size of a standard TIFF entry.
Definition: tiffcomposite_int.cpp:1288
void updateValue(Value::UniquePtr value, ByteOrder byteOrder)
Update the value. Takes ownership of the pointer passed in.
Definition: tiffcomposite_int.cpp:187
void encode(TiffEncoder &encoder, const Exifdatum *datum)
Encode a TIFF component from the metadatum provided and information from the encoder as needed.
Definition: tiffcomposite_int.cpp:690
size_t offset() const
Return the offset to the data area relative to the base for the component (usually the start of the T...
Definition: tiffcomposite_int.hpp:462
size_t doSizeData() const override
Implements sizeData(). Return 0.
Definition: tiffcomposite_int.cpp:1354
void setIdx(int idx)
Set the unique id of the entry in the image.
Definition: tiffcomposite_int.hpp:498
void setData(byte *pData, size_t size, std::shared_ptr< DataBuf > storage)
Set pointer and size of the entry's data (not taking ownership of the data).
Definition: tiffcomposite_int.cpp:179
std::shared_ptr< DataBuf > storage() const
Used (internally) to create another reference to the DataBuf reference by storage_.
Definition: tiffcomposite_int.hpp:537
TiffType tiffType() const
Return the TIFF type.
Definition: tiffcomposite_int.hpp:455
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write the value of a standard TIFF entry to the ioWrapper, return the number of b...
Definition: tiffcomposite_int.cpp:934
constexpr TiffEntryBase(uint16_t tag, IfdId group, TiffType tiffType=ttUndefined)
Default constructor.
Definition: tiffcomposite_int.hpp:388
size_t doCount() const override
Implements count().
Definition: tiffcomposite_int.cpp:734
const byte * pData() const
Return a pointer to the binary representation of the value of this component.
Definition: tiffcomposite_int.hpp:473
void setOffset(size_t offset)
Set the offset.
Definition: tiffcomposite_int.hpp:413
virtual void doEncode(TiffEncoder &encoder, const Exifdatum *datum)=0
Implements encode().
int idx() const override
Return the unique id of the entry in the image.
Definition: tiffcomposite_int.cpp:169
void setCount(size_t count)
Set the number of components in this entry.
Definition: tiffcomposite_int.hpp:494
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
Implements writeData(). Standard TIFF entries have no data: write nothing and return 0.
Definition: tiffcomposite_int.cpp:1122
const Value * pValue() const
Return a const pointer to the converted value of this component.
Definition: tiffcomposite_int.hpp:477
~TiffEntryBase() override=default
Virtual destructor.
TiffEntryBase & operator=(const TiffEntryBase &)=delete
Assignment operator.
size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const override
Implements writeImage(). Standard TIFF entries have no image data: write nothing and return 0.
Definition: tiffcomposite_int.cpp:1201
size_t doSizeImage() const override
Implements sizeImage(). Return 0.
Definition: tiffcomposite_int.cpp:1412
static size_t writeOffset(byte *buf, size_t offset, TiffType tiffType, ByteOrder byteOrder)
Helper function to write an offset to a preallocated binary buffer.
Definition: tiffcomposite_int.cpp:945
void setValue(Value::UniquePtr value)
Set tag value. Takes ownership of the pointer passed in.
Definition: tiffcomposite_int.cpp:201
A standard TIFF IFD entry.
Definition: tiffcomposite_int.hpp:568
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:616
TiffEntry * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:125
constexpr TiffEntry(uint16_t tag, IfdId group)
Constructor.
Definition: tiffcomposite_int.hpp:573
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:706
Tiff IFD Makernote. This is a concrete class suitable for all IFD makernotes.
Definition: tiffcomposite_int.hpp:1067
size_t doCount() const override
Implements count(). Return the number of entries in the IFD of the Makernote. Does not count entries ...
Definition: tiffcomposite_int.cpp:754
size_t baseOffset() const
Return the base offset for use with the makernote IFD entries relative to the start of the TIFF heade...
Definition: tiffcomposite_int.cpp:307
bool readHeader(const byte *pData, size_t size, ByteOrder byteOrder)
Read the header from a data buffer, return true if successful.
Definition: tiffcomposite_int.cpp:313
size_t writeHeader(IoWrapper &ioWrapper, ByteOrder byteOrder) const
Write the header to a data buffer, return the number of bytes written.
Definition: tiffcomposite_int.cpp:330
TiffComponent * doAddNext(TiffComponent::UniquePtr tiffComponent) override
Implements addNext(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:607
void setByteOrder(ByteOrder byteOrder)
Set the byte order for the makernote.
Definition: tiffcomposite_int.cpp:319
size_t doSizeImage() const override
Implements sizeImage(). Return the total image data size of the makernote IFD.
Definition: tiffcomposite_int.cpp:1408
size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const override
Implements writeImage(). Write the image data of the IFD of the Makernote. Return the number of bytes...
Definition: tiffcomposite_int.cpp:1213
size_t sizeHeader() const
Return the size of the header in bytes.
Definition: tiffcomposite_int.cpp:324
size_t mnOffset() const
Return the offset to the makernote from the start of the TIFF header.
Definition: tiffcomposite_int.cpp:303
TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object) override
Implements addPath(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:501
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:666
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
This class does not really implement writeData(), it only has write(). This method must not be called...
Definition: tiffcomposite_int.cpp:1167
~TiffIfdMakernote() override
Virtual destructor.
TiffIfdMakernote * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:153
TiffIfdMakernote & operator=(const TiffIfdMakernote &)=delete
Assignment operator.
void setImageByteOrder(ByteOrder byteOrder)
Set the byte order used for the image.
Definition: tiffcomposite_int.hpp:1108
size_t doSizeData() const override
This class does not really implement sizeData(), it only has size(). This method must not be called; ...
Definition: tiffcomposite_int.cpp:1381
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write the Makernote header, TIFF directory, values and additional data to the ioW...
Definition: tiffcomposite_int.cpp:1028
ByteOrder byteOrder() const
Return the byte order for the makernote. Requires the image byte order to be set (setImageByteOrder()...
Definition: tiffcomposite_int.cpp:296
size_t ifdOffset() const
Return the offset to the start of the Makernote IFD from the start of the Makernote....
Definition: tiffcomposite_int.cpp:290
TiffIfdMakernote(uint16_t tag, IfdId group, IfdId mnGroup, std::unique_ptr< MnHeader > pHeader, bool hasNext=true)
Default constructor.
Definition: tiffcomposite_int.cpp:69
TiffIfdMakernote(const TiffIfdMakernote &)=delete
Copy constructor.
size_t doSize() const override
Implements size(). Return the size of the Makernote header, TIFF directory, values and additional dat...
Definition: tiffcomposite_int.cpp:1307
TiffComponent * doAddChild(TiffComponent::UniquePtr tiffComponent) override
Implements addChild(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:573
A standard TIFF IFD entry consisting of a value which is an array of offsets to image data areas....
Definition: tiffcomposite_int.hpp:714
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:710
size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const override
Implements writeImage(). Write the image data area to the ioWrapper. Return the number of bytes writt...
Definition: tiffcomposite_int.cpp:1221
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:624
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
Implements writeData(). Write the image data area to the ioWrapper. Return the number of bytes writte...
Definition: tiffcomposite_int.cpp:1127
TiffImageEntry * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:133
size_t doSizeData() const override
Implements sizeData(). Return the size of the image data area.
Definition: tiffcomposite_int.cpp:1358
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write pointers into the image data area to the ioWrapper. Return the number of by...
Definition: tiffcomposite_int.cpp:982
void setStrips(const Value *pSize, const byte *pData, size_t sizeData, size_t baseOffset) override
Set the data areas ("strips").
Definition: tiffcomposite_int.cpp:258
size_t doSize() const override
Implements size(). Return the size of the strip pointers.
Definition: tiffcomposite_int.cpp:1292
size_t doSizeImage() const override
Implements sizeImage(). Return the size of the image data area.
Definition: tiffcomposite_int.cpp:1416
This class is the basis for Makernote support in TIFF. It contains a pointer to a concrete Makernote....
Definition: tiffcomposite_int.hpp:1006
TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object) override
Implements addPath(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:484
TiffComponent * doAddNext(TiffComponent::UniquePtr tiffComponent) override
Implements addNext(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:599
constexpr TiffMnEntry(uint16_t tag, IfdId group, IfdId mnGroup)
Default constructor.
Definition: tiffcomposite_int.hpp:1015
TiffMnEntry * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:149
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:656
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:714
TiffComponent * doAddChild(TiffComponent::UniquePtr tiffComponent) override
Implements addChild(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:565
size_t doSize() const override
Implements size() by forwarding the call to the actual concrete Makernote, if there is one.
Definition: tiffcomposite_int.cpp:1300
size_t doCount() const override
Implements count(). Return number of components in the entry.
Definition: tiffcomposite_int.cpp:738
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write() by forwarding the call to the actual concrete Makernote, if there is one.
Definition: tiffcomposite_int.cpp:1020
A tuple consisting of extended Tag and group used as an item in TIFF paths.
Definition: tiffcomposite_int.hpp:62
IfdId group() const
Return the group.
Definition: tiffcomposite_int.hpp:82
uint16_t tag() const
Return the tag corresponding to the extended tag.
Definition: tiffcomposite_int.hpp:74
uint32_t extendedTag() const
Return the extended tag (32 bit so that it can contain special tags)
Definition: tiffcomposite_int.hpp:78
constexpr TiffPathItem(uint32_t extendedTag, IfdId group)
Constructor.
Definition: tiffcomposite_int.hpp:67
TIFF composite visitor to read the TIFF structure from a block of memory and build the composite from...
Definition: tiffvisitor_int.hpp:579
A TIFF IFD entry containing the size of a data area of a related TiffDataEntry. This component is use...
Definition: tiffcomposite_int.hpp:778
IfdId dtGroup() const
Return the group of the related entry which has the data area.
Definition: tiffcomposite_int.hpp:796
constexpr TiffSizeEntry(uint16_t tag, IfdId group, uint16_t dtTag, IfdId dtGroup)
Constructor.
Definition: tiffcomposite_int.hpp:783
uint16_t dtTag() const
Return the group of the related entry which has the data area.
Definition: tiffcomposite_int.hpp:792
TiffSizeEntry * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:137
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:628
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:718
This class models a TIFF sub-directory (sub-IFD). A sub-IFD is an entry with one or more values that ...
Definition: tiffcomposite_int.hpp:932
size_t doSizeImage() const override
Implements sizeImage(). Return the sum of the image sizes of all sub-IFDs.
Definition: tiffcomposite_int.cpp:1400
size_t doWrite(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t valueIdx, size_t dataIdx, size_t &imageIdx) override
Implements write(). Write the sub-IFD pointers to the ioWrapper, return the number of bytes written....
Definition: tiffcomposite_int.cpp:1006
TiffSubIfd * doClone() const override
Internal virtual copy constructor, implements clone().
Definition: tiffcomposite_int.cpp:145
size_t doWriteData(IoWrapper &ioWrapper, ByteOrder byteOrder, size_t offset, size_t dataIdx, size_t &imageIdx) const override
Implements writeData(). Write the sub-IFDs to the ioWrapper. Return the number of bytes written.
Definition: tiffcomposite_int.cpp:1153
size_t doWriteImage(IoWrapper &ioWrapper, ByteOrder byteOrder) const override
Implements writeImage(). Write the image data of each sub-IFD to the ioWrapper. Return the number of ...
Definition: tiffcomposite_int.cpp:1205
size_t doSizeData() const override
Implements sizeData(). Return the sum of the sizes of all sub-IFDs.
Definition: tiffcomposite_int.cpp:1373
TiffComponent * doAddPath(uint16_t tag, TiffPath &tiffPath, TiffComponent *pRoot, TiffComponent::UniquePtr object) override
Implements addPath(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:457
~TiffSubIfd() override=default
Virtual destructor.
TiffSubIfd(uint16_t tag, IfdId group, IfdId newGroup)
Default constructor.
Definition: tiffcomposite_int.cpp:65
size_t doSize() const override
Implements size(). Return the size of the sub-Ifd pointers.
Definition: tiffcomposite_int.cpp:1296
TiffComponent * doAddChild(TiffComponent::UniquePtr tiffComponent) override
Implements addChild(). The default implementation does nothing.
Definition: tiffcomposite_int.cpp:555
void doEncode(TiffEncoder &encoder, const Exifdatum *datum) override
Implements encode().
Definition: tiffcomposite_int.cpp:722
void doAccept(TiffVisitor &visitor) override
Implements accept().
Definition: tiffcomposite_int.cpp:647
Abstract base class defining the interface for TIFF composite visitors (Visitor pattern)
Definition: tiffvisitor_int.hpp:39
Common interface for all types of values used with metadata.
Definition: value.hpp:33
std::unique_ptr< Value > UniquePtr
Shortcut for a Value auto pointer.
Definition: value.hpp:36
const uint32_t cmt2
Special tag: root IFD of CR3 images.
Definition: tiffcomposite_int.hpp:53
const uint32_t fuji
Special tag: root IFD of Fujifilm RAF images.
Definition: tiffcomposite_int.hpp:52
const uint32_t none
Dummy tag.
Definition: tiffcomposite_int.hpp:47
const uint32_t cmt4
Special tag: root IFD of CR3 images.
Definition: tiffcomposite_int.hpp:55
const uint32_t pana
Special tag: root IFD of Panasonic RAW images.
Definition: tiffcomposite_int.hpp:51
const uint32_t root
Special tag: root IFD.
Definition: tiffcomposite_int.hpp:48
const uint32_t cmt3
Special tag: root IFD of CR3 images.
Definition: tiffcomposite_int.hpp:54
const uint32_t all
Special tag: all tags in a group.
Definition: tiffcomposite_int.hpp:50
const uint32_t next
Special tag: next IFD.
Definition: tiffcomposite_int.hpp:49
bool cmpGroupLt(const std::unique_ptr< TiffDirectory > &lhs, const std::unique_ptr< TiffDirectory > &rhs)
Compare two TIFF component pointers by group. Return true if the group of component lhs is less than ...
Definition: tiffcomposite_int.cpp:1482
const TiffType ttTiffFloat
TIFF FLOAT type.
Definition: tiffcomposite_int.hpp:34
TiffComponent::UniquePtr newTiffThumbSize(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF entry for a thumbnail (size)
Definition: tiffcomposite_int.hpp:1528
const TiffType ttUnsignedLong
Exif LONG type.
Definition: tiffcomposite_int.hpp:27
const TiffType ttSignedByte
Exif SBYTE type.
Definition: tiffcomposite_int.hpp:29
const TiffType ttUnsignedRational
Exif RATIONAL type.
Definition: tiffcomposite_int.hpp:28
const TiffType ttTiffDouble
TIFF DOUBLE type.
Definition: tiffcomposite_int.hpp:35
TiffComponent::UniquePtr newTiffEntry(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF entry.
Definition: tiffcomposite_int.cpp:1486
TiffComponent::UniquePtr newTiffBinaryArray0(uint16_t tag, IfdId group)
Function to create and initialize a new binary array entry.
Definition: tiffcomposite_int.hpp:1504
TiffComponent::UniquePtr newTiffDirectory(uint16_t tag, IfdId)
Function to create and initialize a new TIFF directory.
Definition: tiffcomposite_int.hpp:1492
void(TiffEncoder::*)(TiffEntryBase *, const Exifdatum *) EncoderFct
Function pointer type for a TiffDecoder member function to decode a TIFF component.
Definition: tifffwd_int.hpp:60
TiffComponent::UniquePtr newTiffMnEntry(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF makernote entry.
Definition: tiffcomposite_int.cpp:1490
TiffComponent::UniquePtr newTiffSubIfd(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF sub-directory.
Definition: tiffcomposite_int.hpp:1498
const TiffType ttTiffIfd
TIFF IFD type.
Definition: tiffcomposite_int.hpp:36
const TiffType ttSignedShort
Exif SSHORT type.
Definition: tiffcomposite_int.hpp:31
TiffComponent::UniquePtr newTiffImageData(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF entry for image data.
Definition: tiffcomposite_int.hpp:1534
std::stack< TiffPathItem > TiffPath
Stack to hold a path from the TIFF root element to a TIFF entry.
Definition: tifffwd_int.hpp:77
int(*)(uint16_t, const byte *, size_t, TiffComponent *) CfgSelFct
Function pointer type for a function to determine which cfg + def of a corresponding array set to use...
Definition: tiffcomposite_int.hpp:1212
const TiffType ttAsciiString
Exif ASCII type.
Definition: tiffcomposite_int.hpp:25
const TiffType ttUnsignedShort
Exif SHORT type.
Definition: tiffcomposite_int.hpp:26
const TiffType ttSignedLong
Exif SLONG type.
Definition: tiffcomposite_int.hpp:32
void(TiffDecoder::*)(const TiffEntryBase *) DecoderFct
Function pointer type for a TiffDecoder member function to decode a TIFF component.
Definition: tifffwd_int.hpp:55
TiffComponent::UniquePtr newTiffBinaryArray1(uint16_t tag, IfdId group)
Function to create and initialize a new simple binary array entry.
Definition: tiffcomposite_int.hpp:1510
TiffComponent::UniquePtr newTiffBinaryArray2(uint16_t tag, IfdId group)
Function to create and initialize a new complex binary array entry.
Definition: tiffcomposite_int.hpp:1516
DataBuf(*)(uint16_t, const byte *, size_t, TiffComponent *) CryptFct
Function pointer type for a crypt function used for binary arrays.
Definition: tiffcomposite_int.hpp:1215
const TiffType ttUnsignedByte
Exif BYTE type.
Definition: tiffcomposite_int.hpp:24
TiffComponent::UniquePtr newTiffThumbData(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF entry for a thumbnail (data)
Definition: tiffcomposite_int.hpp:1522
TypeId toTypeId(TiffType tiffType, uint16_t tag, IfdId group)
Convert the tiffType of a tag and group to an Exiv2 typeId.
Definition: tiffcomposite_int.cpp:1448
TiffType toTiffType(TypeId typeId)
Convert the Exiv2 typeId to a TIFF value type.
Definition: tiffcomposite_int.cpp:1465
const TiffType ttUndefined
Exif UNDEFINED type.
Definition: tiffcomposite_int.hpp:30
uint16_t TiffType
TIFF value type.
Definition: tiffcomposite_int.hpp:22
TiffComponent::UniquePtr newTiffBinaryElement(uint16_t tag, IfdId group)
Function to create and initialize a new binary array element.
Definition: tiffcomposite_int.cpp:1494
TiffComponent::UniquePtr newTiffImageSize(uint16_t tag, IfdId group)
Function to create and initialize a new TIFF entry for image data (size)
Definition: tiffcomposite_int.hpp:1540
const TiffType ttSignedRational
Exif SRATIONAL type.
Definition: tiffcomposite_int.hpp:33
Class CrwImage to access Canon CRW images. References: The Canon RAW (CRW) File Format by Phil Harv...
Definition: asfvideo.hpp:15
IfdId
Type to specify the IFD to which a metadata belongs.
Definition: tags.hpp:34
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:70
ByteOrder
Type to express the byte order (little or big endian)
Definition: types.hpp:34
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
Additional configuration for a binary array.
Definition: tiffcomposite_int.hpp:1232
bool hasSize_
If true, first tag is the size element.
Definition: tiffcomposite_int.hpp:1245
ArrayDef elDefaultDef_
Default element.
Definition: tiffcomposite_int.hpp:1248
bool concat_
If true, concatenate gaps between defined tags to single tags.
Definition: tiffcomposite_int.hpp:1247
CryptFct cryptFct_
Crypt function, 0 if not used.
Definition: tiffcomposite_int.hpp:1244
TiffType elTiffType_
Type for the array entry and the size element, if any.
Definition: tiffcomposite_int.hpp:1243
ByteOrder byteOrder_
Byte order, invalidByteOrder to inherit.
Definition: tiffcomposite_int.hpp:1242
size_t tagStep() const
Return the size of the default tag, which is used to calculate tag numbers as idx/tagStep.
Definition: tiffcomposite_int.hpp:1237
IfdId group_
Group for the elements.
Definition: tiffcomposite_int.hpp:1241
bool hasFillers_
If true, write all defined tags.
Definition: tiffcomposite_int.hpp:1246
Defines one tag in a binary array.
Definition: tiffcomposite_int.hpp:1218
size_t count_
Number of components.
Definition: tiffcomposite_int.hpp:1228
bool operator==(size_t idx) const
Comparison with idx.
Definition: tiffcomposite_int.hpp:1220
size_t idx_
Index in bytes from the start.
Definition: tiffcomposite_int.hpp:1226
TiffType tiffType_
TIFF type of the element.
Definition: tiffcomposite_int.hpp:1227
size_t size(uint16_t tag, IfdId group) const
Get the size in bytes of a tag.
Definition: tiffcomposite_int.cpp:336
Combination of array configuration and definition for arrays.
Definition: tiffcomposite_int.hpp:1252
const ArrayDef * def_
Binary array definition array.
Definition: tiffcomposite_int.hpp:1254
ArrayCfg cfg_
Binary array configuration.
Definition: tiffcomposite_int.hpp:1253
size_t defSize_
Size of the array definition array.
Definition: tiffcomposite_int.hpp:1255
Search key for TIFF mapping structures.
Definition: tiffcomposite_int.hpp:368
std::string m_
Camera make.
Definition: tiffcomposite_int.hpp:369
uint32_t e_
Extended tag.
Definition: tiffcomposite_int.hpp:370
IfdId g_
Group
Definition: tiffcomposite_int.hpp:371
TIFF mapping table for functions to decode special cases.
Definition: tiffcomposite_int.hpp:342
IfdId group_
Group that contains the tag.
Definition: tiffcomposite_int.hpp:361
const char * make_
Camera make for which these mapping functions apply.
Definition: tiffcomposite_int.hpp:359
uint16_t tag() const
Return the tag corresponding to the extended tag.
Definition: tiffcomposite_int.hpp:354
bool operator==(const Key &key) const
Compare a TiffMappingInfo with a TiffMappingInfo::Key. The two are equal if TiffMappingInfo::make_ eq...
Definition: tiffcomposite_int.cpp:27
uint32_t extendedTag_
Tag (32 bit so that it can contain special tags)
Definition: tiffcomposite_int.hpp:360
DecoderFct decoderFct_
Decoder function for matching tags.
Definition: tiffcomposite_int.hpp:362
EncoderFct encoderFct_
Encoder function for matching tags.
Definition: tiffcomposite_int.hpp:363