26 #ifndef MLN_WORLD_RGB_INVERT_HH
27 # define MLN_WORLD_RGB_INVERT_HH
35 # include <mln/core/concept/image.hh>
36 # include <mln/trait/value_.hh>
37 # include <mln/value/rgb.hh>
40 # include <mln/world/rgb/invert.spe.hh>
68 mln_concrete(I) invert(const Image<I>& input);
86 void invert_inplace(Image<I>& input);
89 # ifndef MLN_INCLUDE_ONLY
97 template <
typename I,
typename O>
99 void invert(
const Image<I>& input_, Image<O>& output_)
101 trace::entering(
"world::rgb::impl::generic::invert");
103 const I& input = exact(input_);
104 O& output = exact(output_);
106 mln_precondition(input.is_valid());
107 mln_precondition(output.is_valid());
109 typedef mln_value(I) V;
110 mln_piter(I) p(input.domain());
112 output(p) = mln_min(V) + (mln_max(V) - input(p));
114 trace::exiting("world::rgb::impl::generic::invert");
129 template <
typename I,
typename O>
132 invert_dispatch(trait::image::speed::any,
const mln_value(I)&,
133 const I& input, O& output)
136 mlc_abort(I)::check();
140 template <
typename I,
typename O,
unsigned n>
143 invert_dispatch(trait::image::speed::any,
const value::rgb<n>&,
144 const I& input, O& output)
146 impl::invert_rgb(input, output);
149 template <
typename I,
typename O,
unsigned n>
152 invert_dispatch(trait::image::speed::fastest,
const value::rgb<n>&,
153 const I& input, O& output)
155 impl::invert_rgb_fastest(input, output);
159 template <
typename I,
typename O>
162 invert_dispatch(
const Image<I>& input, Image<O>& output)
164 typedef mln_value(I) V;
165 invert_dispatch(mln_trait_image_speed(I)(), V(),
166 exact(input), exact(output));
178 template <typename I>
180 mln_concrete(I) invert(const Image<I>& input)
182 trace::entering(
"world::rgb::invert");
184 mln_precondition(exact(input).is_valid());
186 mln_concrete(I) output;
188 internal::invert_dispatch(input, output);
190 trace::exiting("world::rgb::invert");
194 template <typename I>
196 void invert_inplace(Image<I>& input)
198 trace::entering(
"world::rgb::invert_inplace");
200 mln_precondition(exact(input).is_valid());
202 internal::invert_dispatch(input, input);
204 trace::exiting(
"world::rgb::invert_inplace");
207 # endif // ! MLN_INCLUDE_ONLY
216 #endif // ! MLN_WORLD_RGB_INVERT_HH