Boost GIL


concepts/pixel.hpp
1 //
2 // Copyright 2005-2007 Adobe Systems Incorporated
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 #ifndef BOOST_GIL_CONCEPTS_PIXEL_HPP
9 #define BOOST_GIL_CONCEPTS_PIXEL_HPP
10 
11 #include <boost/gil/concepts/basic.hpp>
12 #include <boost/gil/concepts/channel.hpp>
13 #include <boost/gil/concepts/color.hpp>
14 #include <boost/gil/concepts/color_base.hpp>
15 #include <boost/gil/concepts/concept_check.hpp>
16 #include <boost/gil/concepts/fwd.hpp>
17 #include <boost/gil/concepts/pixel_based.hpp>
18 #include <boost/gil/concepts/detail/type_traits.hpp>
19 #include <boost/gil/detail/mp11.hpp>
20 
21 #include <cstddef>
22 #include <type_traits>
23 
24 #if defined(BOOST_CLANG)
25 #pragma clang diagnostic push
26 #pragma clang diagnostic ignored "-Wunused-local-typedefs"
27 #endif
28 
29 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
30 #pragma GCC diagnostic push
31 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"
32 #endif
33 
34 namespace boost { namespace gil {
35 
61 template <typename P>
63 {
64  void constraints()
65  {
66  gil_function_requires<ColorBaseConcept<P>>();
67  gil_function_requires<PixelBasedConcept<P>>();
68 
69  static_assert(is_pixel<P>::value, "");
70  static const bool is_mutable = P::is_mutable;
71  ignore_unused_variable_warning(is_mutable);
72 
73  using value_type = typename P::value_type;
74  // TODO: Is the cyclic dependency intentional? --mloskot
75  // gil_function_requires<PixelValueConcept<value_type>>();
76 
77  using reference = typename P::reference;
78  gil_function_requires<PixelConcept
79  <
80  typename detail::remove_const_and_reference<reference>::type
81  >>();
82 
83  using const_reference = typename P::const_reference;
84  gil_function_requires<PixelConcept
85  <
86  typename detail::remove_const_and_reference<const_reference>::type
87  >>();
88  }
89 };
90 
99 template <typename P>
101 {
102  void constraints()
103  {
104  gil_function_requires<PixelConcept<P>>();
105  static_assert(P::is_mutable, "");
106  }
107 };
108 
121 template <typename P>
123 {
124  void constraints()
125  {
126  gil_function_requires<PixelConcept<P>>();
127  gil_function_requires<HomogeneousColorBaseConcept<P>>();
128  gil_function_requires<HomogeneousPixelBasedConcept<P>>();
129  p[0];
130  }
131  P p;
132 };
133 
146 template <typename P>
148 {
149  void constraints()
150  {
151  gil_function_requires<HomogeneousPixelConcept<P>>();
152  gil_function_requires<MutableHomogeneousColorBaseConcept<P>>();
153  p[0] = v;
154  v = p[0];
155  }
156  typename P::template element_type<P>::type v;
157  P p;
158 };
159 
168 template <typename P>
170 {
171  void constraints()
172  {
173  gil_function_requires<PixelConcept<P>>();
174  gil_function_requires<Regular<P>>();
175  }
176 };
177 
186 template <typename P>
188 {
189  void constraints()
190  {
191  gil_function_requires<HomogeneousPixelConcept<P>>();
192  gil_function_requires<Regular<P>>();
193  static_assert(std::is_same<P, typename P::value_type>::value, "");
194  }
195 };
196 
197 namespace detail {
198 
199 template <typename P1, typename P2, int K>
200 struct channels_are_pairwise_compatible
201  : mp11::mp_and
202  <
203  channels_are_pairwise_compatible<P1, P2, K - 1>,
204  channels_are_compatible
205  <
206  typename kth_semantic_element_reference_type<P1, K>::type,
207  typename kth_semantic_element_reference_type<P2, K>::type
208  >
209  >
210 {
211 };
212 
213 template <typename P1, typename P2>
214 struct channels_are_pairwise_compatible<P1, P2, -1> : std::true_type {};
215 
216 } // namespace detail
217 
224 template <typename P1, typename P2>
226  : mp11::mp_and
227  <
228  typename color_spaces_are_compatible
229  <
230  typename color_space_type<P1>::type,
231  typename color_space_type<P2>::type
232  >::type,
233  detail::channels_are_pairwise_compatible
234  <
235  P1, P2, num_channels<P1>::value - 1
236  >
237  >
238 {
239 };
240 
254 template <typename P1, typename P2>
256 {
257  void constraints()
258  {
259  static_assert(pixels_are_compatible<P1, P2>::value, "");
260  }
261 };
262 
275 template <typename SrcP, typename DstP>
277 {
278  void constraints()
279  {
280  gil_function_requires<PixelConcept<SrcP>>();
281  gil_function_requires<MutablePixelConcept<DstP>>();
282  color_convert(src, dst);
283  }
284  SrcP src;
285  DstP dst;
286 };
287 
288 }} // namespace boost::gil
289 
290 #if defined(BOOST_CLANG)
291 #pragma clang diagnostic pop
292 #endif
293 
294 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
295 #pragma GCC diagnostic pop
296 #endif
297 
298 #endif
Homogeneous pixel concept that allows for changing its channels.
Definition: concepts/pixel.hpp:147
Concept for pixel compatibility Pixels are compatible if their channels and color space types are com...
Definition: concepts/pixel.hpp:255
Pixel concept that is a Regular type.
Definition: concepts/pixel.hpp:169
Specifies the element type of a homogeneous color base.
Definition: color_base_algorithm.hpp:221
Homogeneous pixel concept that is a Regular type.
Definition: concepts/pixel.hpp:187
Homogeneous pixel concept.
Definition: concepts/pixel.hpp:122
Pixel concept that allows for changing its channels.
Definition: concepts/pixel.hpp:100
Pixel convertible concept Convertibility is non-symmetric and implies that one pixel can be converted...
Definition: concepts/pixel.hpp:276
void color_convert(const SrcP &src, DstP &dst)
helper function for converting one pixel to another using GIL default color-converters where ScrP mod...
Definition: color_convert.hpp:304
Returns whether two pixels are compatible Pixels are compatible if their channels and color space typ...
Definition: concepts/pixel.hpp:225
Pixel concept - A color base whose elements are channels.
Definition: concepts/pixel.hpp:62