27 #ifndef MLN_WORLD_RGB_INVERT_HH
28 # define MLN_WORLD_RGB_INVERT_HH
36 # include <mln/core/concept/image.hh>
37 # include <mln/trait/value_.hh>
38 # include <mln/value/rgb.hh>
41 # include <mln/world/rgb/invert.spe.hh>
90 # ifndef MLN_INCLUDE_ONLY
98 template <
typename I,
typename O>
102 mln_trace(
"world::rgb::impl::generic::invert");
104 const I& input =
exact(input_);
105 O& output =
exact(output_);
107 mln_precondition(input.is_valid());
108 mln_precondition(output.is_valid());
110 typedef mln_value(I) V;
111 mln_piter(I)
p(input.domain());
113 output(
p) = mln_min(V) + (mln_max(V) - input(
p));
129 template <
typename I,
typename O>
132 invert_dispatch(trait::image::speed::any,
const mln_value(I)&,
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>
164 typedef mln_value(I) V;
165 invert_dispatch(mln_trait_image_speed(I)(), V(),
178 template <
typename I>
182 mln_trace(
"world::rgb::invert");
184 mln_precondition(
exact(input).is_valid());
186 mln_concrete(I) output;
188 internal::invert_dispatch(input, output);
193 template <
typename I>
197 mln_trace(
"world::rgb::invert_inplace");
199 mln_precondition(
exact(input).is_valid());
201 internal::invert_dispatch(input, input);
205 # endif // ! MLN_INCLUDE_ONLY
214 #endif // ! MLN_WORLD_RGB_INVERT_HH