rev |
line source |
meillo@0
|
1 #include <gtk/gtk.h>
|
meillo@7
|
2 #include <gdk-pixbuf/gdk-pixbuf.h>
|
meillo@13
|
3 #include <gdk/gdkkeysyms.h>
|
meillo@2
|
4 #include "main.h"
|
meillo@0
|
5 #include "callbacks.h"
|
meillo@0
|
6 #include "support.h"
|
meillo@0
|
7
|
meillo@7
|
8 int image_width;
|
meillo@7
|
9 int image_height;
|
meillo@10
|
10 float inc = 0.3;
|
meillo@13
|
11 float zoom = 1.0;
|
meillo@11
|
12
|
meillo@11
|
13
|
meillo@4
|
14 /*
|
meillo@11
|
15 void
|
meillo@11
|
16 update_spin_button_ratio(GtkWidget* spinbutton)
|
meillo@11
|
17 {
|
meillo@3
|
18 g_print("ratio change: %f\n", ratio);
|
meillo@3
|
19 on_ratio_w_spinbutton_value_changed(spinbutton, NULL);
|
meillo@3
|
20 }
|
meillo@2
|
21
|
meillo@4
|
22
|
meillo@11
|
23 void
|
meillo@11
|
24 on_ratio_none_activate(GtkMenuItem* menuitem, gpointer user_data)
|
meillo@11
|
25 {
|
meillo@4
|
26 ratio = 1;
|
meillo@3
|
27 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@2
|
28 }
|
meillo@2
|
29
|
meillo@2
|
30
|
meillo@11
|
31 void
|
meillo@11
|
32 on_ratio_square_activate(GtkMenuItem* menuitem, gpointer user_data)
|
meillo@11
|
33 {
|
meillo@4
|
34 ratio = 1;
|
meillo@3
|
35 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@2
|
36 }
|
meillo@2
|
37
|
meillo@2
|
38
|
meillo@11
|
39 void
|
meillo@11
|
40 on_ratio_4x3_activate(GtkMenuItem* menuitem, gpointer user_data)
|
meillo@11
|
41 {
|
meillo@4
|
42 ratio = 4.0/3.0;
|
meillo@3
|
43 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@2
|
44 }
|
meillo@2
|
45
|
meillo@2
|
46
|
meillo@11
|
47 void
|
meillo@11
|
48 on_ratio_3x2_activate(GtkMenuItem* menuitem, gpointer user_data)
|
meillo@11
|
49 {
|
meillo@4
|
50 ratio = 1.5;
|
meillo@3
|
51 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@2
|
52 }
|
meillo@2
|
53
|
meillo@2
|
54
|
meillo@11
|
55 void
|
meillo@11
|
56 on_ratio_custom_activate(GtkMenuItem* menuitem, gpointer user_data)
|
meillo@11
|
57 {
|
meillo@11
|
58 ratio = gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_w_spinbutton"))
|
meillo@11
|
59 / gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_h_spinbutton"));
|
meillo@3
|
60 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@3
|
61 }
|
meillo@4
|
62 */
|
meillo@3
|
63
|
meillo@3
|
64
|
meillo@3
|
65
|
meillo@3
|
66
|
meillo@3
|
67
|
meillo@4
|
68
|
meillo@4
|
69
|
meillo@4
|
70
|
meillo@4
|
71
|
meillo@4
|
72 /*
|
meillo@11
|
73 static void
|
meillo@11
|
74 ratio_optionmenu_changed_cb(GtkOptionMenu* optionmenu, gpointer unser_data)
|
meillo@11
|
75 {
|
meillo@11
|
76 int idx = gtk_option_menu_get_history(optionmenu);
|
meillo@4
|
77 int w = 1, h = 1;
|
meillo@4
|
78 gboolean use_ratio = TRUE;
|
meillo@4
|
79
|
meillo@4
|
80 switch (idx) {
|
meillo@4
|
81 case GTH_CROP_RATIO_NONE:
|
meillo@4
|
82 use_ratio = FALSE;
|
meillo@4
|
83 break;
|
meillo@4
|
84 case GTH_CROP_RATIO_SQUARE:
|
meillo@4
|
85 w = h = 1;
|
meillo@4
|
86 break;
|
meillo@4
|
87 case GTH_CROP_RATIO_IMAGE:
|
meillo@4
|
88 w = lookup_widget(cropper_window, "image_width");
|
meillo@4
|
89 h = lookup_widget(cropper_window, "image_height");
|
meillo@4
|
90 break;
|
meillo@4
|
91 case GTH_CROP_RATIO_DISPLAY:
|
meillo@4
|
92 w = lookup_widget(cropper_window, "display_width");
|
meillo@4
|
93 h = lookup_widget(cropper_window, "display_height");
|
meillo@4
|
94 break;
|
meillo@4
|
95 case GTH_CROP_RATIO_4_3:
|
meillo@4
|
96 w = 4;
|
meillo@4
|
97 h = 3;
|
meillo@4
|
98 break;
|
meillo@4
|
99 case GTH_CROP_RATIO_4_6:
|
meillo@4
|
100 w = 4;
|
meillo@4
|
101 h = 6;
|
meillo@4
|
102 break;
|
meillo@4
|
103 case GTH_CROP_RATIO_CUSTOM:
|
meillo@4
|
104 default:
|
meillo@11
|
105 w = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
|
meillo@11
|
106 lookup_widget(cropper_window, "ratio_w_spinbutton")));
|
meillo@11
|
107 h = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
|
meillo@11
|
108 lookup_widget(cropper_window, "ratio_h_spinbutton")));
|
meillo@4
|
109 break;
|
meillo@4
|
110 }
|
meillo@4
|
111
|
meillo@11
|
112 gtk_widget_set_sensitive(lookup_widget(cropper_window, "custom_ratio_box"),
|
meillo@11
|
113 idx == GTH_CROP_RATIO_CUSTOM);
|
meillo@11
|
114 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), w);
|
meillo@11
|
115 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), h);
|
meillo@4
|
116
|
meillo@11
|
117 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window, "crop_image")),
|
meillo@11
|
118 use_ratio, (double) w / h);
|
meillo@4
|
119 }
|
meillo@4
|
120
|
meillo@4
|
121
|
meillo@11
|
122 static void
|
meillo@11
|
123 ratio_value_changed_cb(GtkSpinButton* spin, gpointer unser_data)
|
meillo@11
|
124 {
|
meillo@4
|
125 int w, h;
|
meillo@4
|
126
|
meillo@11
|
127 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@11
|
128 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
|
meillo@4
|
129
|
meillo@11
|
130 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(
|
meillo@11
|
131 lookup_widget(cropper_window, "crop_image")), TRUE, (double) w / h);
|
meillo@4
|
132 }
|
meillo@4
|
133
|
meillo@4
|
134
|
meillo@11
|
135 static void
|
meillo@11
|
136 ratio_swap_button_cb(GtkButton* button, gpointer unser_data)
|
meillo@11
|
137 {
|
meillo@4
|
138 int w, h;
|
meillo@4
|
139
|
meillo@4
|
140 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@4
|
141 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
|
meillo@4
|
142
|
meillo@4
|
143 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), h);
|
meillo@4
|
144 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), w);
|
meillo@4
|
145
|
meillo@11
|
146 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window,
|
meillo@11
|
147 "crop_image")), TRUE, (double) h / w);
|
meillo@4
|
148 }
|
meillo@4
|
149
|
meillo@4
|
150
|
meillo@4
|
151
|
meillo@4
|
152
|
meillo@4
|
153
|
meillo@4
|
154
|
meillo@4
|
155
|
meillo@4
|
156
|
meillo@11
|
157 void
|
meillo@11
|
158 on_ratio_w_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
|
meillo@11
|
159 {
|
meillo@3
|
160 g_print("spinbutton W - ratio: %f\n", ratio);
|
meillo@11
|
161 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_h_spinbutton"),
|
meillo@11
|
162 gtk_spin_button_get_value(spinbutton) / ratio);
|
meillo@3
|
163 }
|
meillo@3
|
164
|
meillo@3
|
165
|
meillo@11
|
166 void
|
meillo@11
|
167 on_ratio_w_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
|
meillo@11
|
168 {
|
meillo@3
|
169 }
|
meillo@3
|
170
|
meillo@3
|
171
|
meillo@11
|
172 void
|
meillo@11
|
173 on_ratio_h_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
|
meillo@11
|
174 {
|
meillo@3
|
175 }
|
meillo@3
|
176
|
meillo@3
|
177
|
meillo@11
|
178 void
|
meillo@11
|
179 on_ratio_h_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
|
meillo@11
|
180 {
|
meillo@3
|
181 g_print("spinbutton H - ratio: %f\n", ratio);
|
meillo@11
|
182 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
|
meillo@11
|
183 gtk_spin_button_get_value(spinbutton) * ratio);
|
meillo@0
|
184
|
meillo@0
|
185 }
|
meillo@0
|
186
|
meillo@0
|
187
|
meillo@11
|
188 void
|
meillo@11
|
189 on_ratio_swap_button_clicked(GtkButton* button, gpointer user_data)
|
meillo@11
|
190 {
|
meillo@3
|
191
|
meillo@3
|
192 ratio = 1.0 / ratio;
|
meillo@11
|
193 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
|
meillo@11
|
194 gtk_spin_button_get_value(lookup_widget(cropper_window,
|
meillo@11
|
195 "ratio_h_spinbutton")));
|
meillo@3
|
196 gtk_spin_button_update(lookup_widget(cropper_window, "ratio_w_spinbutton"));
|
meillo@0
|
197
|
meillo@2
|
198 }
|
meillo@4
|
199 */
|
meillo@2
|
200
|
meillo@2
|
201
|
meillo@13
|
202 void
|
meillo@13
|
203 update_title(char* zoom)
|
meillo@13
|
204 {
|
meillo@13
|
205 char title[128];
|
meillo@13
|
206 snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y);
|
meillo@13
|
207 gtk_window_set_title(GTK_WINDOW(cropper_window), title);
|
meillo@13
|
208 }
|
meillo@13
|
209
|
meillo@2
|
210
|
meillo@7
|
211 /* zoom */
|
meillo@11
|
212 void
|
meillo@11
|
213 set_zoom()
|
meillo@11
|
214 {
|
meillo@8
|
215 static GdkPixbuf* pixbuf_new;
|
meillo@8
|
216 g_object_unref(pixbuf_new);
|
meillo@8
|
217
|
meillo@13
|
218 pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom,
|
meillo@13
|
219 GDK_INTERP_BILINEAR);
|
meillo@8
|
220 gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new);
|
meillo@8
|
221 }
|
meillo@8
|
222
|
meillo@11
|
223 void
|
meillo@11
|
224 on_zoom_in_button_clicked(GtkObject* object, gpointer user_data)
|
meillo@11
|
225 {
|
meillo@13
|
226 zoom *= 1 + inc;
|
meillo@8
|
227 set_zoom();
|
meillo@7
|
228 }
|
meillo@7
|
229
|
meillo@11
|
230 void
|
meillo@11
|
231 on_zoom_out_button_clicked(GtkObject* object, gpointer user_data)
|
meillo@11
|
232 {
|
meillo@13
|
233 zoom *= 1 - inc;
|
meillo@8
|
234 set_zoom();
|
meillo@7
|
235 }
|
meillo@7
|
236
|
meillo@11
|
237 void
|
meillo@11
|
238 on_zoom_100_button_clicked(GtkObject* object, gpointer user_data)
|
meillo@11
|
239 {
|
meillo@13
|
240 zoom = 1.0;
|
meillo@8
|
241 set_zoom();
|
meillo@7
|
242 }
|
meillo@7
|
243
|
meillo@11
|
244 void
|
meillo@11
|
245 on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data)
|
meillo@11
|
246 {
|
meillo@8
|
247 int w, h;
|
meillo@13
|
248 float zw, zh;
|
meillo@8
|
249 GtkWidget* image_a;
|
meillo@8
|
250
|
meillo@8
|
251 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
|
meillo@11
|
252 gdk_drawable_get_size(image_a->window, &w, &h);
|
meillo@8
|
253
|
meillo@13
|
254 zw = w*1.0 / image_width;
|
meillo@13
|
255 zh = h*1.0 / image_height;
|
meillo@13
|
256
|
meillo@13
|
257 zoom = (zw < zh) ? zw : zh;
|
meillo@8
|
258 set_zoom();
|
meillo@7
|
259 }
|
meillo@7
|
260
|
meillo@7
|
261
|
meillo@7
|
262
|
meillo@7
|
263
|
meillo@7
|
264
|
meillo@7
|
265
|
meillo@7
|
266
|
meillo@11
|
267 void
|
meillo@14
|
268 crop(void)
|
meillo@11
|
269 {
|
meillo@4
|
270 char crop_call[256];
|
meillo@2
|
271
|
meillo@4
|
272 sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"",
|
meillo@11
|
273 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
|
meillo@11
|
274 "crop_width_spinbutton")),
|
meillo@11
|
275 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
|
meillo@11
|
276 "crop_height_spinbutton")),
|
meillo@11
|
277 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
|
meillo@11
|
278 "crop_x_spinbutton")),
|
meillo@11
|
279 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
|
meillo@11
|
280 "crop_y_spinbutton")),
|
meillo@4
|
281 image_filename,
|
meillo@4
|
282 image_filename
|
meillo@4
|
283 );
|
meillo@4
|
284 system(crop_call);
|
meillo@4
|
285 gtk_main_quit();
|
meillo@4
|
286 }
|
meillo@2
|
287
|
meillo@11
|
288
|
meillo@11
|
289 void
|
meillo@11
|
290 on_cropper_window_create(GtkObject* object, gpointer user_data)
|
meillo@11
|
291 {
|
meillo@7
|
292 image_width = gdk_pixbuf_get_width(image_buffer);
|
meillo@7
|
293 image_height = gdk_pixbuf_get_height(image_buffer);
|
meillo@10
|
294
|
meillo@10
|
295 /*
|
meillo@11
|
296 image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
|
meillo@11
|
297 image_area = gtk_image_new_from_pixbuf(image_buffer);
|
meillo@10
|
298
|
meillo@10
|
299 int w, h;
|
meillo@10
|
300 GtkWidget* image_a;
|
meillo@10
|
301
|
meillo@10
|
302 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
|
meillo@11
|
303 gdk_drawable_get_size(image_a->window, &w, &h);
|
meillo@10
|
304
|
meillo@10
|
305 image_width = w - 200;
|
meillo@10
|
306 image_height = h - 150;
|
meillo@10
|
307 set_zoom();
|
meillo@10
|
308 */
|
meillo@7
|
309 }
|
meillo@0
|
310
|
meillo@11
|
311 void
|
meillo@11
|
312 on_cropper_window_destroy(GtkObject* object, gpointer user_data)
|
meillo@11
|
313 {
|
meillo@0
|
314 gtk_main_quit();
|
meillo@0
|
315 }
|
meillo@0
|
316
|
meillo@13
|
317
|
meillo@13
|
318
|
meillo@13
|
319
|
meillo@13
|
320 gboolean
|
meillo@13
|
321 on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata)
|
meillo@13
|
322 {
|
meillo@13
|
323 if (pKey->type != GDK_KEY_PRESS) {
|
meillo@13
|
324 return FALSE;
|
meillo@13
|
325 }
|
meillo@13
|
326 switch (pKey->keyval) {
|
meillo@14
|
327 case GDK_q:
|
meillo@14
|
328 gtk_main_quit();
|
meillo@14
|
329 break;
|
meillo@14
|
330 case GDK_Return:
|
meillo@14
|
331 crop();
|
meillo@14
|
332 break;
|
meillo@13
|
333 case GDK_plus:
|
meillo@13
|
334 on_zoom_in_button_clicked(NULL, userdata);
|
meillo@13
|
335 break;
|
meillo@13
|
336 case GDK_minus:
|
meillo@13
|
337 on_zoom_out_button_clicked(NULL, userdata);
|
meillo@13
|
338 break;
|
meillo@13
|
339 case GDK_0:
|
meillo@13
|
340 on_zoom_100_button_clicked(NULL, userdata);
|
meillo@13
|
341 break;
|
meillo@13
|
342 case GDK_f:
|
meillo@13
|
343 on_zoom_fit_button_clicked(NULL, userdata);
|
meillo@13
|
344 break;
|
meillo@13
|
345 }
|
meillo@13
|
346 return TRUE;
|
meillo@13
|
347 }
|
meillo@13
|
348
|
meillo@13
|
349
|