diff options
Diffstat (limited to 'boost/gil/extension/io/tiff/tags.hpp')
-rw-r--r-- | boost/gil/extension/io/tiff/tags.hpp | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/boost/gil/extension/io/tiff/tags.hpp b/boost/gil/extension/io/tiff/tags.hpp new file mode 100644 index 0000000000..2242e969ea --- /dev/null +++ b/boost/gil/extension/io/tiff/tags.hpp @@ -0,0 +1,359 @@ +/* + Copyright 2007-2008 Christian Henning, Andreas Pokorny, Lubomir Bourdev + Use, modification and distribution are subject to the Boost Software License, + Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +*/ + +/*************************************************************************************************/ + +#ifndef BOOST_GIL_EXTENSION_IO_TIFF_TAGS_HPP +#define BOOST_GIL_EXTENSION_IO_TIFF_TAGS_HPP + +//////////////////////////////////////////////////////////////////////////////////////// +/// \file +/// \brief All supported tiff tags by the gil io extension. +/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n +/// +/// \date 2007-2008 \n +/// +//////////////////////////////////////////////////////////////////////////////////////// + +#include <boost/mpl/vector.hpp> + +// taken from jpegxx - https://bitbucket.org/edd/jpegxx/src/ea2492a1a4a6/src/ijg_headers.hpp +#ifndef BOOST_GIL_EXTENSION_IO_TIFF_C_LIB_COMPILED_AS_CPLUSPLUS + extern "C" { +#endif + +#include <tiff.h> + +#ifndef BOOST_GIL_EXTENSION_IO_TIFF_C_LIB_COMPILED_AS_CPLUSPLUS + } +#endif + +#include <boost/gil/io/base.hpp> +#include <boost/gil/extension/io/tiff/detail/log.hpp> + +namespace boost { namespace gil { + +/// Defines tiff tag. +struct tiff_tag : format_tag {}; + +/// http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html +/// http://www.remotesensing.org/libtiff/ + +/// TIFF property base class +template< typename T, int Value > +struct tiff_property_base : property_base< T > +{ + /// Tag, needed when reading or writing image properties. + static const ttag_t tag = Value; + /// The list of argument types used in the interface of LibTIFF + /// for + /// this property: + /// http://www.remotesensing.org/libtiff/man/TIFFGetField.3tiff.html + /// http://www.remotesensing.org/libtiff/man/TIFFSetField.3tiff.html + typedef mpl:: vector <typename property_base <T>:: type> arg_types; +}; + +/// baseline tags + +/// Defines type for new subfile property. +struct tiff_new_subfile_type : tiff_property_base< uint32_t, TIFFTAG_SUBFILETYPE > {}; + +/// Defines type for subfile property. +struct tiff_subfile_type : tiff_property_base< uint16_t, TIFFTAG_OSUBFILETYPE > {}; + +/// Defines type for image width property. +struct tiff_image_width : tiff_property_base< uint32_t, TIFFTAG_IMAGEWIDTH > {}; + +/// Defines type for image height property. +struct tiff_image_height : tiff_property_base< uint32_t, TIFFTAG_IMAGELENGTH > {}; + +/// Defines type for bits per sample property. +struct tiff_bits_per_sample : tiff_property_base< uint16_t, TIFFTAG_BITSPERSAMPLE > {}; + +/// Defines type for compression property. +struct tiff_compression : tiff_property_base< uint16_t, TIFFTAG_COMPRESSION > {}; + +/// Defines type for photometric interpretation property. +struct tiff_photometric_interpretation : tiff_property_base< uint16_t, TIFFTAG_PHOTOMETRIC > {}; + +/// Defines type for threshold property. +struct tiff_thresholding : tiff_property_base< uint16_t, TIFFTAG_THRESHHOLDING > {}; + +/// Defines type for cell width property. +struct tiff_cell_width : tiff_property_base< uint16_t, TIFFTAG_CELLWIDTH > {}; + +/// Defines type for cell length property. +struct tiff_cell_length : tiff_property_base< uint16_t, TIFFTAG_CELLLENGTH > {}; + +/// Defines type for fill order property. +struct tiff_fill_order : tiff_property_base< std::string, TIFFTAG_FILLORDER > {}; + +/// Defines type for image description. +struct tiff_image_description : tiff_property_base< std::string, TIFFTAG_IMAGEDESCRIPTION > {}; + +/// Defines type for make property. +struct tiff_make : tiff_property_base< std::string, TIFFTAG_MAKE > {}; + +/// Defines type for model property. +struct tiff_model : tiff_property_base< std::string, TIFFTAG_MODEL > {}; + +/// Defines type for image orientation. +struct tiff_orientation : tiff_property_base< uint16_t, TIFFTAG_ORIENTATION > {}; + +/// Defines type for samples per pixel property. +struct tiff_samples_per_pixel : tiff_property_base< uint16_t, TIFFTAG_SAMPLESPERPIXEL > {}; + +/// Defines type for rows per strip property. +struct tiff_rows_per_strip : tiff_property_base< uint32_t, TIFFTAG_ROWSPERSTRIP > {}; + +/// Defines type for min sample property. +struct tiff_min_sample_value : tiff_property_base< uint16_t, TIFFTAG_MINSAMPLEVALUE > {}; + +/// Defines type for max sample property. +struct tiff_max_sample_value : tiff_property_base< uint16_t, TIFFTAG_MAXSAMPLEVALUE > {}; + +/// Defines type for x resolution property. +struct tiff_x_resolution : tiff_property_base< float, TIFFTAG_XRESOLUTION > {}; + +/// Defines type for y resolution property. +struct tiff_y_resolution : tiff_property_base< float, TIFFTAG_YRESOLUTION > {}; + +/// Defines type for resolution unit property. +enum class tiff_resolution_unit_value: std:: uint16_t { + NONE = RESUNIT_NONE, + INCH = RESUNIT_INCH, + CENTIMETER = RESUNIT_CENTIMETER +}; + +struct tiff_resolution_unit : tiff_property_base< tiff_resolution_unit_value, TIFFTAG_RESOLUTIONUNIT > {}; + +/// Defines type for planar configuration property. +struct tiff_planar_configuration : tiff_property_base< uint16_t, TIFFTAG_PLANARCONFIG > {}; + +/// Defines type for gray response unit property. +struct tiff_gray_response_unit : tiff_property_base< uint16_t, TIFFTAG_GRAYRESPONSEUNIT > {}; + +/// Defines type for gray response curve property. +struct tiff_gray_response_curve : tiff_property_base< uint16_t*, TIFFTAG_GRAYRESPONSECURVE > {}; + +/// Defines type for software vendor property. +struct tiff_software : tiff_property_base< std::string, TIFFTAG_SOFTWARE > {}; + +/// Defines type for date time property. +struct tiff_date_time : tiff_property_base< std::string, TIFFTAG_DATETIME > {}; + +/// Defines type for artist information property. +struct tiff_artist : tiff_property_base< std::string, TIFFTAG_ARTIST > {}; + +/// Defines type for host computer property. +struct tiff_host_computer : tiff_property_base< std::string, TIFFTAG_HOSTCOMPUTER > {}; + +/// Helper structure for reading a color mapper. +struct tiff_color_map +{ + typedef uint16_t* red_t; + typedef uint16_t* green_t; + typedef uint16_t* blue_t; + + static const unsigned int tag = TIFFTAG_COLORMAP; +}; + +/// Defines type for extra samples property. +struct tiff_extra_samples : tiff_property_base< std:: vector <uint16_t>, TIFFTAG_EXTRASAMPLES > { + typedef mpl:: vector <uint16_t, uint16_t const *> arg_types; +}; + +/// Defines type for copyright property. +struct tiff_copyright : tiff_property_base< std::string, TIFFTAG_COPYRIGHT > {}; + +/// non-baseline tags + +/// Defines type for sample format property. +struct tiff_sample_format : tiff_property_base< uint16_t, TIFFTAG_SAMPLEFORMAT > {}; + +/// Defines type for indexed property. +/// Not supported yet +//struct tiff_indexed : tiff_property_base< bool, TIFFTAG_INDEXED > {}; + +/// Tile related tags + +/// Defines type for a (not) tiled tiff image +struct tiff_is_tiled : tiff_property_base< bool, false > {}; + +/// Defines type for tile width +struct tiff_tile_width : tiff_property_base< long, TIFFTAG_TILEWIDTH > {}; + +/// Defines type for tile length +struct tiff_tile_length : tiff_property_base< long, TIFFTAG_TILELENGTH > {}; + +/// Defines the page to read in a multipage tiff file. +#include <boost/mpl/integral_c.hpp> +struct tiff_directory : property_base< tdir_t > +{ + typedef boost::mpl::integral_c< type, 0 > default_value; +}; + +/// Non-baseline tags + +/// Defines type for icc profile property. +struct tiff_icc_profile : tiff_property_base< std:: vector <uint8_t>, TIFFTAG_ICCPROFILE > { + typedef mpl:: vector <uint32_t, void const *> arg_types; +}; + +/// Read information for tiff images. +/// +/// The structure is returned when using read_image_info. +template<> +struct image_read_info< tiff_tag > +{ + image_read_info() + : _width( 0 ) + , _height( 0 ) + + , _compression( COMPRESSION_NONE ) + + , _bits_per_sample( 0 ) + , _samples_per_pixel( 0 ) + , _sample_format( SAMPLEFORMAT_UINT ) + + , _planar_configuration( PLANARCONFIG_CONTIG ) + + , _photometric_interpretation( PHOTOMETRIC_MINISWHITE ) + + , _is_tiled( false ) + + , _tile_width ( 0 ) + , _tile_length( 0 ) + + , _x_resolution( 1 ) + , _y_resolution( 1 ) + , _resolution_unit( tiff_resolution_unit_value:: NONE ) + + , _icc_profile( ) + {} + + /// The number of rows of pixels in the image. + tiff_image_width::type _width; + /// The number of columns in the image, i.e., the number of pixels per row. + tiff_image_height::type _height; + + /// Compression scheme used on the image data. + tiff_compression::type _compression; + + /// Number of bits per component. + tiff_bits_per_sample::type _bits_per_sample; + /// The number of components per pixel. + tiff_samples_per_pixel::type _samples_per_pixel; + /// Specifies how to interpret each data sample in a pixel. + tiff_sample_format::type _sample_format; + + /// How the components of each pixel are stored. + tiff_planar_configuration::type _planar_configuration; + + /// The color space of the image data. + tiff_photometric_interpretation::type _photometric_interpretation; + + /// Is tiled? + tiff_is_tiled::type _is_tiled; + /// Tile width + tiff_tile_width::type _tile_width; + /// Tile length + tiff_tile_length::type _tile_length; + + tiff_x_resolution::type _x_resolution; + tiff_y_resolution::type _y_resolution; + tiff_resolution_unit::type _resolution_unit; + + tiff_icc_profile:: type _icc_profile; +}; + +/// Read settings for tiff images. +/// +/// The structure can be used for all read_xxx functions, except read_image_info. +template<> +struct image_read_settings< tiff_tag > : public image_read_settings_base +{ + /// Default constructor + image_read_settings< tiff_tag >() + : image_read_settings_base() + , _directory( tiff_directory::default_value::value ) + {} + + /// Constructor + /// \param top_left Top left coordinate for reading partial image. + /// \param dim Dimensions for reading partial image. + /// \param directory Defines the page to read in a multipage tiff file. + image_read_settings( const point_t& top_left + , const point_t& dim + , const tiff_directory::type& directory = tiff_directory::default_value::value + ) + : image_read_settings_base( top_left + , dim + ) + , _directory( directory ) + {} + + /// Defines the page to read in a multipage tiff file. + tiff_directory::type _directory; +}; + +/// Write settings for tiff images. +/// +/// The structure can be used for all write_xxx functions, except write_image_info. +template< typename Log > +struct image_write_info< tiff_tag, Log > +{ + /// Default constructor + image_write_info() + : _photometric_interpretation ( PHOTOMETRIC_MINISBLACK ) + , _photometric_interpretation_user_defined( false ) + + , _compression ( COMPRESSION_NONE ) + , _orientation ( ORIENTATION_TOPLEFT ) + , _planar_configuration ( PLANARCONFIG_CONTIG ) + , _is_tiled ( false ) + , _tile_width ( 0 ) + , _tile_length ( 0 ) + , _x_resolution ( 1 ) + , _y_resolution ( 1 ) + , _resolution_unit ( tiff_resolution_unit_value::NONE ) + , _icc_profile ( ) + {} + + /// The color space of the image data. + tiff_photometric_interpretation::type _photometric_interpretation; + bool _photometric_interpretation_user_defined; + + /// Compression scheme used on the image data. + tiff_compression::type _compression; + /// The orientation of the image with respect to the rows and columns. + tiff_orientation::type _orientation; + /// How the components of each pixel are stored. + tiff_planar_configuration::type _planar_configuration; + + /// Is the image tiled? + tiff_is_tiled::type _is_tiled; + /// Tiles width + tiff_tile_width::type _tile_width; + /// Tiles length + tiff_tile_length::type _tile_length; + + /// x, y resolution + tiff_x_resolution::type _x_resolution; + tiff_y_resolution::type _y_resolution; + tiff_resolution_unit::type _resolution_unit; + + tiff_icc_profile:: type _icc_profile; + + /// A log to transcript error and warning messages issued by libtiff. + Log _log; +}; + +} // namespace gil +} // namespace boost + +#endif |