Bonjour,

J'ai fait une petite annimation avec Cairo que je trouve plutôt jolie. Seulemment, j'aimerai sauver cette annimation dans un gif, par exemple.

Comment puis-je faire ?

Il y a bien cairo_surface_write_to_png_stream, mais c'est pour un png

Voici le code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <gtk/gtk.h>
#include <cairo.h>
#include <math.h>
 
#define W_WIDTH 390
#define W_HEIGHT 390
 
 
gint angle = 0;
 
typedef struct _Point
{
	gint x;
	gint y;
} Point;
 
static gboolean OnExposeEvent (
		GtkWidget * widget, 
		GdkEvent * event, 
		gpointer data)
{
	cairo_t * cr = NULL;
	gdouble rad = M_PI / 180;
	gint angle_part = 360 / 5;
	Point point[6];
	gint i = 1;
	gint signe = -1;
 
	cr = gdk_cairo_create (widget->window);
	cairo_scale (cr, 1, -1);
 
	cairo_translate (cr, W_WIDTH/2, -W_WIDTH/2);
 
	cairo_translate (cr, 
				150*cos (0.1*angle * rad),
				150*sin (0.1*angle * rad));
 
	cairo_scale (cr, sin(angle*rad), sin(angle*rad)); 
 
	for (i = 1; i <= 6; i++) {
		point[i - 1].x = 50*cos ((i*angle_part + angle) * rad);
		point[i - 1].y = 50*sin ((i*angle_part + angle) * rad);
	}
 
	cairo_set_source_rgba (cr, 0.1, 0.6, 0.3, 1);
 
	for (i = 0; i < 2; i++) {
		cairo_move_to (cr, signe*point[0].x, point[0].y);
		cairo_line_to (cr, signe*point[2].x, point[2].y);
		cairo_line_to (cr, signe*point[4].x, point[4].y);
		cairo_line_to (cr, signe*point[1].x, point[1].y);
		cairo_line_to (cr, signe*point[3].x, point[3].y);
		cairo_line_to (cr, signe*point[5].x, point[5].y);
 
		signe *= -1;
	}
 
	cairo_fill (cr);
 
	cairo_destroy (cr);
	return FALSE;
}
static gboolean 
time_handler (GtkWidget * widget)
{
	angle --;
	gtk_widget_queue_draw (widget);
	return TRUE;
}
 
int main (int argc, char ** argv)
{
	GtkWidget * window = NULL;
	GtkWidget * draw = NULL;
 
	gtk_init (&argc, &argv);
 
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_default_size (
			GTK_WINDOW(window), W_WIDTH, W_HEIGHT);
	gtk_window_set_title(
			GTK_WINDOW(window), "GtkWindow generic");
	g_signal_connect (G_OBJECT(window),	"destroy", G_CALLBACK(gtk_main_quit), NULL);
 
	draw = gtk_drawing_area_new ();
	gtk_container_add (
			GTK_CONTAINER(window), draw);
	g_signal_connect (G_OBJECT(draw), "expose-event", G_CALLBACK(OnExposeEvent), NULL);
 
	g_timeout_add(5, (GSourceFunc) time_handler, (gpointer) draw);
 
	gtk_widget_show_all (window);
 
	gtk_main ();
 
	return 0;
}
Merci pour vôtre aide