2019-09-10 10:31:48 +11:00
|
|
|
/*
|
|
|
|
* interpolate.c
|
|
|
|
*/
|
2019-09-10 01:02:44 +11:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
2021-05-20 18:31:28 +11:00
|
|
|
#include <stdint.h>
|
2019-09-10 01:02:44 +11:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include "../floatimg.h"
|
|
|
|
|
2020-01-23 04:15:29 +11:00
|
|
|
extern int verbosity;
|
2019-09-10 01:02:44 +11:00
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- */
|
2019-09-10 02:24:31 +11:00
|
|
|
static int gray_interpolate(FloatImg *s1, FloatImg *s2, FloatImg *d, float coef)
|
|
|
|
{
|
2019-09-10 10:31:48 +11:00
|
|
|
int picsize, idx;
|
|
|
|
|
|
|
|
picsize = d->width * d->height;
|
|
|
|
for (idx=0; idx<picsize; idx++) {
|
|
|
|
d->R[idx] = (coef * s1->R[idx]) + ((1.0-coef) * s2->R[idx]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2019-09-10 02:24:31 +11:00
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
2019-09-10 10:31:48 +11:00
|
|
|
static int rgb_interpolate(FloatImg *s1, FloatImg *s2, FloatImg *d, float coef)
|
2019-09-10 01:02:44 +11:00
|
|
|
{
|
|
|
|
int picsize, idx;
|
|
|
|
|
2021-03-18 04:32:51 +11:00
|
|
|
picsize = d->width * d->height;
|
2019-09-10 01:02:44 +11:00
|
|
|
for (idx=0; idx<picsize; idx++) {
|
|
|
|
d->R[idx] = (coef * s1->R[idx]) + ((1.0-coef) * s2->R[idx]);
|
2021-03-18 04:32:51 +11:00
|
|
|
d->G[idx] = (coef * s1->G[idx]) + ((1.0-coef) * s2->G[idx]);
|
|
|
|
d->B[idx] = (coef * s1->B[idx]) + ((1.0-coef) * s2->B[idx]);
|
2019-09-10 10:31:48 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
|
|
|
int fimg_interpolate(FloatImg *s1, FloatImg *s2, FloatImg *d, float coef)
|
|
|
|
{
|
|
|
|
int foo;
|
|
|
|
|
2020-02-17 17:40:06 +11:00
|
|
|
#if DEBUG_LEVEL
|
|
|
|
fprintf(stderr, ">>> %s ( %p %p %p %f )\n", __func__,
|
|
|
|
s1, s2, d, coef);
|
|
|
|
#endif
|
|
|
|
|
2020-04-07 05:09:11 +11:00
|
|
|
foo = fimg_images_not_compatible(s1, s2);
|
2019-09-10 10:31:48 +11:00
|
|
|
if (foo) {
|
2020-02-17 17:40:06 +11:00
|
|
|
fprintf(stderr, "compat s1 s2 -> %d\n", foo);
|
2019-09-10 10:31:48 +11:00
|
|
|
return foo;
|
|
|
|
}
|
|
|
|
|
2020-04-07 05:09:11 +11:00
|
|
|
foo = fimg_images_not_compatible(s1, d);
|
2019-09-10 10:31:48 +11:00
|
|
|
if (foo) {
|
2020-02-17 17:40:06 +11:00
|
|
|
fprintf(stderr, "compat s1 d -> %d\n", foo);
|
2019-09-10 10:31:48 +11:00
|
|
|
return foo;
|
|
|
|
}
|
2019-09-10 01:02:44 +11:00
|
|
|
|
2019-09-10 10:31:48 +11:00
|
|
|
switch (s1->type) {
|
|
|
|
case FIMG_TYPE_GRAY:
|
2020-02-17 17:40:06 +11:00
|
|
|
gray_interpolate (s1, s2, d, coef); break;
|
2019-09-10 10:31:48 +11:00
|
|
|
case FIMG_TYPE_RGB:
|
2020-02-17 17:40:06 +11:00
|
|
|
rgb_interpolate (s1, s2, d, coef); break;
|
2019-09-10 10:31:48 +11:00
|
|
|
default:
|
|
|
|
fprintf(stderr, "%s, %d is a bad type\n", __func__, s1->type);
|
|
|
|
return -18;
|
2019-09-10 01:02:44 +11:00
|
|
|
}
|
|
|
|
|
2019-09-10 02:24:31 +11:00
|
|
|
return 0;
|
2019-09-10 01:02:44 +11:00
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|