[Rawstudio-commit] r2200 - in trunk: plugins/rotate src

Anders Brander anders at brander.dk
Tue Feb 10 01:34:35 CET 2009


Author: abrander
Date: 2009-02-10 01:34:34 +0100 (Tue, 10 Feb 2009)
New Revision: 2200

Modified:
   trunk/plugins/rotate/rotate.c
   trunk/src/rs-preview-widget.c
Log:
Added orientation property to RSRotate.

Modified: trunk/plugins/rotate/rotate.c
===================================================================
--- trunk/plugins/rotate/rotate.c	2009-02-08 14:50:44 UTC (rev 2199)
+++ trunk/plugins/rotate/rotate.c	2009-02-10 00:34:34 UTC (rev 2200)
@@ -36,6 +36,7 @@
 	RS_MATRIX3 affine;
 	gboolean dirty;
 	gfloat angle;
+	gint orientation;
 	gint new_width;
 	gint new_height;
 	gfloat sine;
@@ -52,7 +53,8 @@
 
 enum {
 	PROP_0,
-	PROP_ANGLE
+	PROP_ANGLE,
+	PROP_ORIENTATION
 };
 
 static void get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
@@ -87,6 +89,11 @@
 			"angle", "Angle", "Rotation angle in degrees",
 			-G_MAXFLOAT, G_MAXFLOAT, 0.0, G_PARAM_READWRITE)
 	);
+	g_object_class_install_property(object_class,
+		PROP_ORIENTATION, g_param_spec_uint (
+			"orientation", "orientation", "Orientation",
+			0, 65536, 0, G_PARAM_READWRITE)
+	);
 
 	filter_class->name = "Bilinear rotate filter";
 	filter_class->get_image = get_image;
@@ -99,6 +106,7 @@
 {
 	rotate->angle = 1.0;
 	rotate->dirty = TRUE;
+	ORIENTATION_RESET(rotate->orientation);
 }
 
 static void
@@ -111,6 +119,9 @@
 		case PROP_ANGLE:
 			g_value_set_float(value, rotate->angle);
 			break;
+		case PROP_ORIENTATION:
+			g_value_set_uint(value, rotate->orientation);
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -136,6 +147,15 @@
 				rs_filter_changed(RS_FILTER(object));
 			}
 			break;
+		case PROP_ORIENTATION:
+			if (rotate->orientation != g_value_get_uint(value))
+			{
+				rotate->orientation = g_value_get_uint(value);
+
+				rotate->dirty = TRUE;
+				rs_filter_changed(RS_FILTER(object));
+			}
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -156,7 +176,7 @@
 	if (!RS_IS_IMAGE16(input))
 		return input;
 
-	if (rotate->angle < 0.001)
+	if ((rotate->angle < 0.001) && (rotate->orientation==0))
 		return input;
 
 	recalculate(rotate);
@@ -188,7 +208,8 @@
 {
 	RSRotate *rotate = RS_ROTATE(filter);
 
-	recalculate(rotate);
+	if (rotate->dirty)
+		recalculate(rotate);
 
 	return rotate->new_width;
 }
@@ -198,7 +219,8 @@
 {
 	RSRotate *rotate = RS_ROTATE(filter);
 
-	recalculate(rotate);
+	if (rotate->dirty)
+		recalculate(rotate);
 
 	return rotate->new_height;
 }
@@ -277,9 +299,13 @@
 	/* Start clean */
 	matrix3_identity(&rotate->affine);
 
-	/* Rotate  */
-	matrix3_affine_rotate(&rotate->affine, rotate->angle);
+	/* Rotate + orientation-angle */
+	matrix3_affine_rotate(&rotate->affine, rotate->angle+(rotate->orientation&3)*90.0);
 
+	/* Flip if needed */
+	if (rotate->orientation&4)
+		matrix3_affine_scale(&rotate->affine, 1.0, -1.0);
+
 	/* Translate into positive x,y */
 	matrix3_affine_get_minmax(&rotate->affine, &minx, &miny, &maxx, &maxy, 0.0, 0.0, (gdouble) (rs_filter_get_width(previous)-1), (gdouble) (rs_filter_get_height(previous)-1));
 	minx -= 0.5; /* This SHOULD be the correct rounding :) */

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c	2009-02-08 14:50:44 UTC (rev 2199)
+++ trunk/src/rs-preview-widget.c	2009-02-10 00:34:34 UTC (rev 2200)
@@ -424,7 +424,7 @@
 		for(view=0;view<preview->views;view++)
 		{
 			g_object_set(preview->filter_input[view], "image", preview->photo->input, NULL);
-			g_object_set(preview->filter_rotate[view], "angle", preview->photo->angle, NULL);
+			g_object_set(preview->filter_rotate[view], "angle", preview->photo->angle, "orientation", preview->photo->orientation, NULL);
 			g_object_set(preview->filter_crop[view], "rectangle", preview->photo->crop, NULL);
 			g_object_set(preview->filter_sharpen[view], "amount", preview->scale * preview->photo->settings[preview->snapshot[view]]->sharpen, NULL);
 			rescale(preview, view);
@@ -1938,9 +1938,7 @@
 	gint view;
 	for(view=0;view<preview->views; view++)
 	{
-		/* FIXME: Fix orientation */
-//		g_object_set(preview->filter_transform[view], "orientation", photo->orientation, NULL);
-		g_object_set(preview->filter_rotate[view], "angle", photo->angle, NULL);
+		g_object_set(preview->filter_rotate[view], "angle", photo->angle, "orientation", photo->orientation, NULL);
 		g_object_set(preview->filter_crop[view], "rectangle", photo->crop, NULL);
 	}
 }




More information about the Rawstudio-commit mailing list