27 #ifndef SCRIBO_PREPROCESSING_ROTATE_90_HH
28 # define SCRIBO_PREPROCESSING_ROTATE_90_HH
35 # include <mln/core/concept/image.hh>
36 # include <mln/geom/all.hh>
39 # include <mln/core/alias/dpoint2d.hh>
46 namespace preprocessing
72 # ifndef MLN_INCLUDE_ONLY
79 mln_trace(
"scribo::preprocessing::rotate_90");
81 const I& input =
exact(input_);
82 mln_precondition(input.is_valid());
91 mlc_is(mln_trait_image_value_access(I),
92 mln::trait::image::value_access::direct)::check();
93 mlc_is(mln_trait_image_value_storage(I),
94 mln::trait::image::value_storage::one_block)::check();
98 typedef mln_domain(I) domain_t;
99 mln_site(I) pmax(input.domain().pmax().col(),
100 input.domain().pmax().row());
101 mln_concrete(I) output(domain_t(input.domain().pmin(), pmax),
104 mln_assertion(output.is_valid());
106 const mln_value(I)* in_ptr = input.buffer();
109 in_ncols = geom::
ncols(input) + 2 * input.border(),
110 in_nrows = geom::
nrows(input) + 2 * input.border();
113 out_ncols = geom::
ncols(output) + 2 * input.border(),
114 out_nrows = geom::
nrows(output) + 2 * input.border();
120 mln_value(I)* out_ptr = output.buffer();
125 out_next_offset = output.delta_offset(dp);
127 out_next_p_offset = output.delta_offset(
dpoint2d(-1, 0));
129 out_ptr += output.delta_offset(
dpoint2d(out_nrows - 1, 0));
134 out_next_offset = output.delta_offset(dp);
136 out_next_p_offset = output.delta_offset(
dpoint2d(+1, 0));
138 out_ptr += out_ncols - 1;
141 for (
unsigned row = 0; row < in_nrows; ++row)
143 for (
unsigned col = 0; col < in_ncols;
144 ++col, ++in_ptr, out_ptr += out_next_p_offset)
147 out_ptr += out_next_offset;
154 template <
typename I>
162 # endif // ! MLN_INCLUDE_ONLY
170 # endif // SCRIBO_PREPROCESSING_ROTATE_90_HH