27 #ifndef MLN_BORDER_DUPLICATE_HH
28 # define MLN_BORDER_DUPLICATE_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/core/routine/primary.hh>
36 # include <mln/core/box_runstart_piter.hh>
37 # include <mln/border/get.hh>
38 # include <mln/opt/element.hh>
62 # ifndef MLN_INCLUDE_ONLY
69 void duplicate_1D(I& ima)
71 mln_trace(
"border::impl::duplicate_1D");
73 typedef mln_psite(I) P;
74 mln_box_runstart_piter(I) pl(ima.domain());
75 unsigned len_c = ima.
bbox().len(P::dim - 1);
76 unsigned border = ima.border();
78 for (
unsigned i = 0; i < border; ++i)
79 opt::element(ima, i) = opt::element(ima, border);
81 unsigned st = border + len_c - 1;
82 for (
unsigned i = st + 1; i < opt::nelements(ima); ++i)
83 opt::element(ima, i) = opt::element(ima, st);
89 void duplicate_2D(I& ima)
91 mln_trace(
"border::impl::duplicate_2D");
93 typedef mln_psite(I) P;
94 mln_box_runstart_piter(I) pl(ima.domain());
95 unsigned border = ima.border();
96 unsigned border_2x = 2 * ima.border();
97 unsigned len_c = ima.
bbox().len(1);
98 unsigned len_r = ima.
bbox().len(0);
99 unsigned real_len_c = len_c + border_2x;
105 st = ima.offset_of_point (pl);
106 for (
unsigned i = 1; i <= border; ++i)
109 for (
unsigned i = 1; i <= border; ++i)
114 st = real_len_c * border;
115 for (
unsigned k = 0; k < border; ++k)
116 for (
unsigned i = 0; i < real_len_c; ++i)
120 st = real_len_c * (border + len_r - 1);
121 for (
unsigned k = 1; k <= border; ++k)
122 for (
unsigned i = st; i < st + real_len_c; ++i)
127 template <
typename I>
129 void duplicate_3D(I& ima)
131 mln_trace(
"border::impl::duplicate_3D");
133 mln_precondition(ima.is_valid());
135 typedef mln_psite(I) P;
136 mln_box_runstart_piter(I) pl(ima.domain());
137 unsigned border = ima.border();
138 unsigned border_2x = 2 * ima.border();
139 unsigned len_c = ima.
bbox().len(P::dim - 1);
140 unsigned len_r = ima.
bbox().len(1);
141 unsigned len_s = ima.
bbox().len(0);
142 unsigned real_len_c = len_c + border_2x;
143 unsigned real_len_r = len_r + border_2x;
144 unsigned face = real_len_c * real_len_r;
149 for (
unsigned k = 0; k < len_s; ++k)
153 for (
unsigned j = 0; j < len_r; ++j)
155 st = ima.offset_of_point (pl);
156 for (
unsigned i = 1; i <= border; ++i)
159 for (
unsigned i = 1; i <= border; ++i)
165 st = border * face + k * face + border * real_len_c ;
166 for (
unsigned j = 1; j <= border; ++j)
167 for (
unsigned i = 0; i < real_len_c; ++i)
172 st = border * face + k * face + (len_r + border - 1) * real_len_c ;
173 for (
unsigned j = 1; j <= border; ++j)
174 for (
unsigned i = 0; i < real_len_c; ++i)
181 for (
unsigned k = 0; k < border; ++k)
182 for (
unsigned i = 0; i < face; ++i)
186 st = (len_s + border - 1) * face;
187 for (
unsigned k = 1; k <= border; ++k)
188 for (
unsigned i = 0; i < face; ++i)
199 template <
typename I>
200 void duplicate_dispatch_on(metal::int_<1>, I& ima)
202 impl::duplicate_1D(ima);
205 template <
typename I>
206 void duplicate_dispatch_on(metal::int_<2>, I& ima)
208 impl::duplicate_2D(ima);
211 template <
typename I>
212 void duplicate_dispatch_on(metal::int_<3>, I& ima)
214 impl::duplicate_3D(ima);
217 template <
typename I>
218 void duplicate_dispatch_on(trait::image::speed::fastest,
221 typedef mln_site(I) P;
222 duplicate_dispatch_on(metal::int_<P::dim>(),
223 const_cast<I&>(
exact(ima)));
226 template <typename I>
227 void duplicate_dispatch_on(trait::image::speed::any,
234 template <
typename I>
235 void duplicate_dispatch_on(
const Image<I>& ima)
237 duplicate_dispatch_on(mln_trait_image_speed(I)(),
241 template <
typename I>
242 void duplicate_dispatch(
const Image<I>& ima)
244 duplicate_dispatch_on(
primary(ima));
252 template <
typename I>
255 mln_trace(
"border::duplicate");
256 mln_precondition(
exact(ima).is_valid());
259 internal::duplicate_dispatch(ima);
264 # endif // ! MLN_INCLUDE_ONLY
271 #endif // ! MLN_BORDER_DUPLICATE_HH