Browse Source

mean.c: rename this file into merge.c and implement pipi_merge() for trivial

image merging.

git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@3411 92316355-f0b4-4df1-b90c-862c8a59935f
master
sam 15 years ago
parent
commit
80bfef8e57
4 changed files with 44 additions and 6 deletions
  1. +1
    -1
      pipi/Makefile.am
  2. +17
    -5
      pipi/combine/merge.c
  3. +25
    -0
      pipi/context.c
  4. +1
    -0
      pipi/pipi.h

+ 1
- 1
pipi/Makefile.am View File

@@ -60,7 +60,7 @@ render_sources = \


combine_sources = \ combine_sources = \
combine/rgb.c \ combine/rgb.c \
combine/mean.c \
combine/merge.c \
combine/minmax.c \ combine/minmax.c \
combine/subadd.c \ combine/subadd.c \
combine/mulscreen.c combine/mulscreen.c


pipi/combine/mean.c → pipi/combine/merge.c View File

@@ -23,16 +23,23 @@
#include "pipi.h" #include "pipi.h"
#include "pipi_internals.h" #include "pipi_internals.h"


pipi_image_t *pipi_mean(pipi_image_t *img1, pipi_image_t *img2)
pipi_image_t *pipi_merge(pipi_image_t *img1, pipi_image_t *img2, double t)
{ {
pipi_image_t *dst; pipi_image_t *dst;
pipi_pixels_t *img1p, *img2p, *dstp; pipi_pixels_t *img1p, *img2p, *dstp;
float *img1data, *img2data, *dstdata; float *img1data, *img2data, *dstdata;
double t2;
int x, y, w, h; int x, y, w, h;


if(img1->w != img2->w || img1->h != img2->h) if(img1->w != img2->w || img1->h != img2->h)
return NULL; return NULL;


if(t < 0.0)
t = 0.0;
else if(t > 1.0)
t = 1.0;
t2 = 1.0 - t;

w = img1->w; w = img1->w;
h = img1->h; h = img1->h;


@@ -53,22 +60,27 @@ pipi_image_t *pipi_mean(pipi_image_t *img1, pipi_image_t *img2)


p = img1data[4 * (y * w + x)]; p = img1data[4 * (y * w + x)];
q = img2data[4 * (y * w + x)]; q = img2data[4 * (y * w + x)];
dstdata[4 * (y * w + x)] = (p + q) * 0.5;
dstdata[4 * (y * w + x)] = t * p + t2 * q;


p = img1data[4 * (y * w + x) + 1]; p = img1data[4 * (y * w + x) + 1];
q = img2data[4 * (y * w + x) + 1]; q = img2data[4 * (y * w + x) + 1];
dstdata[4 * (y * w + x) + 1] = (p + q) * 0.5;
dstdata[4 * (y * w + x) + 1] = t * p + t2 * q;


p = img1data[4 * (y * w + x) + 2]; p = img1data[4 * (y * w + x) + 2];
q = img2data[4 * (y * w + x) + 2]; q = img2data[4 * (y * w + x) + 2];
dstdata[4 * (y * w + x) + 2] = (p + q) * 0.5;
dstdata[4 * (y * w + x) + 2] = t * p + t2 * q;


p = img1data[4 * (y * w + x) + 3]; p = img1data[4 * (y * w + x) + 3];
q = img2data[4 * (y * w + x) + 3]; q = img2data[4 * (y * w + x) + 3];
dstdata[4 * (y * w + x) + 3] = (p + q) * 0.5;
dstdata[4 * (y * w + x) + 3] = t * p + t2 * q;
} }
} }


return dst; return dst;
} }


pipi_image_t *pipi_mean(pipi_image_t *img1, pipi_image_t *img2)
{
return pipi_merge(img1, img2, 0.5);
}


+ 25
- 0
pipi/context.c View File

@@ -78,6 +78,7 @@ pipi_command_t const *pipi_get_command_list(void)
{ "combine", 0 }, { "combine", 0 },
{ "split", 0 }, { "split", 0 },
{ "mean", 0 }, { "mean", 0 },
{ "merge", 1 },
{ "min", 0 }, { "min", 0 },
{ "max", 0 }, { "max", 0 },
{ "add", 0 }, { "add", 0 },
@@ -523,6 +524,30 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...)
ctx->images[ctx->nimages - 2] = dst; ctx->images[ctx->nimages - 2] = dst;
ctx->nimages--; ctx->nimages--;
} }
else if(!strcmp(cmd, "merge"))
{
pipi_image_t *dst;
char const *arg;
va_list ap;
double val;

if(ctx->nimages < 2)
return -1;

va_start(ap, cmd);
arg = va_arg(ap, char const *);
va_end(ap);
val = atof(arg);

dst = pipi_merge(ctx->images[ctx->nimages - 2],
ctx->images[ctx->nimages - 1], val);
if(dst == NULL)
return -1;
pipi_free(ctx->images[ctx->nimages - 2]);
pipi_free(ctx->images[ctx->nimages - 1]);
ctx->images[ctx->nimages - 2] = dst;
ctx->nimages--;
}
else if(!strcmp(cmd, "min")) else if(!strcmp(cmd, "min"))
{ {
pipi_image_t *dst; pipi_image_t *dst;


+ 1
- 0
pipi/pipi.h View File

@@ -166,6 +166,7 @@ __extern pipi_image_t *pipi_rgb(pipi_image_t *, pipi_image_t *, pipi_image_t *);
__extern pipi_image_t *pipi_red(pipi_image_t *); __extern pipi_image_t *pipi_red(pipi_image_t *);
__extern pipi_image_t *pipi_green(pipi_image_t *); __extern pipi_image_t *pipi_green(pipi_image_t *);
__extern pipi_image_t *pipi_blue(pipi_image_t *); __extern pipi_image_t *pipi_blue(pipi_image_t *);
__extern pipi_image_t *pipi_merge(pipi_image_t *, pipi_image_t *, double);
__extern pipi_image_t *pipi_mean(pipi_image_t *, pipi_image_t *); __extern pipi_image_t *pipi_mean(pipi_image_t *, pipi_image_t *);
__extern pipi_image_t *pipi_min(pipi_image_t *, pipi_image_t *); __extern pipi_image_t *pipi_min(pipi_image_t *, pipi_image_t *);
__extern pipi_image_t *pipi_max(pipi_image_t *, pipi_image_t *); __extern pipi_image_t *pipi_max(pipi_image_t *, pipi_image_t *);


Loading…
Cancel
Save