1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
/* Show progress feedback and computation cancel.
*
* compile with
*
* gcc -g -Wall progress-cancel.c `pkg-config vips --cflags --libs`
*/
#include <stdio.h>
#include <vips/vips.h>
#include <errno.h>
void
preeval_callback(VipsImage *image, VipsProgress *progress, void *pdata)
{
printf("preeval_callback:\n");
}
void
eval_callback(VipsImage *image, VipsProgress *progress, void *pdata)
{
printf("eval_callback: percent = %d\n", progress->percent);
if (progress->percent >= 25) {
printf("calling vips_image_set_kill() ...\n");
vips_image_set_kill(image, TRUE);
}
}
void
posteval_callback(VipsImage *image, VipsProgress *progress, void *pdata)
{
printf("posteval_callback: finished in %.3gs\n",
g_timer_elapsed(progress->start, NULL));
}
int
main(int argc, char **argv)
{
VipsImage *image;
VipsImage *out;
void *output;
size_t output_length;
if (VIPS_INIT(argv[0]))
vips_error_exit(NULL);
if (argc != 3)
vips_error_exit("usage: %s INPUT-FILE OUTPUT-FILE", argv[0]);
if (!(image = vips_image_new_from_file(argv[1],
"access", VIPS_ACCESS_SEQUENTIAL,
NULL)))
vips_error_exit(NULL);
if (vips_resize(image, &out, 0.5, NULL))
vips_error_exit(NULL);
vips_image_set_progress(out, TRUE);
g_signal_connect(out, "preeval",
G_CALLBACK(preeval_callback), NULL);
g_signal_connect(out, "eval",
G_CALLBACK(eval_callback), NULL);
g_signal_connect(out, "posteval",
G_CALLBACK(posteval_callback), NULL);
output = NULL;
if (vips_image_write_to_buffer(out, argv[2], &output, &output_length,
NULL))
printf("error return from vips_image_write_to_buffer()\n");
g_object_unref(out);
g_object_unref(image);
if (output)
g_free(output);
vips_shutdown();
return 0;
}
|