3 #ifndef EXIV2_CRWIMAGE_INT_HPP
4 #define EXIV2_CRWIMAGE_INT_HPP
9 #include "tags_int.hpp"
41 enum class DataLocId { valueData, directoryData, lastDataLocId };
100 void remove(
CrwDirs& crwDirs, uint16_t crwTagId);
166 void print(std::ostream& os,
ByteOrder byteOrder,
const std::string& prefix =
"")
const;
174 [[nodiscard]] uint16_t
dir()
const {
179 [[nodiscard]] uint16_t
tag()
const {
184 [[nodiscard]]
bool empty()
const;
194 [[nodiscard]]
size_t size()
const {
209 [[nodiscard]] uint16_t
tagId()
const {
210 return tag_ & 0x3fff;
258 virtual void doPrint(std::ostream& os,
ByteOrder byteOrder,
const std::string& prefix)
const;
260 [[nodiscard]]
virtual bool doEmpty()
const;
277 const byte* pData_ =
nullptr;
294 void doAdd(
UniquePtr component)
override;
305 void doDecode(Image& image,
ByteOrder byteOrder)
const override;
342 void doAdd(
UniquePtr component)
override;
346 void doRemove(
CrwDirs& crwDirs, uint16_t crwTagId)
override;
353 void doRead(
const byte* pData,
size_t size, uint32_t start,
ByteOrder byteOrder)
override;
359 void doDecode(Image& image,
ByteOrder byteOrder)
const override;
362 void doPrint(std::ostream& os,
ByteOrder byteOrder,
const std::string& prefix)
const override;
365 [[nodiscard]]
bool doEmpty()
const override;
368 [[nodiscard]]
CiffComponent* doFindComponent(uint16_t crwTagId, uint16_t crwDir)
const override;
408 void read(
const byte* pData,
size_t size);
418 void add(uint16_t crwTagId, uint16_t crwDir,
DataBuf&& buf);
427 void remove(uint16_t crwTagId, uint16_t crwDir)
const;
454 void decode(Image& image)
const;
469 static constexpr
auto signature_ =
"HEAPCCDR";
471 std::unique_ptr<CiffDirectory> pRootDir_;
473 uint32_t offset_ = 0;
474 std::vector<byte> pPadding_;
475 uint32_t padded_ = 0;
531 static const CrwMapping* crwMapping(uint16_t crwDir, uint16_t crwTagId);
542 static void decodeBasic(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
546 static void decode0x0805(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
550 static void decode0x080a(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
554 static void decodeArray(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
558 static void decode0x180e(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
562 static void decode0x1810(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
566 static void decode0x2008(
const CiffComponent& ciffComponent,
const CrwMapping* pCrwMapping, Image& image,
583 static void encodeBasic(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
586 static void encode0x0805(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
589 static void encode0x080a(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
592 static void encodeArray(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
595 static void encode0x180e(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
598 static void encode0x1810(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
601 static void encode0x2008(
const Image& image,
const CrwMapping* pCrwMapping,
CiffHeader* pHead);
604 static const CrwMapping crwMapping_[];
621 #endif // EXIV2_CRWIMAGE_INT_HPP
void add(UniquePtr component)
Add a component to the composition.
Definition: crwimage_int.cpp:142
size_t write(Blob &blob, ByteOrder byteOrder, size_t offset)
Write the metadata from the raw metadata component to the binary image blob. This method may append t...
Definition: crwimage_int.cpp:314
A container for Exif data. This is a top-level class of the Exiv2 library. The container holds Exifda...
Definition: exif.hpp:373
Definition: crwimage_int.hpp:23
uint16_t crwTagId_
CRW tag id.
Definition: crwimage_int.hpp:484
void setValue(DataBuf &&buf)
Set the data value of the entry.
Definition: crwimage_int.cpp:440
ByteOrder
Type to express the byte order (little or big endian)
Definition: types.hpp:34
void decode(Image &image, ByteOrder byteOrder) const
Decode metadata from the component and add it to image.
Definition: crwimage_int.cpp:271
virtual void doAdd(UniquePtr component)=0
Implements add()
DataBuf packIfdId(const ExifData &exifData, IfdId ifdId, ByteOrder byteOrder)
Pack the tag values of all ifdId tags in exifData into a data buffer. This function is used to pack C...
Definition: crwimage_int.cpp:998
TypeId
Exiv2 value type identifiers.
Definition: types.hpp:70
This class models a CIFF directory of a CRW (Canon Raw data) image.
Definition: crwimage_int.hpp:311
const byte * pData() const
Return a pointer to the data area of this component.
Definition: crwimage_int.hpp:204
uint16_t tagId() const
Return the tag id of this component.
Definition: crwimage_int.hpp:209
void read(const byte *pData, size_t size, uint32_t start, ByteOrder byteOrder)
Read a component from a data buffer.
Definition: crwimage_int.cpp:181
uint8_t byte
1 byte unsigned integer type.
Definition: types.hpp:26
Abstract base class defining the interface for an image. This is the top-level interface to the Exiv2...
Definition: image.hpp:50
uint16_t dir() const
Return the tag of the directory containing this component.
Definition: crwimage_int.hpp:174
uint16_t tag() const
Return the tag of this component.
Definition: crwimage_int.hpp:179
size_t size() const
Return the data size of this component.
Definition: crwimage_int.hpp:194
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
CrwDecodeFct toExif_
Conversion function.
Definition: crwimage_int.hpp:489
CiffComponent()=default
Default constructor.
virtual size_t doWrite(Blob &blob, ByteOrder byteOrder, size_t offset)=0
Implements write()
std::unique_ptr< CiffComponent > UniquePtr
CiffComponent auto_ptr type.
Definition: crwimage_int.hpp:55
IfdId
Type to specify the IFD to which a metadata belongs.
Definition: tags.hpp:34
void(*)(const Image &, const CrwMapping *, CiffHeader *) CrwEncodeFct
Function pointer for functions to encode CRW entries from Exif tags.
Definition: crwimage_int.hpp:35
DataLocId dataLocation() const
Return the data location for this component.
Definition: crwimage_int.hpp:219
TypeId typeId() const
Return the type id of this component.
Definition: crwimage_int.hpp:214
This class models one directory entry of a CIFF directory of a CRW (Canon Raw data) image...
Definition: crwimage_int.hpp:288
virtual CiffComponent * doFindComponent(uint16_t crwTagId, uint16_t crwDir) const
Implements findComponent(). The default implementation checks the entry.
Definition: crwimage_int.cpp:494
void setOffset(size_t offset)
Set the offset for this component.
Definition: crwimage_int.hpp:248
IfdId ifdId_
Exif Ifd id to map to.
Definition: crwimage_int.hpp:488
size_t writeValueData(Blob &blob, size_t offset)
Writes the entry's value if size is larger than eight bytes. If needed, the value is padded with one ...
Definition: crwimage_int.cpp:322
CrwEncodeFct fromExif_
Reverse conversion function.
Definition: crwimage_int.hpp:490
static void loadStack(CrwDirs &crwDirs, uint16_t crwDir)
Load the stack: loop through the CRW subdirs hierarchy and push all directories on the path from crwD...
Definition: crwimage_int.cpp:820
void(*)(const CiffComponent &, const CrwMapping *, Image &, ByteOrder) CrwDecodeFct
Function pointer for functions to decode Exif tags from a CRW entry.
Definition: crwimage_int.hpp:32
Helper structure for the Matroska tags lookup table.
Definition: matroskavideo.hpp:39
Static class providing mapping functionality from CRW entries to image metadata and vice versa...
Definition: crwimage_int.hpp:497
Structure for a mapping table for conversion of CIFF entries to image metadata and vice versa...
Definition: crwimage_int.hpp:483
virtual void doDecode(Image &image, ByteOrder byteOrder) const =0
Implements decode()
DataLocId
Type to identify where the data is stored in a directory.
Definition: crwimage_int.hpp:41
uint32_t size_
Data size (overwrites the size from the entry)
Definition: crwimage_int.hpp:486
static void decode(const CiffComponent &ciffComponent, Image &image, ByteOrder byteOrder)
Decode image metadata from a CRW entry, convert and add it to the image metadata. This function conve...
Definition: crwimage_int.cpp:627
virtual bool doEmpty() const
Implements empty(). Default implementation returns true if size is 0.
Definition: crwimage_int.cpp:619
void setDir(uint16_t dir)
Set the directory tag for this component.
Definition: crwimage_int.hpp:137
void writeDirEntry(Blob &blob, ByteOrder byteOrder) const
Write a directory entry for the component to the blob. If the size of the data is not larger than 8 b...
Definition: crwimage_int.cpp:380
virtual void doRemove(CrwDirs &crwDirs, uint16_t crwTagId)
Implements remove(). The default implementation does nothing.
Definition: crwimage_int.cpp:589
void setSize(size_t size)
Set the size of the data area.
Definition: crwimage_int.hpp:244
size_t offset() const
Return the offset to the data from the start of the directory.
Definition: crwimage_int.hpp:199
uint16_t tag_
Exif tag to map to.
Definition: crwimage_int.hpp:487
void readDirectory(const byte *pData, size_t size, ByteOrder byteOrder)
Parse a CIFF directory from a memory buffer.
Definition: crwimage_int.cpp:237
virtual void doRead(const byte *pData, size_t size, uint32_t start, ByteOrder byteOrder)
Implements read(). The default implementation reads a directory entry.
Definition: crwimage_int.cpp:185
CiffComponent * findComponent(uint16_t crwTagId, uint16_t crwDir) const
Finds crwTagId in directory crwDir, returning a pointer to the component or 0 if not found...
Definition: crwimage_int.cpp:490
virtual ~CiffComponent()=default
Virtual destructor.
std::stack< CrwSubDir > CrwDirs
Stack to hold a path of CRW directories.
Definition: crwimage_int.hpp:38
void print(std::ostream &os, ByteOrder byteOrder, const std::string &prefix="") const
Print debug info about a component to os.
Definition: crwimage_int.cpp:414
std::vector< byte > Blob
Container for binary data.
Definition: types.hpp:102
static void encode(CiffHeader *pHead, const Image &image)
Encode image metadata from image into the CRW parse tree. This function converts all Exif metadata th...
Definition: crwimage_int.cpp:830
uint16_t crwDir_
CRW directory tag.
Definition: crwimage_int.hpp:485
virtual void doPrint(std::ostream &os, ByteOrder byteOrder, const std::string &prefix) const
Implements print(). The default implementation prints the entry.
Definition: crwimage_int.cpp:418
std::vector< CiffComponent * > Components
Container type to hold all metadata.
Definition: crwimage_int.hpp:57
~CiffDirectory() override
Virtual destructor.
Definition: crwimage_int.cpp:136
Interface class for components of the CIFF directory hierarchy of a CRW (Canon Raw data) image...
Definition: crwimage_int.hpp:52
bool empty() const
Return true if the component is empty, else false.
Definition: crwimage_int.cpp:615