123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- //
- // Copyright 2007-2008 Christian Henning, Andreas Pokorny, Lubomir Bourdev
- //
- // Distributed under 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
- #include <boost/gil/extension/io/tiff/detail/log.hpp>
- #include <boost/gil/detail/mp11.hpp>
- #include <boost/gil/io/base.hpp>
- #include <type_traits>
- // 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
- 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
- using arg_types = mp11::mp_list<typename property_base<unsigned short>::type>;
- };
- /// 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
- {
- using red_t = uint16_t *;
- using green_t = uint16_t *;
- using blue_t = uint16_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>
- {
- using arg_types = mp11::mp_list<uint16_t, uint16_t const*>;
- };
- /// 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.
- struct tiff_directory : property_base< tdir_t >
- {
- using default_value = std::integral_constant<type, 0>;
- };
- /// Non-baseline tags
- /// Defines type for icc profile property.
- struct tiff_icc_profile : tiff_property_base<std::vector<uint8_t>, TIFFTAG_ICCPROFILE>
- {
- using arg_types = mp11::mp_list<uint32_t, void const*>;
- };
- /// 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
|