[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