9#ifndef BOOST_GIL_METAFUNCTIONS_HPP
10#define BOOST_GIL_METAFUNCTIONS_HPP
12#include <boost/core/use_default.hpp>
14#include <boost/gil/channel.hpp>
15#include <boost/gil/dynamic_step.hpp>
16#include <boost/gil/concepts.hpp>
17#include <boost/gil/concepts/detail/type_traits.hpp>
18#include <boost/gil/detail/mp11.hpp>
23namespace boost {
namespace gil {
26template <
typename T,
typename L>
struct pixel;
27template <
typename BitField,
typename ChannelRefs,
typename Layout>
struct packed_pixel;
28template <
typename T,
typename C>
struct planar_pixel_reference;
29template <
typename IC,
typename C>
struct planar_pixel_iterator;
30template <
typename I>
class memory_based_step_iterator;
31template <
typename I>
class memory_based_2d_locator;
32template <
typename L>
class image_view;
33template <
typename Pixel,
bool IsPlanar = false,
typename Alloc=std::allocator<
unsigned char> >
class image;
34template <
typename T>
struct channel_type;
35template <
typename T>
struct color_space_type;
36template <
typename T>
struct channel_mapping_type;
37template <
typename It>
struct is_iterator_adaptor;
39template <
typename BitField,
typename ChannelBitSizes,
typename Layout,
bool IsMutable>
struct bit_aligned_pixel_reference;
59template <
typename PixelRef>
62template <
typename T,
typename L>
65template <
typename T,
typename L>
66struct pixel_reference_is_basic<const pixel<T, L>&> : std::true_type {};
68template <
typename TR,
typename CS>
69struct pixel_reference_is_basic<planar_pixel_reference<TR, CS>> : std::true_type {};
71template <
typename TR,
typename CS>
72struct pixel_reference_is_basic<const planar_pixel_reference<TR, CS>> : std::true_type {};
77template <
typename Iterator>
81template <
typename T,
typename L>
85template <
typename T,
typename L>
89template <
typename T,
typename CS>
93template <
typename T,
typename CS>
97template <
typename T,
typename L>
101template <
typename T,
typename L>
105template <
typename T,
typename CS>
111template <
typename T,
typename CS>
119template <
typename Loc>
122template <
typename Iterator>
131template <
typename View>
134template <
typename Loc>
139template <
typename Img>
142template <
typename Pixel,
bool IsPlanar,
typename Alloc>
151struct iterator_is_step;
155template <
typename It,
bool IsBase,
bool EqualsStepType>
156struct iterator_is_step_impl;
159template <
typename It,
bool IsBase>
160struct iterator_is_step_impl<It, IsBase, true> : std::true_type {};
163template <
typename It>
164struct iterator_is_step_impl<It, true, false> : std::false_type {};
167template <
typename It>
168struct iterator_is_step_impl<It, false, false>
169 :
public iterator_is_step<typename iterator_adaptor_get_base<It>::type> {};
177 : detail::iterator_is_step_impl
180 !is_iterator_adaptor<I>::value,
181 std::is_same<I, typename dynamic_x_step_type<I>::type
204template <
typename PixelReference>
210 typename detail::remove_const_and_reference<PixelReference>::type,
211 typename detail::remove_const_and_reference<PixelReference>::type::value_type
218template <
typename Pixel>
220 : mp11::mp_or<is_reference<Pixel>, pixel_reference_is_proxy<Pixel>> {};
232 : std::integral_constant<bool, std::remove_reference<R>::type::is_mutable>
271template <
typename T,
typename L>
struct pixel_reference_type<T,L,false,false> {
using type = pixel<T,L>
const&; };
272template <
typename T,
typename L>
struct pixel_reference_type<T,L,true,true> {
using type = planar_pixel_reference<typename channel_traits<T>::reference,
typename color_space_type<L>::type>
const; };
273template <
typename T,
typename L>
struct pixel_reference_type<T,L,true,false> {
using type = planar_pixel_reference<typename channel_traits<T>::const_reference,
typename color_space_type<L>::type>
const; };
279template <
typename Pixel>
struct iterator_type_from_pixel<Pixel,false,false,false> {
using type =
const Pixel *; };
280template <
typename Pixel>
struct iterator_type_from_pixel<Pixel,true,false,true> {
281 using type = planar_pixel_iterator<typename channel_traits<typename channel_type<Pixel>::type>::pointer,
typename color_space_type<Pixel>::type>;
283template <
typename Pixel>
struct iterator_type_from_pixel<Pixel,true,false,false> {
284 using type = planar_pixel_iterator<typename channel_traits<typename channel_type<Pixel>::type>::const_pointer,
typename color_space_type<Pixel>::type>;
286template <
typename Pixel,
bool IsPlanar,
bool IsMutable>
struct iterator_type_from_pixel<Pixel,IsPlanar,true,IsMutable> {
287 using type = memory_based_step_iterator<typename iterator_type_from_pixel<Pixel,IsPlanar,false,IsMutable>::type>;
292template <
typename T,
typename L,
bool IsPlanar=false,
bool IsStep=false,
bool IsMutable=true>
struct iterator_type{};
294template <
typename T,
typename L>
struct iterator_type<T,L,false,false,false> {
using type = pixel<T,L>
const*; };
295template <
typename T,
typename L>
struct iterator_type<T,L,true,false,true> {
using type = planar_pixel_iterator<T*,typename L::color_space_t>; };
296template <
typename T,
typename L>
struct iterator_type<T,L,true,false,false> {
using type = planar_pixel_iterator<const T*,typename L::color_space_t>; };
297template <
typename T,
typename L,
bool IsPlanar,
bool IsMutable>
struct iterator_type<T,L,IsPlanar,true,IsMutable> {
298 using type = memory_based_step_iterator<typename iterator_type<T,L,IsPlanar,false,IsMutable>::type>;
303template <
typename XIterator>
313template <
typename BitField,
typename FirstBit,
typename NumBits>
314struct packed_channel_reference_type
316 using type = packed_channel_reference
318 BitField, FirstBit::value, NumBits::value,
true
322template <
typename BitField,
typename ChannelBitSizes>
323class packed_channel_references_vector_type
325 template <
typename FirstBit,
typename NumBits>
326 using reference_type =
typename packed_channel_reference_type<BitField, FirstBit, NumBits>::type;
330 using first_bit_list = mp11::mp_fold_q
333 mp11::mp_list<std::integral_constant<int, 0>>,
341 mp11::mp_bind<mp_back, mp11::_1>,
347 static_assert(mp11::mp_at_c<first_bit_list, 0>::value == 0,
"packed channel first bit must be 0");
350 using type = mp11::mp_transform
353 mp_pop_back<first_bit_list>,
368template <
typename BitField,
typename ChannelBitSizes,
typename Layout>
374 typename detail::packed_channel_references_vector_type
393template <
typename BitField,
typename ChannelBitSizes,
typename Layout,
typename Alloc=std::allocator<
unsigned char>>
401template <
typename BitField,
unsigned Size1,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
408template <
typename BitField,
unsigned Size1,
unsigned Size2,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
410 :
packed_image_type<BitField, mp11::mp_list_c<unsigned, Size1, Size2>, Layout, Alloc>
415template <
typename BitField,
unsigned Size1,
unsigned Size2,
unsigned Size3,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
417 :
packed_image_type<BitField, mp11::mp_list_c<unsigned, Size1, Size2, Size3>, Layout, Alloc>
422template <
typename BitField,
unsigned Size1,
unsigned Size2,
unsigned Size3,
unsigned Size4,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
424 :
packed_image_type<BitField, mp11::mp_list_c<unsigned, Size1, Size2, Size3, Size4>, Layout, Alloc>
429template <
typename BitField,
unsigned Size1,
unsigned Size2,
unsigned Size3,
unsigned Size4,
unsigned Size5,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
431 :
packed_image_type<BitField, mp11::mp_list_c<unsigned, Size1, Size2, Size3, Size4, Size5>, Layout, Alloc> {};
442 typename ChannelBitSizes,
444 typename Alloc = std::allocator<unsigned char>
450 static constexpr int bit_size =
454 std::integral_constant<int, 0>,
458 using bitfield_t =
typename detail::min_fast_uint<bit_size + 7>::type;
459 using bit_alignedref_t = bit_aligned_pixel_reference<bitfield_t, ChannelBitSizes, Layout, true>
const;
467template <
unsigned Size1,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
472template <
unsigned Size1,
unsigned Size2,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
477template <
unsigned Size1,
unsigned Size2,
unsigned Size3,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
482template <
unsigned Size1,
unsigned Size2,
unsigned Size3,
unsigned Size4,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
487template <
unsigned Size1,
unsigned Size2,
unsigned Size3,
unsigned Size4,
unsigned Size5,
typename Layout,
typename Alloc = std::allocator<
unsigned char>>
493template <
typename Channel,
typename Layout>
501template <
typename BitField,
int NumBits,
bool IsMutable,
typename Layout>
502struct pixel_value_type<packed_dynamic_channel_reference<BitField, NumBits, IsMutable>, Layout>
506template <
typename BitField,
int NumBits,
bool IsMutable,
typename Layout>
507struct pixel_value_type<packed_dynamic_channel_reference<BitField, NumBits, IsMutable> const, Layout>
508 : packed_pixel_type<BitField, mp11::mp_list_c<unsigned, NumBits>, Layout>
511template <
typename BitField,
int FirstBit,
int NumBits,
bool IsMutable,
typename Layout>
512struct pixel_value_type<packed_channel_reference<BitField, FirstBit, NumBits, IsMutable>, Layout>
513 : packed_pixel_type<BitField, mp11::mp_list_c<unsigned, NumBits>, Layout>
516template <
typename BitField,
int FirstBit,
int NumBits,
bool IsMutable,
typename Layout>
517struct pixel_value_type<packed_channel_reference<BitField, FirstBit, NumBits, IsMutable> const, Layout>
518 : packed_pixel_type<BitField, mp11::mp_list_c<unsigned, NumBits>, Layout>
521template <
int NumBits,
typename Layout>
522struct pixel_value_type<packed_channel_value<NumBits>, Layout>
523 : packed_pixel_type<typename detail::min_fast_uint<NumBits>::type, mp11::mp_list_c<unsigned, NumBits>, Layout>
528template <
typename T,
typename L,
bool IsPlanar = false,
bool IsStepX = false,
bool IsMutable = true>
539template <
typename T,
typename L,
bool IsPlanar = false,
bool IsStepX = false,
bool IsMutable = true>
550template <
typename T,
typename L,
bool IsPlanar = false,
typename Alloc = std::allocator<
unsigned char>>
558template <
typename Pixel,
bool IsPlanar=false,
bool IsStepX=false,
bool IsMutable=true>
570 typename T = use_default,
571 typename L = use_default,
572 typename IsPlanar = use_default,
573 typename IsMutable = use_default>
576 using pixel_t =
typename std::remove_reference<Ref>::type;
578 using channel_t =
typename mp11::mp_if
580 std::is_same<T, use_default>,
585 using layout_t =
typename mp11::mp_if
587 std::is_same<L, use_default>,
590 typename color_space_type<pixel_t>::type,
591 typename channel_mapping_type<pixel_t>::type
596 static bool const mut = mp11::mp_if
598 std::is_same<IsMutable, use_default>,
603 static bool const planar = mp11::mp_if
605 std::is_same<IsPlanar, use_default>,
620 typename T = use_default,
621 typename L = use_default,
622 typename IsPlanar = use_default,
623 typename IsStep = use_default,
624 typename IsMutable = use_default
628 using channel_t =
typename mp11::mp_if
630 std::is_same<T, use_default>,
635 using layout_t =
typename mp11::mp_if
637 std::is_same<L, use_default>,
640 typename color_space_type<Iterator>::type,
641 typename channel_mapping_type<Iterator>::type
646 static const bool mut = mp11::mp_if
648 std::is_same<IsMutable, use_default>,
653 static bool const planar = mp11::mp_if
655 std::is_same<IsPlanar, use_default>,
660 static bool const step = mp11::mp_if
662 std::is_same<IsStep, use_default>,
674template <
typename View,
typename T = use_default,
typename L = use_default,
typename IsPlanar = use_default,
typename StepX = use_default,
typename IsMutable = use_default>
677 using channel_t =
typename mp11::mp_if
679 std::is_same<T, use_default>,
684 using layout_t =
typename mp11::mp_if
686 std::is_same<L, use_default>,
689 typename color_space_type<View>::type,
690 typename channel_mapping_type<View>::type
695 static bool const mut = mp11::mp_if
697 std::is_same<IsMutable, use_default>,
702 static bool const planar = mp11::mp_if
704 std::is_same<IsPlanar, use_default>,
709 static bool const step = mp11::mp_if
711 std::is_same<StepX, use_default>,
717 using type =
typename view_type<channel_t, layout_t, planar, step, mut>::type;
723template <
typename Image,
typename T = use_default,
typename L = use_default,
typename IsPlanar = use_default>
726 using channel_t =
typename mp11::mp_if
728 std::is_same<T, use_default>,
733 using layout_t =
typename mp11::mp_if
735 std::is_same<L, use_default>,
738 typename color_space_type<Image>::type,
739 typename channel_mapping_type<Image>::type>,
743 static bool const planar = mp11::mp_if
745 std::is_same<IsPlanar, use_default>,
Constructs a homogeneous image type from a source image type by changing some of the properties....
Definition metafunctions.hpp:725
Constructs a pixel iterator type from a source pixel iterator type by changing some of the properties...
Definition metafunctions.hpp:627
Constructs a pixel reference type from a source pixel reference type by changing some of the properti...
Definition metafunctions.hpp:575
Constructs an image view type from a source view type by changing some of the properties....
Definition metafunctions.hpp:676
A lightweight object that interprets memory as a 2D array of pixels. Models ImageViewConcept,...
Definition image_view.hpp:54
container interface over image view. Models ImageConcept, PixelBasedConcept
Definition image.hpp:43
Memory-based pixel locator. Models: PixelLocatorConcept,HasDynamicXStepTypeConcept,...
Definition locator.hpp:230
MEMORY-BASED STEP ITERATOR.
Definition step_iterator.hpp:158
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36
Returns the type of a single-channel bit-aligned image given the bit size of its channel and its layo...
Definition metafunctions.hpp:468
Returns the type of a two channel bit-aligned image given the bit size of its channels and its layout...
Definition metafunctions.hpp:473
Returns the type of a three channel bit-aligned image given the bit size of its channels and its layo...
Definition metafunctions.hpp:478
Returns the type of a four channel bit-aligned image given the bit size of its channels and its layou...
Definition metafunctions.hpp:483
Returns the type of a five channel bit-aligned image given the bit size of its channels and its layou...
Definition metafunctions.hpp:488
Returns the type of a packed image whose pixels may not be byte aligned. For example,...
Definition metafunctions.hpp:447
Definition color_convert.hpp:31
Basic images must use basic views and std::allocator.
Definition metafunctions.hpp:140
Returns the type of a homogeneous image given the channel type, layout, and whether it operates on pl...
Definition metafunctions.hpp:552
returns the base iterator for a given iterator adaptor. Provide an specialization when introducing ne...
Definition metafunctions.hpp:38
Determines if a given pixel iterator is basic Basic iterators must use gil::pixel (if interleaved),...
Definition metafunctions.hpp:78
Metafunction predicate returning whether the given iterator allows for changing its values.
Definition pixel_iterator.hpp:49
Determines if the given iterator has a step that could be set dynamically.
Definition metafunctions.hpp:184
Returns the type of a pixel iterator given the pixel type, whether it operates on planar data,...
Definition metafunctions.hpp:277
Returns the type of a homogeneous iterator given the channel type, layout, whether it operates on pla...
Definition metafunctions.hpp:292
Represents a color space and ordering of channels in memory.
Definition utilities.hpp:265
Determines if a given locator is basic. A basic locator is memory-based and has basic x_iterator and ...
Definition metafunctions.hpp:120
Determines if the given locator is mutable (i.e. its pixels can be changed)
Definition metafunctions.hpp:242
Determines if the given locator has a horizontal step that could be set dynamically.
Definition metafunctions.hpp:188
Determines if the given locator has a vertical step that could be set dynamically.
Definition metafunctions.hpp:192
Returns the type of a homogeneous locator given the channel type, layout, whether it operates on plan...
Definition metafunctions.hpp:530
Returns the type of a single-channel image given its bitfield type, the bit size of its channel and i...
Definition metafunctions.hpp:404
Returns the type of a two channel image given its bitfield type, the bit size of its channels and its...
Definition metafunctions.hpp:411
Returns the type of a three channel image given its bitfield type, the bit size of its channels and i...
Definition metafunctions.hpp:418
Returns the type of a four channel image given its bitfield type, the bit size of its channels and it...
Definition metafunctions.hpp:425
Returns the type of a five channel image given its bitfield type, the bit size of its channels and it...
Definition metafunctions.hpp:431
Returns the type of an interleaved packed image: an image whose channels may not be byte-aligned,...
Definition metafunctions.hpp:395
Returns the type of a packed pixel given its bitfield type, the bit size of its channels and its layo...
Definition metafunctions.hpp:370
Heterogeneous pixel value whose channel references can be constructed from the pixel bitfield and the...
Definition packed_pixel.hpp:50
Given a model of a pixel, determines whether the model represents a pixel reference (as opposed to pi...
Definition metafunctions.hpp:220
Determines if a given pixel reference is basic Basic references must use gil::pixel& (if interleaved)...
Definition metafunctions.hpp:60
Determines if the given pixel reference is mutable (i.e. its channels can be changed)
Definition metafunctions.hpp:233
Determines whether the given pixel reference is a proxy class or a native C++ reference.
Definition metafunctions.hpp:214
Returns the type of a homogeneous pixel reference given the channel type, layout, whether it operates...
Definition metafunctions.hpp:269
Returns the type of a homogeneous pixel given the channel type and layout.
Definition metafunctions.hpp:495
Represents a pixel value (a container of channels). Models: HomogeneousColorBaseValueConcept,...
Definition pixel.hpp:106
An iterator over planar pixels. Models HomogeneousColorBaseConcept, PixelIteratorConcept,...
Definition planar_pixel_iterator.hpp:59
Given a pixel iterator defining access to pixels along a row, returns the types of the corresponding ...
Definition metafunctions.hpp:305
Basic views must be over basic locators.
Definition metafunctions.hpp:132
Determines if the given view is mutable (i.e. its pixels can be changed)
Definition metafunctions.hpp:245
Determines if the given view has a horizontal step that could be set dynamically.
Definition metafunctions.hpp:196
Determines if the given view has a vertical step that could be set dynamically.
Definition metafunctions.hpp:200
Returns the type of a view the pixel type, whether it operates on planar data and whether it has a st...
Definition metafunctions.hpp:559
Returns the type of a homogeneous view given the channel type, layout, whether it operates on planar ...
Definition metafunctions.hpp:541