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
| #include <gtk/gtk.h>
typedef struct
{
guchar red;
guchar green;
guchar blue;
} RGB;
void
interpolation (int intervalle, int index, RGB *StartColor, RGB *EndColor, RGB *ResultColor)
{
if (!ResultColor) return;
ResultColor->red = (((double)index/intervalle)*EndColor->red) + ((double)(intervalle-index)/intervalle)*StartColor->red;
ResultColor->green = (((double)index/intervalle)*EndColor->green) + ((double)(intervalle-index)/intervalle)*StartColor->green;
ResultColor->blue = (((double)index/intervalle)*EndColor->blue) + ((double)(intervalle-index)/intervalle)*StartColor->blue;
}
int
main(int argc, char *argv[])
{
RGB Red, Green, Yellow, Blue, Black;
RGB ResultColor;
int i=0, j=0;
GtkWidget *Window = NULL;
GtkWidget *Image = NULL;
GdkPixbuf *Pixbuf = NULL;
guchar *Pixels = NULL;
gtk_init (&argc, &argv);
/* Définition de la couleur noire */
Black.red = 0;
Black.green = 0;
Black.blue = 0;
/* Définition de la couleur rouge */
Red.red = 255;
Red.green = 0;
Red.blue = 0;
/* Définition de la couleur jaune */
Yellow.red = 255;
Yellow.green = 255;
Yellow.blue = 0;
/* Définition de la couleur verte */
Green.red = 0;
Green.green = 255;
Green.blue = 0;
/* Définition de la couleur bleue */
Blue.red = 0;
Blue.green = 0;
Blue.blue = 255;
/* Création d'une fenêtre Gtk */
Window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (Window), "Arc-en-ciel");
g_signal_connect (G_OBJECT (Window), "delete-event", gtk_main_quit, NULL);
/* Création d'une image pixbuf représentant un arc-en-ciel sur une échelle de 0 à 1000*/
Pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 1000, 200);
Pixels = gdk_pixbuf_get_pixels (Pixbuf);
for (i=0; i<1000; i++)
{
if (i<250) interpolation (250, i, &Black, &Blue, &ResultColor);
else
if (i<500 && i>=250) interpolation (250, i-250, &Blue, &Green, &ResultColor);
else
if (i<750 && i>=500) interpolation (250, i-500, &Green, &Yellow, &ResultColor);
else
interpolation (250, i-750, &Yellow, &Red, &ResultColor);
for (j=0; j<200; j++)
{
Pixels[(i*gdk_pixbuf_get_n_channels (Pixbuf)) + (j*gdk_pixbuf_get_rowstride (Pixbuf))] = ResultColor.red;
Pixels[(i*gdk_pixbuf_get_n_channels (Pixbuf)) + (j*gdk_pixbuf_get_rowstride (Pixbuf))+1] = ResultColor.green;
Pixels[(i*gdk_pixbuf_get_n_channels (Pixbuf)) + (j*gdk_pixbuf_get_rowstride (Pixbuf))+2] = ResultColor.blue;
}
}
/* Conversion et affichage de l'arc-en-ciel */
Image = gtk_image_new_from_pixbuf (Pixbuf);
g_object_unref (Pixbuf);
gtk_container_add (GTK_CONTAINER(Window), Image);
gtk_widget_show_all(Window);
gtk_main ();
return 0;
} |
Partager