aboutsummaryrefslogtreecommitdiffstats
path: root/libglitter_redistribute_energy_double.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2023-01-31 17:41:21 +0100
committerMattias Andrée <maandree@kth.se>2023-01-31 17:41:21 +0100
commit028da0c98201140f2b0cc6dfdae39da61b3cebaf (patch)
treeb98adf43713e46a48a72e1ba291d2b242e98fd71 /libglitter_redistribute_energy_double.c
parentAdd libglitter_redistribute_energy_double stub (diff)
downloadlibglitter-028da0c98201140f2b0cc6dfdae39da61b3cebaf.tar.gz
libglitter-028da0c98201140f2b0cc6dfdae39da61b3cebaf.tar.bz2
libglitter-028da0c98201140f2b0cc6dfdae39da61b3cebaf.tar.xz
Implement libglitter_redistribute_energy_double
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'libglitter_redistribute_energy_double.c')
-rw-r--r--libglitter_redistribute_energy_double.c64
1 files changed, 28 insertions, 36 deletions
diff --git a/libglitter_redistribute_energy_double.c b/libglitter_redistribute_energy_double.c
index 3eb39e0..9f97ed3 100644
--- a/libglitter_redistribute_energy_double.c
+++ b/libglitter_redistribute_energy_double.c
@@ -4,56 +4,48 @@
static void
-hselfconvolute(double *restrict raster, size_t rowsize, size_t width, size_t height, size_t kernelsize, const double *hkernel)
+vconvolute(double *restrict raster, size_t rowsize, size_t width, size_t height, size_t kernelsize, const double *kernel)
{
- /* TODO */
-}
-
-
-static void
-hconvolute(double *restrict output, const double *restrict input, size_t output_rowsize, size_t input_rowsize,
- size_t width, size_t height, size_t kernelsize, const double *kernel)
-{
- /* TODO */
-}
-
-
-static void
-vconvolute(double *restrict output, const double *restrict input, size_t output_rowsize, size_t input_rowsize,
- size_t width, size_t height, size_t kernelsize, const double *kernel)
-{
- /* TODO */
+ size_t y, x, i;
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++)
+ raster[x] *= kernel[0];
+ for (i = 1; i < kernelsize; i++)
+ for (x = 0; x < width; x++)
+ raster[x] = fma(raster[i * rowsize + x], kernel[i], raster[x]);
+ raster = &raster[rowsize];
+ }
}
static void
-copyraster(double *restrict output, const double *restrict input, size_t output_rowsize,
- size_t input_rowsize, size_t width, size_t height)
+hconvolute(double *restrict raster, size_t rowsize, size_t width, size_t height, size_t kernelsize, const double *kernel)
{
- size_t y;
+ size_t y, x, i;
for (y = 0; y < height; y++) {
- memcpy(output, input, width * sizeof(double));
- output = &output[output_rowsize];
- input = &input[input_rowsize];
+ for (x = 0; x < width; x++) {
+ raster[x] *= kernel[0];
+ for (i = 1; i < kernelsize; i++)
+ raster[x] = fma(raster[x + i], kernel[i], raster[x]);
+ }
+ raster = &raster[rowsize];
}
}
void
-libglitter_redistribute_energy_double(double *restrict output, const double *restrict input, /* TODO add man page */
- size_t output_rowsize, size_t input_rowsize, size_t width,
- size_t height, size_t hkernelsize, size_t vkernelsize,
- const double *hkernel, const double *vkernel)
+libglitter_redistribute_energy_double(double *restrict raster, size_t rowsize, size_t width, size_t height, /* TODO add man page */
+ size_t hkernelsize, size_t vkernelsize, const double *hkernel, const double *vkernel)
{
- /* TODO Can we allow output==input ? */
if (vkernelsize > 1) {
- vconvolute(output, input, output_rowsize, input_rowsize, width, height, vkernelsize, vkernel);
- if (hkernelsize > 1)
- hselfconvolute(output, output_rowsize, width, height, hkernelsize, hkernel);
- } else if (hkernelsize > 1) {
- vconvolute(output, input, output_rowsize, input_rowsize, width, height, hkernelsize, hkernel);
- } else {
- copyraster(output, input, output_rowsize, input_rowsize, width, height);
+ raster -= (hkernelsize - 1) * rowsize;
+ vconvolute(raster, rowsize, width, height, vkernelsize, vkernel);
+ height += hkernelsize - 1;
+ }
+ if (hkernelsize > 1) {
+ raster -= hkernelsize - 1;
+ hconvolute(raster, rowsize, width, height, hkernelsize, hkernel);
+ width += hkernelsize - 1;
}
}