27 #ifndef MLN_SUBSAMPLING_ANTIALIASED_HH
28 # define MLN_SUBSAMPLING_ANTIALIASED_HH
35 #include <mln/core/concept/image.hh>
36 #include <mln/border/thickness.hh>
37 #include <mln/extension/adjust_duplicate.hh>
38 #include <mln/core/macros.hh>
59 const mln_domain(I)& output_domain,
60 unsigned border_thickness);
67 antialiased(const Image<I>& input,
unsigned factor);
71 # ifndef MLN_INCLUDE_ONLY
83 antialiased_tests(
const Image<I>& input,
85 const mln_domain(I)& output_domain,
86 unsigned border_thickness)
88 typedef mln_site(I) P;
90 mlc_is_a(mln_domain(I), Box)::check();
91 mln_precondition(exact(input).is_valid());
92 mln_precondition(exact(input).domain().pmin() == literal::origin);
97 (
void) border_thickness;
113 template <
typename I>
118 const mln_domain(I)& output_domain,
119 unsigned border_thickness)
123 (void) output_domain;
124 (void) border_thickness;
127 mlc_abort(I)::check();
129 mln_concrete(I) output;
137 template <typename I>
140 antialiased_2d_fastest_scalar(const Image<I>& input_,
142 const mln_domain(I)& output_domain,
143 unsigned border_thickness)
145 trace::entering(
"subsampling::impl::antialiased_2d_fastest");
147 internal::antialiased_tests(input_, factor,
148 output_domain, border_thickness);
150 const I& input = exact(input_);
155 trace::exiting(
"subsampling::impl::antialiased_2d_fastest");
159 typedef mln_value(I) V;
160 typedef mln_sum(V) S;
162 typedef mln_site(I) P;
163 box<P> b = output_domain;
166 P pmin = input.domain().pmin() / factor,
167 pmax = input.domain().pmax() / factor;
168 b = box<P>(pmin, pmax);
170 typedef mln_concrete(I) O;
171 O output(b, border_thickness);
174 unsigned input_border = factor - std::min(input.nrows() % factor,
175 input.ncols() % factor);
176 extension::adjust_duplicate(input, input_border);
179 typedef const V* ptr_t;
181 util::array<ptr_t> ptrs(factor, 0);
182 for (
unsigned i = 0; i < factor; ++i)
183 ptrs[i] = & input.at_(i, 0);
185 mln_box_runstart_piter(O) s(output.domain());
186 const
unsigned n = s.run_length();
188 factor_2 = factor * factor,
189 factor_round = factor_2 / 2;
190 unsigned offset = input.delta_index(
point2d(factor,0) -
point2d(0,factor*n));
194 mln_value(O)* po = & output(s);
195 for (
unsigned i = 0; i < n; ++i)
197 mln_sum(V) s = literal::zero;
198 for (
unsigned j = 0; j < factor; ++j)
199 for (
unsigned k = 0; k < factor; ++k)
202 convert::from_to((s + factor_round) / factor_2, *po);
206 for (
unsigned j = 0; j < factor; ++j)
210 trace::exiting("
subsampling::impl::antialiased_2d_fastest");
216 template <typename I>
219 antialiased_2d_fastest_rgb(const Image<I>& input_,
221 const mln_domain(I)& output_domain,
222 unsigned border_thickness)
224 trace::entering(
"subsampling::impl::antialiased_2d_rgb");
226 internal::antialiased_tests(input_, factor,
227 output_domain, border_thickness);
229 const I& input = exact(input_);
235 trace::exiting(
"subsampling::impl::antialiased_2d_rgb");
239 typedef mln_value(I) V;
240 typedef mln_sum(V) S;
242 typedef mln_site(I) P;
243 box<P> b = output_domain;
246 P pmin = input.domain().pmin() / factor,
247 pmax = input.domain().pmax() / factor;
248 b = box<P>(pmin, pmax);
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);
256 extension::adjust_duplicate(input, input_border);
259 typedef const V* ptr_t;
261 util::array<ptr_t> ptrs(factor, 0);
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_index(point2d(factor,0) - point2d(0,factor*n));
274 mln_value(O)* po = & output(s);
275 for (
unsigned i = 0; i < n; ++i)
277 mln_sum(V) s = literal::zero;
278 for (
unsigned j = 0; j < factor; ++j)
279 for (
unsigned k = 0; k < factor; ++k)
281 algebra::vec<3, float> tmp = *ptrs[j]++;
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)
296 trace::exiting(
"subsampling::impl::antialiased_2d_rgb");
311 template <
unsigned dim,
typename I>
314 antialiased_dispatch(trait::image::value_alignment::any,
315 trait::image::value_storage::any,
316 trait::image::value_access::any,
317 const Image<I>& input,
319 const mln_domain(I)& output_domain,
320 unsigned border_thickness)
324 (void) output_domain;
325 (void) border_thickness;
328 mlc_abort(I)::check();
331 template <
typename I>
334 antialiased_2d_fastest_dispatch(const mln_value(I)&,
335 const Image<I>& input,
337 const mln_domain(I)& output_domain,
338 unsigned border_thickness)
340 return impl::antialiased_2d_fastest_scalar(input, factor,
346 template <
unsigned n,
typename I>
349 antialiased_2d_fastest_dispatch(const value::rgb<n>&,
350 const Image<I>& input,
352 const mln_domain(I)& output_domain,
353 unsigned border_thickness)
355 return impl::antialiased_2d_fastest_rgb(input, factor,
361 template <
typename I>
364 antialiased_2d_fastest_dispatch(const Image<I>& input,
366 const mln_domain(I)& output_domain,
367 unsigned border_thickness)
369 typedef mln_value(I) V;
370 return antialiased_2d_fastest_dispatch(V(), input, factor,
376 template <typename I>
379 antialiased_dispatch_2d(trait::image::value_alignment::with_grid,
380 trait::image::value_storage::one_block,
381 trait::image::value_access::direct,
382 const Image<I>& input,
384 const mln_domain(I)& output_domain,
385 unsigned border_thickness)
387 return antialiased_2d_fastest_dispatch(input, factor,
393 template <
typename I>
396 antialiased_dispatch(const Image<I>& input,
398 const mln_domain(I)& output_domain,
399 unsigned border_thickness)
401 unsigned dim = mln_site_(I)::dim;
404 return antialiased_dispatch_2d(
405 mln_trait_image_value_alignment(I)(),
406 mln_trait_image_value_storage(I)(),
407 mln_trait_image_value_access(I)(),
413 trace::warning(
"Not implemented yet.");
415 mln_concrete(I) output;
425 template <typename I>
430 const mln_domain(I)& output_domain,
431 unsigned border_thickness)
433 trace::entering(
"subsampling::antialiased");
435 typedef mln_site(I) P;
437 internal::antialiased_tests(input, factor,
438 output_domain, border_thickness);
441 output = internal::antialiased_dispatch(input, factor,
445 trace::exiting(
"subsampling::antialiased");
450 template <
typename I>
455 mln_domain(I) domain;
456 return antialiased(input, factor, domain, border::thickness);
461 # endif // ! MLN_INCLUDE_ONLY
468 #endif // ! MLN_SUBSAMPLING_ANTIALIASED_HH