[Rawstudio-commit] r898 - trunk/src

Anders Brander anders at brander.dk
Fri Oct 20 11:23:47 CEST 2006


Author: abrander
Date: 2006-10-20 11:23:47 +0200 (Fri, 20 Oct 2006)
New Revision: 898

Modified:
   trunk/src/drawingarea.c
Log:
Added straighten tool.

Modified: trunk/src/drawingarea.c
===================================================================
--- trunk/src/drawingarea.c	2006-10-20 09:22:47 UTC (rev 897)
+++ trunk/src/drawingarea.c	2006-10-20 09:23:47 UTC (rev 898)
@@ -18,6 +18,8 @@
  */
 
 #include <gtk/gtk.h>
+#include <config.h>
+#include "gettext.h"
 #include "matrix.h"
 #include "rs-batch.h"
 #include "rawstudio.h"
@@ -27,6 +29,7 @@
 #include "conf_interface.h"
 #include "rs-image.h"
 
+static gdouble angle;
 static gint start_x, start_y;
 static void draw_region_crop(RS_BLOB *rs, RS_RECT *region);
 static gboolean drawingarea_expose (GtkWidget *widget, GdkEventExpose *event, RS_BLOB *rs);
@@ -47,6 +50,7 @@
 static GdkCursor *cur_ne;
 static GdkCursor *cur_se;
 static GdkCursor *cur_sw;
+static GdkCursor *cur_pencil;
 
 static void
 draw_region_crop(RS_BLOB *rs, RS_RECT *region)
@@ -364,7 +368,55 @@
 	return;
 }
 
+static void
+gui_drawingarea_popup_straighten(GtkMenuItem *menuitem, RS_BLOB *rs)
+{
+	extern gint state;
+	gdk_window_set_cursor(rs->preview_drawingarea->window, cur_pencil);
+	state = STATE_STRAIGHTEN;
+	return;
+}
+
 gboolean
+gui_drawingarea_straighten_motion_callback(GtkWidget *widget, GdkEventMotion *event, RS_BLOB *rs)
+{
+	const gint x = event->x;
+	const gint y = event->y;
+	const gint vx = start_x - x;
+	const gint vy = start_y - y;
+	gdouble degrees;
+
+	GdkGC *gc = rs->preview_drawingarea->style->fg_gc[GTK_WIDGET_STATE (rs->preview_drawingarea)];
+
+	gdk_draw_drawable(rs->preview_drawingarea->window, gc,
+		rs->preview_backing,
+		rs->preview_exposed->x1, rs->preview_exposed->y1,
+		rs->preview_exposed->x1, rs->preview_exposed->y1,
+		rs->preview_exposed->x2-rs->preview_exposed->x1+1,
+		rs->preview_exposed->y2-rs->preview_exposed->y1+1);
+	gdk_draw_line(rs->preview_drawingarea->window, gc,
+		start_x, start_y,
+		x, y);
+	degrees = -atan2(vy,vx)*180/M_PI;
+	if (degrees>=0.0)
+	{
+		if ((degrees>45.0) && (degrees<=135.0))
+			degrees -= 90.0;
+		else if (degrees>135.0)
+			degrees -= 180.0;
+	}
+	else /* <0.0 */
+	{
+		if ((degrees < -45.0) && (degrees >= -135.0))
+			degrees += 90.0;
+		else if (degrees<-135.0)
+			degrees += 180.0;
+	}
+	angle = degrees;
+	return(TRUE);
+}
+
+gboolean
 gui_drawingarea_button(GtkWidget *widget, GdkEventButton *event, RS_BLOB *rs)
 {
 	extern gint state;
@@ -379,7 +431,7 @@
 	{
 		if ((event->button==1) && (state == STATE_NORMAL))
 			rs_set_wb_from_pixels(rs, x, y);
-		else if (event->button==2)
+		else if ((event->button==2) && (state != STATE_STRAIGHTEN_DRAW))
 		{
 			if(!gui_is_busy())
 			{
@@ -399,18 +451,24 @@
 		else if (((event->button==3) && (state == STATE_NORMAL)) && !gui_is_busy())
 		{
 			GtkWidget *i, *menu = gtk_menu_new();
+			gint n=0;
 
 			i = gtk_menu_item_new_with_label ("Crop");
 			gtk_widget_show (i);
-			gtk_menu_attach (GTK_MENU (menu), i, 0, 1, 0, 1);
+			gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
 			g_signal_connect (i, "activate", G_CALLBACK (gui_drawingarea_popup_crop), rs);
 			if (rs->photo->crop)
 			{
 				i = gtk_menu_item_new_with_label ("Uncrop");
 				gtk_widget_show (i);
-				gtk_menu_attach (GTK_MENU (menu), i, 0, 1, 1, 2);
+				gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
 				g_signal_connect (i, "activate", G_CALLBACK (gui_drawingarea_popup_uncrop), rs);
 			}
+			i = gtk_menu_item_new_with_label (_("Straighten"));
+			gtk_widget_show (i);
+			gtk_menu_attach (GTK_MENU (menu), i, 0, 1, n, n+1); n++;
+			g_signal_connect (i, "activate", G_CALLBACK (gui_drawingarea_popup_straighten), rs);
+
 			gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME);
 		}
 		else if (((event->button==1) && (state == STATE_CROP)) && rs->preview_done)
@@ -453,6 +511,16 @@
 				rs_crop_end(rs, FALSE);
 			gdk_window_set_cursor(rs->preview_drawingarea->window, cur_normal);
 		}
+		else if (((event->button==1) && (state == STATE_STRAIGHTEN)) && rs->preview_done)
+		{
+			start_x = (gint) event->x;
+			start_y = (gint) event->y;
+			gdk_window_set_cursor(rs->preview_drawingarea->window, cur_pencil);
+			state = STATE_STRAIGHTEN_DRAW;
+			signal = g_signal_connect (G_OBJECT (rs->preview_drawingarea),
+				"motion_notify_event",
+				G_CALLBACK (gui_drawingarea_straighten_motion_callback), rs);
+		}
 	}
 	else /* release */
 	{
@@ -481,8 +549,14 @@
 				g_signal_handler_disconnect(rs->preview_drawingarea, signal);
 				state = STATE_CROP;
 				break;
+			case STATE_STRAIGHTEN_DRAW:
+				gdk_window_set_cursor(rs->preview_drawingarea->window, cur_normal);
+				g_signal_handler_disconnect(rs->preview_drawingarea, signal);
+				state = STATE_NORMAL;
+				rs->photo->angle += angle;
+				update_preview(rs, FALSE, TRUE);
+				break;
 		}
-		
 	}
 	return(TRUE);
 }
@@ -529,6 +603,7 @@
 	cur_ne = gdk_cursor_new(GDK_TOP_RIGHT_CORNER);
 	cur_se = gdk_cursor_new(GDK_BOTTOM_RIGHT_CORNER);
 	cur_sw = gdk_cursor_new(GDK_BOTTOM_LEFT_CORNER);
+	cur_pencil = gdk_cursor_new(GDK_PENCIL);
 	cur_normal = NULL;
 
 	scroller = gtk_scrolled_window_new (NULL, NULL);




More information about the Rawstudio-commit mailing list