[dia] LineCaps and LineJoin switchable for Standard objects
- From: Hans Breuer <hans src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [dia] LineCaps and LineJoin switchable for Standard objects
- Date: Sat, 7 Nov 2009 20:29:01 +0000 (UTC)
commit 29c546d04476935dee461bca9e58d590246e91f0
Author: Hans Breuer <hans breuer org>
Date: Sun Nov 1 22:47:02 2009 +0100
LineCaps and LineJoin switchable for Standard objects
lib/properties.c | 12 ++++++++++++
lib/properties.h | 26 ++++++++++++++++++++++++++
objects/standard/arc.c | 18 ++++++++++++++++--
objects/standard/bezier.c | 33 ++++++++++++++++++++++++++++++---
objects/standard/beziergon.c | 16 +++++++++++++++-
objects/standard/line.c | 18 ++++++++++++++++--
objects/standard/polygon.c | 15 ++++++++++++++-
objects/standard/polyline.c | 36 ++++++++++++++++++++++++++++++------
objects/standard/zigzagline.c | 34 +++++++++++++++++++++++++++++-----
9 files changed, 188 insertions(+), 20 deletions(-)
---
diff --git a/lib/properties.c b/lib/properties.c
index f8c96f0..8f8c5b2 100644
--- a/lib/properties.c
+++ b/lib/properties.c
@@ -67,6 +67,18 @@ PropEnumData prop_std_text_align_data[] = {
{ N_("Right"), ALIGN_RIGHT },
{ NULL, 0 }
};
+PropEnumData prop_std_line_join_data[] = {
+ { N_("Miter"), LINEJOIN_MITER },
+ { N_("Round"), LINEJOIN_ROUND },
+ { N_("Bevel"), LINEJOIN_BEVEL },
+ { NULL, 0 }
+};
+PropEnumData prop_std_line_caps_data[] = {
+ { N_("Butt"), LINECAPS_BUTT },
+ { N_("Round"), LINECAPS_ROUND },
+ { N_("Projecting"), LINECAPS_PROJECTING },
+ { NULL, 0 }
+};
#endif
#ifdef FOR_TRANSLATORS_ONLY
diff --git a/lib/properties.h b/lib/properties.h
index 7ebf73d..7e2071d 100644
--- a/lib/properties.h
+++ b/lib/properties.h
@@ -480,9 +480,23 @@ static PropEnumData prop_std_text_align_data[] = {
{ N_("Right"), ALIGN_RIGHT },
{ NULL, 0 }
};
+static PropEnumData prop_std_line_join_data[] = {
+ { N_("Miter"), LINEJOIN_MITER },
+ { N_("Round"), LINEJOIN_ROUND },
+ { N_("Bevel"), LINEJOIN_BEVEL },
+ { NULL, 0 }
+};
+static PropEnumData prop_std_line_caps_data[] = {
+ { N_("Butt"), LINECAPS_BUTT },
+ { N_("Round"), LINECAPS_ROUND },
+ { N_("Projecting"), LINECAPS_PROJECTING },
+ { NULL, 0 }
+};
#else
extern PropNumData prop_std_line_width_data, prop_std_text_height_data;
extern PropEnumData prop_std_text_align_data[];
+extern PropEnumData prop_std_line_join_data[];
+extern PropEnumData prop_std_line_caps_data[];
#endif
#define PROP_STDNAME_LINE_WIDTH "line_width"
@@ -505,6 +519,18 @@ extern PropEnumData prop_std_text_align_data[];
#define PROP_STD_LINE_STYLE_OPTIONAL \
{ "line_style", PROP_TYPE_LINESTYLE, PROP_FLAG_VISIBLE|PROP_FLAG_STANDARD|PROP_FLAG_OPTIONAL, \
N_("Line style"), NULL, NULL }
+#define PROP_STD_LINE_JOIN \
+ { "line_join", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE, \
+ N_("Line join"), NULL, prop_std_line_join_data }
+#define PROP_STD_LINE_JOIN_OPTIONAL \
+ { "line_join", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE|PROP_FLAG_OPTIONAL, \
+ N_("Line join"), NULL, prop_std_line_join_data }
+#define PROP_STD_LINE_CAPS \
+ { "line_caps", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE, \
+ N_("Line caps"), NULL, prop_std_line_caps_data }
+#define PROP_STD_LINE_CAPS_OPTIONAL \
+ { "line_caps", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE|PROP_FLAG_OPTIONAL, \
+ N_("Line caps"), NULL, prop_std_line_caps_data }
#define PROP_STD_FILL_COLOUR \
{ "fill_colour", PROP_TYPE_COLOUR, PROP_FLAG_VISIBLE|PROP_FLAG_STANDARD, \
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index f55e8c7..141f5cc 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -52,6 +52,7 @@ struct _Arc {
real curve_distance;
real line_width;
LineStyle line_style;
+ LineCaps line_caps;
real dashlength;
Arrow start_arrow, end_arrow;
@@ -135,6 +136,7 @@ static PropDescription arc_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_CAPS_OPTIONAL,
PROP_STD_START_ARROW,
PROP_STD_END_ARROW,
{ "curve_distance", PROP_TYPE_REAL, 0,
@@ -156,6 +158,7 @@ static PropOffset arc_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Arc, arc_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Arc, line_style), offsetof(Arc, dashlength) },
+ { "line_caps", PROP_TYPE_ENUM, offsetof(Arc, line_caps) },
{ "start_arrow", PROP_TYPE_ARROW, offsetof(Arc, start_arrow) },
{ "end_arrow", PROP_TYPE_ARROW, offsetof(Arc, end_arrow) },
{ "curve_distance", PROP_TYPE_REAL, offsetof(Arc, curve_distance) },
@@ -555,7 +558,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, arc->line_width);
renderer_ops->set_linestyle(renderer, arc->line_style);
renderer_ops->set_dashlength(renderer, arc->dashlength);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linecaps(renderer, arc->line_caps);
/* Special case when almost line: */
if (fabs(arc->curve_distance) <= 0.01) {
@@ -596,6 +599,7 @@ arc_create(Point *startpoint,
arc->curve_distance = 1.0;
arc->arc_color = attributes_get_foreground();
attributes_get_default_line_style(&arc->line_style, &arc->dashlength);
+ arc->line_caps = LINECAPS_BUTT;
arc->start_arrow = attributes_get_default_start_arrow();
arc->end_arrow = attributes_get_default_end_arrow();
@@ -649,6 +653,7 @@ arc_copy(Arc *arc)
newarc->curve_distance = arc->curve_distance;
newarc->line_width = arc->line_width;
newarc->line_style = arc->line_style;
+ newarc->line_caps = arc->line_caps;
newarc->dashlength = arc->dashlength;
newarc->start_arrow = arc->start_arrow;
newarc->end_arrow = arc->end_arrow;
@@ -838,7 +843,11 @@ arc_save(Arc *arc, ObjectNode obj_node, const char *filename)
arc->dashlength != DEFAULT_LINESTYLE_DASHLEN)
data_add_real(new_attribute(obj_node, "dashlength"),
arc->dashlength);
-
+
+ if (arc->line_caps != LINECAPS_BUTT)
+ data_add_enum(new_attribute(obj_node, "line_caps"),
+ arc->line_caps);
+
if (arc->start_arrow.type != ARROW_NONE) {
save_arrow(obj_node, &arc->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
@@ -893,6 +902,11 @@ arc_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
arc->dashlength = data_real(attribute_first_data(attr));
+ arc->line_caps = LINECAPS_BUTT;
+ attr = object_find_attribute(obj_node, "line_caps");
+ if (attr != NULL)
+ arc->line_caps = data_enum(attribute_first_data(attr));
+
load_arrow(obj_node, &arc->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index 683fcc3..7d8fe05 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -49,6 +49,8 @@ struct _Bezierline {
Color line_color;
LineStyle line_style;
+ LineJoin line_join;
+ LineCaps line_caps;
real dashlength;
real line_width;
Arrow start_arrow, end_arrow;
@@ -134,6 +136,8 @@ static PropDescription bezierline_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_JOIN_OPTIONAL,
+ PROP_STD_LINE_CAPS_OPTIONAL,
PROP_STD_START_ARROW,
PROP_STD_END_ARROW,
PROP_FRAME_BEGIN("gaps",0,N_("Line gaps")),
@@ -159,6 +163,8 @@ static PropOffset bezierline_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Bezierline, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Bezierline, line_style), offsetof(Bezierline, dashlength) },
+ { "line_join", PROP_TYPE_ENUM, offsetof(Bezierline, line_join) },
+ { "line_caps", PROP_TYPE_ENUM, offsetof(Bezierline, line_caps) },
{ "start_arrow", PROP_TYPE_ARROW, offsetof(Bezierline, start_arrow) },
{ "end_arrow", PROP_TYPE_ARROW, offsetof(Bezierline, end_arrow) },
PROP_OFFSET_FRAME_BEGIN("gaps"),
@@ -365,8 +371,8 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, bezierline->line_width);
renderer_ops->set_linestyle(renderer, bezierline->line_style);
renderer_ops->set_dashlength(renderer, bezierline->dashlength);
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linejoin(renderer, bezierline->line_join);
+ 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) ||
@@ -459,6 +465,8 @@ bezierline_create(Point *startpoint,
bezierline->line_color = attributes_get_foreground();
attributes_get_default_line_style(&bezierline->line_style,
&bezierline->dashlength);
+ bezierline->line_join = LINEJOIN_MITER;
+ bezierline->line_caps = LINECAPS_BUTT;
bezierline->start_arrow = attributes_get_default_start_arrow();
bezierline->end_arrow = attributes_get_default_end_arrow();
@@ -494,6 +502,8 @@ bezierline_copy(Bezierline *bezierline)
newbezierline->line_color = bezierline->line_color;
newbezierline->line_width = bezierline->line_width;
newbezierline->line_style = bezierline->line_style;
+ newbezierline->line_join = bezierline->line_join;
+ newbezierline->line_caps = bezierline->line_caps;
newbezierline->dashlength = bezierline->dashlength;
newbezierline->start_arrow = bezierline->start_arrow;
newbezierline->end_arrow = bezierline->end_arrow;
@@ -603,7 +613,14 @@ bezierline_save(Bezierline *bezierline, ObjectNode obj_node,
bezierline->dashlength != DEFAULT_LINESTYLE_DASHLEN)
data_add_real(new_attribute(obj_node, "dashlength"),
bezierline->dashlength);
-
+
+ if (bezierline->line_join != LINEJOIN_MITER)
+ data_add_enum(new_attribute(obj_node, "line_join"),
+ bezierline->line_join);
+ if (bezierline->line_caps != LINECAPS_BUTT)
+ data_add_enum(new_attribute(obj_node, "line_caps"),
+ bezierline->line_caps);
+
if (bezierline->start_arrow.type != ARROW_NONE) {
save_arrow(obj_node, &bezierline->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
@@ -655,6 +672,16 @@ bezierline_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
bezierline->line_style = data_enum(attribute_first_data(attr));
+ bezierline->line_join = LINEJOIN_MITER;
+ attr = object_find_attribute(obj_node, "line_join");
+ if (attr != NULL)
+ bezierline->line_join = data_enum(attribute_first_data(attr));
+
+ bezierline->line_caps = LINECAPS_BUTT;
+ attr = object_find_attribute(obj_node, "line_caps");
+ if (attr != NULL)
+ bezierline->line_caps = data_enum(attribute_first_data(attr));
+
bezierline->dashlength = DEFAULT_LINESTYLE_DASHLEN;
attr = object_find_attribute(obj_node, "dashlength");
if (attr != NULL)
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index ff61ab9..6780d43 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -49,6 +49,7 @@ typedef struct _Beziergon {
Color line_color;
LineStyle line_style;
+ LineJoin line_join;
Color inner_color;
gboolean show_background;
real dashlength;
@@ -132,6 +133,7 @@ static PropDescription beziergon_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_JOIN_OPTIONAL,
PROP_STD_FILL_COLOUR,
PROP_STD_SHOW_BACKGROUND,
PROP_DESC_END
@@ -151,6 +153,7 @@ static PropOffset beziergon_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Beziergon, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Beziergon, line_style), offsetof(Beziergon, dashlength) },
+ { "line_join", PROP_TYPE_ENUM, offsetof(Beziergon, line_join) },
{ "fill_colour", PROP_TYPE_COLOUR, offsetof(Beziergon, inner_color) },
{ "show_background", PROP_TYPE_BOOL, offsetof(Beziergon, show_background) },
{ NULL, 0, 0 }
@@ -232,7 +235,7 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, beziergon->line_width);
renderer_ops->set_linestyle(renderer, beziergon->line_style);
renderer_ops->set_dashlength(renderer, beziergon->dashlength);
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
+ renderer_ops->set_linejoin(renderer, beziergon->line_join);
renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
if (beziergon->show_background)
@@ -297,6 +300,7 @@ beziergon_create(Point *startpoint,
beziergon->inner_color = attributes_get_background();
attributes_get_default_line_style(&beziergon->line_style,
&beziergon->dashlength);
+ beziergon->line_join = LINEJOIN_MITER;
beziergon->show_background = default_properties.show_background;
beziergon_update_data(beziergon);
@@ -330,6 +334,7 @@ beziergon_copy(Beziergon *beziergon)
newbeziergon->line_color = beziergon->line_color;
newbeziergon->line_width = beziergon->line_width;
newbeziergon->line_style = beziergon->line_style;
+ newbeziergon->line_join = beziergon->line_join;
newbeziergon->dashlength = beziergon->dashlength;
newbeziergon->inner_color = beziergon->inner_color;
newbeziergon->show_background = beziergon->show_background;
@@ -393,6 +398,10 @@ beziergon_save(Beziergon *beziergon, ObjectNode obj_node,
data_add_real(new_attribute(obj_node, "dashlength"),
beziergon->dashlength);
+ if (beziergon->line_join != LINEJOIN_MITER)
+ data_add_enum(new_attribute(obj_node, "line_join"),
+ beziergon->line_join);
+
}
static DiaObject *
@@ -438,6 +447,11 @@ beziergon_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
beziergon->line_style = data_enum(attribute_first_data(attr));
+ beziergon->line_join = LINEJOIN_MITER;
+ attr = object_find_attribute(obj_node, "line_join");
+ if (attr != NULL)
+ beziergon->line_join = data_enum(attribute_first_data(attr));
+
beziergon->dashlength = DEFAULT_LINESTYLE_DASHLEN;
attr = object_find_attribute(obj_node, "dashlength");
if (attr != NULL)
diff --git a/objects/standard/line.c b/objects/standard/line.c
index 5981f46..4a65b84 100644
--- a/objects/standard/line.c
+++ b/objects/standard/line.c
@@ -48,7 +48,8 @@ typedef struct _Line {
Color line_color;
real line_width;
- LineStyle line_style;
+ LineStyle line_style;
+ LineCaps line_caps;
Arrow start_arrow, end_arrow;
real dashlength;
real absolute_start_gap, absolute_end_gap;
@@ -131,6 +132,7 @@ static PropDescription line_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_CAPS_OPTIONAL,
PROP_FRAME_BEGIN("arrows",PROP_FLAG_STANDARD,N_("Arrows")),
PROP_STD_START_ARROW,
PROP_STD_END_ARROW,
@@ -164,6 +166,7 @@ static PropOffset line_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Line, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Line, line_style), offsetof(Line, dashlength) },
+ { "line_caps", PROP_TYPE_ENUM, offsetof(Line, line_caps) },
{ "start_arrow", PROP_TYPE_ARROW, offsetof(Line, start_arrow) },
{ "end_arrow", PROP_TYPE_ARROW, offsetof(Line, end_arrow) },
{ "start_point", PROP_TYPE_POINT, offsetof(Connection, endpoints[0]) },
@@ -344,7 +347,7 @@ line_draw(Line *line, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, line->line_width);
renderer_ops->set_linestyle(renderer, line->line_style);
renderer_ops->set_dashlength(renderer, line->dashlength);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linecaps(renderer, line->line_caps);
if (line->absolute_start_gap || line->absolute_end_gap ) {
line_adjust_for_absolute_gap(line, gap_endpoints);
@@ -402,6 +405,7 @@ line_create(Point *startpoint,
line->cpl = connpointline_create(obj,1);
attributes_get_default_line_style(&line->line_style, &line->dashlength);
+ line->line_caps = LINECAPS_BUTT;
line->start_arrow = attributes_get_default_start_arrow();
line->end_arrow = attributes_get_default_end_arrow();
line_update_data(line);
@@ -439,6 +443,7 @@ line_copy(Line *line)
newline->line_color = line->line_color;
newline->line_width = line->line_width;
newline->line_style = line->line_style;
+ newline->line_caps = line->line_caps;
newline->dashlength = line->dashlength;
newline->start_arrow = line->start_arrow;
newline->end_arrow = line->end_arrow;
@@ -541,6 +546,10 @@ line_save(Line *line, ObjectNode obj_node, const char *filename)
data_add_enum(new_attribute(obj_node, "line_style"),
line->line_style);
+ if (line->line_caps != LINECAPS_BUTT)
+ data_add_enum(new_attribute(obj_node, "line_caps"),
+ line->line_caps);
+
if (line->start_arrow.type != ARROW_NONE) {
save_arrow(obj_node, &line->start_arrow,
"start_arrow", "start_arrow_length", "start_arrow_width");
@@ -596,6 +605,11 @@ line_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
line->line_style = data_enum(attribute_first_data(attr));
+ line->line_caps = LINECAPS_BUTT;
+ attr = object_find_attribute(obj_node, "line_caps");
+ if (attr != NULL)
+ line->line_caps = data_enum(attribute_first_data(attr));
+
load_arrow(obj_node, &line->start_arrow,
"start_arrow", "start_arrow_length", "start_arrow_width");
diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c
index 37d9706..3ee4378 100644
--- a/objects/standard/polygon.c
+++ b/objects/standard/polygon.c
@@ -53,6 +53,7 @@ typedef struct _Polygon {
Color line_color;
LineStyle line_style;
+ LineJoin line_join;
Color inner_color;
gboolean show_background;
real dashlength;
@@ -135,6 +136,7 @@ static PropDescription polygon_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_JOIN_OPTIONAL,
PROP_STD_FILL_COLOUR,
PROP_STD_SHOW_BACKGROUND,
PROP_DESC_END
@@ -154,6 +156,7 @@ static PropOffset polygon_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Polygon, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Polygon, line_style), offsetof(Polygon, dashlength) },
+ { "line_join", PROP_TYPE_ENUM, offsetof(Polygon, line_join) },
{ "fill_colour", PROP_TYPE_COLOUR, offsetof(Polygon, inner_color) },
{ "show_background", PROP_TYPE_BOOL, offsetof(Polygon, show_background) },
{ NULL, 0, 0 }
@@ -234,7 +237,7 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, polygon->line_width);
renderer_ops->set_linestyle(renderer, polygon->line_style);
renderer_ops->set_dashlength(renderer, polygon->dashlength);
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
+ renderer_ops->set_linejoin(renderer, polygon->line_join);
renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
if (polygon->show_background)
@@ -282,6 +285,7 @@ polygon_create(Point *startpoint,
polygon->inner_color = attributes_get_background();
attributes_get_default_line_style(&polygon->line_style,
&polygon->dashlength);
+ polygon->line_join = LINEJOIN_MITER;
polygon->show_background = default_properties.show_background;
polygon_update_data(polygon);
@@ -368,6 +372,10 @@ polygon_save(Polygon *polygon, ObjectNode obj_node,
data_add_real(new_attribute(obj_node, "dashlength"),
polygon->dashlength);
+ if (polygon->line_join != LINEJOIN_MITER)
+ data_add_enum(new_attribute(obj_node, "line_join"),
+ polygon->line_join);
+
}
static DiaObject *
@@ -413,6 +421,11 @@ polygon_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
polygon->line_style = data_enum(attribute_first_data(attr));
+ polygon->line_join = LINEJOIN_MITER;
+ attr = object_find_attribute(obj_node, "line_join");
+ if (attr != NULL)
+ polygon->line_join = data_enum(attribute_first_data(attr));
+
polygon->dashlength = DEFAULT_LINESTYLE_DASHLEN;
attr = object_find_attribute(obj_node, "dashlength");
if (attr != NULL)
diff --git a/objects/standard/polyline.c b/objects/standard/polyline.c
index 4ae052d..b7b271c 100644
--- a/objects/standard/polyline.c
+++ b/objects/standard/polyline.c
@@ -45,6 +45,8 @@ typedef struct _Polyline {
Color line_color;
LineStyle line_style;
+ LineJoin line_join;
+ LineCaps line_caps;
real dashlength;
real line_width;
real corner_radius;
@@ -130,6 +132,8 @@ static PropDescription polyline_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_JOIN_OPTIONAL,
+ PROP_STD_LINE_CAPS_OPTIONAL,
PROP_STD_START_ARROW,
PROP_STD_END_ARROW,
{ "corner_radius", PROP_TYPE_REAL, PROP_FLAG_VISIBLE,
@@ -157,6 +161,8 @@ static PropOffset polyline_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Polyline, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Polyline, line_style), offsetof(Polyline, dashlength) },
+ { "line_join", PROP_TYPE_ENUM, offsetof(Polyline, line_join) },
+ { "line_caps", PROP_TYPE_ENUM, offsetof(Polyline, line_caps) },
{ "start_arrow", PROP_TYPE_ARROW, offsetof(Polyline, start_arrow) },
{ "end_arrow", PROP_TYPE_ARROW, offsetof(Polyline, end_arrow) },
{ "corner_radius", PROP_TYPE_REAL, offsetof(Polyline, corner_radius) },
@@ -300,11 +306,8 @@ polyline_draw(Polyline *polyline, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, polyline->line_width);
renderer_ops->set_linestyle(renderer, polyline->line_style);
renderer_ops->set_dashlength(renderer, polyline->dashlength);
- if (polyline->corner_radius > 0.0)
- renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
- else
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linejoin(renderer, polyline->line_join);
+ renderer_ops->set_linecaps(renderer, polyline->line_caps);
polyline_calculate_gap_endpoints(polyline, gap_endpoints);
polyline_exchange_gap_points(polyline, gap_endpoints);
@@ -369,6 +372,8 @@ polyline_create(Point *startpoint,
polyline->line_color = attributes_get_foreground();
attributes_get_default_line_style(&polyline->line_style,
&polyline->dashlength);
+ polyline->line_join = LINEJOIN_MITER;
+ polyline->line_caps = LINECAPS_BUTT;
polyline->start_arrow = attributes_get_default_start_arrow();
polyline->end_arrow = attributes_get_default_end_arrow();
polyline->corner_radius = 0.0;
@@ -402,6 +407,8 @@ polyline_copy(Polyline *polyline)
newpolyline->line_color = polyline->line_color;
newpolyline->line_width = polyline->line_width;
newpolyline->line_style = polyline->line_style;
+ newpolyline->line_join = polyline->line_join;
+ newpolyline->line_caps = polyline->line_caps;
newpolyline->dashlength = polyline->dashlength;
newpolyline->start_arrow = polyline->start_arrow;
newpolyline->end_arrow = polyline->end_arrow;
@@ -492,7 +499,14 @@ polyline_save(Polyline *polyline, ObjectNode obj_node,
polyline->dashlength != DEFAULT_LINESTYLE_DASHLEN)
data_add_real(new_attribute(obj_node, "dashlength"),
polyline->dashlength);
-
+
+ if (polyline->line_join != LINEJOIN_MITER)
+ data_add_enum(new_attribute(obj_node, "line_join"),
+ polyline->line_join);
+ if (polyline->line_caps != LINECAPS_BUTT)
+ data_add_enum(new_attribute(obj_node, "line_caps"),
+ polyline->line_caps);
+
if (polyline->start_arrow.type != ARROW_NONE) {
save_arrow(obj_node, &polyline->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
@@ -548,6 +562,16 @@ polyline_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
polyline->line_style = data_enum(attribute_first_data(attr));
+ polyline->line_join = LINEJOIN_MITER;
+ attr = object_find_attribute(obj_node, "line_join");
+ if (attr != NULL)
+ polyline->line_join = data_enum(attribute_first_data(attr));
+
+ polyline->line_caps = LINECAPS_BUTT;
+ attr = object_find_attribute(obj_node, "line_caps");
+ if (attr != NULL)
+ polyline->line_caps = data_enum(attribute_first_data(attr));
+
polyline->dashlength = DEFAULT_LINESTYLE_DASHLEN;
attr = object_find_attribute(obj_node, "dashlength");
if (attr != NULL)
diff --git a/objects/standard/zigzagline.c b/objects/standard/zigzagline.c
index fe25eb2..8f256d1 100644
--- a/objects/standard/zigzagline.c
+++ b/objects/standard/zigzagline.c
@@ -45,6 +45,8 @@ typedef struct _Zigzagline {
Color line_color;
LineStyle line_style;
+ LineJoin line_join;
+ LineCaps line_caps;
real dashlength;
real line_width;
real corner_radius;
@@ -126,6 +128,8 @@ static PropDescription zigzagline_props[] = {
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
+ PROP_STD_LINE_JOIN_OPTIONAL,
+ PROP_STD_LINE_CAPS_OPTIONAL,
PROP_STD_START_ARROW,
PROP_STD_END_ARROW,
{ "corner_radius", PROP_TYPE_REAL, PROP_FLAG_VISIBLE,
@@ -147,6 +151,8 @@ static PropOffset zigzagline_offsets[] = {
{ "line_colour", PROP_TYPE_COLOUR, offsetof(Zigzagline, line_color) },
{ "line_style", PROP_TYPE_LINESTYLE,
offsetof(Zigzagline, line_style), offsetof(Zigzagline, dashlength) },
+ { "line_join", PROP_TYPE_ENUM, offsetof(Zigzagline, line_join) },
+ { "line_caps", PROP_TYPE_ENUM, offsetof(Zigzagline, line_caps) },
{ "start_arrow", PROP_TYPE_ARROW, offsetof(Zigzagline, start_arrow) },
{ "end_arrow", PROP_TYPE_ARROW, offsetof(Zigzagline, end_arrow) },
{ "corner_radius", PROP_TYPE_REAL, offsetof(Zigzagline, corner_radius) },
@@ -224,11 +230,8 @@ zigzagline_draw(Zigzagline *zigzagline, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, zigzagline->line_width);
renderer_ops->set_linestyle(renderer, zigzagline->line_style);
renderer_ops->set_dashlength(renderer, zigzagline->dashlength);
- if (zigzagline->corner_radius > 0)
- renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
- else
- renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+ renderer_ops->set_linejoin(renderer, zigzagline->line_join);
+ renderer_ops->set_linecaps(renderer, zigzagline->line_caps);
renderer_ops->draw_rounded_polyline_with_arrows(renderer,
points, n,
@@ -264,6 +267,8 @@ zigzagline_create(Point *startpoint,
zigzagline->line_color = attributes_get_foreground();
attributes_get_default_line_style(&zigzagline->line_style,
&zigzagline->dashlength);
+ zigzagline->line_join = LINEJOIN_MITER;
+ zigzagline->line_caps = LINECAPS_BUTT;
zigzagline->start_arrow = attributes_get_default_start_arrow();
zigzagline->end_arrow = attributes_get_default_end_arrow();
zigzagline->corner_radius = 0.0;
@@ -300,6 +305,8 @@ zigzagline_copy(Zigzagline *zigzagline)
newzigzagline->line_color = zigzagline->line_color;
newzigzagline->line_width = zigzagline->line_width;
newzigzagline->line_style = zigzagline->line_style;
+ newzigzagline->line_join = zigzagline->line_join;
+ newzigzagline->line_caps = zigzagline->line_caps;
newzigzagline->dashlength = zigzagline->dashlength;
newzigzagline->start_arrow = zigzagline->start_arrow;
newzigzagline->end_arrow = zigzagline->end_arrow;
@@ -422,6 +429,13 @@ zigzagline_save(Zigzagline *zigzagline, ObjectNode obj_node,
data_add_enum(new_attribute(obj_node, "line_style"),
zigzagline->line_style);
+ if (zigzagline->line_join != LINEJOIN_MITER)
+ data_add_enum(new_attribute(obj_node, "line_join"),
+ zigzagline->line_join);
+ if (zigzagline->line_caps != LINECAPS_BUTT)
+ data_add_enum(new_attribute(obj_node, "line_caps"),
+ zigzagline->line_caps);
+
if (zigzagline->start_arrow.type != ARROW_NONE) {
save_arrow(obj_node, &zigzagline->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
@@ -475,6 +489,16 @@ zigzagline_load(ObjectNode obj_node, int version, const char *filename)
if (attr != NULL)
zigzagline->line_style = data_enum(attribute_first_data(attr));
+ zigzagline->line_join = LINEJOIN_MITER;
+ attr = object_find_attribute(obj_node, "line_join");
+ if (attr != NULL)
+ zigzagline->line_join = data_enum(attribute_first_data(attr));
+
+ zigzagline->line_caps = LINECAPS_BUTT;
+ attr = object_find_attribute(obj_node, "line_caps");
+ if (attr != NULL)
+ zigzagline->line_caps = data_enum(attribute_first_data(attr));
+
load_arrow(obj_node, &zigzagline->start_arrow, "start_arrow",
"start_arrow_length", "start_arrow_width");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]