// ***************************************************************** -*- C++ -*- /* * Copyright (C) 2004-2008 Andreas Huggel * * This program is part of the Exiv2 distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA. */ /*! @file tiffimage_int.hpp @brief Internal class TiffParserWorker to parse TIFF data. @version $Rev$ @author Andreas Huggel (ahu) ahuggel@gmx.net @date 23-Apr-08, ahu: created */ #ifndef TIFFIMAGE_INT_HPP_ #define TIFFIMAGE_INT_HPP_ // ***************************************************************************** // included header files #include "tifffwd_int.hpp" #include "image.hpp" #include "types.hpp" // + standard includes // ***************************************************************************** // namespace extensions namespace Exiv2 { /*! @brief Contains internal objects which are not published and are not part of the libexiv2 API. */ namespace Internal { // ***************************************************************************** // class definitions /*! @brief Abstract base class defining the interface of an image header. Used internally by classes for TIFF-based images. Default implementation is for the regular TIFF header. */ class TiffHeaderBase { public: //! @name Creators //@{ //! Constructor taking \em tag, \em size and default \em byteOrder and \em offset. TiffHeaderBase(uint16_t tag, uint32_t size, ByteOrder byteOrder, uint32_t offset); //! Virtual destructor. virtual ~TiffHeaderBase() =0; //@} //! @name Manipulators //@{ /*! @brief Read the image header from a data buffer. Return false if the data buffer does not contain an image header of the expected format, else true. @param pData Pointer to the data buffer. @param size Number of bytes in the data buffer. @return True if the TIFF header was read successfully. False if the data buffer does not contain a valid TIFF header. */ virtual bool read(const byte* pData, uint32_t size); //! Set the byte order. virtual void setByteOrder(ByteOrder byteOrder); //! Set the offset to the start of the root directory. virtual void setOffset(uint32_t offset); //@} //! @name Accessors //@{ /*! @brief Write the image header to the binary image \em blob. This method appends to the blob. @param blob Binary image to add to. @return Number of bytes written. */ virtual uint32_t write(Blob& blob) const; /*! @brief Print debug info for the image header to \em os. @param os Output stream to write to. @param prefix Prefix to be written before each line of output. */ virtual void print(std::ostream& os, const std::string& prefix ="") const; //! Return the byte order (little or big endian). virtual ByteOrder byteOrder() const; //! Return the offset to the start of the root directory. virtual uint32_t offset() const; //! Return the size (in bytes) of the image header. virtual uint32_t size() const; //! Return the tag value (magic number) which identifies the buffer as TIFF data virtual uint16_t tag() const; //@} private: // DATA const uint16_t tag_; //!< Tag to identify the buffer as TIFF data const uint32_t size_; //!< Size of the header ByteOrder byteOrder_; //!< Applicable byte order uint32_t offset_; //!< Offset to the start of the root dir }; // class TiffHeaderBase /*! @brief Standard TIFF header structure. */ class TiffHeade2 : public TiffHeaderBase { public: //! @name Creators //@{ //! Default constructor TiffHeade2(ByteOrder byteOrder =littleEndian); //! Destructor ~TiffHeade2(); //@} }; // class TiffHeade2 /*! @brief TIFF component factory for standard TIFF components. */ class TiffCreator { public: /*! @brief Create the TiffComponent for TIFF entry \em extendedTag and \em group based on the embedded lookup table. If the pointer that is returned is 0, then the TIFF entry should be ignored. */ static std::auto_ptr create(uint32_t extendedTag, uint16_t group); /*! @brief Get the path, i.e., a list of TiffStructure pointers, from the root TIFF element to the TIFF entry \em extendedTag and \em group. */ static void getPath(TiffPath& tiffPath, uint32_t extendedTag, uint16_t group); private: static const TiffStructure tiffStructure_[]; // parse(const byte* pData, uint32_t size, TiffCompFactoryFct createFct, TiffHeaderBase* pHeader); }; // class TiffParserWorker /*! @brief Table of TIFF decoding and encoding functions and find functions. This class is separated from the metadata decoder and encoder visitors so that the parser can be parametrized with a different table if needed. This is used, eg., for CR2 format, which uses a different decoder table. */ class TiffMapping { public: /*! @brief Find the decoder function for a key. If the returned pointer is 0, the tag should not be decoded, else the decoder function should be used. @param make Camera make @param extendedTag Extended tag @param group %Group @return Pointer to the decoder function */ static DecoderFct findDecoder(const std::string& make, uint32_t extendedTag, uint16_t group); /*! @brief Find special encoder function for a key. If the returned pointer is 0, the tag should be encoded with the encoder function of the TIFF component, else the encoder function should be used. @param make Camera make @param extendedTag Extended tag @param group %Group @return Pointer to the encoder function */ static EncoderFct findEncoder( const std::string& make, uint32_t extendedTag, uint16_t group ); private: static const TiffMappingInfo tiffMappingInfo_[]; //