From 60d1383db4d9f646ce5504edc9b2c437836696db Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 29 Jun 2019 10:23:40 +0200 Subject: transfer: implement and use 1D interpolation Stop abusing "2D of y size 1" for this. --- transfer_interp_template.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'transfer_interp_template.c') diff --git a/transfer_interp_template.c b/transfer_interp_template.c index e7ff14a..7bfc89e 100644 --- a/transfer_interp_template.c +++ b/transfer_interp_template.c @@ -27,9 +27,9 @@ #define FUNC(name) FUNC2(name, CONT, STENCIL) static void -FUNC(interp_transfer_line)(double *dst, ptrdiff_t dst_len, - const double *src, ptrdiff_t src_stride, - const ptrdiff_t *idx_x, const double *fact_x, const double *fact_y +FUNC(interp2d_transfer_line)(double *dst, ptrdiff_t dst_len, + const double *src, ptrdiff_t src_stride, + const ptrdiff_t *idx_x, const double *fact_x, const double *fact_y #if !CONTIGUOUS , ptrdiff_t dst_stride0, ptrdiff_t src_stride0 # define SSTRIDE1 src_stride0 @@ -56,6 +56,26 @@ FUNC(interp_transfer_line)(double *dst, ptrdiff_t dst_len, } } +static void +FUNC(interp1d_transfer_line)(double *dst, ptrdiff_t dst_len, + const double *src, const ptrdiff_t *idx_x, const double *fact_x +#if !CONTIGUOUS + , ptrdiff_t dst_stride0, ptrdiff_t src_stride0 +#endif + ) +{ + for (size_t x = 0; x < dst_len; x++) { + const double *src_data = src + SSTRIDE1 * idx_x[x]; + + double val = 0.0; + + for (ptrdiff_t idx = 0; idx < STENCIL; idx++) + val += src_data[idx * SSTRIDE1] * fact_x[STENCIL * x + idx]; + + dst[x * DSTRIDE1] = val; + } +} + #undef SSTRIDE1 #undef DSTRIDE1 #undef CONT -- cgit v1.2.3