|
|
@@ -243,32 +243,9 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "boxblur")) |
|
|
|
else if(!strcmp(cmd, "boxblur") || !strcmp(cmd, "median")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
double w, h; |
|
|
|
|
|
|
|
if(ctx->nimages < 1) |
|
|
|
return -1; |
|
|
|
va_start(ap, cmd); |
|
|
|
arg = va_arg(ap, char const *); |
|
|
|
va_end(ap); |
|
|
|
w = h = atof(arg); |
|
|
|
arg = strchr(arg, 'x'); |
|
|
|
if(arg) |
|
|
|
h = atof(arg + 1); |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_box_blur_ext(src, w, h); |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "median")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
pipi_image_t *src, *dst = NULL; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
double w, h; |
|
|
@@ -283,41 +260,19 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
if(arg) |
|
|
|
h = atof(arg + 1); |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_median_ext(src, w, h); |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "geometry")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
int w, h; |
|
|
|
|
|
|
|
if(ctx->nimages < 1) |
|
|
|
return -1; |
|
|
|
va_start(ap, cmd); |
|
|
|
arg = va_arg(ap, char const *); |
|
|
|
va_end(ap); |
|
|
|
w = atoi(arg); |
|
|
|
arg = strchr(arg, 'x'); |
|
|
|
if(!arg) |
|
|
|
return -1; |
|
|
|
h = atoi(arg + 1); |
|
|
|
if(w <= 0 || h <= 0) |
|
|
|
return -1; |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_resize(src, w, h); |
|
|
|
switch(cmd[0]) |
|
|
|
{ |
|
|
|
case 'b': dst = pipi_box_blur_ext(src, w, h); break; |
|
|
|
case 'm': dst = pipi_median_ext(src, w, h); break; |
|
|
|
} |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "tile")) |
|
|
|
else if(!strcmp(cmd, "geometry") || !strcmp(cmd, "tile")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
pipi_image_t *src, *dst = NULL; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
int w, h; |
|
|
@@ -335,7 +290,11 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
if(w <= 0 || h <= 0) |
|
|
|
return -1; |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_tile(src, w, h); |
|
|
|
switch(cmd[0]) |
|
|
|
{ |
|
|
|
case 'g': dst = pipi_resize(src, w, h); break; |
|
|
|
case 't': dst = pipi_tile(src, w, h); break; |
|
|
|
} |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
@@ -389,29 +348,10 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
ctx->images[ctx->nimages - 1] = pipi_crop(tmp, w, h, x, y); |
|
|
|
pipi_free(tmp); |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "brightness")) |
|
|
|
else if(!strcmp(cmd, "brightness") || !strcmp(cmd, "contrast") |
|
|
|
|| !strcmp(cmd, "threshold")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
double val; |
|
|
|
|
|
|
|
if(ctx->nimages < 1) |
|
|
|
return -1; |
|
|
|
va_start(ap, cmd); |
|
|
|
arg = va_arg(ap, char const *); |
|
|
|
va_end(ap); |
|
|
|
val = atof(arg); |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_brightness(src, val); |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "contrast")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
pipi_image_t *src, *dst = NULL; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
double val; |
|
|
@@ -423,27 +363,12 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
va_end(ap); |
|
|
|
val = atof(arg); |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_contrast(src, val); |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
|
ctx->images[ctx->nimages - 1] = dst; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "threshold")) |
|
|
|
{ |
|
|
|
pipi_image_t *src, *dst; |
|
|
|
char const *arg; |
|
|
|
va_list ap; |
|
|
|
double val; |
|
|
|
|
|
|
|
if(ctx->nimages < 1) |
|
|
|
return -1; |
|
|
|
va_start(ap, cmd); |
|
|
|
arg = va_arg(ap, char const *); |
|
|
|
va_end(ap); |
|
|
|
val = atof(arg); |
|
|
|
src = ctx->images[ctx->nimages - 1]; |
|
|
|
dst = pipi_threshold(src, val); |
|
|
|
switch(cmd[0]) |
|
|
|
{ |
|
|
|
case 'b': dst = pipi_brightness(src, val); break; |
|
|
|
case 'c': dst = pipi_contrast(src, val); break; |
|
|
|
case 't': dst = pipi_threshold(src, val); break; |
|
|
|
} |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(src); |
|
|
@@ -533,21 +458,6 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
ctx->images[ctx->nimages - 3] = dst; |
|
|
|
ctx->nimages -= 2; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "mean")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_mean(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "merge")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
@@ -572,134 +482,49 @@ int pipi_command(pipi_context_t *ctx, char const *cmd, ...) |
|
|
|
ctx->images[ctx->nimages - 2] = dst; |
|
|
|
ctx->nimages--; |
|
|
|
} |
|
|
|
else if(!strcmp(cmd, "min")) |
|
|
|
else if(!strcmp(cmd, "mean") || !strcmp(cmd, "min") || !strcmp(cmd, "max") |
|
|
|
|| !strcmp(cmd, "add") || !strcmp(cmd, "sub") |
|
|
|
|| !strcmp(cmd, "difference") || !strcmp(cmd, "multiply") |
|
|
|
|| !strcmp(cmd, "divide") || !strcmp(cmd, "screen") |
|
|
|
|| !strcmp(cmd, "overlay")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_min(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "max")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_max(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "add")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_add(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "sub")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
pipi_image_t *dst = NULL; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_sub(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "difference")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_difference(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "multiply")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_multiply(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "divide")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_divide(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "screen")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_screen(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
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, "overlay")) |
|
|
|
{ |
|
|
|
pipi_image_t *dst; |
|
|
|
|
|
|
|
if(ctx->nimages < 2) |
|
|
|
return -1; |
|
|
|
dst = pipi_overlay(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
switch(cmd[2]) |
|
|
|
{ |
|
|
|
case 'a': dst = pipi_mean(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'n': dst = pipi_min(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'x': dst = pipi_max(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'd': dst = pipi_add(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'b': dst = pipi_sub(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'f': dst = pipi_difference(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'l': dst = pipi_multiply(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'v': dst = pipi_divide(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'r': dst = pipi_screen(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
case 'e': dst = pipi_overlay(ctx->images[ctx->nimages - 2], |
|
|
|
ctx->images[ctx->nimages - 1]); |
|
|
|
break; |
|
|
|
} |
|
|
|
if(dst == NULL) |
|
|
|
return -1; |
|
|
|
pipi_free(ctx->images[ctx->nimages - 2]); |
|
|
|