Fix run length encoding of marked image, bump to version 0.8
[colorize.git] / gui / diag_bc.c
1 #include <gtk/gtk.h>
2 #include <gdk/gdkkeysyms.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <math.h>
7 #include "main.h"
8 #include "diag_bc.h"
9 #include "../src/mark.h"
10 #include "palette.h"
11 #include "image.h"
12
13 #define min(x,y) ((x < y) ? x : y)
14
15 static GtkWidget *bc_window = NULL;
16 static GtkObject *bright_adj;
17 static GtkObject *contrast_adj;
18 static GtkObject *alpha_adj;
19
20 static void bc_destroy(GtkWidget *widget, gpointer priv)
21 {
22         gtk_widget_destroy(bc_window);
23         bc_window = NULL;
24 }
25
26 static gboolean bc_key_press(GtkWidget *widget, GdkEventKey *event, gpointer priv)
27 {
28         switch (event->keyval) {
29         case GDK_q:
30         case GDK_w:
31                 if (event->state & GDK_CONTROL_MASK) {
32                         gtk_widget_destroy(widget);
33                         return TRUE;
34                 }
35         default:
36                 ;//printf("%x\n", event->keyval);
37         }
38
39         return FALSE;
40 }
41
42 static void close_event(gpointer *priv)
43 {
44         gtk_widget_destroy(bc_window);
45         bc_window = NULL;
46 }
47
48 static void reset_event(gpointer *priv)
49 {
50         anything_modified = 1;
51
52         mark_palette[mark_selected].bright = 0;
53         mark_palette[mark_selected].contrast = 1;
54         mark_palette[mark_selected].alpha = 1;
55         gtk_adjustment_set_value(GTK_ADJUSTMENT(bright_adj), mark_palette[mark_selected].bright * 100);
56         gtk_adjustment_set_value(GTK_ADJUSTMENT(contrast_adj), mark_palette[mark_selected].contrast * 100);
57         gtk_adjustment_set_value(GTK_ADJUSTMENT(alpha_adj), mark_palette[mark_selected].alpha * 100);
58         update_color(mark_selected);
59         draw_image(0, 0, -1, -1); /* alpha may change, so always update */
60 }
61
62 static void apply_event(gpointer *priv)
63 {
64         anything_modified = 1;
65
66         mark_palette[mark_selected].bright = GTK_ADJUSTMENT(bright_adj)->value / 100.0;
67         mark_palette[mark_selected].contrast = GTK_ADJUSTMENT(contrast_adj)->value / 100.0;
68         mark_palette[mark_selected].alpha = GTK_ADJUSTMENT(alpha_adj)->value / 100.0;
69         update_color(mark_selected);
70         draw_image(0, 0, -1, -1); /* alpha may change, so always update */
71 }
72
73 static GtkWidget *xpm_label_box( const gchar *stock_id,
74                                  gchar *label_text)
75 {
76         GtkWidget *box;
77         GtkWidget *label;
78         GtkWidget *image;
79
80         /* Create box for image and label */
81         box = gtk_hbox_new (FALSE, 0);
82         gtk_container_set_border_width (GTK_CONTAINER (box), 4);
83
84         /* Now on to the image stuff */
85         image = gtk_image_new_from_stock(stock_id, -1);
86
87         /* Create a label for the button */
88         label = gtk_label_new (label_text);
89
90         /* Pack the image and label into the box */
91         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
92         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
93
94         gtk_widget_show (image);
95         gtk_widget_show (label);
96
97         return box;
98 }
99
100 void bc_event(gpointer priv)
101 {
102         GtkWidget *vbox, *hbox;
103         GtkWidget *menu_bar;
104         GtkWidget *root_menu;
105         GtkWidget *menu;
106         GtkWidget *menu_item;
107         GtkWidget *bright_label;
108         GtkWidget *bright_scroll;
109         GtkWidget *contrast_label;
110         GtkWidget *contrast_scroll;
111         GtkWidget *alpha_label;
112         GtkWidget *alpha_scroll;
113         GtkWidget *button_apply;
114         GtkWidget *button_reset;
115         GtkWidget *box;
116
117         if (bc_window) {
118                 gtk_widget_destroy(bc_window);
119                 bc_window = NULL;
120                 return;
121         }
122
123         /* create window */
124         bc_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
125         gtk_window_set_default_size(GTK_WINDOW(bc_window), 500, 0);
126         gtk_window_set_title(GTK_WINDOW(bc_window), "Brightness + Contrast");
127         g_signal_connect(bc_window, "destroy", G_CALLBACK(bc_destroy), bc_window);
128         g_signal_connect(bc_window, "key_press_event", G_CALLBACK(bc_key_press), bc_window);
129
130         /* create menu*/
131         menu_bar = gtk_menu_bar_new();
132         gtk_widget_show(menu_bar);
133         menu = gtk_menu_new();
134         root_menu = gtk_menu_item_new_with_mnemonic("_File");
135         gtk_widget_show(root_menu);
136
137         menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL);
138         gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
139         g_signal_connect_swapped(menu_item, "activate", G_CALLBACK(close_event), bc_window);
140         gtk_widget_show(menu_item);
141         gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
142         gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu);
143
144         /* create scale widgets */
145         bright_label = gtk_label_new("Brightness:"); 
146         gtk_widget_show(GTK_WIDGET(bright_label));
147         bright_adj = gtk_adjustment_new(mark_palette[mark_selected].bright * 100, -200, 201, 1, 1, 1);
148         bright_scroll = gtk_hscale_new(GTK_ADJUSTMENT(bright_adj));
149         gtk_widget_show(bright_scroll);
150         contrast_label = gtk_label_new("Contrast:"); 
151         gtk_widget_show(GTK_WIDGET(contrast_label));
152         contrast_adj = gtk_adjustment_new(mark_palette[mark_selected].contrast * 100, -500, 501, 1, 1, 1);
153         contrast_scroll = gtk_hscale_new(GTK_ADJUSTMENT(contrast_adj));
154         gtk_widget_show(contrast_scroll);
155         alpha_label = gtk_label_new("Alpha:"); 
156         gtk_widget_show(GTK_WIDGET(alpha_label));
157         alpha_adj = gtk_adjustment_new(mark_palette[mark_selected].alpha * 100, 0, 101, 1, 1, 1);
158         alpha_scroll = gtk_hscale_new(GTK_ADJUSTMENT(alpha_adj));
159         gtk_widget_show(alpha_scroll);
160
161         /* buttons */
162         button_reset = gtk_button_new();
163         g_signal_connect(button_reset, "clicked", G_CALLBACK(reset_event), NULL);
164         box = xpm_label_box (GTK_STOCK_REMOVE, "Reset");
165         gtk_widget_show (box);
166         gtk_container_add (GTK_CONTAINER (button_reset), box);
167         gtk_widget_show(button_reset);
168
169         button_apply = gtk_button_new();
170         g_signal_connect(button_apply, "clicked", G_CALLBACK(apply_event), NULL);
171         box = xpm_label_box (GTK_STOCK_APPLY, "Apply");
172         gtk_widget_show (box);
173         gtk_container_add (GTK_CONTAINER (button_apply), box);
174         gtk_widget_show(button_apply);
175
176         hbox = gtk_hbox_new(FALSE, 0);
177         gtk_box_pack_end(GTK_BOX(hbox), button_apply, FALSE, FALSE, 2);
178         gtk_box_pack_end(GTK_BOX(hbox), button_reset, FALSE, FALSE, 2);
179         gtk_widget_show(hbox);
180
181         /* create vbox (complete window) */
182         vbox = gtk_vbox_new(FALSE, 0);
183         gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
184         gtk_box_pack_start(GTK_BOX(vbox), bright_label, FALSE, FALSE, 2);
185         gtk_box_pack_start(GTK_BOX(vbox), bright_scroll, FALSE, FALSE, 2);
186         gtk_box_pack_start(GTK_BOX(vbox), contrast_label, FALSE, FALSE, 2);
187         gtk_box_pack_start(GTK_BOX(vbox), contrast_scroll, FALSE, FALSE, 2);
188         gtk_box_pack_start(GTK_BOX(vbox), alpha_label, FALSE, FALSE, 2);
189         gtk_box_pack_start(GTK_BOX(vbox), alpha_scroll, FALSE, FALSE, 2);
190         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 20);
191         gtk_widget_show(vbox);
192
193         gtk_container_add(GTK_CONTAINER(bc_window), vbox);
194         gtk_widget_show(bc_window);
195 }
196
197 void bc_set_current(void)
198 {
199         if (!bc_window)
200                 return;
201
202         gtk_adjustment_set_value(GTK_ADJUSTMENT(bright_adj), mark_palette[mark_selected].bright * 100);
203         gtk_adjustment_set_value(GTK_ADJUSTMENT(contrast_adj), mark_palette[mark_selected].contrast * 100);
204         gtk_adjustment_set_value(GTK_ADJUSTMENT(alpha_adj), mark_palette[mark_selected].alpha * 100);
205 }
206
207