view cropper.c @ 19:762de8cee1e4 default tip

fixed makefile; some cleanups
author meillo@marmaro.de
date Thu, 04 Mar 2010 19:44:28 +0100
parents 9d6e8105b145
children
line wrap: on
line source

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gdk-pixbuf/gdk-pixbuf.h>




GtkWidget* cropper_window;
char* image_filename;

/* from interface.h */
GtkWidget* create_cropper_window(void);
GtkWidget* image_area;
GdkPixbuf* image_buffer;

int w, h, x, y;

int image_width;
int image_height;
float inc = 0.3;
float zoom = 1.0;

/* from callbacks.h */
double ratio;




#define GLADE_HOOKUP_OBJECT(component,widget,name) \
  g_object_set_data_full(G_OBJECT(component), name, \
    gtk_widget_ref(widget),(GDestroyNotify) gtk_widget_unref)

#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
  g_object_set_data(G_OBJECT(component), name, widget)


/*
 * This function returns a widget in a component created by Glade.
 * Call it with the toplevel widget in the component (i.e. a window/dialog),
 * or alternatively any widget in the component, and the name of the widget
 * you want returned.
 */
GtkWidget*
lookup_widget(GtkWidget* widget, const gchar* widget_name)
{
	GtkWidget* parent;
	GtkWidget* found_widget;

	for (;;) {
		if (GTK_IS_MENU(widget)) {
			parent = gtk_menu_get_attach_widget(GTK_MENU(widget));
		} else {
			parent = widget->parent;
		}
		if (!parent) {
			parent = (GtkWidget*) g_object_get_data(G_OBJECT(widget), "GladeParentKey");
		}
		if (parent == NULL) {
			break;
		}
		widget = parent;
	}

	found_widget = (GtkWidget*) g_object_get_data(G_OBJECT(widget), widget_name);
	if (!found_widget) {
		g_warning("Widget not found: %s", widget_name);
	}
	return found_widget;
}























/* zoom */
void
set_zoom()
{
	static GdkPixbuf* pixbuf_new;
	g_object_unref(pixbuf_new);

	pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom,
	                                     GDK_INTERP_BILINEAR);
	gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new);
}

void
on_zoom_in_button_clicked(GtkObject* object, gpointer user_data)
{
	zoom *= 1 + inc;
	set_zoom();
}

void
on_zoom_out_button_clicked(GtkObject* object, gpointer user_data)
{
	zoom *= 1 - inc;
	set_zoom();
}

void
on_zoom_100_button_clicked(GtkObject* object, gpointer user_data)
{
	zoom = 1.0;
	set_zoom();
}

void
on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data)
{
	int w, h;
	float zw, zh;
	GtkWidget* image_a;

	image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
	gdk_drawable_get_size(image_a->window, &w, &h);

	zw = w*1.0 / image_width;
	zh = h*1.0 / image_height;

	zoom = (zw < zh) ? zw : zh;
	set_zoom();
}







void
crop(void)
{
	char crop_call[256];

	sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"",
		w, h, x, y, image_filename, image_filename);
	system(crop_call);
	gtk_main_quit();
}


void
on_cropper_window_create(GtkObject* object, gpointer user_data)
{
	image_width = gdk_pixbuf_get_width(image_buffer);
	image_height = gdk_pixbuf_get_height(image_buffer);

	/*
	image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
	image_area = gtk_image_new_from_pixbuf(image_buffer);

	int w, h;
	GtkWidget* image_a;

	image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
	gdk_drawable_get_size(image_a->window, &w, &h);

	image_width = w - 200;
	image_height = h - 150;
	set_zoom();
	*/
}

void
on_cropper_window_destroy(GtkObject* object, gpointer user_data)
{
	gtk_main_quit();
}




