image merging. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@3411 92316355-f0b4-4df1-b90c-862c8a59935fmaster
| @@ -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 | ||||
| @@ -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); | |||||
| } | |||||
| @@ -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; | ||||
| @@ -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 *); | ||||