File: progress-cancel.c

package info (click to toggle)
vips 8.18.0-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 53,240 kB
  • sloc: ansic: 172,611; cpp: 12,257; python: 5,077; sh: 773; perl: 40; makefile: 25; javascript: 6
file content (78 lines) | stat: -rw-r--r-- 1,716 bytes parent folder | download | duplicates (2)
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;
}