diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-06-29 10:23:40 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-06-29 11:21:56 +0200 |
commit | 60d1383db4d9f646ce5504edc9b2c437836696db (patch) | |
tree | 12fc2d690c6add4fa849e97e614bde60ca60372b /transfer_interp_template.c | |
parent | 6d9c352ff599201dacff330004a7c6cd54705aaa (diff) |
transfer: implement and use 1D interpolation
Stop abusing "2D of y size 1" for this.
Diffstat (limited to 'transfer_interp_template.c')
-rw-r--r-- | transfer_interp_template.c | 26 |
1 files changed, 23 insertions, 3 deletions
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 |