[dia] [restructuring] Bezier* start sharing code



commit 1eff5f4239e164281b1d7256110ec6982d543520
Author: Hans Breuer <hans breuer org>
Date:   Tue Oct 2 19:53:13 2012 +0200

    [restructuring] Bezier* start sharing code
    
     - BezierShape and BezierConn both have BezierCOmmon now
     - new files bezier-common.[hc] to actually share code
     - standard/bez* being ported

 lib/Makefile.am              |    2 +
 lib/bezier-common.c          |  133 ++++++++++++
 lib/bezier-common.h          |   52 +++++
 lib/bezier_conn.c            |  342 ++++++++++++++-----------------
 lib/bezier_conn.h            |   17 +-
 lib/beziershape.c            |  473 ++++++++++++++++++------------------------
 lib/beziershape.h            |   14 +-
 lib/libdia.def               |    8 +-
 lib/makefile.msc             |    3 +
 objects/standard/bezier.c    |  118 ++++++-----
 objects/standard/beziergon.c |   90 ++++----
 11 files changed, 670 insertions(+), 582 deletions(-)
---
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 6761891..a13d55a 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -103,6 +103,8 @@ libdia_la_SOURCES =  \
 		poly_conn.h \
 		bezier_conn.c \
 		bezier_conn.h \
+		bezier-common.c \
+		bezier-common.h \
 		connection.h \
 		element.c \
 		element.h \
