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/assert.hpp> 15 #include <boost/config.hpp> 16 #include <boost/mpl/range_c.hpp> 17 #include <boost/mpl/size.hpp> 18 #include <boost/mpl/vector_c.hpp> 19 #include <boost/type_traits.hpp> 21 namespace boost {
namespace gil {
24 template <
typename P> P* memunit_advanced(
const P* p, std::ptrdiff_t diff);
27 template <
int K,
typename ColorBase>
29 ->
typename std::enable_if
31 !std::is_const<ColorBase>::value,
32 typename kth_semantic_element_reference_type<ColorBase, K>::type
36 template <
int K,
typename ColorBase>
37 typename kth_semantic_element_const_reference_type<ColorBase,K>::type
semantic_at_c(
const ColorBase& p);
42 template <
typename ColorBase,
int K>
struct kth_element_type;
43 template <
typename ColorBase,
int K>
struct kth_element_type<const ColorBase,K> :
public kth_element_type<ColorBase,K> {};
44 template <
typename ColorBase,
int K>
struct kth_element_reference_type;
45 template <
typename ColorBase,
int K>
struct kth_element_reference_type<const ColorBase,K> :
public kth_element_reference_type<ColorBase,K> {};
46 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type;
47 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type<const ColorBase,K> :
public kth_element_const_reference_type<ColorBase,K> {};
51 template <
typename DstLayout,
typename SrcLayout,
int K>
52 struct mapping_transform
53 :
public mpl::at<typename SrcLayout::channel_mapping_t,
54 typename detail::type_to_index<typename DstLayout::channel_mapping_t,mpl::integral_c<int,K> >::type
62 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) 64 #pragma warning(disable:4512) //assignment operator could not be generated 69 template <
typename Element,
typename Layout>
70 struct homogeneous_color_base<Element,Layout,1> {
74 using layout_t = Layout;
78 homogeneous_color_base() {}
79 homogeneous_color_base(Element v) : _v0(v) {}
82 operator Element ()
const {
return _v0; }
84 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,1>& c) : _v0(gil::at_c<0>(c)) {}
90 template <
typename Element,
typename Layout>
91 struct homogeneous_color_base<Element,Layout,2> {
95 using layout_t = Layout;
101 homogeneous_color_base() {}
102 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v) {}
103 homogeneous_color_base(Element v0, Element v1) : _v0(v0), _v1(v1) {}
105 template <
typename E2,
typename L2> homogeneous_color_base(
const 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 E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,2>& c) :
111 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
112 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)) {}
115 template <
typename P> homogeneous_color_base(P* p,
bool) :
116 _v0(&semantic_at_c<0>(*p)),
117 _v1(&semantic_at_c<1>(*p)) {}
118 template <
typename Ref> Ref deref()
const {
119 return Ref(*semantic_at_c<0>(*
this),
120 *semantic_at_c<1>(*
this)); }
123 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
124 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
125 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)) {}
128 Element at_c_dynamic(std::size_t i)
const {
129 if (i==0)
return _v0;
136 template <
typename Element,
typename Layout>
137 struct homogeneous_color_base<Element,Layout,3> {
139 Element _v0, _v1, _v2;
141 using layout_t = Layout;
149 homogeneous_color_base() {}
150 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v) {}
151 homogeneous_color_base(Element v0, Element v1, Element v2) : _v0(v0), _v1(v1), _v2(v2) {}
153 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,3>& c) :
154 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
155 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
156 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
159 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,3>& c) :
160 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
161 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
162 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
165 template <
typename P> homogeneous_color_base(P* p,
bool) :
166 _v0(&semantic_at_c<0>(*p)),
167 _v1(&semantic_at_c<1>(*p)),
168 _v2(&semantic_at_c<2>(*p)) {}
169 template <
typename Ref> Ref deref()
const {
170 return Ref(*semantic_at_c<0>(*
this),
171 *semantic_at_c<1>(*
this),
172 *semantic_at_c<2>(*
this)); }
175 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
176 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
177 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
178 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)) {}
181 Element at_c_dynamic(std::size_t i)
const {
192 template <
typename Element,
typename Layout>
193 struct homogeneous_color_base<Element,Layout,4> {
195 Element _v0, _v1, _v2, _v3;
197 using layout_t = Layout;
206 homogeneous_color_base() {}
207 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v) {}
208 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3) : _v0(v0), _v1(v1), _v2(v2), _v3(v3) {}
210 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,4>& c) :
211 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
212 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
213 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
214 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
217 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,4>& c) :
218 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
219 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
220 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
221 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
224 template <
typename P> homogeneous_color_base(P* p,
bool) :
225 _v0(&semantic_at_c<0>(*p)),
226 _v1(&semantic_at_c<1>(*p)),
227 _v2(&semantic_at_c<2>(*p)),
228 _v3(&semantic_at_c<3>(*p)) {}
230 template <
typename Ref> Ref deref()
const {
231 return Ref(*semantic_at_c<0>(*
this),
232 *semantic_at_c<1>(*
this),
233 *semantic_at_c<2>(*
this),
234 *semantic_at_c<3>(*
this)); }
237 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
238 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
239 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
240 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
241 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)) {}
244 Element at_c_dynamic(std::size_t i)
const {
256 template <
typename Element,
typename Layout>
257 struct homogeneous_color_base<Element,Layout,5> {
259 Element _v0, _v1, _v2, _v3, _v4;
261 using layout_t = Layout;
272 homogeneous_color_base() {}
273 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v), _v4(v) {}
274 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3, Element v4) : _v0(v0), _v1(v1), _v2(v2), _v3(v3), _v4(v4) {}
276 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,5>& c) :
277 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
278 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
279 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
280 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
281 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
284 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,5>& c) :
285 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
286 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
287 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
288 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
289 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
292 template <
typename P> homogeneous_color_base(P* p,
bool) :
293 _v0(&semantic_at_c<0>(*p)),
294 _v1(&semantic_at_c<1>(*p)),
295 _v2(&semantic_at_c<2>(*p)),
296 _v3(&semantic_at_c<3>(*p)),
297 _v4(&semantic_at_c<4>(*p)) {}
299 template <
typename Ref> Ref deref()
const {
300 return Ref(*semantic_at_c<0>(*
this),
301 *semantic_at_c<1>(*
this),
302 *semantic_at_c<2>(*
this),
303 *semantic_at_c<3>(*
this),
304 *semantic_at_c<4>(*
this)); }
307 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
308 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
309 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
310 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
311 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)),
312 _v4(*memunit_advanced(semantic_at_c<4>(ptr),diff)) {}
315 Element at_c_dynamic(std::size_t i)
const {
326 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) 340 template <
typename Element,
typename Layout,
int K>
342 dynamic_at_c(homogeneous_color_base<Element,Layout,K>& cb, std::size_t i)
345 return (gil_reinterpret_cast<Element*>(&cb))[i];
348 template <
typename Element,
typename Layout,
int K>
350 dynamic_at_c(
const homogeneous_color_base<Element,Layout,K>& cb, std::size_t i) {
352 return (gil_reinterpret_cast_c<const Element*>(&cb))[i];
355 template <
typename Element,
typename Layout,
int K>
357 dynamic_at_c(
const homogeneous_color_base<Element&,Layout,K>& cb, std::size_t i) {
359 return cb.at_c_dynamic(i);
362 template <
typename Element,
typename Layout,
int K>
364 dynamic_at_c(
const homogeneous_color_base<const Element&,Layout,K>& cb, std::size_t i) {
366 return cb.at_c_dynamic(i);
372 template <
typename Element,
typename Layout,
int K1,
int K>
373 struct kth_element_type<detail::homogeneous_color_base<Element,Layout,K1>, K> {
374 using type = Element;
377 template <
typename Element,
typename Layout,
int K1,
int K>
378 struct kth_element_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<Element> {};
380 template <
typename Element,
typename Layout,
int K1,
int K>
381 struct kth_element_const_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<typename add_const<Element>::type> {};
385 template <
int K,
typename E,
typename L,
int N>
inline 386 typename add_reference<E>::type
387 at_c( detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
391 template <
int K,
typename E,
typename L,
int N>
inline 392 typename add_reference<typename add_const<E>::type>::type
393 at_c(
const detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
397 template <
typename T>
void operator()(T& x, T& y)
const {
403 template <
typename E,
typename L,
int N>
inline 404 void swap(detail::homogeneous_color_base<E,L,N>& x, detail::homogeneous_color_base<E,L,N>& y) {
405 static_for_each(x,y,detail::swap_fn());
Definition: algorithm.hpp:30
void swap(const boost::gil::packed_channel_reference< BF, FB, NB, M > x, R &y)
swap for packed_channel_reference
Definition: channel.hpp:485
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:138
Specifies the return type of the constant element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:41
Specifies the return type of the mutable element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:40
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:393