37 #ifndef VIGRA_MULTI_RESIZE_HXX
38 #define VIGRA_MULTI_RESIZE_HXX
41 #include "resizeimage.hxx"
42 #include "navigator.hxx"
48 template <
class SrcIterator,
class Shape,
class SrcAccessor,
49 class DestIterator,
class DestAccessor,
class Kernel>
51 internalResizeMultiArrayOneDimension(
52 SrcIterator si, Shape
const & sshape, SrcAccessor src,
53 DestIterator di, Shape
const & dshape, DestAccessor dest,
54 Kernel
const & spline,
unsigned int d)
56 enum { N = 1 + SrcIterator::level };
58 typedef typename NumericTraits<typename DestAccessor::value_type>::RealPromote TmpType;
60 typedef MultiArrayNavigator<SrcIterator, N> SNavigator;
61 typedef MultiArrayNavigator<DestIterator, N> DNavigator;
63 SNavigator snav( si, sshape, d );
64 DNavigator dnav( di, dshape, d );
66 int ssize = sshape[d];
67 int dsize = dshape[d];
69 vigra_precondition(ssize > 1,
70 "resizeMultiArraySplineInterpolation(): "
71 "Source array too small.\n");
73 Rational<int> ratio(dsize - 1, ssize - 1);
74 Rational<int> offset(0);
75 resampling_detail::MapTargetToSourceCoordinate mapCoordinate(ratio, offset);
76 int period =
lcm(ratio.numerator(), ratio.denominator());
78 ArrayVector<double>
const & prefilterCoeffs = spline.prefilterCoefficients();
79 ArrayVector<Kernel1D<double> > kernels(period);
80 createResamplingKernels(spline, mapCoordinate, kernels);
83 ArrayVector<TmpType> tmp( ssize );
84 typename ArrayVector<TmpType>::iterator t = tmp.begin(), tend = tmp.end();
85 typename AccessorTraits<TmpType>::default_accessor ta;
87 for( ; snav.hasMore(); snav++, dnav++ )
90 copyLine( snav.begin(), snav.end(), src, t, ta);
92 for(
unsigned int b = 0; b < prefilterCoeffs.size(); ++b)
95 prefilterCoeffs[b], BORDER_TREATMENT_REFLECT);
98 dnav.begin(), dnav.begin() + dsize, dest,
99 kernels, mapCoordinate);
199 template <
class SrcIterator,
class Shape,
class SrcAccessor,
200 class DestIterator,
class DestAccessor,
204 SrcIterator si, Shape
const & sshape, SrcAccessor src,
205 DestIterator di, Shape
const & dshape, DestAccessor dest,
206 Kernel
const & spline)
208 enum { N = 1 + SrcIterator::level };
209 typedef typename NumericTraits<typename DestAccessor::value_type>::RealPromote TmpType;
210 typedef MultiArray<N, TmpType> TmpArray;
211 typedef typename AccessorTraits<TmpType>::default_accessor TmpAccessor;
215 detail::internalResizeMultiArrayOneDimension(si, sshape, src,
216 di, dshape, dest, spline, 0);
221 Shape tmpShape(sshape);
222 tmpShape[d] = dshape[d];
223 MultiArray<N, TmpType> tmp(tmpShape);
226 detail::internalResizeMultiArrayOneDimension(si, sshape, src,
227 tmp.traverser_begin(), tmpShape, ta, spline, d);
231 tmpShape[d] = dshape[d];
232 MultiArray<N, TmpType> dtmp(tmpShape);
234 detail::internalResizeMultiArrayOneDimension(tmp.traverser_begin(), tmp.shape(), ta,
235 dtmp.traverser_begin(), tmpShape, ta, spline, d);
238 detail::internalResizeMultiArrayOneDimension(tmp.traverser_begin(), tmp.shape(), ta,
239 di, dshape, dest, spline, d);
243 template <
class SrcIterator,
class Shape,
class SrcAccessor,
244 class DestIterator,
class DestAccessor,
248 triple<DestIterator, Shape, DestAccessor> dest,
249 Kernel
const & spline)
252 dest.first, dest.second, dest.third, spline);
255 template <
class SrcIterator,
class Shape,
class SrcAccessor,
256 class DestIterator,
class DestAccessor>
259 SrcIterator si, Shape
const & sshape, SrcAccessor src,
260 DestIterator di, Shape
const & dshape, DestAccessor dest)
265 template <
class SrcIterator,
class Shape,
class SrcAccessor,
266 class DestIterator,
class DestAccessor>
269 triple<DestIterator, Shape, DestAccessor> dest)
272 dest.first, dest.second, dest.third);
279 #endif // VIGRA_MULTI_RESIZE_HXX