#include #include /* no strcmp equivalent in glib ? */ #include "pixbufs.h" #include "pixbuf_ops.h" #include "colors.h" #include "tabs.h" #include "filter_tabs.h" #include "epromwriter.h" #define EPROM_FILENAME "Eprom.bin" #define FILTER_LIST_FILENAME "filter_list.txt" enum { RGB_COLORSPACE, HSL_COLORSPACE, LUV_COLORSPACE, LAB_COLORSPACE }; GtkWidget *top_left_area, *top_right_area, *bottom_left_area, *bottom_right_area; GtkWidget *pixbufs_table; GdkPixbuf *original_pixbuf, *video_pixbuf, *scaled_pixbuf, *r_pixbuf, *g_pixbuf, *b_pixbuf, *h_pixbuf, *s_pixbuf, *l_pixbuf, *x_pixbuf, *y_pixbuf, *z_pixbuf, *l_star_pixbuf, *u_star_pixbuf, *v_star_pixbuf, *a_star_pixbuf, *b_star_pixbuf; GdkPixbuf *original_thumbnail, *video_thumbnail, *scaled_thumbnail, *r_thumbnail, *g_thumbnail, *b_thumbnail, *h_thumbnail, *s_thumbnail, *l_thumbnail, *x_thumbnail, *y_thumbnail, *z_thumbnail, *l_star_thumbnail, *u_star_thumbnail, *v_star_thumbnail, *a_star_thumbnail, *b_star_thumbnail; GtkWidget *original_area, *video_area, *scaled_area, *r_area, *g_area, *b_area, *h_area, *s_area, *l_area, *x_area, *y_area, *z_area, *l_star_area, *u_star_area, *v_star_area, *a_star_area, *b_star_area; GdkPixbuf *filter_pixbuf; GtkWidget *filter_area; GtkWidget *composant1_button, *composant2_button, *composant3_button; GtkWidget *rgb_button, *hsl_button, *luv_button, *lab_button; GtkWidget *show_settings_button; GtkWidget *min_spinner, *max_spinner, *value_spinner; GtkWidget *invert_button; GtkWidget *settings_window; GtkWidget *filter_tabs_box; GtkWidget *colorseldlg; static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { /* return FALSE to destroy window */ return FALSE; } static void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } static void expose_func( GtkWidget *drawing_area, GdkEventExpose *event, gpointer data ) { draw_pixbuf_on_area (drawing_area, (GdkPixbuf *)g_object_get_data (G_OBJECT (drawing_area), "pixbuf")); } static void select_color_space( GtkWidget *widget, gpointer data ) { switch ((int) data) { case RGB_COLORSPACE: gtk_button_set_label (GTK_BUTTON (composant1_button), "R"); gtk_button_set_label (GTK_BUTTON (composant2_button), "G"); gtk_button_set_label (GTK_BUTTON (composant3_button), "B"); break; case HSL_COLORSPACE: gtk_button_set_label (GTK_BUTTON (composant1_button), "H"); gtk_button_set_label (GTK_BUTTON (composant2_button), "S"); gtk_button_set_label (GTK_BUTTON (composant3_button), "L"); break; case LUV_COLORSPACE: gtk_button_set_label (GTK_BUTTON (composant1_button), "L*"); gtk_button_set_label (GTK_BUTTON (composant2_button), "U"); gtk_button_set_label (GTK_BUTTON (composant3_button), "V"); break; case LAB_COLORSPACE: gtk_button_set_label (GTK_BUTTON (composant1_button), "L*"); gtk_button_set_label (GTK_BUTTON (composant2_button), "A"); gtk_button_set_label (GTK_BUTTON (composant3_button), "B"); break; default: break; } } static void get_color_space_and_composant( gchar ** space, gchar ** comp ) { GtkWidget *button; button = NULL; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rgb_button))) button = rgb_button; else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (hsl_button))) button = hsl_button; else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (luv_button))) button = luv_button; else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lab_button))) button = lab_button; if (button) *space = (gchar *) gtk_button_get_label(GTK_BUTTON (button)); else *space = "undefined"; button = NULL; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (composant1_button))) button = composant1_button; else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (composant2_button))) button = composant2_button; else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (composant3_button))) button = composant3_button; if (button) *comp = (gchar *) gtk_button_get_label(GTK_BUTTON (button)); else *comp = "undefined"; } static void add_filter( GtkWidget *widget, gpointer data ) { GtkTreeIter iter; gchar *color_space, *composant; GtkWidget *tab_group; GtkListStore * filter_list; GtkTreeSelection *filter_selection; tab_group = GTK_WIDGET (data); filter_list = get_selected_filter_list(tab_group); if (!filter_list) return; filter_selection = g_object_get_data(G_OBJECT (tab_group), "filter_selection"); get_color_space_and_composant (&color_space, &composant); gtk_list_store_append (GTK_LIST_STORE (filter_list), &iter); gtk_list_store_set (GTK_LIST_STORE (filter_list), &iter, COLORSPACE_COLUMN, color_space, COMPOSANT_COLUMN, composant, MIN_COLUMN, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (min_spinner)), MAX_COLUMN, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (max_spinner)), INVERT_COLUMN, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (invert_button)), -1); } static void update_filter( GtkWidget *widget, gpointer data ) { GtkTreeIter iter; GtkTreeModel *list; gchar *color_space, *composant; GtkWidget *tab_group; GtkListStore * filter_list; GtkTreeSelection *filter_selection; tab_group = GTK_WIDGET (data); filter_list = get_selected_filter_list(tab_group); if (!filter_list) return; filter_selection = g_object_get_data(G_OBJECT (tab_group), "filter_selection"); if (gtk_tree_selection_get_selected (filter_selection, &list, &iter)) { get_color_space_and_composant (&color_space, &composant); gtk_list_store_set (GTK_LIST_STORE (filter_list), &iter, COLORSPACE_COLUMN, color_space, COMPOSANT_COLUMN, composant, MIN_COLUMN, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (min_spinner)), MAX_COLUMN, gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (max_spinner)), INVERT_COLUMN, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (invert_button)), -1); } } static void delete_filter( GtkWidget *widget, gpointer data ) { GtkTreeIter iter; GtkTreeModel *list; GtkWidget *tab_group; GtkListStore * filter_list; GtkTreeSelection *filter_selection; tab_group = GTK_WIDGET (data); filter_list = get_selected_filter_list(tab_group); if (!filter_list) return; filter_selection = g_object_get_data(G_OBJECT (tab_group), "filter_selection"); if (gtk_tree_selection_get_selected (filter_selection, &list, &iter)) gtk_list_store_remove (GTK_LIST_STORE (filter_list), &iter); } static void select_filter( GtkTreeSelection *selection, gpointer data ) { GtkTreeIter iter; GtkTreeModel *model; gchar *colorspace, *composant; guchar min, max; gboolean invert; if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gtk_tree_model_get (model, &iter, COLORSPACE_COLUMN, &colorspace, COMPOSANT_COLUMN, &composant, MIN_COLUMN, &min, MAX_COLUMN, &max, INVERT_COLUMN, &invert, -1); if (strcmp (colorspace, "RGB") == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rgb_button), TRUE); else if (strcmp (colorspace, "HSL") == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (hsl_button), TRUE); else if (strcmp (colorspace, "LUV") == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (luv_button), TRUE); else if (strcmp (colorspace, "LAB") == 0) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lab_button), TRUE); gtk_spin_button_set_value (GTK_SPIN_BUTTON (min_spinner), min); gtk_spin_button_set_value (GTK_SPIN_BUTTON (max_spinner), max); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (invert_button), invert); } } static gboolean hide_settings_window( GtkWidget *widget, gpointer data ) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_settings_button), FALSE); return TRUE; } static void set_filter_value( GtkWidget *spinner, gpointer data ) { GtkWidget *tab_group, *tab; tab_group = (GtkWidget *) data; tab = (GtkWidget *) g_object_get_data(G_OBJECT (tab_group), "selected_tab"); g_object_set_data(G_OBJECT (tab), "eprom_value", (gpointer) gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner))); update_filter_tab_name(tab); } static void select_display_color( GtkWidget *widget, gpointer data ) { gint response; GtkColorSelection *colorsel; /* Get the ColorSelection widget */ colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel); /* Show the dialog */ response = gtk_dialog_run (GTK_DIALOG (colorseldlg)); if (response == GTK_RESPONSE_OK) { GtkWidget *tab; GdkColor color; guint r, g, b; tab = (GtkWidget *) g_object_get_data(G_OBJECT (filter_tabs_box), "selected_tab"); gtk_color_selection_get_current_color (colorsel, &color); r = color.red; g = color.green; b = color.blue; g_object_set_data(G_OBJECT (tab), "color_r", (gpointer) r); g_object_set_data(G_OBJECT (tab), "color_g", (gpointer) g); g_object_set_data(G_OBJECT (tab), "color_b", (gpointer) b); update_filter_tab_name(tab); } gtk_widget_hide (colorseldlg); } static void update_value_and_color_from_tab( GtkWidget *tab, gpointer data ) { guchar value; GdkColor color; GtkColorSelection *colorsel; value = (guint) g_object_get_data(G_OBJECT (tab), "eprom_value"); gtk_spin_button_set_value (GTK_SPIN_BUTTON (value_spinner), value); color.red = (guint) g_object_get_data(G_OBJECT (tab), "color_r"); color.green = (guint) g_object_get_data(G_OBJECT (tab), "color_g"); color.blue = (guint) g_object_get_data(G_OBJECT (tab), "color_b"); /* Get the ColorSelection widget */ colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel); gtk_color_selection_set_current_color (colorsel, &color); } static void init_settings_window( ) { GtkWidget *settings_box, *filter_box, *color_space_box, *composant_box, *interval_box, *filter_output_box, *action_box; GtkWidget *tab; GtkWidget *filter_table; GtkWidget *filter_frame; GtkWidget *add_button, *update_button, *delete_button; GtkWidget *min_label, *max_label; GtkAdjustment *min_adj, *max_adj; GtkWidget *value_label; GtkAdjustment *value_adj; GtkWidget *scrolled_window, *tree_view; GtkWidget *colorsel_button; GtkTreeSelection *filter_selection; GtkColorSelection *colorsel; guint i; settings_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* add handler to "close window event" */ g_signal_connect (G_OBJECT (settings_window), "delete_event", G_CALLBACK (hide_settings_window), NULL); /* add handler to destroy event, which occurs when calling gtk_widget_destroy() or when the delete_event callback returns false */ g_signal_connect (G_OBJECT (settings_window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (settings_window), 10); /* settings box, contains filters tabs box and filter box*/ settings_box = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (settings_window), settings_box); /* filter tabs box, contains one tab per filter set */ filter_tabs_box = create_vertical_tab_group(); gtk_box_pack_start (GTK_BOX (settings_box), filter_tabs_box, TRUE, TRUE, 5); tree_view = create_filter_tree_view(filter_tabs_box); filter_selection = g_object_get_data(G_OBJECT (filter_tabs_box), "filter_selection"); g_signal_connect (G_OBJECT (filter_selection), "changed", G_CALLBACK (select_filter), NULL); /* filter box, contains filter frame and filter list window */ filter_box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (settings_box), filter_box, TRUE, TRUE, 5); /* filter_output_box, contains spinner to specify value and color output */ filter_output_box = gtk_hbox_new (FALSE, 10); gtk_box_pack_start (GTK_BOX (filter_box), filter_output_box, TRUE, TRUE, 5); value_label = gtk_label_new ("Valeur dans l'EPROM"); gtk_box_pack_start (GTK_BOX (filter_output_box), value_label, FALSE, FALSE, 0); value_adj = (GtkAdjustment *) gtk_adjustment_new (DEFAULT_VALUE_NOT_FILTERED, 0.0, 255.0, 1.0, 10.0, 0.0); value_spinner = gtk_spin_button_new (value_adj, 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (value_spinner), FALSE); gtk_box_pack_start (GTK_BOX (filter_output_box), value_spinner, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (value_spinner), "value-changed", G_CALLBACK (set_filter_value), (gpointer) filter_tabs_box); /* Create color selection dialog */ colorseldlg = gtk_color_selection_dialog_new ("Choix de la couleur du filtre"); /* Get the ColorSelection widget */ colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)->colorsel); gtk_color_selection_set_has_palette (colorsel, FALSE); colorsel_button = gtk_button_new_with_label ("Couleur du filtre"); gtk_box_pack_start (GTK_BOX (filter_output_box), colorsel_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (colorsel_button), "clicked", G_CALLBACK (select_display_color), NULL); /* filter frame, to tweak settings of a filter */ filter_frame = gtk_frame_new ("Reglages du filtre"); gtk_box_pack_start (GTK_BOX (filter_box), filter_frame, TRUE, TRUE, 5); /* color box, contains color space box and composant box */ filter_table = gtk_table_new (2, 3, FALSE); gtk_table_set_row_spacings ((GtkTable *) filter_table, 5); gtk_table_set_col_spacings ((GtkTable *) filter_table, 5); gtk_container_add (GTK_CONTAINER (filter_frame), filter_table); /* color space box, contains a radio button per color space (RGB, HSL, LUV, LAB) */ color_space_box = gtk_vbox_new (FALSE, 0); gtk_table_attach_defaults ((GtkTable *) filter_table, color_space_box, 0, 1, 0, 1); /* RGB HSL LUV LAB radio buttons */ rgb_button = gtk_radio_button_new_with_label (NULL, "RGB"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rgb_button), TRUE); gtk_box_pack_start (GTK_BOX (color_space_box), rgb_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (rgb_button), "clicked", G_CALLBACK (select_color_space), (gpointer) RGB_COLORSPACE); hsl_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rgb_button), "HSL"); gtk_box_pack_start (GTK_BOX (color_space_box), hsl_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (hsl_button), "clicked", G_CALLBACK (select_color_space), (gpointer) HSL_COLORSPACE); luv_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (hsl_button), "LUV"); gtk_box_pack_start (GTK_BOX (color_space_box), luv_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (luv_button), "clicked", G_CALLBACK (select_color_space), (gpointer) LUV_COLORSPACE); lab_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (luv_button), "LAB"); gtk_box_pack_start (GTK_BOX (color_space_box), lab_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (lab_button), "clicked", G_CALLBACK (select_color_space), (gpointer) LAB_COLORSPACE); /* composant box, contains a radio button per color composant */ composant_box = gtk_vbox_new (FALSE, 0); gtk_table_attach_defaults ((GtkTable *) filter_table, composant_box, 1, 2, 0, 1); /* color composant radio buttons, label changes with color space selection */ composant1_button = gtk_radio_button_new_with_label (NULL, "R"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (composant1_button), TRUE); gtk_box_pack_start (GTK_BOX (composant_box), composant1_button, FALSE, FALSE, 0); composant2_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (composant1_button), "G"); gtk_box_pack_start (GTK_BOX (composant_box), composant2_button, FALSE, FALSE, 0); composant3_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (composant2_button), "B"); gtk_box_pack_start (GTK_BOX (composant_box), composant3_button, FALSE, FALSE, 0); interval_box = gtk_hbox_new (FALSE, 10); gtk_table_attach_defaults ((GtkTable *) filter_table, interval_box, 0, 2, 1, 2); /* adjust min values between 0.0 and 255.0, default: 0.0 */ min_label = gtk_label_new ("Min"); gtk_box_pack_start (GTK_BOX (interval_box), min_label, FALSE, FALSE, 0); min_adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 255.0, 1.0, 10.0, 0.0); min_spinner = gtk_spin_button_new (min_adj, 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (min_spinner), FALSE); gtk_box_pack_start (GTK_BOX (interval_box), min_spinner, FALSE, FALSE, 0); /* adjust max values between 0.0 and 255.0, default: 255.0 */ max_label = gtk_label_new ("Max"); gtk_box_pack_start (GTK_BOX (interval_box), max_label, FALSE, FALSE, 0); max_adj = (GtkAdjustment *) gtk_adjustment_new (255.0, 0.0, 255.0, 1.0, 10.0, 0.0); max_spinner = gtk_spin_button_new (max_adj, 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (max_spinner), FALSE); gtk_box_pack_start (GTK_BOX (interval_box), max_spinner, FALSE, FALSE, 0); invert_button = gtk_check_button_new_with_label ("Invert"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (invert_button), FALSE); gtk_box_pack_start (GTK_BOX (interval_box), invert_button, FALSE, FALSE, 0); /* action box, contains buttons used to modify settings */ action_box = gtk_hbutton_box_new (); gtk_box_pack_start (GTK_BOX (filter_box), action_box, TRUE, TRUE, 5); /* buttons to add, update or delete filters */ add_button = gtk_button_new_with_label ("Ajouter"); gtk_container_add (GTK_CONTAINER (action_box), add_button); g_signal_connect (G_OBJECT (add_button), "clicked", G_CALLBACK (add_filter), (gpointer) filter_tabs_box); update_button = gtk_button_new_with_label ("Mettre a jour"); gtk_container_add (GTK_CONTAINER (action_box), update_button); g_signal_connect (G_OBJECT (update_button), "clicked", G_CALLBACK (update_filter), (gpointer) filter_tabs_box); delete_button = gtk_button_new_with_label ("Supprimer"); gtk_container_add (GTK_CONTAINER (action_box), delete_button); g_signal_connect (G_OBJECT (delete_button), "clicked", G_CALLBACK (delete_filter), (gpointer) filter_tabs_box); /* filter list window */ /* Create a new scrolled window, with scrollbars only if needed */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), tree_view); gtk_box_pack_start (GTK_BOX (filter_box), scrolled_window, TRUE, TRUE, 5); /* add some filter tabs */ for (i=0; i<8; i++) { tab = add_filter_tab(filter_tabs_box); g_signal_connect (G_OBJECT (tab), "clicked", G_CALLBACK (update_value_and_color_from_tab), NULL); } } void attach_drawing_areas( ) { gtk_table_attach_defaults((GtkTable *) pixbufs_table, top_left_area, 0, 1, 0, 1); gtk_signal_connect (GTK_OBJECT (top_left_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) pixbufs_table, top_right_area, 1, 2, 0, 1); gtk_signal_connect (GTK_OBJECT (top_right_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) pixbufs_table, bottom_left_area, 0, 1, 1, 2); gtk_signal_connect (GTK_OBJECT (bottom_left_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) pixbufs_table, bottom_right_area, 1, 2, 1, 2); gtk_signal_connect (GTK_OBJECT (bottom_right_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_widget_show_all (pixbufs_table); } static void show_rgb_pixbufs( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (scaled_pixbuf); top_right_area = drawing_area_from_pixbuf (r_pixbuf); bottom_left_area = drawing_area_from_pixbuf (g_pixbuf); bottom_right_area = drawing_area_from_pixbuf (b_pixbuf); attach_drawing_areas (); } static void show_hsl_pixbufs( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (scaled_pixbuf); top_right_area = drawing_area_from_pixbuf (h_pixbuf); bottom_left_area = drawing_area_from_pixbuf (s_pixbuf); bottom_right_area = drawing_area_from_pixbuf (l_pixbuf); attach_drawing_areas (); } static void show_xyz_pixbufs( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (scaled_pixbuf); top_right_area = drawing_area_from_pixbuf (x_pixbuf); bottom_left_area = drawing_area_from_pixbuf (y_pixbuf); bottom_right_area = drawing_area_from_pixbuf (z_pixbuf); attach_drawing_areas (); } static void show_luv_pixbufs( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (scaled_pixbuf); top_right_area = drawing_area_from_pixbuf (l_star_pixbuf); bottom_left_area = drawing_area_from_pixbuf (u_star_pixbuf); bottom_right_area = drawing_area_from_pixbuf (v_star_pixbuf); attach_drawing_areas (); } static void show_lab_pixbufs( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (scaled_pixbuf); top_right_area = drawing_area_from_pixbuf (l_star_pixbuf); bottom_left_area = drawing_area_from_pixbuf (a_star_pixbuf); bottom_right_area = drawing_area_from_pixbuf (b_star_pixbuf); attach_drawing_areas (); } static void show_filter_pixbuf( GtkWidget *widget, gpointer data ) { top_left_area = drawing_area_from_pixbuf (filter_pixbuf); gtk_table_attach_defaults((GtkTable *) pixbufs_table, top_left_area, 0, 1, 0, 1); gtk_signal_connect (GTK_OBJECT (top_left_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_widget_show_all (pixbufs_table); } static void toggle_settings_window( GtkWidget *widget, gpointer data ) { if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) gtk_widget_show_all (settings_window); else gtk_widget_hide_all (settings_window); } static void update_filter_preview () { guchar *scaled_pixels, *filter_pixels; guint rowstride = gdk_pixbuf_get_rowstride (scaled_pixbuf); guint width = gdk_pixbuf_get_width (scaled_pixbuf); guint height = gdk_pixbuf_get_height (scaled_pixbuf); guint i, j; scaled_pixels = gdk_pixbuf_get_pixels (scaled_pixbuf); filter_pixels = gdk_pixbuf_get_pixels (filter_pixbuf); for (i=0; ichildren; /* for each filter, add a signal handler */ while (tabs) { GtkBoxChild *child; GtkWidget *tab; child = tabs->data; tab = child->widget; g_signal_connect (G_OBJECT (tab), "clicked", G_CALLBACK (update_value_and_color_from_tab), NULL); /* next filter */ tabs = tabs->next; } } static void init_main_window( ) { GtkWidget *window, *hbox, *preview_box, *filter_box; GtkWidget *show_rgb_button, *show_hsl_button, *show_xyz_button, *show_luv_button, *show_lab_button; GtkWidget *filter_button, *show_filter_button, *save_eprom_button, *save_filter_list_button, *load_filter_list_button; GtkWidget *thumbnail_table; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* add handler to "close window event" */ g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); /* add handler to destroy event, which occurs when calling gtk_widget_destroy() or when the delete_event callback returns false */ g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); hbox = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), hbox); preview_box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), preview_box, TRUE, TRUE, 0); show_settings_button = gtk_toggle_button_new_with_label ("Filtres"); gtk_box_pack_start (GTK_BOX (preview_box), show_settings_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (show_settings_button), "clicked", G_CALLBACK (toggle_settings_window), NULL); pixbufs_table = gtk_table_new(2, 2, TRUE); gtk_box_pack_start (GTK_BOX (hbox), pixbufs_table, TRUE, TRUE, 0); gtk_table_set_row_spacings((GtkTable *) pixbufs_table, 5); gtk_table_set_col_spacings((GtkTable *) pixbufs_table, 5); /* loaded the file into a pixbuf */ original_pixbuf = gdk_pixbuf_new_from_file ("test.jpg", NULL); /* scale the pixbuf to a small size */ scaled_pixbuf = scale_pixbuf_with_size (original_pixbuf, 320, 240); video_pixbuf = video_effect(scaled_pixbuf); filter_pixbuf = gdk_pixbuf_copy (scaled_pixbuf); /* select red, green and blue composant */ r_pixbuf = select_rgb_composant (scaled_pixbuf, 1, 0, 0); g_pixbuf = select_rgb_composant (scaled_pixbuf, 0, 1, 0); b_pixbuf = select_rgb_composant (scaled_pixbuf, 0, 0, 1); pixbuf_rgb2hsl (scaled_pixbuf, &h_pixbuf, &s_pixbuf, &l_pixbuf); pixbuf_rgb2xyz (scaled_pixbuf, &x_pixbuf, &y_pixbuf, &z_pixbuf); pixbuf_rgb2luv (scaled_pixbuf, &l_star_pixbuf, &u_star_pixbuf, &v_star_pixbuf); pixbuf_rgb2lab (scaled_pixbuf, &l_star_pixbuf, &a_star_pixbuf, &b_star_pixbuf); original_thumbnail = scale_pixbuf_with_size (original_pixbuf, 40, 30); video_thumbnail = scale_pixbuf_with_size (video_pixbuf, 40, 30); r_thumbnail = scale_pixbuf_with_size (r_pixbuf, 40, 30); g_thumbnail = scale_pixbuf_with_size (g_pixbuf, 40, 30); b_thumbnail = scale_pixbuf_with_size (b_pixbuf, 40, 30); h_thumbnail = scale_pixbuf_with_size (h_pixbuf, 40, 30); s_thumbnail = scale_pixbuf_with_size (s_pixbuf, 40, 30); l_thumbnail = scale_pixbuf_with_size (l_pixbuf, 40, 30); x_thumbnail = scale_pixbuf_with_size (x_pixbuf, 40, 30); y_thumbnail = scale_pixbuf_with_size (y_pixbuf, 40, 30); z_thumbnail = scale_pixbuf_with_size (z_pixbuf, 40, 30); l_star_thumbnail = scale_pixbuf_with_size (l_star_pixbuf, 40, 30); u_star_thumbnail = scale_pixbuf_with_size (u_star_pixbuf, 40, 30); v_star_thumbnail = scale_pixbuf_with_size (v_star_pixbuf, 40, 30); a_star_thumbnail = scale_pixbuf_with_size (a_star_pixbuf, 40, 30); b_star_thumbnail = scale_pixbuf_with_size (b_star_pixbuf, 40, 30); original_area = drawing_area_from_pixbuf (original_thumbnail); video_area = drawing_area_from_pixbuf (video_thumbnail); r_area = drawing_area_from_pixbuf (r_thumbnail); g_area = drawing_area_from_pixbuf (g_thumbnail); b_area = drawing_area_from_pixbuf (b_thumbnail); h_area = drawing_area_from_pixbuf (h_thumbnail); s_area = drawing_area_from_pixbuf (s_thumbnail); l_area = drawing_area_from_pixbuf (l_thumbnail); x_area = drawing_area_from_pixbuf (x_thumbnail); y_area = drawing_area_from_pixbuf (y_thumbnail); z_area = drawing_area_from_pixbuf (z_thumbnail); l_star_area = drawing_area_from_pixbuf (l_star_thumbnail); u_star_area = drawing_area_from_pixbuf (u_star_thumbnail); v_star_area = drawing_area_from_pixbuf (v_star_thumbnail); a_star_area = drawing_area_from_pixbuf (a_star_thumbnail); b_star_area = drawing_area_from_pixbuf (b_star_thumbnail); thumbnail_table = gtk_table_new(11, 3, TRUE); gtk_box_pack_start (GTK_BOX (preview_box), thumbnail_table, TRUE, TRUE, 0); gtk_table_set_row_spacings((GtkTable *) thumbnail_table, 2); gtk_table_set_col_spacings((GtkTable *) thumbnail_table, 2); gtk_table_attach_defaults((GtkTable *) thumbnail_table, original_area, 0, 1, 0, 1); gtk_signal_connect (GTK_OBJECT (original_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, video_area, 1, 2, 0, 1); gtk_signal_connect (GTK_OBJECT (video_area), "expose_event", (GtkSignalFunc) expose_func, NULL); show_rgb_button = gtk_button_new_with_label ("Afficher RGB"); gtk_table_attach_defaults((GtkTable *) thumbnail_table, show_rgb_button, 0, 3, 1, 2); g_signal_connect (G_OBJECT (show_rgb_button), "clicked", G_CALLBACK (show_rgb_pixbufs), NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, r_area, 0, 1, 2, 3); gtk_signal_connect (GTK_OBJECT (r_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, g_area, 1, 2, 2, 3); gtk_signal_connect (GTK_OBJECT (g_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, b_area, 2, 3, 2, 3); gtk_signal_connect (GTK_OBJECT (b_area), "expose_event", (GtkSignalFunc) expose_func, NULL); show_hsl_button = gtk_button_new_with_label ("Afficher HSL"); gtk_table_attach_defaults((GtkTable *) thumbnail_table, show_hsl_button, 0, 3, 3, 4); g_signal_connect (G_OBJECT (show_hsl_button), "clicked", G_CALLBACK (show_hsl_pixbufs), NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, h_area, 0, 1, 4, 5); gtk_signal_connect (GTK_OBJECT (h_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, s_area, 1, 2, 4, 5); gtk_signal_connect (GTK_OBJECT (s_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, l_area, 2, 3, 4, 5); gtk_signal_connect (GTK_OBJECT (l_area), "expose_event", (GtkSignalFunc) expose_func, NULL); show_xyz_button = gtk_button_new_with_label ("Afficher XYZ"); gtk_table_attach_defaults((GtkTable *) thumbnail_table, show_xyz_button, 0, 3, 5, 6); g_signal_connect (G_OBJECT (show_xyz_button), "clicked", G_CALLBACK (show_xyz_pixbufs), NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, x_area, 0, 1, 6, 7); gtk_signal_connect (GTK_OBJECT (x_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, y_area, 1, 2, 6, 7); gtk_signal_connect (GTK_OBJECT (y_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, z_area, 2, 3, 6, 7); gtk_signal_connect (GTK_OBJECT (z_area), "expose_event", (GtkSignalFunc) expose_func, NULL); show_luv_button = gtk_button_new_with_label ("Afficher LUV"); gtk_table_attach_defaults((GtkTable *) thumbnail_table, show_luv_button, 0, 3, 7, 8); g_signal_connect (G_OBJECT (show_luv_button), "clicked", G_CALLBACK (show_luv_pixbufs), NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, l_star_area, 0, 1, 8, 9); gtk_signal_connect (GTK_OBJECT (l_star_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, u_star_area, 1, 2, 8, 9); gtk_signal_connect (GTK_OBJECT (u_star_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, v_star_area, 2, 3, 8, 9); gtk_signal_connect (GTK_OBJECT (v_star_area), "expose_event", (GtkSignalFunc) expose_func, NULL); show_lab_button = gtk_button_new_with_label ("Afficher LAB"); gtk_table_attach_defaults((GtkTable *) thumbnail_table, show_lab_button, 0, 3, 9, 10); g_signal_connect (G_OBJECT (show_lab_button), "clicked", G_CALLBACK (show_lab_pixbufs), NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, a_star_area, 1, 2, 10, 11); gtk_signal_connect (GTK_OBJECT (a_star_area), "expose_event", (GtkSignalFunc) expose_func, NULL); gtk_table_attach_defaults((GtkTable *) thumbnail_table, b_star_area, 2, 3, 10, 11); gtk_signal_connect (GTK_OBJECT (b_star_area), "expose_event", (GtkSignalFunc) expose_func, NULL); filter_box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), filter_box, TRUE, TRUE, 0); filter_button = gtk_button_new_with_label ("Appliquer filtre"); gtk_box_pack_start (GTK_BOX (filter_box), filter_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (filter_button), "clicked", G_CALLBACK (update_filter_preview), NULL); show_filter_button = gtk_button_new_with_label ("Afficher filtre"); gtk_box_pack_start (GTK_BOX (filter_box), show_filter_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (show_filter_button), "clicked", G_CALLBACK (show_filter_pixbuf), NULL); save_eprom_button = gtk_button_new_with_label ("Sauvegarder l'Eprom"); gtk_box_pack_start (GTK_BOX (filter_box), save_eprom_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (save_eprom_button), "clicked", G_CALLBACK (do_save_eprom), EPROM_FILENAME); save_filter_list_button = gtk_button_new_with_label ("Sauvegarder la liste des filtres"); gtk_box_pack_start (GTK_BOX (filter_box), save_filter_list_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (save_filter_list_button), "clicked", G_CALLBACK (do_save_filter_list), FILTER_LIST_FILENAME); load_filter_list_button = gtk_button_new_with_label ("Charger la liste des filtres"); gtk_box_pack_start (GTK_BOX (filter_box), load_filter_list_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (load_filter_list_button), "clicked", G_CALLBACK (do_load_filter_list), FILTER_LIST_FILENAME); show_lab_pixbufs (NULL, NULL); gtk_widget_show_all (window); } int main( int argc, char *argv[] ) { gtk_init (&argc, &argv); compute_ref(); init_main_window (); init_settings_window (); gtk_main (); return 0; }