gboolean
on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata)
{
	if (pKey->type != GDK_KEY_PRESS) {
		return FALSE;
	}
	switch (pKey->keyval) {
	case GDK_q:
		gtk_main_quit();
		break;
	case GDK_Return:
		crop();
		break;
	case GDK_plus:
		on_zoom_in_button_clicked(NULL, userdata);
		break;
	case GDK_minus:
		on_zoom_out_button_clicked(NULL, userdata);
		break;
	case GDK_0:
		on_zoom_100_button_clicked(NULL, userdata);
		break;
	case GDK_f:
		on_zoom_fit_button_clicked(NULL, userdata);
		break;
	}
	return TRUE;
}





GtkWidget*
create_cropper_window(void)
{
	GtkWidget *cropper_window;
	GtkWidget *dialog_vbox1;
	GtkWidget *status;
	GtkWidget *label1;
	GtkWidget *label2;
	
	
	cropper_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_widget_set_name(cropper_window, "cropper_window");
	gtk_container_set_border_width(GTK_CONTAINER(cropper_window), 6);
	gtk_window_set_title(GTK_WINDOW(cropper_window), "cropper-0.2");
	
	dialog_vbox1 = gtk_vbox_new(FALSE, 6);
	gtk_widget_set_name(dialog_vbox1, "dialog_vbox1");
	gtk_widget_show(dialog_vbox1);
	gtk_container_add(GTK_CONTAINER(cropper_window), dialog_vbox1);
	
	
	status = gtk_hbox_new(FALSE, 0);
	gtk_widget_set_name(status, "status");
	gtk_widget_show(status);
	gtk_box_pack_end(GTK_BOX(dialog_vbox1), status, FALSE, FALSE, 0);
	
	label1 = gtk_label_new("zoom:");
	gtk_widget_set_name(label1, "label1");
	gtk_widget_show(label1);
	gtk_box_pack_start(GTK_BOX(status), label1, FALSE, FALSE, 0);
	
	label2 = gtk_label_new("1.0");
	gtk_widget_set_name(label2, "label2");
	gtk_widget_show(label2);
	gtk_box_pack_start(GTK_BOX(status), label2, FALSE, FALSE, 0);
	
	/* image_area */
	image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
	image_area = gtk_image_new_from_pixbuf(image_buffer);
	
	gtk_widget_set_name(image_area, "image_area");
	gtk_widget_show(image_area);
	gtk_box_pack_start(GTK_BOX(dialog_vbox1), image_area, TRUE, TRUE, 0);
	
	
	
	
	
	g_signal_connect(G_OBJECT(cropper_window), "show",
	               G_CALLBACK(on_cropper_window_create), NULL);
	
	g_signal_connect(G_OBJECT(cropper_window), "destroy",
	               G_CALLBACK(on_cropper_window_destroy), NULL);
	
	g_signal_connect(cropper_window, "key-press-event",
	               G_CALLBACK(on_key_press), NULL);
	
	
	/* Store pointers to all widgets, for use by lookup_widget(). */
	
	GLADE_HOOKUP_OBJECT_NO_REF(cropper_window, cropper_window, "cropper_window");
	GLADE_HOOKUP_OBJECT(cropper_window, dialog_vbox1, "dialog_vbox1");
	
	GLADE_HOOKUP_OBJECT(cropper_window, label1, "label1");
	GLADE_HOOKUP_OBJECT(cropper_window, label2, "label2");
	GLADE_HOOKUP_OBJECT(cropper_window, status, "status");
	GLADE_HOOKUP_OBJECT(cropper_window, image_area, "image_area");
	GLADE_HOOKUP_OBJECT(cropper_window,(GtkWidget*) image_buffer, "image_buffer");
	
	
	return cropper_window;
}





int
main(int argc, char* argv[])
{
	/* commandline option handling */
	if (argc != 2) {
		g_print("cropper -- a crop frontend to convert\n");
		g_print("usage: cropper IMAGE\n");
		return 1;
	}

	image_filename = argv[1];
	gtk_init(&argc, &argv);

	cropper_window = create_cropper_window();
	gtk_widget_show(cropper_window);
	gtk_main();

	return 0;
}