
* mln/world/k1/fill_0_from_1_faces.hh, * mln/world/k1/fill_1_from_2_faces.hh: New overloads. --- milena/ChangeLog | 7 +++++ milena/mln/world/k1/fill_0_from_1_faces.hh | 34 ++++++++++++++++++++++++- milena/mln/world/k1/fill_1_from_2_faces.hh | 38 +++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 2 deletions(-) diff --git a/milena/ChangeLog b/milena/ChangeLog index d7d8e1e..0095a12 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,5 +1,12 @@ 2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Add new overloads of fill routines in k1. + + * mln/world/k1/fill_0_from_1_faces.hh, + * mln/world/k1/fill_1_from_2_faces.hh: New overloads. + +2012-10-26 Guillaume Lazzara <z@lrde.epita.fr> + Do not read outside images in fill functions with accumulators. * mln/world/k2/fill_non_primary_from_primary_2_faces.hh, diff --git a/milena/mln/world/k1/fill_0_from_1_faces.hh b/milena/mln/world/k1/fill_0_from_1_faces.hh index c0f6eb7..0568220 100644 --- a/milena/mln/world/k1/fill_0_from_1_faces.hh +++ b/milena/mln/world/k1/fill_0_from_1_faces.hh @@ -70,11 +70,15 @@ namespace mln template <typename I, typename F> void fill_0_from_1_faces(Image<I>& inout, const Function_vvvv2v<F>& f); + /// \overload + template <typename I, typename A> + void fill_0_from_1_faces(Image<I>& inout, const Accumulator<A>& accu); + # ifndef MLN_INCLUDE_ONLY - // Facade + // Facades template <typename I, typename F> @@ -95,6 +99,34 @@ namespace mln trace::exiting("mln::world::k1::fill_0_from_1_faces"); } + template <typename I, typename A> + void fill_0_from_1_faces(Image<I>& inout_, const Accumulator<A>& accu_) + { + trace::entering("mln::world::k1::fill_0_from_1_faces"); + + mln_precondition(exact(inout_).is_valid()); + I& inout = exact(inout_); + + A accu(exact(accu_)); + + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); + for_all(p) + if (kn::is_0_face(p)) + { + if (inout.domain().has(p + up)) + accu.take(inout(p + up)); + if (inout.domain().has(p + left)) + accu.take(inout(p + left)); + if (inout.domain().has(p + right)) + accu.take(inout(p + right)); + if (inout.domain().has(p + down)) + accu.take(inout(p + down)); + inout(p) = accu.to_result(); + } + + trace::exiting("mln::world::k1::fill_0_from_1_faces"); + } # endif // ! MLN_INCLUDE_ONLY diff --git a/milena/mln/world/k1/fill_1_from_2_faces.hh b/milena/mln/world/k1/fill_1_from_2_faces.hh index 74e6b25..b8bf9cd 100644 --- a/milena/mln/world/k1/fill_1_from_2_faces.hh +++ b/milena/mln/world/k1/fill_1_from_2_faces.hh @@ -69,11 +69,15 @@ namespace mln template <typename I, typename F> void fill_1_from_2_faces(Image<I>& inout, const Function_vv2v<F>& f); + /// \overload + template <typename I, typename A> + void fill_1_from_2_faces(Image<I>& inout, const Accumulator<A>& accu); + # ifndef MLN_INCLUDE_ONLY - // Facade + // Facades template <typename I, typename F> @@ -95,6 +99,38 @@ namespace mln trace::exiting("mln::world::k1::fill_1_from_2_faces"); } + template <typename I, typename A> + void fill_1_from_2_faces(Image<I>& inout_, const Accumulator<A>& accu_) + { + trace::entering("mln::world::k1::fill_1_from_2_faces"); + + mln_precondition(exact(inout_).is_valid()); + I& inout = exact(inout_); + A accu(accu_); + + mln_box(I) b = inout.domain(); + mln_piter(I) p(b); + for_all(p) + if (kn::is_1_face_vertical(p)) + { + if (inout.domain().has(p + left)) + accu.take(inout(p + left)); + if (inout.domain().has(p + right)) + accu.take(inout(p + right)); + inout(p) = accu.to_result(); + } + else if (kn::is_1_face_horizontal(p)) + { + if (inout.domain().has(p + up)) + accu.take(inout(p + up)); + if (inout.domain().has(p + down)) + accu.take(inout(p + down)); + inout(p) = accu.to_result(); + } + + trace::exiting("mln::world::k1::fill_1_from_2_faces"); + } + # endif // ! MLN_INCLUDE_ONLY -- 1.7.2.5