[dia] [restructuring] Bezier* start sharing code
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] [restructuring] Bezier* start sharing code
- Date: Wed, 3 Oct 2012 20:03:06 +0000 (UTC)
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]