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