diff --git a/lib/bezier-common.c b/lib/bezier-common.c
new file mode 100644
index 0000000..367d955
--- /dev/null
+++ b/lib/bezier-common.c
@@ -0,0 +1,133 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * BezierConn  Copyright (C) 1999 James Henstridge
+ * BezierShape Copyright (C) 2000 James Henstridge
+ *
+ * Major restructuring to share more code
+ * Copyright (C) 2012 Hans Breuer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h" 
+
+#include "bezier-common.h"
+#include "diarenderer.h"
+
+/*!
+ * \brief Calculate BezCornerType just from the _BezPoint
+ *
+ * The bezier line/shape is fully described just with the array of BezPoint.
+ * For convenience and editing there also is an BezierConn::corner_types
+ */
+static void
+bezier_calc_corner_types (BezierCommon *bezier)
+{
+  int i;
+  int num = bezier->num_points;
+  const real tolerance = 0.00001; /* EPSILON */
+
+  g_return_if_fail (bezier->num_points < 2);
+
+  bezier->corner_types = g_realloc (bezier->corner_types, bezier->num_points * sizeof(BezCornerType));
+  bezier->corner_types[0] = BEZ_CORNER_CUSP;
+  bezier->corner_types[num-1] = BEZ_CORNER_CUSP;
+  
+  for (i = 0; i < num - 2; ++i) {
+    const Point *start = &bezier->points[i].p2;
+    const Point *major = &bezier->points[i].p3;
+    const Point *end   = &bezier->points[i+1].p2;
+
+    if (bezier->points[i+1].type != BEZ_CURVE_TO)
+      bezier->corner_types[i+1] = BEZ_CORNER_CUSP;
+    else if (distance_line_point (start, end, 0, major) > tolerance)
+      bezier->corner_types[i+1] = BEZ_CORNER_CUSP;
+    else if (fabs (   distance_point_point (start, major) 
+		   -  distance_point_point (end, major) > tolerance))
+      bezier->corner_types[i+1] = BEZ_CORNER_SMOOTH;
+    else
+      bezier->corner_types[i+1] = BEZ_CORNER_SYMMETRIC;
+  }
+}
+
+/** Set a bezier to use the given array of points.
+ * This function does *not* set up handles
+ * @param bezier A bezier to operate on
+ * @param num_points The number of points in the `points' array.
+ * @param points The new points that this bezier should be set to use.
+ */
+void
+beziercommon_set_points (BezierCommon *bezier, int num_points, const BezPoint *points)
+{
+  int i;
+
+  bezier->num_points = num_points;
+
+  if (bezier->points)
+    g_free(bezier->points);
+
+  bezier->points = g_malloc((bezier->num_points)*sizeof(BezPoint));
+
+  for (i=0;i<bezier->num_points;i++) {
+    bezier->points[i] = points[i];
+  }
+
+  /* adjust our corner_types to what is possible with the points */
+  bezier_calc_corner_types (bezier);
+}
+
+void
+beziercommon_copy (BezierCommon *from, BezierCommon *to)
+{
+  int i;
+
+  to->num_points = from->num_points;
+
+  to->points = g_new(BezPoint, to->num_points);
+  to->corner_types = g_new(BezCornerType, to->num_points);
+
+  for (i = 0; i < to->num_points; i++) {
+    to->points[i] = from->points[i];
+    to->corner_types[i] = from->corner_types[i];
+  }
+}
+
+/*!
+ * \brief Draw control lines of the given _BezPoint array
+ */
+void
+bezier_draw_control_lines (int          num_points,
+			   BezPoint    *points,
+			   DiaRenderer *renderer)
+{
+  Color line_colour = { 0.0, 0.0, 0.6, 1.0 };
+  Point startpoint;
+  int i;
+  
+  /* setup renderer ... */
+  DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
+  DIA_RENDERER_GET_CLASS(renderer)->set_dashlength(renderer, 1);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
+
+  startpoint = points[0].p1;
+  for (i = 1; i < num_points; i++) {
+    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &startpoint, &points[i].p1, &line_colour);
+    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &points[i].p2, &points[i].p3, &line_colour);
+    startpoint = points[i].p3;
+  }
+}
diff --git a/lib/bezier-common.h b/lib/bezier-common.h
new file mode 100644
index 0000000..7f115da
--- /dev/null
+++ b/lib/bezier-common.h
@@ -0,0 +1,52 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * BezierConn  Copyright (C) 1999 James Henstridge
+ * BezierShape Copyright (C) 2000 James Henstridge
+ *
+ * Major restructuring to share more code
+ * Copyright (C) 2012 Hans Breuer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef BEZIER_COMMON_H
+#define BEZIER_COMMON_H
+
+#include "diatypes.h"
+
+typedef enum {
+  BEZ_CORNER_SYMMETRIC,
+  BEZ_CORNER_SMOOTH,
+  BEZ_CORNER_CUSP
+} BezCornerType;
+
+
+typedef struct _BezierCommon BezierCommon;
+
+struct _BezierCommon {
+  /*! The number of point in points */
+  int            num_points;
+  /*! Array of _BezPoint to operate on */
+  BezPoint      *points;
+  /*! The corner types for manual adjustment */
+  BezCornerType *corner_types;
+};
+
+void beziercommon_set_points (BezierCommon *bezier, int num, const BezPoint *pts);
+void beziercommon_copy (BezierCommon *from, BezierCommon *to);
+
+void bezier_draw_control_lines (int num_points, BezPoint *pts, DiaRenderer *renderer);
+
+#endif
\ No newline at end of file
diff --git a/lib/bezier_conn.c b/lib/bezier_conn.c
index 0161ddf..7465663 100644
--- a/lib/bezier_conn.c
+++ b/lib/bezier_conn.c
@@ -155,44 +155,44 @@ bezierconn_move_handle (BezierConn *bezier,
   comp_nr = get_comp_nr(handle_nr);
   switch(handle->id) {
   case HANDLE_MOVE_STARTPOINT:
-    bezier->points[0].p1 = *to;
+    bezier->bezier.points[0].p1 = *to;
     /* shift adjacent point */
-    point_add(&bezier->points[1].p1, &delta);
+    point_add(&bezier->bezier.points[1].p1, &delta);
     break;
   case HANDLE_MOVE_ENDPOINT:
-    bezier->points[bezier->numpoints-1].p3 = *to;
+    bezier->bezier.points[bezier->bezier.num_points-1].p3 = *to;
     /* shift adjacent point */
-    point_add(&bezier->points[bezier->numpoints-1].p2, &delta);
+    point_add(&bezier->bezier.points[bezier->bezier.num_points-1].p2, &delta);
     break;
   case HANDLE_BEZMAJOR:
-    bezier->points[comp_nr].p3 = *to;
+    bezier->bezier.points[comp_nr].p3 = *to;
     /* shift adjacent point */
-    point_add(&bezier->points[comp_nr].p2, &delta);
-    point_add(&bezier->points[comp_nr+1].p1, &delta);
+    point_add(&bezier->bezier.points[comp_nr].p2, &delta);
+    point_add(&bezier->bezier.points[comp_nr+1].p1, &delta);
     break;
   case HANDLE_LEFTCTRL:
-    bezier->points[comp_nr].p2 = *to;
-    if (comp_nr < bezier->numpoints - 1) {
-      switch (bezier->corner_types[comp_nr]) {
+    bezier->bezier.points[comp_nr].p2 = *to;
+    if (comp_nr < bezier->bezier.num_points - 1) {
+      switch (bezier->bezier.corner_types[comp_nr]) {
       case BEZ_CORNER_SYMMETRIC:
-	pt = bezier->points[comp_nr].p3;
-	point_sub(&pt, &bezier->points[comp_nr].p2);
-	point_add(&pt, &bezier->points[comp_nr].p3);
-	bezier->points[comp_nr+1].p1 = pt;
+	pt = bezier->bezier.points[comp_nr].p3;
+	point_sub(&pt, &bezier->bezier.points[comp_nr].p2);
+	point_add(&pt, &bezier->bezier.points[comp_nr].p3);
+	bezier->bezier.points[comp_nr+1].p1 = pt;
 	break;
       case BEZ_CORNER_SMOOTH: {
 	real len;
-	pt = bezier->points[comp_nr+1].p1;
-	point_sub(&pt, &bezier->points[comp_nr].p3);
+	pt = bezier->bezier.points[comp_nr+1].p1;
+	point_sub(&pt, &bezier->bezier.points[comp_nr].p3);
 	len = point_len(&pt);
-	pt = bezier->points[comp_nr].p2;
-	point_sub(&pt, &bezier->points[comp_nr].p3);
+	pt = bezier->bezier.points[comp_nr].p2;
+	point_sub(&pt, &bezier->bezier.points[comp_nr].p3);
 	if (point_len(&pt) > 0)
 	  point_normalize(&pt);
 	else { pt.x = 1.0; pt.y = 0.0; }	  
 	point_scale(&pt, -len);
-	point_add(&pt, &bezier->points[comp_nr].p3);
-	bezier->points[comp_nr+1].p1 = pt;
+	point_add(&pt, &bezier->bezier.points[comp_nr].p3);
+	bezier->bezier.points[comp_nr+1].p1 = pt;
 	break;
       }	
       case BEZ_CORNER_CUSP:
@@ -202,28 +202,28 @@ bezierconn_move_handle (BezierConn *bezier,
     }
     break;
   case HANDLE_RIGHTCTRL:
-    bezier->points[comp_nr].p1 = *to;
+    bezier->bezier.points[comp_nr].p1 = *to;
     if (comp_nr > 1) {
-      switch (bezier->corner_types[comp_nr-1]) {
+      switch (bezier->bezier.corner_types[comp_nr-1]) {
       case BEZ_CORNER_SYMMETRIC:
-	pt = bezier->points[comp_nr - 1].p3;
-	point_sub(&pt, &bezier->points[comp_nr].p1);
-	point_add(&pt, &bezier->points[comp_nr - 1].p3);
-	bezier->points[comp_nr-1].p2 = pt;
+	pt = bezier->bezier.points[comp_nr - 1].p3;
+	point_sub(&pt, &bezier->bezier.points[comp_nr].p1);
+	point_add(&pt, &bezier->bezier.points[comp_nr - 1].p3);
+	bezier->bezier.points[comp_nr-1].p2 = pt;
 	break;
       case BEZ_CORNER_SMOOTH: {
 	real len;
-	pt = bezier->points[comp_nr-1].p2;
-	point_sub(&pt, &bezier->points[comp_nr-1].p3);
+	pt = bezier->bezier.points[comp_nr-1].p2;
+	point_sub(&pt, &bezier->bezier.points[comp_nr-1].p3);
 	len = point_len(&pt);
-	pt = bezier->points[comp_nr].p1;
-	point_sub(&pt, &bezier->points[comp_nr-1].p3);
+	pt = bezier->bezier.points[comp_nr].p1;
+	point_sub(&pt, &bezier->bezier.points[comp_nr-1].p3);
 	if (point_len(&pt) > 0)
 	  point_normalize(&pt);
 	else { pt.x = 1.0; pt.y = 0.0; }	  
 	point_scale(&pt, -len);
-	point_add(&pt, &bezier->points[comp_nr-1].p3);
-	bezier->points[comp_nr-1].p2 = pt;
+	point_add(&pt, &bezier->bezier.points[comp_nr-1].p3);
+	bezier->bezier.points[comp_nr-1].p2 = pt;
 	break;
       }	
       case BEZ_CORNER_CUSP:
@@ -254,13 +254,13 @@ bezierconn_move (BezierConn *bezier, Point *to)
   int i;
   
   p = *to;
-  point_sub(&p, &bezier->points[0].p1);
+  point_sub(&p, &bezier->bezier.points[0].p1);
 
-  bezier->points[0].p1 = *to;
-  for (i = 1; i < bezier->numpoints; i++) {
-    point_add(&bezier->points[i].p1, &p);
-    point_add(&bezier->points[i].p2, &p);
-    point_add(&bezier->points[i].p3, &p);
+  bezier->bezier.points[0].p1 = *to;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    point_add(&bezier->bezier.points[i].p1, &p);
+    point_add(&bezier->bezier.points[i].p2, &p);
+    point_add(&bezier->bezier.points[i].p3, &p);
   }
 
   return NULL;
@@ -285,16 +285,16 @@ bezierconn_closest_segment (BezierConn *bezier,
   int closest;
 
   closest = 0;
-  last = bezier->points[0].p1;
-  for (i = 0; i < bezier->numpoints - 1; i++) {
-    real new_dist = distance_bez_seg_point(&last, &bezier->points[i+1].p1,
-				&bezier->points[i+1].p2, &bezier->points[i+1].p3,
+  last = bezier->bezier.points[0].p1;
+  for (i = 0; i < bezier->bezier.num_points - 1; i++) {
+    real new_dist = distance_bez_seg_point(&last, &bezier->bezier.points[i+1].p1,
+				&bezier->bezier.points[i+1].p2, &bezier->bezier.points[i+1].p3,
 				line_width, point);
     if (new_dist < dist) {
       dist = new_dist;
       closest = i;
     }
-    last = bezier->points[i+1].p3;
+    last = bezier->bezier.points[i+1].p3;
   }
   return closest;
 }
@@ -317,24 +317,24 @@ bezierconn_closest_handle (BezierConn *bezier,
   
   closest = bezier->object.handles[0];
   dist = distance_point_point( point, &closest->pos);
-  for (i = 1, hn = 1; i < bezier->numpoints; i++, hn++) {
+  for (i = 1, hn = 1; i < bezier->bezier.num_points; i++, hn++) {
     real new_dist;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p1);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p1);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
     }
     hn++;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p2);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p2);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
     }
     hn++;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p3);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p3);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
@@ -374,7 +374,7 @@ bezierconn_closest_major_handle (BezierConn *bezier, Point *point)
 real
 bezierconn_distance_from (BezierConn *bezier, Point *point, real line_width)
 {
-  return distance_bez_line_point(bezier->points, bezier->numpoints,
+  return distance_bez_line_point(bezier->bezier.points, bezier->bezier.num_points,
 				 line_width, point);
 }
 
@@ -399,25 +399,25 @@ add_handles (BezierConn *bezier,
 
   g_assert(pos > 0);
 
-  bezier->numpoints++;
+  bezier->bezier.num_points++;
   next = pos + 1;
-  bezier->points = g_realloc(bezier->points, bezier->numpoints*sizeof(BezPoint));
-  bezier->corner_types = g_realloc(bezier->corner_types,
-				   bezier->numpoints * sizeof(BezCornerType));
+  bezier->bezier.points = g_realloc(bezier->bezier.points, bezier->bezier.num_points*sizeof(BezPoint));
+  bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types,
+				   bezier->bezier.num_points * sizeof(BezCornerType));
 
-  for (i = bezier->numpoints - 1; i > pos; i--) {
-    bezier->points[i] = bezier->points[i-1];
-    bezier->corner_types[i] = bezier->corner_types[i-1];
+  for (i = bezier->bezier.num_points - 1; i > pos; i--) {
+    bezier->bezier.points[i] = bezier->bezier.points[i-1];
+    bezier->bezier.corner_types[i] = bezier->bezier.corner_types[i-1];
   }
-  bezier->points[pos] = *point;
-  bezier->points[pos].p1 = bezier->points[next].p1;
-  bezier->points[next].p1 = point->p1;
-  bezier->corner_types[pos] = corner_type;
+  bezier->bezier.points[pos] = *point;
+  bezier->bezier.points[pos].p1 = bezier->bezier.points[next].p1;
+  bezier->bezier.points[next].p1 = point->p1;
+  bezier->bezier.corner_types[pos] = corner_type;
   object_add_handle_at(obj, handle1, 3*pos-2);
   object_add_handle_at(obj, handle2, 3*pos-1);
   object_add_handle_at(obj, handle3, 3*pos);
 
-  if (pos==bezier->numpoints-1) {
+  if (pos==bezier->bezier.num_points-1) {
     obj->handles[obj->num_handles-4]->type = HANDLE_MINOR_CONTROL;
     obj->handles[obj->num_handles-4]->id = HANDLE_BEZMAJOR;
   }
@@ -446,16 +446,16 @@ remove_handles (BezierConn *bezier, int pos)
   }
 
   /* delete the points */
-  bezier->numpoints--;
-  tmppoint = bezier->points[pos].p1;
-  for (i = pos; i < bezier->numpoints; i++) {
-    bezier->points[i] = bezier->points[i+1];
-    bezier->corner_types[i] = bezier->corner_types[i+1];
+  bezier->bezier.num_points--;
+  tmppoint = bezier->bezier.points[pos].p1;
+  for (i = pos; i < bezier->bezier.num_points; i++) {
+    bezier->bezier.points[i] = bezier->bezier.points[i+1];
+    bezier->bezier.corner_types[i] = bezier->bezier.corner_types[i+1];
   }
-  bezier->points[pos].p1 = tmppoint;
-  bezier->points = g_realloc(bezier->points, bezier->numpoints*sizeof(BezPoint));
-  bezier->corner_types = g_realloc(bezier->corner_types,
-				bezier->numpoints * sizeof(BezCornerType));
+  bezier->bezier.points[pos].p1 = tmppoint;
+  bezier->bezier.points = g_realloc(bezier->bezier.points, bezier->bezier.num_points*sizeof(BezPoint));
+  bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types,
+				bezier->bezier.num_points * sizeof(BezCornerType));
 
   old_handle1 = obj->handles[3*pos-2];
   old_handle2 = obj->handles[3*pos-1];
@@ -485,10 +485,10 @@ bezierconn_add_segment (BezierConn *bezier,
   Point other;
 
   if (segment == 0)
-    startpoint = bezier->points[0].p1;
+    startpoint = bezier->bezier.points[0].p1;
   else
-    startpoint = bezier->points[segment].p3;
-  other = bezier->points[segment+1].p3;
+    startpoint = bezier->bezier.points[segment].p3;
+  other = bezier->bezier.points[segment+1].p3;
 
   if (point == NULL) {
     realpoint.p1.x = (startpoint.x + other.x)/6;
@@ -540,17 +540,17 @@ bezierconn_remove_segment (BezierConn *bezier, int pos)
   int next = pos+1;
 
   g_assert(pos > 0);
-  g_assert(bezier->numpoints > 2);
+  g_assert(bezier->bezier.num_points > 2);
 
-  if (pos == bezier->numpoints-1) pos--;
+  if (pos == bezier->bezier.num_points-1) pos--;
 
   old_handle1 = bezier->object.handles[3*pos-2];
   old_handle2 = bezier->object.handles[3*pos-1];
   old_handle3 = bezier->object.handles[3*pos];
-  old_point = bezier->points[pos];
+  old_point = bezier->bezier.points[pos];
   /* remember the old control point of following bezpoint */
-  old_point.p1 = bezier->points[next].p1;
-  old_ctype = bezier->corner_types[pos];
+  old_point.p1 = bezier->bezier.points[next].p1;
+  old_ctype = bezier->bezier.corner_types[pos];
 
   cpt1 = old_handle1->connected_to;
   cpt2 = old_handle2->connected_to;
@@ -588,33 +588,33 @@ bezierconn_straighten_corner (BezierConn *bezier, int comp_nr)
   /* Neat thing would be to have the kind of straigthening depend on
      which handle was chosen:  Mid-handle does average, other leaves that
      handle where it is. */
-  switch (bezier->corner_types[comp_nr]) {
+  switch (bezier->bezier.corner_types[comp_nr]) {
   case BEZ_CORNER_SYMMETRIC: {
     Point pt1, pt2;
 
-    pt1 = bezier->points[comp_nr].p3;
-    point_sub(&pt1, &bezier->points[comp_nr].p2);
-    pt2 = bezier->points[comp_nr].p3;
-    point_sub(&pt2, &bezier->points[next_nr].p1);
+    pt1 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt1, &bezier->bezier.points[comp_nr].p2);
+    pt2 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt2, &bezier->bezier.points[next_nr].p1);
     point_scale(&pt2, -1.0);
     point_add(&pt1, &pt2);
     point_scale(&pt1, 0.5);
     pt2 = pt1;
     point_scale(&pt1, -1.0);
-    point_add(&pt1, &bezier->points[comp_nr].p3);
-    point_add(&pt2, &bezier->points[comp_nr].p3);
-    bezier->points[comp_nr].p2 = pt1;
-    bezier->points[next_nr].p1 = pt2;
+    point_add(&pt1, &bezier->bezier.points[comp_nr].p3);
+    point_add(&pt2, &bezier->bezier.points[comp_nr].p3);
+    bezier->bezier.points[comp_nr].p2 = pt1;
+    bezier->bezier.points[next_nr].p1 = pt2;
     bezierconn_update_data(bezier);
   }
   break;
   case BEZ_CORNER_SMOOTH: {
     Point pt1, pt2;
     real len1, len2;
-    pt1 = bezier->points[comp_nr].p3;
-    point_sub(&pt1, &bezier->points[comp_nr].p2);
-    pt2 = bezier->points[comp_nr].p3;
-    point_sub(&pt2, &bezier->points[next_nr].p1);
+    pt1 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt1, &bezier->bezier.points[comp_nr].p2);
+    pt2 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt2, &bezier->bezier.points[next_nr].p1);
     len1 = point_len(&pt1);
     len2 = point_len(&pt2);
     point_scale(&pt2, -1.0);
@@ -626,11 +626,11 @@ bezierconn_straighten_corner (BezierConn *bezier, int comp_nr)
     point_scale(&pt1, 0.5);
     pt2 = pt1;
     point_scale(&pt1, -len1);
-    point_add(&pt1, &bezier->points[comp_nr].p3);
+    point_add(&pt1, &bezier->bezier.points[comp_nr].p3);
     point_scale(&pt2, len2);
-    point_add(&pt2, &bezier->points[comp_nr].p3);
-    bezier->points[comp_nr].p2 = pt1;
-    bezier->points[next_nr].p1 = pt2;
+    point_add(&pt2, &bezier->bezier.points[comp_nr].p3);
+    bezier->bezier.points[comp_nr].p2 = pt1;
+    bezier->bezier.points[next_nr].p1 = pt2;
     bezierconn_update_data(bezier);
   }
     break;
@@ -676,11 +676,11 @@ bezierconn_set_corner_type (BezierConn *bezier,
 
   comp_nr = get_major_nr(handle_nr);
 
-  old_type = bezier->corner_types[comp_nr];
-  old_left = bezier->points[comp_nr].p2;
-  old_right = bezier->points[comp_nr+1].p1;
+  old_type = bezier->bezier.corner_types[comp_nr];
+  old_left = bezier->bezier.points[comp_nr].p2;
+  old_right = bezier->bezier.points[comp_nr+1].p1;
 
-  bezier->corner_types[comp_nr] = corner_type;
+  bezier->bezier.corner_types[comp_nr] = corner_type;
 
   bezierconn_straighten_corner(bezier, comp_nr);
 
@@ -698,7 +698,7 @@ bezierconn_update_data (BezierConn *bezier)
   DiaObject *obj = &bezier->object;
   
   /* handle the case of whole points array update (via set_prop) */
-  if (3*bezier->numpoints-2 != obj->num_handles) {
+  if (3*bezier->bezier.num_points-2 != obj->num_handles) {
     /* also maintain potential connections */
     ConnectionPoint *cps = bezier->object.handles[0]->connected_to;
     ConnectionPoint *cpe = bezier->object.handles[obj->num_handles-1]->connected_to;
@@ -715,10 +715,10 @@ bezierconn_update_data (BezierConn *bezier)
       g_free(obj->handles[i]);
     g_free(obj->handles);
 
-    obj->num_handles = 3*bezier->numpoints-2;
+    obj->num_handles = 3*bezier->bezier.num_points-2;
     obj->handles = g_new(Handle*, obj->num_handles); 
 
-    new_handles(bezier, bezier->numpoints);
+    new_handles(bezier, bezier->bezier.num_points);
     /* we may assign NULL once more here */
     if (cps)
       object_connect(&bezier->object, bezier->object.handles[0], cps);
@@ -727,11 +727,11 @@ bezierconn_update_data (BezierConn *bezier)
   }
 
   /* Update handles: */
-  bezier->object.handles[0]->pos = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
-    bezier->object.handles[3*i-2]->pos = bezier->points[i].p1;
-    bezier->object.handles[3*i-1]->pos = bezier->points[i].p2;
-    bezier->object.handles[3*i]->pos   = bezier->points[i].p3;
+  bezier->object.handles[0]->pos = bezier->bezier.points[0].p1;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    bezier->object.handles[3*i-2]->pos = bezier->bezier.points[i].p1;
+    bezier->object.handles[3*i-1]->pos = bezier->bezier.points[i].p2;
+    bezier->object.handles[3*i]->pos   = bezier->bezier.points[i].p3;
   }
 }
 
@@ -743,8 +743,8 @@ bezierconn_update_boundingbox (BezierConn *bezier)
 {
   g_assert(bezier != NULL);
 
-  polybezier_bbox(&bezier->points[0],
-                  bezier->numpoints,
+  polybezier_bbox(&bezier->bezier.points[0],
+                  bezier->bezier.num_points,
                   &bezier->extra_spacing, FALSE,
                   &bezier->object.bounding_box);
 }
@@ -769,13 +769,13 @@ bezierconn_draw_control_lines (BezierConn *bezier,
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
-  startpoint = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
-    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &startpoint, &bezier->points[i].p1,
+  startpoint = bezier->bezier.points[0].p1;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &startpoint, &bezier->bezier.points[i].p1,
                              &line_colour);
-    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &bezier->points[i].p2, &bezier->points[i].p3,
+    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &bezier->bezier.points[i].p2, &bezier->bezier.points[i].p3,
                              &line_colour);
-    startpoint = bezier->points[i].p3;
+    startpoint = bezier->bezier.points[i].p3;
   }
 }
 
@@ -830,15 +830,15 @@ bezierconn_init (BezierConn *bezier, int num_points)
 
   object_init(obj, 3*num_points-2, 0);
   
-  bezier->numpoints = num_points;
+  bezier->bezier.num_points = num_points;
 
-  bezier->points = g_new(BezPoint, num_points);
-  bezier->corner_types = g_new(BezCornerType, num_points);
-  bezier->points[0].type = BEZ_MOVE_TO;
-  bezier->corner_types[0] = BEZ_CORNER_SYMMETRIC;
+  bezier->bezier.points = g_new(BezPoint, num_points);
+  bezier->bezier.corner_types = g_new(BezCornerType, num_points);
+  bezier->bezier.points[0].type = BEZ_MOVE_TO;
+  bezier->bezier.corner_types[0] = BEZ_CORNER_SYMMETRIC;
   for (i = 1; i < num_points; i++) {
-    bezier->points[i].type = BEZ_CURVE_TO;
-    bezier->corner_types[i] = BEZ_CORNER_SYMMETRIC;
+    bezier->bezier.points[i].type = BEZ_CURVE_TO;
+    bezier->bezier.corner_types[i] = BEZ_CORNER_SYMMETRIC;
   }
 
   new_handles(bezier, num_points);
@@ -848,32 +848,6 @@ bezierconn_init (BezierConn *bezier, int num_points)
   /* bezierconn_update_data(bezier); */
 }
 
-/** Set a bezier to use the given array of points.
- * This function does *not* set up handles
- * @param bezier A bezier to operate on
- * @param num_points The number of points in the `points' array.
- * @param points The new points that this bezier should be set to use.
- */
-void
-bezierconn_set_points (BezierConn *bezier,
-		       int num_points,
-		       BezPoint *points)
-{
-  int i;
-
-  bezier->numpoints = num_points;
-
-  if (bezier->points)
-    g_free(bezier->points);
-
-  bezier->points = g_malloc((bezier->numpoints)*sizeof(BezPoint));
-
-  for (i=0;i<bezier->numpoints;i++) {
-    bezier->points[i] = points[i];
-  }
-}
-
-
 /** Copy a bezierconn objects.  This function in turn invokes object_copy.
  * @param from The object to copy from.
  * @param to The object to copy to.
@@ -889,15 +863,7 @@ bezierconn_copy (BezierConn *from, BezierConn *to)
 
   object_copy(fromobj, toobj);
 
-  to->numpoints = from->numpoints;
-
-  to->points = g_new(BezPoint, to->numpoints);
-  to->corner_types = g_new(BezCornerType, to->numpoints);
-
-  for (i = 0; i < to->numpoints; i++) {
-    to->points[i] = from->points[i];
-    to->corner_types[i] = from->corner_types[i];
-  }
+  beziercommon_copy (&from->bezier, &to->bezier);
 
   to->object.handles[0] = g_new0(Handle,1);
   *to->object.handles[0] = *from->object.handles[0];
@@ -936,8 +902,8 @@ bezierconn_destroy (BezierConn *bezier)
     g_free(temp_handles[i]);
   g_free(temp_handles);
   
-  g_free(bezier->points);
-  g_free(bezier->corner_types);
+  g_free(bezier->bezier.points);
+  g_free(bezier->bezier.corner_types);
 }
 
 
@@ -956,18 +922,18 @@ bezierconn_save (BezierConn *bezier,
 
   attr = new_attribute(obj_node, "bez_points");
 
-  data_add_point(attr, &bezier->points[0].p1);
-  for (i = 1; i < bezier->numpoints; i++) {
-    if (BEZ_MOVE_TO == bezier->points[i].type)
+  data_add_point(attr, &bezier->bezier.points[0].p1);
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    if (BEZ_MOVE_TO == bezier->bezier.points[i].type)
       g_warning("only first BezPoint can be a BEZ_MOVE_TO");
-    data_add_point(attr, &bezier->points[i].p1);
-    data_add_point(attr, &bezier->points[i].p2);
-    data_add_point(attr, &bezier->points[i].p3);
+    data_add_point(attr, &bezier->bezier.points[i].p1);
+    data_add_point(attr, &bezier->bezier.points[i].p2);
+    data_add_point(attr, &bezier->bezier.points[i].p3);
   }
 
   attr = new_attribute(obj_node, "corner_types");
-  for (i = 0; i < bezier->numpoints; i++)
-    data_add_enum(attr, bezier->corner_types[i]);
+  for (i = 0; i < bezier->bezier.num_points; i++)
+    data_add_enum(attr, bezier->bezier.corner_types[i]);
 }
 
 /** Load a bezierconn object from XML.
@@ -992,40 +958,40 @@ bezierconn_load (BezierConn *bezier,
   attr = object_find_attribute(obj_node, "bez_points");
 
   if (attr != NULL)
-    bezier->numpoints = (attribute_num_data(attr) + 2)/3;
+    bezier->bezier.num_points = (attribute_num_data(attr) + 2)/3;
   else
-    bezier->numpoints = 0;
+    bezier->bezier.num_points = 0;
 
-  object_init(obj, 3 * bezier->numpoints - 2, 0);
+  object_init(obj, 3 * bezier->bezier.num_points - 2, 0);
 
   data = attribute_first_data(attr);
-  if (bezier->numpoints != 0) {
-    bezier->points = g_new(BezPoint, bezier->numpoints);
-    bezier->points[0].type = BEZ_MOVE_TO;
-    data_point(data, &bezier->points[0].p1, ctx);
+  if (bezier->bezier.num_points != 0) {
+    bezier->bezier.points = g_new(BezPoint, bezier->bezier.num_points);
+    bezier->bezier.points[0].type = BEZ_MOVE_TO;
+    data_point(data, &bezier->bezier.points[0].p1, ctx);
     data = data_next(data);
 
-    for (i = 1; i < bezier->numpoints; i++) {
-      bezier->points[i].type = BEZ_CURVE_TO;
-      data_point(data, &bezier->points[i].p1, ctx);
+    for (i = 1; i < bezier->bezier.num_points; i++) {
+      bezier->bezier.points[i].type = BEZ_CURVE_TO;
+      data_point(data, &bezier->bezier.points[i].p1, ctx);
       data = data_next(data);
-      data_point(data, &bezier->points[i].p2, ctx);
+      data_point(data, &bezier->bezier.points[i].p2, ctx);
       data = data_next(data);
-      data_point(data, &bezier->points[i].p3, ctx);
+      data_point(data, &bezier->bezier.points[i].p3, ctx);
       data = data_next(data);
     }
   }
 
-  bezier->corner_types = g_new(BezCornerType, bezier->numpoints);
+  bezier->bezier.corner_types = g_new(BezCornerType, bezier->bezier.num_points);
   attr = object_find_attribute(obj_node, "corner_types");
   /* if corner_types is missing or corrupt */
-  if (!attr || attribute_num_data(attr) != bezier->numpoints) {
-    for (i = 0; i < bezier->numpoints; i++)
-      bezier->corner_types[i] = BEZ_CORNER_SYMMETRIC;
+  if (!attr || attribute_num_data(attr) != bezier->bezier.num_points) {
+    for (i = 0; i < bezier->bezier.num_points; i++)
+      bezier->bezier.corner_types[i] = BEZ_CORNER_SYMMETRIC;
   } else {
     data = attribute_first_data(attr);
-    for (i = 0; i < bezier->numpoints; i++) {
-      bezier->corner_types[i] = data_enum(data, ctx);
+    for (i = 0; i < bezier->bezier.num_points; i++) {
+      bezier->bezier.corner_types[i] = data_enum(data, ctx);
       data = data_next(data);
     }
   }
@@ -1036,7 +1002,7 @@ bezierconn_load (BezierConn *bezier,
   obj->handles[0]->type = HANDLE_MAJOR_CONTROL;
   obj->handles[0]->id = HANDLE_MOVE_STARTPOINT;
   
-  for (i = 1; i < bezier->numpoints; i++) {
+  for (i = 1; i < bezier->bezier.num_points; i++) {
     obj->handles[3*i-2] = g_new0(Handle,1);
     setup_handle(obj->handles[3*i-2], HANDLE_RIGHTCTRL);
     obj->handles[3*i-1] = g_new0(Handle,1);
@@ -1185,7 +1151,7 @@ bezierconn_corner_change_apply(struct CornerChange *change,
 
   bezierconn_straighten_corner(bezier, comp_nr);
 
-  bezier->corner_types[comp_nr] = change->new_type;
+  bezier->bezier.corner_types[comp_nr] = change->new_type;
 
   change->applied = 1;
 }
@@ -1203,9 +1169,9 @@ bezierconn_corner_change_revert(struct CornerChange *change,
   int handle_nr = get_handle_nr(bezier, change->handle);
   int comp_nr = get_major_nr(handle_nr);
 
-  bezier->points[comp_nr].p2 = change->point_left;
-  bezier->points[comp_nr+1].p1 = change->point_right;
-  bezier->corner_types[comp_nr] = change->old_type;  
+  bezier->bezier.points[comp_nr].p2 = change->point_left;
+  bezier->bezier.points[comp_nr+1].p1 = change->point_right;
+  bezier->bezier.corner_types[comp_nr] = change->old_type;  
 
   change->applied = 0;
 }
diff --git a/lib/bezier_conn.h b/lib/bezier_conn.h
index a089185..ed14fef 100644
--- a/lib/bezier_conn.h
+++ b/lib/bezier_conn.h
@@ -26,12 +26,7 @@
 #include "diatypes.h"
 #include "object.h"
 #include "boundingbox.h"
-
-typedef enum {
-  BEZ_CORNER_SYMMETRIC,
-  BEZ_CORNER_SMOOTH,
-  BEZ_CORNER_CUSP
-} BezCornerType;
+#include "bezier-common.h"
 
 /*!
  * \brief Helper class to implement bezier connections
@@ -44,17 +39,15 @@ typedef enum {
 struct _BezierConn {
   DiaObject object; /**< inheritance */
 
-  int numpoints; /**< >= 2 */
-  BezPoint *points; /**< point data */
-  BezCornerType *corner_types;
+  /*! Common bezier object stuff */
+  BezierCommon bezier;
+
   PolyBBExtras extra_spacing;
 };
 
 void bezierconn_update_data(BezierConn *bez);
 void bezierconn_update_boundingbox(BezierConn *bez);
-void bezierconn_draw_control_lines(BezierConn *bez, DiaRenderer *renderer);
 void bezierconn_init(BezierConn *bez, int num_points);
-void bezierconn_set_points(BezierConn *poly, int num_points, BezPoint *points);
 void bezierconn_destroy(BezierConn *bez);
 void bezierconn_copy(BezierConn *from, BezierConn *to);
 void bezierconn_save(BezierConn *bez, ObjectNode obj_node);
@@ -83,6 +76,6 @@ int bezierconn_closest_segment(BezierConn *bez, Point *point,
 #define BEZCONN_COMMON_PROPERTIES_OFFSETS \
   OBJECT_COMMON_PROPERTIES_OFFSETS, \
   { "bez_points", PROP_TYPE_BEZPOINTARRAY, \
-     offsetof(BezierConn,points), offsetof(BezierConn,numpoints)} \
+     offsetof(BezierConn,bezier.points), offsetof(BezierConn,bezier.num_points)} \
 
 #endif /* BEZIER_CONN_H */
diff --git a/lib/beziershape.c b/lib/beziershape.c
index 2b8f7e1..03dcf98 100644
--- a/lib/beziershape.c
+++ b/lib/beziershape.c
@@ -159,50 +159,50 @@ beziershape_move_handle (BezierShape *bezier,
   comp_nr = get_comp_nr(handle_nr);
   next_nr = comp_nr + 1;
   prev_nr = comp_nr - 1;
-  if (comp_nr == bezier->numpoints - 1)
+  if (comp_nr == bezier->bezier.num_points - 1)
     next_nr = 1;
   if (comp_nr == 1)
-    prev_nr = bezier->numpoints - 1;
+    prev_nr = bezier->bezier.num_points - 1;
   
   switch(handle->id) {
   case HANDLE_BEZMAJOR:
-    if (comp_nr == bezier->numpoints - 1) {
-      bezier->points[comp_nr].p3 = *to;
-      bezier->points[0].p1 = bezier->points[0].p3 = *to;
-      point_add(&bezier->points[comp_nr].p2, &delta);
-      point_add(&bezier->points[1].p1, &delta);
+    if (comp_nr == bezier->bezier.num_points - 1) {
+      bezier->bezier.points[comp_nr].p3 = *to;
+      bezier->bezier.points[0].p1 = bezier->bezier.points[0].p3 = *to;
+      point_add(&bezier->bezier.points[comp_nr].p2, &delta);
+      point_add(&bezier->bezier.points[1].p1, &delta);
     } else {
-      bezier->points[comp_nr].p3 = *to;
-      point_add(&bezier->points[comp_nr].p2, &delta);
-      point_add(&bezier->points[comp_nr+1].p1, &delta);
+      bezier->bezier.points[comp_nr].p3 = *to;
+      point_add(&bezier->bezier.points[comp_nr].p2, &delta);
+      point_add(&bezier->bezier.points[comp_nr+1].p1, &delta);
     }
     break;
   case HANDLE_LEFTCTRL:
-    bezier->points[comp_nr].p2 = *to;
-    switch (bezier->corner_types[comp_nr]) {
+    bezier->bezier.points[comp_nr].p2 = *to;
+    switch (bezier->bezier.corner_types[comp_nr]) {
     case BEZ_CORNER_SYMMETRIC:
-      pt = bezier->points[comp_nr].p3;
-      point_sub(&pt, &bezier->points[comp_nr].p2);
-      point_add(&pt, &bezier->points[comp_nr].p3);
-      bezier->points[next_nr].p1 = pt;
+      pt = bezier->bezier.points[comp_nr].p3;
+      point_sub(&pt, &bezier->bezier.points[comp_nr].p2);
+      point_add(&pt, &bezier->bezier.points[comp_nr].p3);
+      bezier->bezier.points[next_nr].p1 = pt;
       break;
     case BEZ_CORNER_SMOOTH: {
       real len;
 
-      pt = bezier->points[next_nr].p1;
-      point_sub(&pt, &bezier->points[comp_nr].p3);
+      pt = bezier->bezier.points[next_nr].p1;
+      point_sub(&pt, &bezier->bezier.points[comp_nr].p3);
       len = point_len(&pt);
 
-      pt = bezier->points[comp_nr].p3;
-      point_sub(&pt, &bezier->points[comp_nr].p2);
+      pt = bezier->bezier.points[comp_nr].p3;
+      point_sub(&pt, &bezier->bezier.points[comp_nr].p2);
       if (point_len(&pt) > 0)
 	point_normalize(&pt);
       else {
 	pt.x = 1.0; pt.y = 0.0;
       }
       point_scale(&pt, len);
-      point_add(&pt, &bezier->points[comp_nr].p3);
-      bezier->points[next_nr].p1 = pt;
+      point_add(&pt, &bezier->bezier.points[comp_nr].p3);
+      bezier->bezier.points[next_nr].p1 = pt;
       break;
     }
     case BEZ_CORNER_CUSP:
@@ -211,31 +211,31 @@ beziershape_move_handle (BezierShape *bezier,
     }
     break;
   case HANDLE_RIGHTCTRL:
-    bezier->points[comp_nr].p1 = *to;
-    switch (bezier->corner_types[prev_nr]) {
+    bezier->bezier.points[comp_nr].p1 = *to;
+    switch (bezier->bezier.corner_types[prev_nr]) {
     case BEZ_CORNER_SYMMETRIC:
-      pt = bezier->points[prev_nr].p3;
-      point_sub(&pt, &bezier->points[comp_nr].p1);
-      point_add(&pt, &bezier->points[prev_nr].p3);
-      bezier->points[prev_nr].p2 = pt;
+      pt = bezier->bezier.points[prev_nr].p3;
+      point_sub(&pt, &bezier->bezier.points[comp_nr].p1);
+      point_add(&pt, &bezier->bezier.points[prev_nr].p3);
+      bezier->bezier.points[prev_nr].p2 = pt;
       break;
     case BEZ_CORNER_SMOOTH: {
       real len;
 
-      pt = bezier->points[prev_nr].p2;
-      point_sub(&pt, &bezier->points[prev_nr].p3);
+      pt = bezier->bezier.points[prev_nr].p2;
+      point_sub(&pt, &bezier->bezier.points[prev_nr].p3);
       len = point_len(&pt);
 
-      pt = bezier->points[prev_nr].p3;
-      point_sub(&pt, &bezier->points[comp_nr].p1);
+      pt = bezier->bezier.points[prev_nr].p3;
+      point_sub(&pt, &bezier->bezier.points[comp_nr].p1);
       if (point_len(&pt) > 0)
 	point_normalize(&pt);
       else {
 	pt.x = 1.0; pt.y = 0.0;
       }
       point_scale(&pt, len);
-      point_add(&pt, &bezier->points[prev_nr].p3);
-      bezier->points[prev_nr].p2 = pt;
+      point_add(&pt, &bezier->bezier.points[prev_nr].p3);
+      bezier->bezier.points[prev_nr].p2 = pt;
       break;
     }
     case BEZ_CORNER_CUSP:
@@ -265,13 +265,13 @@ beziershape_move (BezierShape *bezier, Point *to)
   int i;
   
   p = *to;
-  point_sub(&p, &bezier->points[0].p1);
+  point_sub(&p, &bezier->bezier.points[0].p1);
 
-  bezier->points[0].p1 = bezier->points[0].p3 = *to;
-  for (i = 1; i < bezier->numpoints; i++) {
-    point_add(&bezier->points[i].p1, &p);
-    point_add(&bezier->points[i].p2, &p);
-    point_add(&bezier->points[i].p3, &p);
+  bezier->bezier.points[0].p1 = bezier->bezier.points[0].p3 = *to;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    point_add(&bezier->bezier.points[i].p1, &p);
+    point_add(&bezier->bezier.points[i].p2, &p);
+    point_add(&bezier->bezier.points[i].p3, &p);
   }
 
   return NULL;
@@ -296,17 +296,17 @@ beziershape_closest_segment (BezierShape *bezier,
   int closest;
 
   closest = 0;
-  last = bezier->points[0].p1;
+  last = bezier->bezier.points[0].p1;
   /* the first point is just move-to so there is no need to consider p2,p3 of it */
-  for (i = 1; i < bezier->numpoints; i++) {
-    real new_dist = distance_bez_seg_point(&last, &bezier->points[i].p1,
-			&bezier->points[i].p2, &bezier->points[i].p3,
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    real new_dist = distance_bez_seg_point(&last, &bezier->bezier.points[i].p1,
+			&bezier->bezier.points[i].p2, &bezier->bezier.points[i].p3,
 			line_width, point);
     if (new_dist < dist) {
       dist = new_dist;
       closest = i;
     }
-    last = bezier->points[i].p3;
+    last = bezier->bezier.points[i].p3;
   }
   return closest;
 }
@@ -327,24 +327,24 @@ beziershape_closest_handle (BezierShape *bezier,
   real dist = G_MAXDOUBLE;
   Handle *closest = NULL;
   
-  for (i = 1, hn = 0; i < bezier->numpoints; i++, hn++) {
+  for (i = 1, hn = 0; i < bezier->bezier.num_points; i++, hn++) {
     real new_dist;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p1);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p1);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
     }
     hn++;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p2);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p2);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
     }
     hn++;
 
-    new_dist = distance_point_point(point, &bezier->points[i].p3);
+    new_dist = distance_point_point(point, &bezier->bezier.points[i].p3);
     if (new_dist < dist) {
       dist = new_dist;
       closest = bezier->object.handles[hn];
@@ -360,7 +360,7 @@ beziershape_closest_major_handle (BezierShape *bezier, Point *point)
   int pos = get_major_nr(get_handle_nr(bezier, closest));
 
   if (pos == 0)
-    pos = bezier->numpoints - 1;
+    pos = bezier->bezier.num_points - 1;
   return bezier->object.handles[3*pos - 1];
 }
 
@@ -375,7 +375,7 @@ beziershape_closest_major_handle (BezierShape *bezier, Point *point)
 real
 beziershape_distance_from (BezierShape *bezier, Point *point, real line_width)
 {
-  return distance_bez_shape_point(bezier->points, bezier->numpoints,
+  return distance_bez_shape_point(bezier->bezier.points, bezier->bezier.num_points,
 				  line_width, point);
 }
 
@@ -390,26 +390,26 @@ add_handles (BezierShape *bezier,
   DiaObject *obj = &bezier->object;
 
   g_assert(pos >= 1);
-  g_assert(pos <= bezier->numpoints);
+  g_assert(pos <= bezier->bezier.num_points);
 
-  bezier->numpoints++;
+  bezier->bezier.num_points++;
   next = pos + 1;
-  bezier->points = g_realloc(bezier->points, bezier->numpoints*sizeof(BezPoint));
-  if (pos == bezier->numpoints - 1)
+  bezier->bezier.points = g_realloc(bezier->bezier.points, bezier->bezier.num_points*sizeof(BezPoint));
+  if (pos == bezier->bezier.num_points - 1)
     next = 1;
-  bezier->corner_types = g_realloc(bezier->corner_types,
-				   bezier->numpoints * sizeof(BezCornerType));
+  bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types,
+				   bezier->bezier.num_points * sizeof(BezCornerType));
 
-  for (i = bezier->numpoints - 1; i > pos; i--) {
-    bezier->points[i] = bezier->points[i-1];
-    bezier->corner_types[i] = bezier->corner_types[i-1];
+  for (i = bezier->bezier.num_points - 1; i > pos; i--) {
+    bezier->bezier.points[i] = bezier->bezier.points[i-1];
+    bezier->bezier.corner_types[i] = bezier->bezier.corner_types[i-1];
   }
-  bezier->points[pos] = *point;
-  bezier->points[pos].p1 = bezier->points[next].p1;
-  bezier->points[next].p1 = point->p1;
-  if (pos == bezier->numpoints - 1)
-    bezier->points[0].p1 = bezier->points[0].p3 = bezier->points[pos].p3;
-  bezier->corner_types[pos] = corner_type;
+  bezier->bezier.points[pos] = *point;
+  bezier->bezier.points[pos].p1 = bezier->bezier.points[next].p1;
+  bezier->bezier.points[next].p1 = point->p1;
+  if (pos == bezier->bezier.num_points - 1)
+    bezier->bezier.points[0].p1 = bezier->bezier.points[0].p3 = bezier->bezier.points[pos].p3;
+  bezier->bezier.corner_types[pos] = corner_type;
   object_add_handle_at(obj, handle1, 3*pos-3);
   object_add_handle_at(obj, handle2, 3*pos-2);
   object_add_handle_at(obj, handle3, 3*pos-1);
@@ -430,33 +430,33 @@ remove_handles (BezierShape *bezier, int pos)
   controlvector.y=0;
 
   g_assert(pos > 0);
-  g_assert(pos < bezier->numpoints);
+  g_assert(pos < bezier->bezier.num_points);
 
   obj = (DiaObject *)bezier;
 
   /* delete the points */
-  bezier->numpoints--;
-  tmppoint = bezier->points[pos].p1;
-  if (pos == bezier->numpoints) {
-    controlvector = bezier->points[pos-1].p3;
-    point_sub(&controlvector, &bezier->points[pos].p1);
+  bezier->bezier.num_points--;
+  tmppoint = bezier->bezier.points[pos].p1;
+  if (pos == bezier->bezier.num_points) {
+    controlvector = bezier->bezier.points[pos-1].p3;
+    point_sub(&controlvector, &bezier->bezier.points[pos].p1);
   }
-  for (i = pos; i < bezier->numpoints; i++) {
-    bezier->points[i] = bezier->points[i+1];
-    bezier->corner_types[i] = bezier->corner_types[i+1];
+  for (i = pos; i < bezier->bezier.num_points; i++) {
+    bezier->bezier.points[i] = bezier->bezier.points[i+1];
+    bezier->bezier.corner_types[i] = bezier->bezier.corner_types[i+1];
   }
-  bezier->points[pos].p1 = tmppoint;
-  if (pos == bezier->numpoints) {
+  bezier->bezier.points[pos].p1 = tmppoint;
+  if (pos == bezier->bezier.num_points) {
     /* If this was the last point, we also need to move points[0] and
        the control point in points[1]. */
-    bezier->points[0].p1 = bezier->points[bezier->numpoints-1].p3;
-    bezier->points[1].p1 = bezier->points[0].p1;
-    point_sub(&bezier->points[1].p1, &controlvector);
+    bezier->bezier.points[0].p1 = bezier->bezier.points[bezier->bezier.num_points-1].p3;
+    bezier->bezier.points[1].p1 = bezier->bezier.points[0].p1;
+    point_sub(&bezier->bezier.points[1].p1, &controlvector);
   }
-  bezier->points = g_realloc(bezier->points,
-			     bezier->numpoints * sizeof(BezPoint));
-  bezier->corner_types = g_realloc(bezier->corner_types,
-				bezier->numpoints * sizeof(BezCornerType));
+  bezier->bezier.points = g_realloc(bezier->bezier.points,
+			     bezier->bezier.num_points * sizeof(BezPoint));
+  bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types,
+				bezier->bezier.num_points * sizeof(BezCornerType));
 
   old_handle1 = obj->handles[3*pos-3];
   old_handle2 = obj->handles[3*pos-2];
@@ -485,10 +485,10 @@ beziershape_add_segment (BezierShape *bezier,
   Point other;
 
   if (segment != 1)
-    startpoint = bezier->points[segment-1].p3;
+    startpoint = bezier->bezier.points[segment-1].p3;
   else 
-    startpoint = bezier->points[0].p1;
-  other = bezier->points[segment].p3;
+    startpoint = bezier->bezier.points[0].p1;
+  other = bezier->bezier.points[segment].p3;
   if (point == NULL) {
     realpoint.p1.x = (startpoint.x + other.x)/6;
     realpoint.p1.y = (startpoint.y + other.y)/6;
@@ -542,19 +542,19 @@ beziershape_remove_segment (BezierShape *bezier, int pos)
   int next = pos+1;
 
   g_assert(pos > 0);
-  g_assert(bezier->numpoints > 2);
-  g_assert(pos < bezier->numpoints);
+  g_assert(bezier->bezier.num_points > 2);
+  g_assert(pos < bezier->bezier.num_points);
 
-  if (pos == bezier->numpoints - 1)
+  if (pos == bezier->bezier.num_points - 1)
     next = 1;
 
   old_handle1 = bezier->object.handles[3*pos-3];
   old_handle2 = bezier->object.handles[3*pos-2];
   old_handle3 = bezier->object.handles[3*pos-1];
-  old_point = bezier->points[pos];
+  old_point = bezier->bezier.points[pos];
   /* remember the old control point of following bezpoint */
-  old_point.p1 = bezier->points[next].p1;
-  old_ctype = bezier->corner_types[pos];
+  old_point.p1 = bezier->bezier.points[next].p1;
+  old_ctype = bezier->bezier.corner_types[pos];
 
   old_cp1 = bezier->object.connections[2*pos-2];
   old_cp2 = bezier->object.connections[2*pos-1];
@@ -588,41 +588,41 @@ beziershape_straighten_corner (BezierShape *bezier, int comp_nr)
 {
   int next_nr;
 
-  if (comp_nr == 0) comp_nr = bezier->numpoints - 1;
+  if (comp_nr == 0) comp_nr = bezier->bezier.num_points - 1;
   next_nr = comp_nr + 1;
-  if (comp_nr == bezier->numpoints - 1)
+  if (comp_nr == bezier->bezier.num_points - 1)
     next_nr = 1;
   /* Neat thing would be to have the kind of straigthening depend on
      which handle was chosen:  Mid-handle does average, other leaves that
      handle where it is. */
-  bezier->points[0].p3 = bezier->points[0].p1;
-  switch (bezier->corner_types[comp_nr]) {
+  bezier->bezier.points[0].p3 = bezier->bezier.points[0].p1;
+  switch (bezier->bezier.corner_types[comp_nr]) {
   case BEZ_CORNER_SYMMETRIC: {
     Point pt1, pt2;
 
-    pt1 = bezier->points[comp_nr].p3;
-    point_sub(&pt1, &bezier->points[comp_nr].p2);
-    pt2 = bezier->points[comp_nr].p3;
-    point_sub(&pt2, &bezier->points[next_nr].p1);
+    pt1 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt1, &bezier->bezier.points[comp_nr].p2);
+    pt2 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt2, &bezier->bezier.points[next_nr].p1);
     point_scale(&pt2, -1.0);
     point_add(&pt1, &pt2);
     point_scale(&pt1, 0.5);
     pt2 = pt1;
     point_scale(&pt1, -1.0);
-    point_add(&pt1, &bezier->points[comp_nr].p3);
-    point_add(&pt2, &bezier->points[comp_nr].p3);
-    bezier->points[comp_nr].p2 = pt1;
-    bezier->points[next_nr].p1 = pt2;
+    point_add(&pt1, &bezier->bezier.points[comp_nr].p3);
+    point_add(&pt2, &bezier->bezier.points[comp_nr].p3);
+    bezier->bezier.points[comp_nr].p2 = pt1;
+    bezier->bezier.points[next_nr].p1 = pt2;
     beziershape_update_data(bezier);
   }
   break;
   case BEZ_CORNER_SMOOTH: {
     Point pt1, pt2;
     real len1, len2;
-    pt1 = bezier->points[comp_nr].p3;
-    point_sub(&pt1, &bezier->points[comp_nr].p2);
-    pt2 = bezier->points[comp_nr].p3;
-    point_sub(&pt2, &bezier->points[next_nr].p1);
+    pt1 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt1, &bezier->bezier.points[comp_nr].p2);
+    pt2 = bezier->bezier.points[comp_nr].p3;
+    point_sub(&pt2, &bezier->bezier.points[next_nr].p1);
     len1 = point_len(&pt1);
     len2 = point_len(&pt2);
     point_scale(&pt2, -1.0);
@@ -634,18 +634,18 @@ beziershape_straighten_corner (BezierShape *bezier, int comp_nr)
     point_scale(&pt1, 0.5);
     pt2 = pt1;
     point_scale(&pt1, -len1);
-    point_add(&pt1, &bezier->points[comp_nr].p3);
+    point_add(&pt1, &bezier->bezier.points[comp_nr].p3);
     point_scale(&pt2, len2);
-    point_add(&pt2, &bezier->points[comp_nr].p3);
-    bezier->points[comp_nr].p2 = pt1;
-    bezier->points[next_nr].p1 = pt2;
+    point_add(&pt2, &bezier->bezier.points[comp_nr].p3);
+    bezier->bezier.points[comp_nr].p2 = pt1;
+    bezier->bezier.points[next_nr].p1 = pt2;
     beziershape_update_data(bezier);
   }
     break;
   case BEZ_CORNER_CUSP:
     break;
   }
-  bezier->points[0].p1 = bezier->points[0].p3;
+  bezier->bezier.points[0].p1 = bezier->bezier.points[0].p3;
 }
 
 ObjectChange *
@@ -681,23 +681,23 @@ beziershape_set_corner_type (BezierShape *bezier,
 
   comp_nr = get_major_nr(handle_nr);
 
-  old_type = bezier->corner_types[comp_nr];
-  old_left = bezier->points[comp_nr].p2;
-  if (comp_nr == bezier->numpoints - 1)
-    old_right = bezier->points[1].p1;
+  old_type = bezier->bezier.corner_types[comp_nr];
+  old_left = bezier->bezier.points[comp_nr].p2;
+  if (comp_nr == bezier->bezier.num_points - 1)
+    old_right = bezier->bezier.points[1].p1;
   else
-    old_right = bezier->points[comp_nr+1].p1;
+    old_right = bezier->bezier.points[comp_nr+1].p1;
 
 #if 0
   g_message("Setting corner type on segment %d to %s", comp_nr,
 	    corner_type == BEZ_CORNER_SYMMETRIC ? "symmetric" :
 	    corner_type == BEZ_CORNER_SMOOTH ? "smooth" : "cusp");
 #endif
-  bezier->corner_types[comp_nr] = corner_type;
+  bezier->bezier.corner_types[comp_nr] = corner_type;
   if (comp_nr == 0)
-    bezier->corner_types[bezier->numpoints-1] = corner_type;
-  else if (comp_nr == bezier->numpoints - 1)
-    bezier->corner_types[0] = corner_type;
+    bezier->bezier.corner_types[bezier->bezier.num_points-1] = corner_type;
+  else if (comp_nr == bezier->bezier.num_points - 1)
+    bezier->bezier.corner_types[0] = corner_type;
 
   beziershape_straighten_corner(bezier, comp_nr);
 
@@ -715,8 +715,8 @@ beziershape_update_data (BezierShape *bezier)
   DiaObject *obj = &bezier->object;
   
   /* handle the case of whole points array update (via set_prop) */
-  if (3*(bezier->numpoints-1) != obj->num_handles ||
-      2*(bezier->numpoints-1) + 1 != obj->num_connections) {
+  if (3*(bezier->bezier.num_points-1) != obj->num_handles ||
+      2*(bezier->bezier.num_points-1) + 1 != obj->num_connections) {
     object_unconnect_all(obj); /* too drastic ? */
 
     /* delete the old ones */
@@ -727,57 +727,57 @@ beziershape_update_data (BezierShape *bezier)
       g_free(obj->connections[i]);
     g_free(obj->connections);
 
-    obj->num_handles = 3*(bezier->numpoints-1);
+    obj->num_handles = 3*(bezier->bezier.num_points-1);
     obj->handles = g_new(Handle*, obj->num_handles);
-    obj->num_connections = 2*(bezier->numpoints-1) + 1;
+    obj->num_connections = 2*(bezier->bezier.num_points-1) + 1;
     obj->connections = g_new(ConnectionPoint *, obj->num_connections);
 
-    new_handles_and_connections(bezier, bezier->numpoints);
+    new_handles_and_connections(bezier, bezier->bezier.num_points);
 
-    bezier->corner_types = g_realloc(bezier->corner_types, bezier->numpoints*sizeof(BezCornerType));
-    for (i = 0; i < bezier->numpoints; i++)
-      bezier->corner_types[i] = BEZ_CORNER_SYMMETRIC;
+    bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types, bezier->bezier.num_points*sizeof(BezCornerType));
+    for (i = 0; i < bezier->bezier.num_points; i++)
+      bezier->bezier.corner_types[i] = BEZ_CORNER_SYMMETRIC;
   }
 
   /* Update handles: */
-  bezier->points[0].p3 = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
-    obj->handles[3*i-3]->pos = bezier->points[i].p1;
-    obj->handles[3*i-2]->pos = bezier->points[i].p2;
-    obj->handles[3*i-1]->pos = bezier->points[i].p3;
+  bezier->bezier.points[0].p3 = bezier->bezier.points[0].p1;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    obj->handles[3*i-3]->pos = bezier->bezier.points[i].p1;
+    obj->handles[3*i-2]->pos = bezier->bezier.points[i].p2;
+    obj->handles[3*i-1]->pos = bezier->bezier.points[i].p3;
   }
 
   /* Update connection points: */
-  last = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
+  last = bezier->bezier.points[0].p1;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
     Point slopepoint1, slopepoint2;
-    slopepoint1 = bezier->points[i].p1;
+    slopepoint1 = bezier->bezier.points[i].p1;
     point_sub(&slopepoint1, &last);
     point_scale(&slopepoint1, .5);
     point_add(&slopepoint1, &last);
-    slopepoint2 = bezier->points[i].p2;
-    point_sub(&slopepoint2, &bezier->points[i].p3);
+    slopepoint2 = bezier->bezier.points[i].p2;
+    point_sub(&slopepoint2, &bezier->bezier.points[i].p3);
     point_scale(&slopepoint2, .5);
-    point_add(&slopepoint2, &bezier->points[i].p3);
+    point_add(&slopepoint2, &bezier->bezier.points[i].p3);
 
     obj->connections[2*i-2]->pos = last;
     obj->connections[2*i-2]->directions =
-      find_slope_directions(last, bezier->points[i].p1);
+      find_slope_directions(last, bezier->bezier.points[i].p1);
     obj->connections[2*i-1]->pos.x =
-      (last.x + 3*bezier->points[i].p1.x + 3*bezier->points[i].p2.x +
-       bezier->points[i].p3.x)/8;
+      (last.x + 3*bezier->bezier.points[i].p1.x + 3*bezier->bezier.points[i].p2.x +
+       bezier->bezier.points[i].p3.x)/8;
     obj->connections[2*i-1]->pos.y =
-      (last.y + 3*bezier->points[i].p1.y + 3*bezier->points[i].p2.y +
-       bezier->points[i].p3.y)/8;
+      (last.y + 3*bezier->bezier.points[i].p1.y + 3*bezier->bezier.points[i].p2.y +
+       bezier->bezier.points[i].p3.y)/8;
     obj->connections[2*i-1]->directions = 
       find_slope_directions(slopepoint1, slopepoint2);
-    last = bezier->points[i].p3;
+    last = bezier->bezier.points[i].p3;
   }
   
   /* Find the middle of the object (or some approximation at least) */
-  minp = maxp = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
-    Point p = bezier->points[i].p3;
+  minp = maxp = bezier->bezier.points[0].p1;
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    Point p = bezier->bezier.points[i].p3;
     if (p.x < minp.x) minp.x = p.x;
     if (p.x > maxp.x) maxp.x = p.x;
     if (p.y < minp.y) minp.y = p.y;
@@ -801,37 +801,12 @@ beziershape_update_boundingbox (BezierShape *bezier)
     pextra.start_long = pextra.end_long = 0;
   pextra.middle_trans = extra->border_trans;
 
-  polybezier_bbox(&bezier->points[0],
-                  bezier->numpoints,
+  polybezier_bbox(&bezier->bezier.points[0],
+                  bezier->bezier.num_points,
                   &pextra, TRUE,
                   &bezier->object.bounding_box);
 }
 
-void
-beziershape_draw_control_lines (BezierShape *bezier,
-				DiaRenderer *renderer)
-{
-  Color line_colour = { 0.0, 0.0, 0.6, 1.0 };
-  Point startpoint;
-  int i;
-  
-  /* setup renderer ... */
-  DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
-  DIA_RENDERER_GET_CLASS(renderer)->set_dashlength(renderer, 1);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
-
-  startpoint = bezier->points[0].p1;
-  for (i = 1; i < bezier->numpoints; i++) {
-    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &startpoint, &bezier->points[i].p1,
-                             &line_colour);
-    DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &bezier->points[i].p2, &bezier->points[i].p3,
-                             &line_colour);
-    startpoint = bezier->points[i].p3;
-  }
-}
-
 static void
 new_handles_and_connections (BezierShape *bezier, int num_points)
 {
@@ -891,15 +866,15 @@ beziershape_init (BezierShape *bezier, int num_points)
 
   object_init(obj, 3*(num_points-1), 2*(num_points-1) + 1);
   
-  bezier->numpoints = num_points;
+  bezier->bezier.num_points = num_points;
 
-  bezier->points = g_new(BezPoint, num_points);
-  bezier->corner_types = g_new(BezCornerType, num_points);
-  bezier->points[0].type = BEZ_MOVE_TO;
-  bezier->corner_types[0] = BEZ_CORNER_SYMMETRIC;
+  bezier->bezier.points = g_new(BezPoint, num_points);
+  bezier->bezier.corner_types = g_new(BezCornerType, num_points);
+  bezier->bezier.points[0].type = BEZ_MOVE_TO;
+  bezier->bezier.corner_types[0] = BEZ_CORNER_SYMMETRIC;
   for (i = 1; i < num_points; i++) {
-    bezier->points[i].type = BEZ_CURVE_TO;
-    bezier->corner_types[i] = BEZ_CORNER_SYMMETRIC;
+    bezier->bezier.points[i].type = BEZ_CURVE_TO;
+    bezier->bezier.corner_types[i] = BEZ_CORNER_SYMMETRIC;
   }
 
   new_handles_and_connections(bezier, num_points);
@@ -909,32 +884,6 @@ beziershape_init (BezierShape *bezier, int num_points)
   /*  beziershape_update_data(bezier);*/
 }
 
-/** Set a bezier to use the given array of points.
- * This function does *not* set up handles
- * @param bezier A bezier to operate on
- * @param num_points The number of points in the `points' array.
- * @param points The new points that this bezier should be set to use.
- */
-void
-beziershape_set_points (BezierShape *bezier,
-			int num_points,
-			BezPoint *points)
-{
-  int i;
-
-  bezier->numpoints = num_points;
-
-  if (bezier->points)
-    g_free(bezier->points);
-
-  bezier->points = g_malloc((bezier->numpoints)*sizeof(BezPoint));
-
-  for (i=0;i<bezier->numpoints;i++) {
-    bezier->points[i] = points[i];
-  }
-}
-
-
 /** Copy a beziershape objects.  This function in turn invokes object_copy.
  * @param from The object to copy from.
  * @param to The object to copy to.
@@ -950,15 +899,7 @@ beziershape_copy (BezierShape *from, BezierShape *to)
 
   object_copy(fromobj, toobj);
 
-  to->numpoints = from->numpoints;
-
-  to->points = g_new(BezPoint, to->numpoints);
-  to->corner_types = g_new(BezCornerType, to->numpoints);
-
-  for (i = 0; i < to->numpoints; i++) {
-    to->points[i] = from->points[i];
-    to->corner_types[i] = from->corner_types[i];
-  }
+  beziercommon_copy (&from->bezier, &to->bezier);
 
   for (i = 0; i < toobj->num_handles; i++) {
     toobj->handles[i] = g_new0(Handle,1);
@@ -1002,8 +943,8 @@ beziershape_destroy (BezierShape *bezier)
     g_free(temp_cps[i]);
   g_free(temp_cps);
   
-  g_free(bezier->points);
-  g_free(bezier->corner_types);
+  g_free(bezier->bezier.points);
+  g_free(bezier->bezier.corner_types);
 }
 
 
@@ -1022,19 +963,19 @@ beziershape_save (BezierShape *bezier,
 
   attr = new_attribute(obj_node, "bez_points");
 
-  data_add_point(attr, &bezier->points[0].p1);
-  for (i = 1; i < bezier->numpoints; i++) {
-    if (BEZ_MOVE_TO == bezier->points[i].type)
+  data_add_point(attr, &bezier->bezier.points[0].p1);
+  for (i = 1; i < bezier->bezier.num_points; i++) {
+    if (BEZ_MOVE_TO == bezier->bezier.points[i].type)
       g_warning("only first BezPoint can be a BEZ_MOVE_TO");
-    data_add_point(attr, &bezier->points[i].p1);
-    data_add_point(attr, &bezier->points[i].p2);
-    if (i < bezier->numpoints - 1)
-      data_add_point(attr, &bezier->points[i].p3);
+    data_add_point(attr, &bezier->bezier.points[i].p1);
+    data_add_point(attr, &bezier->bezier.points[i].p2);
+    if (i < bezier->bezier.num_points - 1)
+      data_add_point(attr, &bezier->bezier.points[i].p3);
   }
 
   attr = new_attribute(obj_node, "corner_types");
-  for (i = 0; i < bezier->numpoints; i++)
-    data_add_enum(attr, bezier->corner_types[i]);
+  for (i = 0; i < bezier->bezier.num_points; i++)
+    data_add_enum(attr, bezier->bezier.corner_types[i]);
 }
 
 /** Load a beziershape object from XML.
@@ -1059,50 +1000,50 @@ beziershape_load (BezierShape *bezier,
   attr = object_find_attribute(obj_node, "bez_points");
 
   if (attr != NULL)
-    bezier->numpoints = attribute_num_data(attr) / 3 + 1;
+    bezier->bezier.num_points = attribute_num_data(attr) / 3 + 1;
   else
-    bezier->numpoints = 0;
+    bezier->bezier.num_points = 0;
 
-  object_init(obj, 3 * (bezier->numpoints - 1),
-	      2 * (bezier->numpoints - 1) + 1);
+  object_init(obj, 3 * (bezier->bezier.num_points - 1),
+	      2 * (bezier->bezier.num_points - 1) + 1);
 
   data = attribute_first_data(attr);
-  if (bezier->numpoints != 0) {
-    bezier->points = g_new(BezPoint, bezier->numpoints);
-    bezier->points[0].type = BEZ_MOVE_TO;
-    data_point(data, &bezier->points[0].p1, ctx);
-    bezier->points[0].p3 = bezier->points[0].p1;
+  if (bezier->bezier.num_points != 0) {
+    bezier->bezier.points = g_new(BezPoint, bezier->bezier.num_points);
+    bezier->bezier.points[0].type = BEZ_MOVE_TO;
+    data_point(data, &bezier->bezier.points[0].p1, ctx);
+    bezier->bezier.points[0].p3 = bezier->bezier.points[0].p1;
     data = data_next(data);
 
-    for (i = 1; i < bezier->numpoints; i++) {
-      bezier->points[i].type = BEZ_CURVE_TO;
-      data_point(data, &bezier->points[i].p1, ctx);
+    for (i = 1; i < bezier->bezier.num_points; i++) {
+      bezier->bezier.points[i].type = BEZ_CURVE_TO;
+      data_point(data, &bezier->bezier.points[i].p1, ctx);
       data = data_next(data);
-      data_point(data, &bezier->points[i].p2, ctx);
+      data_point(data, &bezier->bezier.points[i].p2, ctx);
       data = data_next(data);
-      if (i < bezier->numpoints - 1) {
-	data_point(data, &bezier->points[i].p3, ctx);
+      if (i < bezier->bezier.num_points - 1) {
+	data_point(data, &bezier->bezier.points[i].p3, ctx);
 	data = data_next(data);
       } else
-	bezier->points[i].p3 = bezier->points[0].p1;
+	bezier->bezier.points[i].p3 = bezier->bezier.points[0].p1;
     }
   }
 
-  bezier->corner_types = g_new(BezCornerType, bezier->numpoints);
+  bezier->bezier.corner_types = g_new(BezCornerType, bezier->bezier.num_points);
   attr = object_find_attribute(obj_node, "corner_types");
   /* if corner_types is missing or corrupt */
-  if (!attr || attribute_num_data(attr) != bezier->numpoints) {
-    for (i = 0; i < bezier->numpoints; i++)
-      bezier->corner_types[i] = BEZ_CORNER_SYMMETRIC;
+  if (!attr || attribute_num_data(attr) != bezier->bezier.num_points) {
+    for (i = 0; i < bezier->bezier.num_points; i++)
+      bezier->bezier.corner_types[i] = BEZ_CORNER_SYMMETRIC;
   } else {
     data = attribute_first_data(attr);
-    for (i = 0; i < bezier->numpoints; i++) {
-      bezier->corner_types[i] = data_enum(data, ctx);
+    for (i = 0; i < bezier->bezier.num_points; i++) {
+      bezier->bezier.corner_types[i] = data_enum(data, ctx);
       data = data_next(data);
     }
   }
 
-  for (i = 0; i < bezier->numpoints - 1; i++) {
+  for (i = 0; i < bezier->bezier.num_points - 1; i++) {
     obj->handles[3*i] = g_new0(Handle,1);
     obj->handles[3*i+1] = g_new0(Handle,1);
     obj->handles[3*i+2]   = g_new0(Handle,1);
@@ -1240,11 +1181,11 @@ beziershape_corner_change_apply (struct CornerChange *change,
 
   beziershape_straighten_corner(bezier, comp_nr);
 
-  bezier->corner_types[comp_nr] = change->new_type;
+  bezier->bezier.corner_types[comp_nr] = change->new_type;
   if (comp_nr == 0)
-    bezier->corner_types[bezier->numpoints-1] = change->new_type;
-  if (comp_nr == bezier->numpoints - 1)
-    bezier->corner_types[0] = change->new_type;
+    bezier->bezier.corner_types[bezier->bezier.num_points-1] = change->new_type;
+  if (comp_nr == bezier->bezier.num_points - 1)
+    bezier->bezier.corner_types[0] = change->new_type;
 
   change->applied = 1;
 }
@@ -1262,16 +1203,16 @@ beziershape_corner_change_revert (struct CornerChange *change,
   int handle_nr = get_handle_nr(bezier, change->handle);
   int comp_nr = get_major_nr(handle_nr);
 
-  bezier->points[comp_nr].p2 = change->point_left;
-  if (comp_nr == bezier->numpoints - 1)
-    bezier->points[1].p1 = change->point_right;
+  bezier->bezier.points[comp_nr].p2 = change->point_left;
+  if (comp_nr == bezier->bezier.num_points - 1)
+    bezier->bezier.points[1].p1 = change->point_right;
   else
-    bezier->points[comp_nr+1].p1 = change->point_right;
-  bezier->corner_types[comp_nr] = change->old_type;  
+    bezier->bezier.points[comp_nr+1].p1 = change->point_right;
+  bezier->bezier.corner_types[comp_nr] = change->old_type;  
   if (comp_nr == 0)
-    bezier->corner_types[bezier->numpoints-1] = change->new_type;
-  if (comp_nr == bezier->numpoints - 1)
-    bezier->corner_types[0] = change->new_type;
+    bezier->bezier.corner_types[bezier->bezier.num_points-1] = change->new_type;
+  if (comp_nr == bezier->bezier.num_points - 1)
+    bezier->bezier.corner_types[0] = change->new_type;
 
   change->applied = 0;
 }
diff --git a/lib/beziershape.h b/lib/beziershape.h
index 6e96cec..e7ba98b 100644
--- a/lib/beziershape.h
+++ b/lib/beziershape.h
@@ -26,8 +26,8 @@
 
 #include "diatypes.h"
 #include "object.h"
-/* for BezCornerType */
-#include "bezier_conn.h"
+#include "boundingbox.h"
+#include "bezier-common.h"
 
 #define HANDLE_CORNER (HANDLE_CUSTOM1)
 
@@ -43,17 +43,14 @@ struct _BezierShape {
   /*! \protected DiaObject must be first because this is a 'subclass' of it. */
   DiaObject object;
   /*! \protected Number of points in points array */
-  int numpoints; /* >= 2 */
-  /*! \protected Array of points describing the object */
-  BezPoint *points;
-  BezCornerType *corner_types;
+  BezierCommon bezier;
+  /*! \protexted Extra info (like line-width) to help bounding boc calculation */
   ElementBBExtras extra_spacing;
 };
 
 void beziershape_update_data(BezierShape *bezier);
 void beziershape_update_boundingbox(BezierShape *bezier);
 void beziershape_init(BezierShape *bezier, int num_points);
-void beziershape_set_points(BezierShape *bezier, int num_points, BezPoint *points);
 void beziershape_destroy(BezierShape *bezier);
 void beziershape_copy(BezierShape *from, BezierShape *to);
 void beziershape_save(BezierShape *bezier, ObjectNode obj_node);
@@ -75,7 +72,6 @@ Handle *beziershape_closest_handle(BezierShape *bezier, Point *point);
 Handle *beziershape_closest_major_handle(BezierShape *bezier, Point *point);
 int beziershape_closest_segment(BezierShape *bezier, Point *point,
 				real line_width);
-void beziershape_draw_control_lines(BezierShape *bez, DiaRenderer *renderer);
 
 #define BEZSHAPE_COMMON_PROPERTIES \
   OBJECT_COMMON_PROPERTIES, \
@@ -84,6 +80,6 @@ void beziershape_draw_control_lines(BezierShape *bez, DiaRenderer *renderer);
 #define BEZSHAPE_COMMON_PROPERTIES_OFFSETS \
   OBJECT_COMMON_PROPERTIES_OFFSETS, \
   { "bez_points", PROP_TYPE_BEZPOINTARRAY, \
-     offsetof(BezierShape,points), offsetof(BezierShape,numpoints)} \
+     offsetof(BezierShape,bezier.points), offsetof(BezierShape,bezier.num_points)} \
 
 #endif /* BEZIER_SHAPE_H */
diff --git a/lib/libdia.def b/lib/libdia.def
index 62aaa92..d2d0b4b 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -37,6 +37,9 @@ EXPORTS
  attributes_swap_fgbg
  new_attribute
 
+ bezier_draw_control_lines
+ beziercommon_set_points
+
  bezierconn_add_segment
  bezierconn_closest_handle
  bezierconn_closest_major_handle
@@ -44,7 +47,6 @@ EXPORTS
  bezierconn_copy
  bezierconn_destroy
  bezierconn_distance_from
- bezierconn_draw_control_lines
  bezierconn_init
  bezierconn_load
  bezierconn_move
@@ -52,7 +54,6 @@ EXPORTS
  bezierconn_remove_segment
  bezierconn_save
  bezierconn_set_corner_type
- bezierconn_set_points
  bezierconn_update_boundingbox
  bezierconn_update_data
 
@@ -63,7 +64,6 @@ EXPORTS
  beziershape_copy
  beziershape_destroy
  beziershape_distance_from
- beziershape_draw_control_lines
  beziershape_init
  beziershape_load
  beziershape_move
@@ -71,7 +71,6 @@ EXPORTS
  beziershape_remove_segment
  beziershape_save
  beziershape_set_corner_type
- beziershape_set_points
  beziershape_update_boundingbox
  beziershape_update_data
 
@@ -710,6 +709,7 @@ EXPORTS
  text_get_max_width
  text_get_string_copy
  text_grab_focus
+ text_is_empty
  text_set_alignment
  text_set_attributes
  text_set_color
diff --git a/lib/makefile.msc b/lib/makefile.msc
index f1ceb66..6ee23fc 100644
--- a/lib/makefile.msc
+++ b/lib/makefile.msc
@@ -21,6 +21,7 @@ DEFINES = \
 # in GTK_CFLAGS: $(GLIB_CFLAGS) 
 
 PKG_LINK = $(GTK2_LIBS)  $(PANGOWIN32_LIBS) $(GLIB_LIBS) \
+	$(PANGOCAIRO_LIBS) \
 !IFDEF USEFT2
 	$(PANGOFT2_LIBS) \
 !ENDIF
@@ -33,6 +34,7 @@ ICON_PNG_PAIRS = \
 	dia_broken_chain_icon pixmaps\broken-chain.png \
 	dia_unbroken_chain_icon pixmaps\unbroken-chain.png
 
+
 # Note that this doesn't seem to get run automatically.  It should, but
 # I'm not gonna chase goblins right now.
 dia-lib-icons.h:
@@ -43,6 +45,7 @@ OBJECTS = \
 	autoroute.obj \
 	arrows.obj \
 	attributes.obj \
+	bezier-common.obj \
 	bezier_conn.obj \
 	beziershape.obj \
 	boundingbox.obj \
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index 19e4d87..bb7711d 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -196,7 +196,7 @@ bezierline_distance_from(Bezierline *bezierline, Point *point)
 {
   BezierConn *bez = &bezierline->bez;
   if (connpoint_is_autogap(bez->object.handles[0]->connected_to) ||
-      connpoint_is_autogap(bez->object.handles[3*(bez->numpoints-1)]->connected_to) ||
+      connpoint_is_autogap(bez->object.handles[3*(bez->bezier.num_points-1)]->connected_to) ||
       bezierline->absolute_start_gap || bezierline->absolute_end_gap) {
     Point gap_points[4];
     real distance;
@@ -234,7 +234,7 @@ bezierline_move_handle(Bezierline *bezierline, Handle *handle,
   if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) {
     /* During creation, change the control points */
     BezierConn *bez = &bezierline->bez;
-    Point dist = bez->points[0].p1;
+    Point dist = bez->bezier.points[0].p1;
 
     point_sub(&dist, to);
     dist.y = 0;
@@ -242,10 +242,10 @@ bezierline_move_handle(Bezierline *bezierline, Handle *handle,
 
     bezierconn_move_handle(bez, handle, to, cp, reason, modifiers);
     
-    bez->points[1].p1 = bez->points[0].p1;
-    point_sub(&bez->points[1].p1, &dist);
-    bez->points[1].p2 = *to;
-    point_add(&bez->points[1].p2, &dist);
+    bez->bezier.points[1].p1 = bez->bezier.points[0].p1;
+    point_sub(&bez->bezier.points[1].p1, &dist);
+    bez->bezier.points[1].p2 = *to;
+    point_add(&bez->bezier.points[1].p2, &dist);
   } else {
     bezierconn_move_handle(&bezierline->bez, handle, to, cp, reason, modifiers);
   }
@@ -265,17 +265,18 @@ bezierline_move(Bezierline *bezierline, Point *to)
   return NULL;
 }
 
-static void exchange_bez_gap_points(BezierConn * bez, Point* gap_points)
+static void
+exchange_bez_gap_points(BezierConn * bez, Point* gap_points)
 {
         Point tmp_points[4];
-        tmp_points[0] = bez->points[0].p1;
-        tmp_points[1] = bez->points[1].p1;
-        tmp_points[2] = bez->points[bez->numpoints-1].p2;
-        tmp_points[3] = bez->points[bez->numpoints-1].p3;
-        bez->points[0].p1 = gap_points[0];
-        bez->points[1].p1 = gap_points[1];
-        bez->points[bez->numpoints-1].p2 = gap_points[2];
-        bez->points[bez->numpoints-1].p3 = gap_points[3];
+        tmp_points[0] = bez->bezier.points[0].p1;
+        tmp_points[1] = bez->bezier.points[1].p1;
+        tmp_points[2] = bez->bezier.points[bez->bezier.num_points-1].p2;
+        tmp_points[3] = bez->bezier.points[bez->bezier.num_points-1].p3;
+        bez->bezier.points[0].p1 = gap_points[0];
+        bez->bezier.points[1].p1 = gap_points[1];
+        bez->bezier.points[bez->bezier.num_points-1].p2 = gap_points[2];
+        bez->bezier.points[bez->bezier.num_points-1].p3 = gap_points[3];
         gap_points[0] = tmp_points[0];
         gap_points[1] = tmp_points[1];
         gap_points[2] = tmp_points[2];
@@ -288,10 +289,10 @@ static real approx_bez_length(BezierConn *bez)
         Point *current, *last, vec;
         real length = .0;
         int i;
-        current = &bez->points[0].p1;
-        for (i=1; i < bez->numpoints ; i++){
+        current = &bez->bezier.points[0].p1;
+        for (i=1; i < bez->bezier.num_points ; i++){
             last = current;
-            current = &bez->points[i].p3;
+            current = &bez->bezier.points[i].p3;
             point_copy(&vec,last);
             point_sub(&vec,current);
             length += point_len(&vec);
@@ -307,10 +308,10 @@ compute_gap_points(Bezierline *bezierline, Point *gap_points)
         Point vec_start, vec_end;
 
 
-        gap_points[0] = bez->points[0].p1;
-        gap_points[1] = bez->points[1].p1;
-        gap_points[2] = bez->points[bez->numpoints-1].p2;
-        gap_points[3] = bez->points[bez->numpoints-1].p3;
+        gap_points[0] = bez->bezier.points[0].p1;
+        gap_points[1] = bez->bezier.points[1].p1;
+        gap_points[2] = bez->bezier.points[bez->bezier.num_points-1].p2;
+        gap_points[3] = bez->bezier.points[bez->bezier.num_points-1].p3;
         
         point_copy(&vec_start, &gap_points[1]);
         point_sub(&vec_start, &gap_points[0]);
@@ -336,14 +337,14 @@ compute_gap_points(Bezierline *bezierline, Point *gap_points)
             point_add(&gap_points[1], &end);
         }
 
-        if (connpoint_is_autogap(bez->object.handles[3*(bez->numpoints-1)]->connected_to) && 
-                (bez->object.handles[3*(bez->numpoints-1)])->connected_to != NULL &&
-                (bez->object.handles[3*(bez->numpoints-1)])->connected_to->object != NULL) {
+        if (connpoint_is_autogap(bez->object.handles[3*(bez->bezier.num_points-1)]->connected_to) && 
+                (bez->object.handles[3*(bez->bezier.num_points-1)])->connected_to != NULL &&
+                (bez->object.handles[3*(bez->bezier.num_points-1)])->connected_to->object != NULL) {
             Point end; 
             point_copy(&end, &gap_points[3]);
             point_add_scaled(&end, &vec_end, bez_length); /* far away on the same slope */
             end = calculate_object_edge(&gap_points[3], &end, 
-                            (bez->object.handles[3*(bez->numpoints-1)])->connected_to->object);
+                            (bez->object.handles[3*(bez->bezier.num_points-1)])->connected_to->object);
             point_sub(&end, &gap_points[3]); /* vector from old end to new end */
             /* move points */
             point_add(&gap_points[3], &end);
@@ -376,19 +377,19 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
   renderer_ops->set_linecaps(renderer, bezierline->line_caps);
 
   if (connpoint_is_autogap(bez->object.handles[0]->connected_to) ||
-      connpoint_is_autogap(bez->object.handles[3*(bez->numpoints-1)]->connected_to) ||
+      connpoint_is_autogap(bez->object.handles[3*(bez->bezier.num_points-1)]->connected_to) ||
       bezierline->absolute_start_gap || bezierline->absolute_end_gap) {
 
     compute_gap_points(bezierline,gap_points);
     exchange_bez_gap_points(bez,gap_points);
-    renderer_ops->draw_bezier_with_arrows(renderer, bez->points, bez->numpoints,
+    renderer_ops->draw_bezier_with_arrows(renderer, bez->bezier.points, bez->bezier.num_points,
 					 bezierline->line_width,
 					 &bezierline->line_color,
 					 &bezierline->start_arrow,
 					 &bezierline->end_arrow);
     exchange_bez_gap_points(bez,gap_points);
   } else {
-    renderer_ops->draw_bezier_with_arrows(renderer, bez->points, bez->numpoints,
+    renderer_ops->draw_bezier_with_arrows(renderer, bez->bezier.points, bez->bezier.num_points,
 					  bezierline->line_width,
 					  &bezierline->line_color,
 					  &bezierline->start_arrow,
@@ -396,20 +397,20 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
   }
 
 #if 0
-  renderer_ops->draw_bezier(renderer, bez->points, bez->numpoints,
+  renderer_ops->draw_bezier(renderer, bez->bezier.points, bez->bezier.num_points,
 			     &bezierline->line_color);
 
   if (bezierline->start_arrow.type != ARROW_NONE) {
     arrow_draw(renderer, bezierline->start_arrow.type,
-	       &bez->points[0].p1, &bez->points[1].p1,
+	       &bez->bezier.points[0].p1, &bez->bezier.points[1].p1,
 	       bezierline->start_arrow.length, bezierline->start_arrow.width,
 	       bezierline->line_width,
 	       &bezierline->line_color, &color_white);
   }
   if (bezierline->end_arrow.type != ARROW_NONE) {
     arrow_draw(renderer, bezierline->end_arrow.type,
-	       &bez->points[bez->numpoints-1].p3,
-	       &bez->points[bez->numpoints-1].p2,
+	       &bez->bezier.points[bez->bezier.num_points-1].p3,
+	       &bez->bezier.points[bez->bezier.num_points-1].p2,
 	       bezierline->end_arrow.length, bezierline->end_arrow.width,
 	       bezierline->line_width,
 	       &bezierline->line_color, &color_white);
@@ -423,7 +424,7 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
    */
   if (renderer->is_interactive &&
       dia_object_is_selected(&bezierline->bez.object)) {
-    bezierconn_draw_control_lines(&bezierline->bez, renderer);
+    bezier_draw_control_lines(bezierline->bez.bezier.num_points, bezierline->bez.bezier.points, renderer);
   }
 }
 
@@ -448,18 +449,18 @@ bezierline_create(Point *startpoint,
   if (user_data == NULL) {
     bezierconn_init(bez, 2);
     
-    bez->points[0].p1 = *startpoint;
-    bez->points[1].p1 = *startpoint;
-    point_add(&bez->points[1].p1, &defaultlen);
-    bez->points[1].p2 = bez->points[1].p1;
-    point_add(&bez->points[1].p2, &defaultlen);
-    bez->points[1].p3 = bez->points[1].p2;
-    point_add(&bez->points[1].p3, &defaultlen);
+    bez->bezier.points[0].p1 = *startpoint;
+    bez->bezier.points[1].p1 = *startpoint;
+    point_add(&bez->bezier.points[1].p1, &defaultlen);
+    bez->bezier.points[1].p2 = bez->bezier.points[1].p1;
+    point_add(&bez->bezier.points[1].p2, &defaultlen);
+    bez->bezier.points[1].p3 = bez->bezier.points[1].p2;
+    point_add(&bez->bezier.points[1].p3, &defaultlen);
   } else {
     BezierCreateData *bcd = (BezierCreateData*)user_data;
 
     bezierconn_init(bez, bcd->num_points);
-    bezierconn_set_points(bez, bcd->num_points, bcd->points);
+    beziercommon_set_points (&bez->bezier, bcd->num_points, bcd->points);
   }
 
   bezierline->line_width =  attributes_get_default_linewidth();
@@ -526,37 +527,38 @@ bezierline_update_data(Bezierline *bezierline)
   extra->middle_trans =
   extra->end_trans = extra->end_long = (bezierline->line_width / 2.0);
 
-  obj->position = bez->points[0].p1;
+  obj->position = bez->bezier.points[0].p1;
 
   if (connpoint_is_autogap(bez->object.handles[0]->connected_to) ||
-      connpoint_is_autogap(bez->object.handles[3*(bez->numpoints-1)]->connected_to) ||
+      connpoint_is_autogap(bez->object.handles[3*(bez->bezier.num_points-1)]->connected_to) ||
       bezierline->absolute_start_gap || bezierline->absolute_end_gap ||
       bezierline->start_arrow.type != ARROW_NONE || bezierline->end_arrow.type != ARROW_NONE) {
     Point gap_points[4];
-    Rectangle bbox_union = {bez->points[0].p1.x, bez->points[0].p1.y, bez->points[0].p1.x, bez->points[0].p1.y};
+    Rectangle bbox_union = {bez->bezier.points[0].p1.x, bez->bezier.points[0].p1.y, 
+			    bez->bezier.points[0].p1.x, bez->bezier.points[0].p1.y};
     compute_gap_points(bezierline, gap_points);
     exchange_bez_gap_points(bez,gap_points);
     /* further modifying the points data, accounts for corrcet arrow and bezier bounding box */
     if (bezierline->start_arrow.type != ARROW_NONE) {
       Rectangle bbox;
       Point move_arrow, move_line;
-      Point to = bez->points[0].p1, from = bez->points[1].p1;
+      Point to = bez->bezier.points[0].p1, from = bez->bezier.points[1].p1;
       
       calculate_arrow_point(&bezierline->start_arrow, &to, &from, &move_arrow, &move_line, bezierline->line_width);
       point_sub(&to, &move_arrow);
-      point_sub(&bez->points[0].p1, &move_line);
+      point_sub(&bez->bezier.points[0].p1, &move_line);
       arrow_bbox (&bezierline->start_arrow, bezierline->line_width, &to, &from, &bbox);
       rectangle_union (&bbox_union, &bbox);
     }
     if (bezierline->end_arrow.type != ARROW_NONE) {
       Rectangle bbox;
       Point move_arrow, move_line;
-      int num_points = bez->numpoints;
-      Point to = bez->points[num_points-1].p3, from = bez->points[num_points-1].p2;
+      int num_points = bez->bezier.num_points;
+      Point to = bez->bezier.points[num_points-1].p3, from = bez->bezier.points[num_points-1].p2;
       
       calculate_arrow_point(&bezierline->end_arrow, &to, &from, &move_arrow, &move_line, bezierline->line_width);
       point_sub(&to, &move_arrow);
-      point_sub(&bez->points[num_points-1].p3, &move_line);
+      point_sub(&bez->bezier.points[num_points-1].p3, &move_line);
       arrow_bbox (&bezierline->end_arrow, bezierline->line_width, &to, &from, &bbox);
       rectangle_union (&bbox_union, &bbox);
     }
@@ -569,14 +571,14 @@ bezierline_update_data(Bezierline *bezierline)
     /* add control points to the bounding box, needed to make them visible when showing all 
       * and to remove traces from them */
   {
-    int i, num_points = bez->numpoints;
+    int i, num_points = bez->bezier.num_points;
     obj->enclosing_box = obj->bounding_box;
     /* starting with the second point, the first one is MOVE_TO */
     for (i = 1; i < num_points; ++i) {
-      if (bez->points[i].type != BEZ_CURVE_TO)
+      if (bez->bezier.points[i].type != BEZ_CURVE_TO)
         continue;
-      rectangle_add_point(&obj->enclosing_box, &bez->points[i].p1);      
-      rectangle_add_point(&obj->enclosing_box, &bez->points[i].p2);      
+      rectangle_add_point(&obj->enclosing_box, &bez->bezier.points[i].p1);      
+      rectangle_add_point(&obj->enclosing_box, &bez->bezier.points[i].p2);      
     }
   }
 }
@@ -586,7 +588,7 @@ bezierline_save(Bezierline *bezierline, ObjectNode obj_node,
 	      const char *filename)
 {
   if (connpoint_is_autogap(bezierline->bez.object.handles[0]->connected_to) ||
-      connpoint_is_autogap(bezierline->bez.object.handles[3*(bezierline->bez.numpoints-1)]->connected_to) ||
+      connpoint_is_autogap(bezierline->bez.object.handles[3*(bezierline->bez.bezier.num_points-1)]->connected_to) ||
       bezierline->absolute_start_gap || bezierline->absolute_end_gap) {
     Point gap_points[4];
     compute_gap_points(bezierline, gap_points);
@@ -787,15 +789,15 @@ bezierline_get_object_menu(Bezierline *bezierline, Point *clickedpoint)
   else
     closest_is_endpoint = FALSE;
 
-  for (i = 0; i < bezierline->bez.numpoints; i++)
+  for (i = 0; i < bezierline->bez.bezier.num_points; i++)
     if (bezierline->bez.object.handles[3*i] == closest) {
-      ctype = bezierline->bez.corner_types[i];
+      ctype = bezierline->bez.bezier.corner_types[i];
       break;
     }
 
   /* Set entries sensitive/selected etc here */
   bezierline_menu_items[0].active = 1;
-  bezierline_menu_items[1].active = bezierline->bez.numpoints > 2;
+  bezierline_menu_items[1].active = bezierline->bez.bezier.num_points > 2;
   bezierline_menu_items[3].active = !closest_is_endpoint &&
     (ctype != BEZ_CORNER_SYMMETRIC);
   bezierline_menu_items[4].active = !closest_is_endpoint &&
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index 5792917..5533866 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -212,12 +212,12 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
 {
   DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
 
-  BezierShape *bezier = &beziergon->bezier;
+  BezierShape *bez = &beziergon->bezier;
   BezPoint *points;
   int n;
   
-  points = &bezier->points[0];
-  n = bezier->numpoints;
+  points = &bez->bezier.points[0];
+  n = bez->bezier.num_points;
 
   renderer_ops->set_linewidth(renderer, beziergon->line_width);
   renderer_ops->set_linestyle(renderer, beziergon->line_style);
@@ -235,7 +235,7 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
    * state.  This is a compromise until I fix this properly. */
   if (renderer->is_interactive &&
       dia_object_is_selected((DiaObject*)beziergon)) {
-    beziershape_draw_control_lines(&beziergon->bezier, renderer);
+    bezier_draw_control_lines (beziergon->bezier.bezier.num_points, beziergon->bezier.bezier.points, renderer);
   }
 }
 
@@ -246,41 +246,41 @@ beziergon_create(Point *startpoint,
 		  Handle **handle2)
 {
   Beziergon *beziergon;
-  BezierShape *bezier;
+  BezierShape *bez;
   DiaObject *obj;
   Point defaultx = { 1.0, 0.0 };
   Point defaulty = { 0.0, 1.0 };
 
   beziergon = g_new0(Beziergon, 1);
-  bezier = &beziergon->bezier;
-  obj = &bezier->object;
+  bez = &beziergon->bezier;
+  obj = &bez->object;
 
   obj->type = &beziergon_type;
   obj->ops = &beziergon_ops;
 
   if (user_data == NULL) {
-    beziershape_init(bezier, 3);
-
-    bezier->points[0].p1 = *startpoint;
-    bezier->points[0].p3 = *startpoint;
-    bezier->points[2].p3 = *startpoint;
-
-    bezier->points[1].p1 = *startpoint;
-    point_add(&bezier->points[1].p1, &defaultx);
-    bezier->points[2].p2 = *startpoint;
-    point_sub(&bezier->points[2].p2, &defaultx);
-
-    bezier->points[1].p3 = *startpoint;
-    point_add(&bezier->points[1].p3, &defaulty);
-    bezier->points[1].p2 = bezier->points[1].p3;
-    point_add(&bezier->points[1].p2, &defaultx);
-    bezier->points[2].p1 = bezier->points[1].p3;
-    point_sub(&bezier->points[2].p1, &defaultx);
+    beziershape_init(bez, 3);
+
+    bez->bezier.points[0].p1 = *startpoint;
+    bez->bezier.points[0].p3 = *startpoint;
+    bez->bezier.points[2].p3 = *startpoint;
+
+    bez->bezier.points[1].p1 = *startpoint;
+    point_add(&bez->bezier.points[1].p1, &defaultx);
+    bez->bezier.points[2].p2 = *startpoint;
+    point_sub(&bez->bezier.points[2].p2, &defaultx);
+
+    bez->bezier.points[1].p3 = *startpoint;
+    point_add(&bez->bezier.points[1].p3, &defaulty);
+    bez->bezier.points[1].p2 = bez->bezier.points[1].p3;
+    point_add(&bez->bezier.points[1].p2, &defaultx);
+    bez->bezier.points[2].p1 = bez->bezier.points[1].p3;
+    point_sub(&bez->bezier.points[2].p1, &defaultx);
   } else {
     BezierCreateData *bcd = (BezierCreateData*)user_data;
 
-    beziershape_init(bezier, bcd->num_points);
-    beziershape_set_points(bezier, bcd->num_points, bcd->points);
+    beziershape_init(bez, bcd->num_points);
+    beziercommon_set_points (&bez->bezier, bcd->num_points, bcd->points);
   }  
   beziergon->line_width =  attributes_get_default_linewidth();
   beziergon->line_color = attributes_get_foreground();
@@ -292,8 +292,8 @@ beziergon_create(Point *startpoint,
 
   beziergon_update_data(beziergon);
 
-  *handle1 = bezier->object.handles[5];
-  *handle2 = bezier->object.handles[2];
+  *handle1 = bez->object.handles[5];
+  *handle2 = bez->object.handles[2];
   return &beziergon->bezier.object;
 }
 
@@ -330,27 +330,27 @@ beziergon_copy(Beziergon *beziergon)
 static void
 beziergon_update_data(Beziergon *beziergon)
 {
-  BezierShape *bezier = &beziergon->bezier;
-  DiaObject *obj = &bezier->object;
-  ElementBBExtras *extra = &bezier->extra_spacing;
-  
-  beziershape_update_data(bezier);
-  
+  BezierShape *bez = &beziergon->bezier;
+  DiaObject *obj = &bez->object;
+  ElementBBExtras *extra = &bez->extra_spacing;
+
+  beziershape_update_data(bez);
+
   extra->border_trans = beziergon->line_width / 2.0;
-  beziershape_update_boundingbox(bezier);
+  beziershape_update_boundingbox(bez);
 
   /* update the enclosing box using the control points */
   {
-    int i, num_points = bezier->numpoints;
+    int i, num_points = bez->bezier.num_points;
     obj->enclosing_box = obj->bounding_box;
     for (i = 0; i < num_points; ++i) {
-      if (bezier->points[i].type != BEZ_CURVE_TO)
+      if (bez->bezier.points[i].type != BEZ_CURVE_TO)
         continue;
-      rectangle_add_point(&obj->enclosing_box, &bezier->points[i].p1);      
-      rectangle_add_point(&obj->enclosing_box, &bezier->points[i].p2);      
+      rectangle_add_point(&obj->enclosing_box, &bez->bezier.points[i].p1);      
+      rectangle_add_point(&obj->enclosing_box, &bez->bezier.points[i].p2);      
     }
   }
-  obj->position = bezier->points[0].p1;
+  obj->position = bez->bezier.points[0].p1;
 }
 
 static void
@@ -393,19 +393,19 @@ static DiaObject *
 beziergon_load(ObjectNode obj_node, int version, DiaContext *ctx)
 {
   Beziergon *beziergon;
-  BezierShape *bezier;
+  BezierShape *bez;
   DiaObject *obj;
   AttributeNode attr;
 
   beziergon = g_malloc0(sizeof(Beziergon));
 
-  bezier = &beziergon->bezier;
-  obj = &bezier->object;
+  bez = &beziergon->bezier;
+  obj = &bez->object;
   
   obj->type = &beziergon_type;
   obj->ops = &beziergon_ops;
 
-  beziershape_load(bezier, obj_node, ctx);
+  beziershape_load(bez, obj_node, ctx);
 
   beziergon->line_color = color_black;
   attr = object_find_attribute(obj_node, "line_color");
@@ -514,6 +514,6 @@ beziergon_get_object_menu(Beziergon *beziergon, Point *clickedpoint)
 {
   /* Set entries sensitive/selected etc here */
   beziergon_menu_items[0].active = 1;
-  beziergon_menu_items[1].active = beziergon->bezier.numpoints > 3;
+  beziergon_menu_items[1].active = beziergon->bezier.bezier.num_points > 3;
   return &beziergon_menu;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]