[gimp/soc-2010-cage] gimpcageconfig: add the scaling factor computation
- From: Michael Muré <mmure src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/soc-2010-cage] gimpcageconfig: add the scaling factor computation
- Date: Sat, 24 Jul 2010 18:08:40 +0000 (UTC)
commit 0aba807deeb887af10cace51259473bdb2fa4754
Author: Michael Muré <batolettre gmail com>
Date: Sat Jul 24 11:27:47 2010 +0200
gimpcageconfig: add the scaling factor computation
app/gegl/gimpcageconfig.c | 65 +++++++++++++++++++++++++++++++++++---------
app/gegl/gimpcageconfig.h | 1 +
2 files changed, 52 insertions(+), 14 deletions(-)
---
diff --git a/app/gegl/gimpcageconfig.c b/app/gegl/gimpcageconfig.c
index 4b1262d..cb53840 100644
--- a/app/gegl/gimpcageconfig.c
+++ b/app/gegl/gimpcageconfig.c
@@ -56,6 +56,7 @@ static void gimp_cage_config_set_property (GObject *obj
guint property_id,
const GValue *value,
GParamSpec *pspec);
+static void gimp_cage_config_compute_scaling_factor (GimpCageConfig *gcc);
/* FIXME: to debug only */
static void
@@ -95,6 +96,7 @@ gimp_cage_config_init (GimpCageConfig *self)
self->cage_vertices = g_new(GimpVector2, self->cage_vertices_max);
self->cage_vertices_d = g_new(GimpVector2, self->cage_vertices_max);
+ self->scaling_factor = g_malloc (self->cage_vertices_max * sizeof(gfloat));
}
static void
@@ -104,6 +106,7 @@ gimp_cage_config_finalize (GObject *object)
g_free(gcc->cage_vertices);
g_free(gcc->cage_vertices_d);
+ g_free(gcc->scaling_factor);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -170,21 +173,27 @@ gimp_cage_config_add_cage_point (GimpCageConfig *gcc,
gcc->cage_vertices_d[gcc->cage_vertice_number].y = y;
gcc->cage_vertice_number++;
+
+ gimp_cage_config_compute_scaling_factor (gcc);
}
-void gimp_cage_config_remove_last_cage_point (GimpCageConfig *gcc)
+void
+gimp_cage_config_remove_last_cage_point (GimpCageConfig *gcc)
{
g_return_if_fail (GIMP_IS_CAGE_CONFIG (gcc));
if (gcc->cage_vertice_number >= 1)
gcc->cage_vertice_number--;
+
+ gimp_cage_config_compute_scaling_factor (gcc);
}
-gint gimp_cage_config_is_on_handle (GimpCageConfig *gcc,
- GimpCageMode mode,
- gdouble x,
- gdouble y,
- gint handle_size)
+gint
+gimp_cage_config_is_on_handle (GimpCageConfig *gcc,
+ GimpCageMode mode,
+ gdouble x,
+ gdouble y,
+ gint handle_size)
{
gint i;
gdouble vert_x, vert_y;
@@ -217,11 +226,12 @@ gint gimp_cage_config_is_on_handle (GimpCageConfig *gcc,
return -1;
}
-void gimp_cage_config_move_cage_point (GimpCageConfig *gcc,
- GimpCageMode mode,
- gint point_number,
- gdouble x,
- gdouble y)
+void
+gimp_cage_config_move_cage_point (GimpCageConfig *gcc,
+ GimpCageMode mode,
+ gint point_number,
+ gdouble x,
+ gdouble y)
{
g_return_if_fail (GIMP_IS_CAGE_CONFIG (gcc));
g_return_if_fail (point_number < gcc->cage_vertice_number);
@@ -237,10 +247,13 @@ void gimp_cage_config_move_cage_point (GimpCageConfig *gcc,
gcc->cage_vertices_d[point_number].x = x;
gcc->cage_vertices_d[point_number].y = y;
}
+
+ gimp_cage_config_compute_scaling_factor (gcc);
}
-GimpVector2 gimp_cage_config_get_edge_normal (GimpCageConfig *gcc,
- gint edge_index)
+GimpVector2
+gimp_cage_config_get_edge_normal (GimpCageConfig *gcc,
+ gint edge_index)
{
GimpVector2 result;
@@ -255,7 +268,8 @@ GimpVector2 gimp_cage_config_get_edge_normal (GimpCageConfig *gcc,
return gimp_vector2_normal (&result);
}
-GeglRectangle gimp_cage_config_get_bounding_box (GimpCageConfig *gcc)
+GeglRectangle
+gimp_cage_config_get_bounding_box (GimpCageConfig *gcc)
{
gint i;
GeglRectangle bounding_box = {0, };
@@ -319,6 +333,8 @@ gimp_cage_config_reverse_cage (GimpCageConfig *gcc)
gcc->cage_vertices_d[i] = gcc->cage_vertices_d[gcc->cage_vertice_number - i -1];
gcc->cage_vertices_d[gcc->cage_vertice_number - i -1] = temp;
}
+
+ gimp_cage_config_compute_scaling_factor (gcc);
}
void
@@ -354,3 +370,24 @@ gimp_cage_config_reverse_cage_if_needed (GimpCageConfig *gcc)
printf("reverse the cage !\n");
}
}
+
+static void
+gimp_cage_config_compute_scaling_factor (GimpCageConfig *gcc)
+{
+ gint i;
+ gdouble length, length_d;
+ GimpVector2 edge;
+
+ g_return_if_fail (GIMP_IS_CAGE_CONFIG (gcc));
+
+ for (i = 0; i < gcc->cage_vertice_number; i++)
+ {
+ gimp_vector2_sub ( &edge, &gcc->cage_vertices[i], &gcc->cage_vertices[(i+1) % gcc->cage_vertice_number]);
+ length = gimp_vector2_length (&edge);
+
+ gimp_vector2_sub ( &edge, &gcc->cage_vertices_d[i], &gcc->cage_vertices_d[(i+1) % gcc->cage_vertice_number]);
+ length_d = gimp_vector2_length (&edge);
+
+ gcc->scaling_factor[i] = length_d / length;
+ }
+}
diff --git a/app/gegl/gimpcageconfig.h b/app/gegl/gimpcageconfig.h
index 9d52952..3db18b6 100644
--- a/app/gegl/gimpcageconfig.h
+++ b/app/gegl/gimpcageconfig.h
@@ -43,6 +43,7 @@ struct _GimpCageConfig
GimpVector2 *cage_vertices; /* cage before deformation */
GimpVector2 *cage_vertices_d; /* cage after deformation */
+ gdouble *scaling_factor;
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]