8 #ifndef BOOST_GIL_COLOR_BASE_HPP
9 #define BOOST_GIL_COLOR_BASE_HPP
11 #include <boost/gil/utilities.hpp>
12 #include <boost/gil/concepts.hpp>
14 #include <boost/config.hpp>
15 #include <boost/mpl/range_c.hpp>
16 #include <boost/mpl/size.hpp>
17 #include <boost/mpl/vector_c.hpp>
18 #include <boost/type_traits.hpp>
19 #include <boost/utility/enable_if.hpp>
23 namespace boost {
namespace gil {
26 template <
typename P> P* memunit_advanced(
const P* p, std::ptrdiff_t diff);
29 template <
int K,
typename ColorBase>
30 typename disable_if<is_const<ColorBase>,
typename kth_semantic_element_reference_type<ColorBase,K>::type>::type
semantic_at_c(ColorBase& p);
31 template <
int K,
typename ColorBase>
32 typename kth_semantic_element_const_reference_type<ColorBase,K>::type
semantic_at_c(
const ColorBase& p);
37 template <
typename ColorBase,
int K>
struct kth_element_type;
38 template <
typename ColorBase,
int K>
struct kth_element_type<const ColorBase,K> :
public kth_element_type<ColorBase,K> {};
39 template <
typename ColorBase,
int K>
struct kth_element_reference_type;
40 template <
typename ColorBase,
int K>
struct kth_element_reference_type<const ColorBase,K> :
public kth_element_reference_type<ColorBase,K> {};
41 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type;
42 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type<const ColorBase,K> :
public kth_element_const_reference_type<ColorBase,K> {};
46 template <
typename DstLayout,
typename SrcLayout,
int K>
47 struct mapping_transform
48 :
public mpl::at<typename SrcLayout::channel_mapping_t,
49 typename detail::type_to_index<typename DstLayout::channel_mapping_t,mpl::integral_c<int,K> >::type
57 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
59 #pragma warning(disable:4512) //assignment operator could not be generated
64 template <
typename Element,
typename Layout>
65 struct homogeneous_color_base<Element,Layout,1> {
69 typedef Layout layout_t;
73 homogeneous_color_base() {}
74 homogeneous_color_base(Element v) : _v0(v) {}
77 operator Element ()
const {
return _v0; }
79 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,1>& c) : _v0(gil::at_c<0>(c)) {}
85 template <
typename Element,
typename Layout>
86 struct homogeneous_color_base<Element,Layout,2> {
90 typedef Layout layout_t;
96 homogeneous_color_base() {}
97 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v) {}
98 homogeneous_color_base(Element v0, Element v1) : _v0(v0), _v1(v1) {}
100 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,2>& c) :
101 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
102 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)) {}
105 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,2>& c) :
106 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
107 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)) {}
110 template <
typename P> homogeneous_color_base(P* p,
bool) :
111 _v0(&semantic_at_c<0>(*p)),
112 _v1(&semantic_at_c<1>(*p)) {}
113 template <
typename Ref> Ref deref()
const {
114 return Ref(*semantic_at_c<0>(*
this),
115 *semantic_at_c<1>(*
this)); }
118 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
119 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
120 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)) {}
123 Element at_c_dynamic(std::size_t i)
const {
124 if (i==0)
return _v0;
131 template <
typename Element,
typename Layout>
132 struct homogeneous_color_base<Element,Layout,3> {
134 Element _v0, _v1, _v2;
136 typedef Layout layout_t;
144 homogeneous_color_base() {}
145 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v) {}
146 homogeneous_color_base(Element v0, Element v1, Element v2) : _v0(v0), _v1(v1), _v2(v2) {}
148 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,3>& c) :
149 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
150 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
151 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
154 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,3>& c) :
155 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
156 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
157 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
160 template <
typename P> homogeneous_color_base(P* p,
bool) :
161 _v0(&semantic_at_c<0>(*p)),
162 _v1(&semantic_at_c<1>(*p)),
163 _v2(&semantic_at_c<2>(*p)) {}
164 template <
typename Ref> Ref deref()
const {
165 return Ref(*semantic_at_c<0>(*
this),
166 *semantic_at_c<1>(*
this),
167 *semantic_at_c<2>(*
this)); }
170 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
171 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
172 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
173 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)) {}
176 Element at_c_dynamic(std::size_t i)
const {
187 template <
typename Element,
typename Layout>
188 struct homogeneous_color_base<Element,Layout,4> {
190 Element _v0, _v1, _v2, _v3;
192 typedef Layout layout_t;
201 homogeneous_color_base() {}
202 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v) {}
203 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3) : _v0(v0), _v1(v1), _v2(v2), _v3(v3) {}
205 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,4>& c) :
206 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
207 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
208 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
209 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
212 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,4>& c) :
213 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
214 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
215 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
216 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
219 template <
typename P> homogeneous_color_base(P* p,
bool) :
220 _v0(&semantic_at_c<0>(*p)),
221 _v1(&semantic_at_c<1>(*p)),
222 _v2(&semantic_at_c<2>(*p)),
223 _v3(&semantic_at_c<3>(*p)) {}
225 template <
typename Ref> Ref deref()
const {
226 return Ref(*semantic_at_c<0>(*
this),
227 *semantic_at_c<1>(*
this),
228 *semantic_at_c<2>(*
this),
229 *semantic_at_c<3>(*
this)); }
232 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
233 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
234 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
235 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
236 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)) {}
239 Element at_c_dynamic(std::size_t i)
const {
251 template <
typename Element,
typename Layout>
252 struct homogeneous_color_base<Element,Layout,5> {
254 Element _v0, _v1, _v2, _v3, _v4;
256 typedef Layout layout_t;
267 homogeneous_color_base() {}
268 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v), _v4(v) {}
269 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3, Element v4) : _v0(v0), _v1(v1), _v2(v2), _v3(v3), _v4(v4) {}
271 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,5>& c) :
272 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
273 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
274 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
275 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
276 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
279 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,5>& c) :
280 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
281 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
282 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
283 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
284 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
287 template <
typename P> homogeneous_color_base(P* p,
bool) :
288 _v0(&semantic_at_c<0>(*p)),
289 _v1(&semantic_at_c<1>(*p)),
290 _v2(&semantic_at_c<2>(*p)),
291 _v3(&semantic_at_c<3>(*p)),
292 _v4(&semantic_at_c<4>(*p)) {}
294 template <
typename Ref> Ref deref()
const {
295 return Ref(*semantic_at_c<0>(*
this),
296 *semantic_at_c<1>(*
this),
297 *semantic_at_c<2>(*
this),
298 *semantic_at_c<3>(*
this),
299 *semantic_at_c<4>(*
this)); }
302 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
303 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
304 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
305 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
306 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)),
307 _v4(*memunit_advanced(semantic_at_c<4>(ptr),diff)) {}
310 Element at_c_dynamic(std::size_t i)
const {
321 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
335 template <
typename Element,
typename Layout,
int K>
337 dynamic_at_c(homogeneous_color_base<Element,Layout,K>& cb, std::size_t i) {
339 return (gil_reinterpret_cast<Element*>(&cb))[i];
342 template <
typename Element,
typename Layout,
int K>
344 dynamic_at_c(
const homogeneous_color_base<Element,Layout,K>& cb, std::size_t i) {
346 return (gil_reinterpret_cast_c<const Element*>(&cb))[i];
349 template <
typename Element,
typename Layout,
int K>
350 typename element_reference_type<homogeneous_color_base<Element&,Layout,K> >::type
351 dynamic_at_c(
const homogeneous_color_base<Element&,Layout,K>& cb, std::size_t i) {
353 return cb.at_c_dynamic(i);
356 template <
typename Element,
typename Layout,
int K>
357 typename element_const_reference_type<homogeneous_color_base<const Element&,Layout,K> >::type
358 dynamic_at_c(
const homogeneous_color_base<const Element&,Layout,K>& cb, std::size_t i) {
360 return cb.at_c_dynamic(i);
366 template <
typename Element,
typename Layout,
int K1,
int K>
367 struct kth_element_type<detail::homogeneous_color_base<Element,Layout,K1>, K> {
368 typedef Element type;
371 template <
typename Element,
typename Layout,
int K1,
int K>
372 struct kth_element_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<Element> {};
374 template <
typename Element,
typename Layout,
int K1,
int K>
375 struct kth_element_const_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<typename add_const<Element>::type> {};
379 template <
int K,
typename E,
typename L,
int N>
inline
380 typename add_reference<E>::type
381 at_c( detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
385 template <
int K,
typename E,
typename L,
int N>
inline
386 typename add_reference<typename add_const<E>::type>::type
387 at_c(
const detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
391 template <
typename T>
void operator()(T& x, T& y)
const {
397 template <
typename E,
typename L,
int N>
inline
398 void swap(detail::homogeneous_color_base<E,L,N>& x, detail::homogeneous_color_base<E,L,N>& y) {
399 static_for_each(x,y,detail::swap_fn());
void swap(const boost::gil::packed_channel_reference< BF, FB, NB, M > x, R &y)
swap for packed_channel_reference
Definition: channel.hpp:480
kth_semantic_element_const_reference_type< ColorBase, K >::type semantic_at_c(const ColorBase &p)
A constant accessor to the K-th semantic element of a color base.
Definition: color_base_algorithm.hpp:114
Specifies the return type of the constant element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:36
add_reference< typename add_const< E >::type >::type at_c(const detail::homogeneous_color_base< E, L, N > &p)
Provides constant access to the K-th element, in physical order.
Definition: color_base.hpp:387
Specifies the return type of the mutable element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:35