meillo@0: #include meillo@7: #include meillo@13: #include meillo@2: #include "main.h" meillo@0: #include "callbacks.h" meillo@0: #include "support.h" meillo@0: meillo@7: int image_width; meillo@7: int image_height; meillo@10: float inc = 0.3; meillo@13: float zoom = 1.0; meillo@11: meillo@11: meillo@4: /* meillo@11: void meillo@11: update_spin_button_ratio(GtkWidget* spinbutton) meillo@11: { meillo@3: g_print("ratio change: %f\n", ratio); meillo@3: on_ratio_w_spinbutton_value_changed(spinbutton, NULL); meillo@3: } meillo@2: meillo@4: meillo@11: void meillo@11: on_ratio_none_activate(GtkMenuItem* menuitem, gpointer user_data) meillo@11: { meillo@4: ratio = 1; meillo@3: update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@2: } meillo@2: meillo@2: meillo@11: void meillo@11: on_ratio_square_activate(GtkMenuItem* menuitem, gpointer user_data) meillo@11: { meillo@4: ratio = 1; meillo@3: update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@2: } meillo@2: meillo@2: meillo@11: void meillo@11: on_ratio_4x3_activate(GtkMenuItem* menuitem, gpointer user_data) meillo@11: { meillo@4: ratio = 4.0/3.0; meillo@3: update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@2: } meillo@2: meillo@2: meillo@11: void meillo@11: on_ratio_3x2_activate(GtkMenuItem* menuitem, gpointer user_data) meillo@11: { meillo@4: ratio = 1.5; meillo@3: update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@2: } meillo@2: meillo@2: meillo@11: void meillo@11: on_ratio_custom_activate(GtkMenuItem* menuitem, gpointer user_data) meillo@11: { meillo@11: ratio = gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_w_spinbutton")) meillo@11: / gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_h_spinbutton")); meillo@3: update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@3: } meillo@4: */ meillo@3: meillo@3: meillo@3: meillo@3: meillo@3: meillo@4: meillo@4: meillo@4: meillo@4: meillo@4: /* meillo@11: static void meillo@11: ratio_optionmenu_changed_cb(GtkOptionMenu* optionmenu, gpointer unser_data) meillo@11: { meillo@11: int idx = gtk_option_menu_get_history(optionmenu); meillo@4: int w = 1, h = 1; meillo@4: gboolean use_ratio = TRUE; meillo@4: meillo@4: switch (idx) { meillo@4: case GTH_CROP_RATIO_NONE: meillo@4: use_ratio = FALSE; meillo@4: break; meillo@4: case GTH_CROP_RATIO_SQUARE: meillo@4: w = h = 1; meillo@4: break; meillo@4: case GTH_CROP_RATIO_IMAGE: meillo@4: w = lookup_widget(cropper_window, "image_width"); meillo@4: h = lookup_widget(cropper_window, "image_height"); meillo@4: break; meillo@4: case GTH_CROP_RATIO_DISPLAY: meillo@4: w = lookup_widget(cropper_window, "display_width"); meillo@4: h = lookup_widget(cropper_window, "display_height"); meillo@4: break; meillo@4: case GTH_CROP_RATIO_4_3: meillo@4: w = 4; meillo@4: h = 3; meillo@4: break; meillo@4: case GTH_CROP_RATIO_4_6: meillo@4: w = 4; meillo@4: h = 6; meillo@4: break; meillo@4: case GTH_CROP_RATIO_CUSTOM: meillo@4: default: meillo@11: w = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON( meillo@11: lookup_widget(cropper_window, "ratio_w_spinbutton"))); meillo@11: h = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON( meillo@11: lookup_widget(cropper_window, "ratio_h_spinbutton"))); meillo@4: break; meillo@4: } meillo@4: meillo@11: gtk_widget_set_sensitive(lookup_widget(cropper_window, "custom_ratio_box"), meillo@11: idx == GTH_CROP_RATIO_CUSTOM); meillo@11: set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), w); meillo@11: set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), h); meillo@4: meillo@11: gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window, "crop_image")), meillo@11: use_ratio, (double) w / h); meillo@4: } meillo@4: meillo@4: meillo@11: static void meillo@11: ratio_value_changed_cb(GtkSpinButton* spin, gpointer unser_data) meillo@11: { meillo@4: int w, h; meillo@4: meillo@11: w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@11: h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton")); meillo@4: meillo@11: gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR( meillo@11: lookup_widget(cropper_window, "crop_image")), TRUE, (double) w / h); meillo@4: } meillo@4: meillo@4: meillo@11: static void meillo@11: ratio_swap_button_cb(GtkButton* button, gpointer unser_data) meillo@11: { meillo@4: int w, h; meillo@4: meillo@4: w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@4: h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton")); meillo@4: meillo@4: set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), h); meillo@4: set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), w); meillo@4: meillo@11: gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window, meillo@11: "crop_image")), TRUE, (double) h / w); meillo@4: } meillo@4: meillo@4: meillo@4: meillo@4: meillo@4: meillo@4: meillo@4: meillo@4: meillo@11: void meillo@11: on_ratio_w_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data) meillo@11: { meillo@3: g_print("spinbutton W - ratio: %f\n", ratio); meillo@11: gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_h_spinbutton"), meillo@11: gtk_spin_button_get_value(spinbutton) / ratio); meillo@3: } meillo@3: meillo@3: meillo@11: void meillo@11: on_ratio_w_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data) meillo@11: { meillo@3: } meillo@3: meillo@3: meillo@11: void meillo@11: on_ratio_h_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data) meillo@11: { meillo@3: } meillo@3: meillo@3: meillo@11: void meillo@11: on_ratio_h_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data) meillo@11: { meillo@3: g_print("spinbutton H - ratio: %f\n", ratio); meillo@11: gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"), meillo@11: gtk_spin_button_get_value(spinbutton) * ratio); meillo@0: meillo@0: } meillo@0: meillo@0: meillo@11: void meillo@11: on_ratio_swap_button_clicked(GtkButton* button, gpointer user_data) meillo@11: { meillo@3: meillo@3: ratio = 1.0 / ratio; meillo@11: gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"), meillo@11: gtk_spin_button_get_value(lookup_widget(cropper_window, meillo@11: "ratio_h_spinbutton"))); meillo@3: gtk_spin_button_update(lookup_widget(cropper_window, "ratio_w_spinbutton")); meillo@0: meillo@2: } meillo@4: */ meillo@2: meillo@2: meillo@13: void meillo@13: update_title(char* zoom) meillo@13: { meillo@13: char title[128]; meillo@13: snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y); meillo@13: gtk_window_set_title(GTK_WINDOW(cropper_window), title); meillo@13: } meillo@13: meillo@2: meillo@7: /* zoom */ meillo@11: void meillo@11: set_zoom() meillo@11: { meillo@8: static GdkPixbuf* pixbuf_new; meillo@8: g_object_unref(pixbuf_new); meillo@8: meillo@13: pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom, meillo@13: GDK_INTERP_BILINEAR); meillo@8: gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new); meillo@8: } meillo@8: meillo@11: void meillo@11: on_zoom_in_button_clicked(GtkObject* object, gpointer user_data) meillo@11: { meillo@13: zoom *= 1 + inc; meillo@8: set_zoom(); meillo@7: } meillo@7: meillo@11: void meillo@11: on_zoom_out_button_clicked(GtkObject* object, gpointer user_data) meillo@11: { meillo@13: zoom *= 1 - inc; meillo@8: set_zoom(); meillo@7: } meillo@7: meillo@11: void meillo@11: on_zoom_100_button_clicked(GtkObject* object, gpointer user_data) meillo@11: { meillo@13: zoom = 1.0; meillo@8: set_zoom(); meillo@7: } meillo@7: meillo@11: void meillo@11: on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data) meillo@11: { meillo@8: int w, h; meillo@13: float zw, zh; meillo@8: GtkWidget* image_a; meillo@8: meillo@8: image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); meillo@11: gdk_drawable_get_size(image_a->window, &w, &h); meillo@8: meillo@13: zw = w*1.0 / image_width; meillo@13: zh = h*1.0 / image_height; meillo@13: meillo@13: zoom = (zw < zh) ? zw : zh; meillo@8: set_zoom(); meillo@7: } meillo@7: meillo@7: meillo@7: meillo@7: meillo@7: meillo@7: meillo@7: meillo@11: void meillo@14: crop(void) meillo@11: { meillo@4: char crop_call[256]; meillo@2: meillo@4: sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"", meillo@11: gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, meillo@11: "crop_width_spinbutton")), meillo@11: gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, meillo@11: "crop_height_spinbutton")), meillo@11: gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, meillo@11: "crop_x_spinbutton")), meillo@11: gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window, meillo@11: "crop_y_spinbutton")), meillo@4: image_filename, meillo@4: image_filename meillo@4: ); meillo@4: system(crop_call); meillo@4: gtk_main_quit(); meillo@4: } meillo@2: meillo@11: meillo@11: void meillo@11: on_cropper_window_create(GtkObject* object, gpointer user_data) meillo@11: { meillo@7: image_width = gdk_pixbuf_get_width(image_buffer); meillo@7: image_height = gdk_pixbuf_get_height(image_buffer); meillo@10: meillo@10: /* meillo@11: image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL); meillo@11: image_area = gtk_image_new_from_pixbuf(image_buffer); meillo@10: meillo@10: int w, h; meillo@10: GtkWidget* image_a; meillo@10: meillo@10: image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area"); meillo@11: gdk_drawable_get_size(image_a->window, &w, &h); meillo@10: meillo@10: image_width = w - 200; meillo@10: image_height = h - 150; meillo@10: set_zoom(); meillo@10: */ meillo@7: } meillo@0: meillo@11: void meillo@11: on_cropper_window_destroy(GtkObject* object, gpointer user_data) meillo@11: { meillo@0: gtk_main_quit(); meillo@0: } meillo@0: meillo@13: meillo@13: meillo@13: meillo@13: gboolean meillo@13: on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata) meillo@13: { meillo@13: if (pKey->type != GDK_KEY_PRESS) { meillo@13: return FALSE; meillo@13: } meillo@13: switch (pKey->keyval) { meillo@14: case GDK_q: meillo@14: gtk_main_quit(); meillo@14: break; meillo@14: case GDK_Return: meillo@14: crop(); meillo@14: break; meillo@13: case GDK_plus: meillo@13: on_zoom_in_button_clicked(NULL, userdata); meillo@13: break; meillo@13: case GDK_minus: meillo@13: on_zoom_out_button_clicked(NULL, userdata); meillo@13: break; meillo@13: case GDK_0: meillo@13: on_zoom_100_button_clicked(NULL, userdata); meillo@13: break; meillo@13: case GDK_f: meillo@13: on_zoom_fit_button_clicked(NULL, userdata); meillo@13: break; meillo@13: } meillo@13: return TRUE; meillo@13: } meillo@13: meillo@13: