27 #ifndef MLN_SUBSAMPLING_ANTIALIASED_HH
28 # define MLN_SUBSAMPLING_ANTIALIASED_HH
35 #include <mln/core/concept/image.hh>
36 #include <mln/core/alias/point2d.hh>
37 #include <mln/border/thickness.hh>
38 #include <mln/extension/adjust_duplicate.hh>
39 #include <mln/core/macros.hh>
61 const mln_domain(I)& output_domain,
62 unsigned border_thickness);
74 # ifndef MLN_INCLUDE_ONLY
86 antialiased_tests(
const Image<I>& input,
88 const mln_domain(I)& output_domain,
89 unsigned border_thickness)
91 typedef mln_site(I) P;
93 mlc_is_a(mln_domain(I),
Box)::check();
94 mln_precondition(
exact(input).is_valid());
100 (void) border_thickness;
116 template <
typename I>
121 const mln_domain(I)& output_domain,
122 unsigned border_thickness)
126 (void) output_domain;
127 (void) border_thickness;
130 mlc_abort(I)::check();
132 mln_concrete(I) output;
140 template <
typename I>
143 antialiased_2d_fastest_scalar(
const Image<I>& input_,
145 const mln_domain(I)& output_domain,
146 unsigned border_thickness)
148 mln_trace(
"subsampling::impl::antialiased_2d_fastest");
150 internal::antialiased_tests(input_, factor,
151 output_domain, border_thickness);
153 const I& input =
exact(input_);
161 typedef mln_value(I) V;
162 typedef mln_sum(V) S;
164 typedef mln_site(I) P;
168 P pmin = input.domain().
pmin() / factor,
169 pmax = input.domain().pmax() / factor;
172 typedef mln_concrete(I) O;
173 O output(b, border_thickness);
176 unsigned input_border = factor -
std::min(input.nrows() % factor,
177 input.ncols() % factor);
181 typedef const V* ptr_t;
184 for (
unsigned i = 0; i < factor; ++i)
185 ptrs[i] = & input.at_(i, 0);
187 mln_box_runstart_piter(O) s(output.domain());
188 const unsigned n = s.run_length();
190 factor_2 = factor * factor,
191 factor_round = factor_2 / 2;
192 unsigned offset = input.delta_offset(
point2d(factor,0) -
point2d(0,factor*n));
196 mln_value(O)* po = & output(s);
197 for (
unsigned i = 0; i < n; ++i)
200 for (
unsigned j = 0; j < factor; ++j)
201 for (
unsigned k = 0; k < factor; ++k)
208 for (
unsigned j = 0; j < factor; ++j)
217 template <
typename I>
220 antialiased_2d_fastest_rgb(
const Image<I>& input_,
222 const mln_domain(I)& output_domain,
223 unsigned border_thickness)
225 mln_trace(
"subsampling::impl::antialiased_2d_rgb");
227 internal::antialiased_tests(input_, factor,
228 output_domain, border_thickness);
230 const I& input =
exact(input_);
239 typedef mln_value(I) V;
240 typedef mln_sum(V) S;
242 typedef mln_site(I) P;
246 P pmin = input.domain().
pmin() / factor,
247 pmax = input.domain().pmax() / factor;
250 typedef mln_concrete(I) O;
251 O output(b, border_thickness);
254 unsigned input_border = factor -
std::min(input.nrows() % factor,
255 input.ncols() % factor);
259 typedef const V* ptr_t;
262 for (
unsigned i = 0; i < factor; ++i)
263 ptrs[i] = & input.at_(i, 0);
265 mln_box_runstart_piter(O) s(output.domain());
266 const unsigned n = s.run_length();
268 factor_2 = factor * factor,
269 factor_round = factor_2 / 2;
270 unsigned offset = input.delta_offset(
point2d(factor,0) -
point2d(0,factor*n));
274 mln_value(O)* po = & output(s);
275 for (
unsigned i = 0; i < n; ++i)
278 for (
unsigned j = 0; j < factor; ++j)
279 for (
unsigned k = 0; k < factor; ++k)
287 for (
unsigned j = 0; j < P::dim; ++j)
288 s[j] += factor_round;
290 *po++ = (s ) / factor_2;
292 for (
unsigned j = 0; j < factor; ++j)
310 template <
unsigned dim,
typename I>
313 antialiased_dispatch(trait::image::value_alignment::any,
314 trait::image::value_storage::any,
315 trait::image::value_access::any,
318 const mln_domain(I)& output_domain,
319 unsigned border_thickness)
323 (void) output_domain;
324 (void) border_thickness;
327 mlc_abort(I)::check();
330 template <
typename I>
333 antialiased_2d_fastest_dispatch(
const mln_value(I)&,
336 const mln_domain(I)& output_domain,
337 unsigned border_thickness)
339 return impl::antialiased_2d_fastest_scalar(input, factor,
345 template <
unsigned n,
typename I>
351 const mln_domain(I)& output_domain,
352 unsigned border_thickness)
354 return impl::antialiased_2d_fastest_rgb(input, factor,
360 template <
typename I>
363 antialiased_2d_fastest_dispatch(
const Image<I>& input,
365 const mln_domain(I)& output_domain,
366 unsigned border_thickness)
368 typedef mln_value(I) V;
369 return antialiased_2d_fastest_dispatch(V(), input, factor,
375 template <
typename I>
378 antialiased_dispatch_2d(trait::image::value_alignment::with_grid,
379 trait::image::value_storage::one_block,
380 trait::image::value_access::direct,
383 const mln_domain(I)& output_domain,
384 unsigned border_thickness)
386 return antialiased_2d_fastest_dispatch(input, factor,
392 template <
typename I>
395 antialiased_dispatch(
const Image<I>& input,
397 const mln_domain(I)& output_domain,
398 unsigned border_thickness)
400 unsigned dim = mln_site_(I)::dim;
403 return antialiased_dispatch_2d(
404 mln_trait_image_value_alignment(I)(),
405 mln_trait_image_value_storage(I)(),
406 mln_trait_image_value_access(I)(),
412 mln_trace_warning(
"Not implemented yet.");
414 mln_concrete(I) output;
424 template <
typename I>
429 const mln_domain(I)& output_domain,
430 unsigned border_thickness)
432 mln_trace(
"subsampling::antialiased");
434 typedef mln_site(I) P;
436 internal::antialiased_tests(input, factor,
437 output_domain, border_thickness);
440 output = internal::antialiased_dispatch(input, factor,
448 template <
typename I>
453 mln_domain(I) domain;
459 # endif // ! MLN_INCLUDE_ONLY
466 #endif // ! MLN_SUBSAMPLING_ANTIALIASED_HH