31 #ifndef MLN_GEOM_VERTICAL_SYMMETRY_HH
32 # define MLN_GEOM_VERTICAL_SYMMETRY_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/core/box_runend_piter.hh>
36 # include <mln/core/box_runstart_piter.hh>
53 # ifndef MLN_INCLUDE_ONLY
68 const I& input =
exact(input_);
69 mln_precondition(input.is_valid());
71 mln_concrete(I) output(input.domain());
73 typedef mln_site(I) P;
82 mln_site(I) idi = pi, ido = po;
84 for (
unsigned n = 0; n < ncols; ++n, ++idi[1], --ido[1])
85 output(ido) = input(idi);
96 vertical_symmetry_fastest(const Image<I>& input_)
98 const I& input =
exact(input_);
99 mln_precondition(input.is_valid());
101 mln_concrete(I) output(input.domain());
103 typedef mln_site(I) P;
104 box_runstart_piter<P>
108 unsigned ncols = input.ncols();
110 typedef mln_value(I)* ptr_t;
114 const mln_value(I)* ptr_in = & input(pi);
115 ptr_t ptr_out = (& output(po)) + ncols - 1;
117 for (
unsigned n = 0; n <
ncols; ++n)
118 *ptr_out-- = *ptr_in++;
134 template <
typename I>
136 vertical_symmetry_dispatch(
137 trait::image::value_alignment::any,
138 trait::image::value_storage::any,
139 trait::image::value_access::any,
140 const Image<I>& input)
146 template <
typename I>
148 vertical_symmetry_dispatch(
149 trait::image::value_alignment::with_grid,
150 trait::image::value_storage::one_block,
151 trait::image::value_access::direct,
152 const Image<I>& input)
154 return impl::vertical_symmetry_fastest(input);
158 template <
typename I>
160 vertical_symmetry_dispatch(const Image<I>& input)
162 return vertical_symmetry_dispatch(
163 mln_trait_image_value_alignment(I)(),
164 mln_trait_image_value_storage(I)(),
165 mln_trait_image_value_access(I)(),
175 template <
typename I>
179 mln_trace(
"geom::vertical_symmetry");
181 const I& input =
exact(input_);
182 mln_precondition(input.is_valid());
184 mln_concrete(I) output = internal::vertical_symmetry_dispatch(input);
190 # endif // ! MLN_INCLUDE_ONLY
198 #endif // ! MLN_GEOM_VERTICAL_SYMMETRY_HH