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