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
| #include <stdlib.h>
#include <gtk/gtk.h>
cairo_surface_t*
create_surface ()
{
/* Création d'une surface de taille 1000, 1000 */
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
1000,
1000);
/* Création d'un contexte graphique pour la surface temporaire */
cairo_t* cr = cairo_create (surface);
/* Effacement en noire de la surface */
cairo_set_source_rgba (cr, 0, 0, 0, 1);
cairo_paint (cr);
/* Dessin d'un cadre pour délimiter la surface à l'affichage */
cairo_set_source_rgba (cr, 1, 1, 1, 1);
cairo_rectangle (cr, 0, 0, 1000, 1000);
cairo_stroke (cr);
/* Dessin d'une diagonale avec une interpolation linéaire pour l'exemple */
gdouble coeff;
for (gint i=100; i<900; i++) {
coeff = (gdouble)i / 1131.;
cairo_set_source_rgba (cr, coeff, coeff, coeff, 1);
cairo_move_to (cr, i, i);
cairo_line_to (cr, i+1, i);
cairo_stroke (cr);
}
/* Destruction du contexte devenu inutile */
cairo_destroy (cr);
return surface;
}
gboolean
draw_CB (GtkWidget *drawing, cairo_t *cr, cairo_surface_t *surface)
{
/* Fond du GtkDrawingArea couleur paille */
cairo_set_source_rgba (cr, 0.87, 0.82, 0.58, 1);
cairo_paint (cr);
/* Placement de la surface en 0, 0 */
cairo_set_source_surface (cr, surface, 0, 0);
cairo_paint (cr);
return FALSE;
}
int
main(int argc, char *argv[]) {
GtkWidget *window = NULL;
/* Initialisation de Gtk */
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window, 200, 200);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
GtkWidget *scrolled = gtk_scrolled_window_new (NULL, NULL);
gtk_container_add (GTK_CONTAINER (window), scrolled);
GtkWidget *drawing = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing, 1000, 1000);
gtk_container_add (GTK_CONTAINER (scrolled), drawing);
cairo_surface_t *surface = create_surface ();
g_signal_connect (G_OBJECT (drawing), "draw", G_CALLBACK (draw_CB), surface);
gtk_widget_show_all(window);
gtk_main();
cairo_surface_destroy (surface);
return 0;
} |