summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Argiolas <filippo.argiolas@gmail.com>2010-08-03 10:08:34 +0200
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>2010-08-04 20:09:09 -0300
commitc921067208414c47a0c961e604b4d777f2d40b34 (patch)
tree939cf08f7deb7246f29434446dd2a1a0c659d9c4
parent770194a8fcc638924b29e78e9f24c4c7e7ef4b83 (diff)
geometrictransform: make ciclegt "radius" property relative
Make the "radius" property of CircleGeometricTransform relative. This is more coherent with the way [x,y]-center properties are handled and allow to set a radius without knowing the video size. Radius is defined with respect to the circle circumscribed about the video rectangle so that a point in the center has radius 0.0 and one in a vertex has radius 1.0. Note that this is not a regression from the previous absolute way of defining the radius as a user who knows the video size can easily calculate the relative radius and set that. https://bugzilla.gnome.org/show_bug.cgi?id=625959
-rw-r--r--gst/geometrictransform/gstcircle.c3
-rw-r--r--gst/geometrictransform/gstcirclegeometrictransform.c9
-rw-r--r--gst/geometrictransform/gstcirclegeometrictransform.h1
-rw-r--r--gst/geometrictransform/gstkaleidoscope.c4
-rw-r--r--gst/geometrictransform/gsttwirl.c3
-rw-r--r--gst/geometrictransform/gstwaterripple.c2
6 files changed, 14 insertions, 8 deletions
diff --git a/gst/geometrictransform/gstcircle.c b/gst/geometrictransform/gstcircle.c
index fe6a99efe..7cfe67c2b 100644
--- a/gst/geometrictransform/gstcircle.c
+++ b/gst/geometrictransform/gstcircle.c
@@ -183,7 +183,8 @@ circle_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
*in_x = gt->width * theta / (circle->spread_angle + 0.0001);
*in_y =
- gt->height * (1 - (distance - cgt->radius) / (circle->height + 0.0001));
+ gt->height * (1 - (distance - cgt->precalc_radius) / (circle->height +
+ 0.0001));
GST_DEBUG_OBJECT (circle, "Inversely mapped %d %d into %lf %lf",
x, y, *in_x, *in_y);
diff --git a/gst/geometrictransform/gstcirclegeometrictransform.c b/gst/geometrictransform/gstcirclegeometrictransform.c
index 7f8cf2ecc..19e0dde02 100644
--- a/gst/geometrictransform/gstcirclegeometrictransform.c
+++ b/gst/geometrictransform/gstcirclegeometrictransform.c
@@ -72,7 +72,7 @@ enum
#define DEFAULT_X_CENTER 0.5
#define DEFAULT_Y_CENTER 0.5
-#define DEFAULT_RADIUS 100
+#define DEFAULT_RADIUS 0.35
static void
gst_circle_geometric_transform_set_property (GObject * object, guint prop_id,
@@ -155,7 +155,10 @@ circle_geometric_transform_precalc (GstGeometricTransform * gt)
cgt->precalc_x_center = cgt->x_center * gt->width;
cgt->precalc_y_center = cgt->y_center * gt->height;
- cgt->precalc_radius2 = cgt->radius * cgt->radius;
+ cgt->precalc_radius =
+ cgt->radius * 0.5 * sqrt (gt->width * gt->width +
+ gt->height * gt->height);
+ cgt->precalc_radius2 = cgt->precalc_radius * cgt->precalc_radius;
return TRUE;
}
@@ -195,7 +198,7 @@ gst_circle_geometric_transform_class_init (GstCircleGeometricTransformClass *
GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_RADIUS,
g_param_spec_double ("radius", "radius",
- "radius of the circle_geometric_transform effect", 0.0, G_MAXDOUBLE,
+ "radius of the circle_geometric_transform effect", 0.0, 1.0,
DEFAULT_RADIUS,
GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
diff --git a/gst/geometrictransform/gstcirclegeometrictransform.h b/gst/geometrictransform/gstcirclegeometrictransform.h
index a9539ad0c..b8b484adc 100644
--- a/gst/geometrictransform/gstcirclegeometrictransform.h
+++ b/gst/geometrictransform/gstcirclegeometrictransform.h
@@ -76,6 +76,7 @@ struct _GstCircleGeometricTransform
gdouble precalc_x_center;
gdouble precalc_y_center;
+ gdouble precalc_radius;
gdouble precalc_radius2;
};
diff --git a/gst/geometrictransform/gstkaleidoscope.c b/gst/geometrictransform/gstkaleidoscope.c
index ecc369013..384037b32 100644
--- a/gst/geometrictransform/gstkaleidoscope.c
+++ b/gst/geometrictransform/gstkaleidoscope.c
@@ -180,8 +180,8 @@ kaleidoscope_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
theta = geometric_math_triangle (theta / G_PI * kaleidoscope->sides * 0.5);
- if (cgt->radius != 0) {
- gdouble radiusc = cgt->radius / cos (theta);
+ if (cgt->precalc_radius != 0) {
+ gdouble radiusc = cgt->precalc_radius / cos (theta);
distance = radiusc * geometric_math_triangle (distance / radiusc);
}
diff --git a/gst/geometrictransform/gsttwirl.c b/gst/geometrictransform/gsttwirl.c
index 51302d413..8d31d8ee5 100644
--- a/gst/geometrictransform/gsttwirl.c
+++ b/gst/geometrictransform/gsttwirl.c
@@ -155,7 +155,8 @@ twirl_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
*in_y = y;
} else {
gdouble d = sqrt (distance);
- gdouble a = atan2 (dy, dx) + twirl->angle * (cgt->radius - d) / cgt->radius;
+ gdouble a = atan2 (dy,
+ dx) + twirl->angle * (cgt->precalc_radius - d) / cgt->precalc_radius;
*in_x = cgt->precalc_x_center + d * cos (a);
*in_y = cgt->precalc_y_center + d * sin (a);
diff --git a/gst/geometrictransform/gstwaterripple.c b/gst/geometrictransform/gstwaterripple.c
index d66d98340..7e911df7a 100644
--- a/gst/geometrictransform/gstwaterripple.c
+++ b/gst/geometrictransform/gstwaterripple.c
@@ -183,7 +183,7 @@ water_ripple_map (GstGeometricTransform * gt, gint x, gint y, gdouble * in_x,
water->amplitude * sin (d / water->wavelength * G_PI * 2 -
water->phase);
- amount *= (cgt->radius - d) / cgt->radius;
+ amount *= (cgt->precalc_radius - d) / cgt->precalc_radius;
if (d != 0)
amount *= water->wavelength / d;
*in_x = x + dx * amount;