// // Copyright 2005-2007 Adobe Systems Incorporated // // 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_PIXEL_ITERATOR_HPP #define BOOST_GIL_PIXEL_ITERATOR_HPP #include #include #include #include #include #include namespace boost { namespace gil { //forwarded declaration (as this file is included in step_iterator.hpp) template class memory_based_step_iterator; /// \brief metafunction predicate determining whether the given iterator is a plain one or an adaptor over another iterator. /// Examples of adaptors are the step iterator and the dereference iterator adaptor. template struct is_iterator_adaptor : public std::false_type {}; /// \brief returns the base iterator for a given iterator adaptor. Provide an specialization when introducing new iterator adaptors template struct iterator_adaptor_get_base; /// \brief Changes the base iterator of an iterator adaptor. Provide an specialization when introducing new iterator adaptors template struct iterator_adaptor_rebind; /// \brief Returns the type of an iterator just like the input iterator, except operating over immutable values template struct const_iterator_type; // The default implementation when the iterator is a C pointer is to use the standard constness semantics template struct const_iterator_type { using type = T const*; }; template struct const_iterator_type { using type = T const*; }; /// \brief Metafunction predicate returning whether the given iterator allows for changing its values /// \ingroup GILIsMutable template struct iterator_is_mutable{}; // The default implementation when the iterator is a C pointer is to use the standard constness semantics template struct iterator_is_mutable : std::true_type {}; template struct iterator_is_mutable : std::false_type {}; /// \defgroup PixelIteratorModelInterleavedPtr C pointer to a pixel /// \ingroup PixelIteratorModel /// \brief Iterators over interleaved pixels. /// A C pointer to a model of PixelValueConcept is used as an iterator over interleaved pixels. Models PixelIteratorConcept, HomogeneousPixelBasedConcept, HasDynamicXStepTypeConcept, MemoryBasedIteratorConcept ///////////////////////////// // HasDynamicXStepTypeConcept ///////////////////////////// /// \ingroup PixelIteratorModelInterleavedPtr template struct dynamic_x_step_type { using type = memory_based_step_iterator; }; /// \ingroup PixelIteratorModelInterleavedPtr template struct dynamic_x_step_type { using type = memory_based_step_iterator; }; ///////////////////////////// // PixelBasedConcept ///////////////////////////// template struct color_space_type : color_space_type {}; template struct color_space_type : color_space_type {}; template struct channel_mapping_type : channel_mapping_type {}; template struct channel_mapping_type : channel_mapping_type {}; template struct is_planar : is_planar {}; template struct is_planar : is_planar {}; ///////////////////////////// // HomogeneousPixelBasedConcept ///////////////////////////// template struct channel_type : channel_type {}; template struct channel_type : channel_type {}; //////////////////////////////////////////////////////////////////////////////////////// /// Support for pixel iterator movement measured in memory units (bytes or bits) as opposed to pixel type. /// Necessary to handle image row alignment and channel plane alignment. //////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////// // MemoryBasedIteratorConcept ///////////////////////////// template struct byte_to_memunit : std::integral_constant {}; template inline std::ptrdiff_t memunit_step(P const*) { return sizeof(P); } template inline std::ptrdiff_t memunit_distance(P const* p1, P const* p2) { return ( gil_reinterpret_cast_c(p2) - gil_reinterpret_cast_c(p1)); } template inline void memunit_advance(P* &p, std::ptrdiff_t diff) { p = (P*)((unsigned char*)(p)+diff); } template inline P* memunit_advanced(const P* p, std::ptrdiff_t diff) { return (P*)((char*)(p)+diff); } // memunit_advanced_ref // (shortcut to advancing a pointer by a given number of memunits and taking the reference in case the compiler is not smart enough) template inline P& memunit_advanced_ref(P* p, std::ptrdiff_t diff) { return *memunit_advanced(p,diff); } } } // namespace boost::gil #endif