[dia] DiaRenderer: replace fill_polygon() with extended draw_polygon() method
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] DiaRenderer: replace fill_polygon() with extended draw_polygon() method
- Date: Thu, 1 May 2014 10:49:33 +0000 (UTC)
commit ce69adf022585e1a580c1aa8f6a2a4cd2051bb73
Author: Hans Breuer <hans breuer org>
Date: Sun Apr 27 15:44:32 2014 +0200
DiaRenderer: replace fill_polygon() with extended draw_polygon() method
What started with draw_beziergon() is continued with draw_polygon(): merge
two calls into one to get rid of superfluous drawing commands and arbitrary
object splits.
Given that fill_polygon was a required method now draw_polygon is. So it was
implemented more often than fill_bezier
To reduce the risk of breaking file formats not yet tested the following
pattern is introduced:
- rename draw_polygon to stroke_polygon
- keep fill_polygon as local function
- make new draw_polygon call one or both for fill and stroke parameter
As a result the output of these exporters wont change at all.
Not optimized are: MetaPost, LibArt, XFig, VDX, diastddia.py
Also not optimized, but more simple are: PGF, PS, PSTricks and Skia
Optimized to fill and stroke in one step are: WPG, PyDia, WMF, CGM, DRS,
cairo, SVG, Shape, GDK, HPGL(kind of;)) and DXF(as limited as before)
Fully optimized shape rendering for: AADL, Custom, KAOS, Standard,
Flowchart, Network, ER, Chronogram, UML - i.e. all programmed objects
bindings/dia-renderer.cpp | 13 +----
bindings/dia-renderer.h | 7 +--
lib/arrows.c | 20 ++++----
lib/diagdkrenderer.c | 51 +++++++----------------
lib/diaimportrenderer.c | 28 ++----------
lib/diapathrenderer.c | 27 ++++--------
lib/diarenderer.c | 34 +++++----------
lib/diarenderer.h | 12 +----
lib/diasvgrenderer.c | 43 +++++--------------
lib/diatransformrenderer.c | 20 +--------
makefile.msc | 6 +-
objects/AADL/aadlbus.c | 3 +-
objects/AADL/aadldevice.c | 12 ++----
objects/AADL/aadlpackage.c | 3 +-
objects/AADL/aadlport.c | 17 +++-----
objects/AADL/aadlprocess.c | 3 +-
objects/AADL/aadlprocessor.c | 6 +--
objects/Database/table.c | 2 +-
objects/ER/entity.c | 8 +--
objects/ER/relationship.c | 10 ++---
objects/Istar/other.c | 3 +-
objects/KAOS/goal.c | 3 +-
objects/KAOS/metaandorrel.c | 3 +-
objects/KAOS/other.c | 6 +--
objects/UML/association.c | 2 +-
objects/UML/branch.c | 3 +-
objects/UML/node.c | 3 +-
objects/UML/note.c | 4 +-
objects/chronogram/chronoline.c | 18 ++++----
objects/custom/custom_object.c | 10 +---
objects/flowchart/diamond.c | 10 +---
objects/flowchart/parallelogram.c | 10 +---
objects/network/basestation.c | 9 +---
objects/network/radiocell.c | 8 ++--
objects/network/wanlink.c | 11 ++---
objects/standard/polygon.c | 11 ++++-
plug-ins/cairo/diacairo-renderer.c | 16 ++-----
plug-ins/cgm/cgm.c | 31 ++-----------
plug-ins/drs/dia-render-script-import.c | 6 +--
plug-ins/drs/dia-render-script-renderer.c | 29 +++----------
plug-ins/dxf/dxf-export.c | 13 ++++--
plug-ins/hpgl/hpgl.c | 21 +++-------
plug-ins/libart/dialibartrenderer.c | 21 +++++++--
plug-ins/metapost/render_metapost.c | 29 +++++++++----
plug-ins/pgf/render_pgf.c | 24 +++--------
plug-ins/postscript/diapsrenderer.c | 22 ++++------
plug-ins/pstricks/render_pstricks.c | 27 ++++--------
plug-ins/python/diadissect.py | 3 +-
plug-ins/python/diastddia.py | 7 +++-
plug-ins/python/diasvg.py | 12 +----
plug-ins/python/export-render.py | 12 ++----
plug-ins/python/pydia-render.c | 65 +++++++----------------------
plug-ins/shape/shape-export.c | 14 ++++--
plug-ins/vdx/vdx-export.c | 46 ++++++++++++--------
plug-ins/wmf/wmf.cpp | 44 +++++++------------
plug-ins/wpg/wpg-import.c | 9 ++--
plug-ins/wpg/wpg.c | 32 ++++++--------
plug-ins/xfig/xfig-export.c | 24 +++++++----
58 files changed, 354 insertions(+), 592 deletions(-)
---
diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp
index 41d41f0..269b77c 100644
--- a/bindings/dia-renderer.cpp
+++ b/bindings/dia-renderer.cpp
@@ -124,13 +124,6 @@ dia::Renderer::fill_rect (Point *ul_corner, Point *lr_corner, Color *color)
assert (self);
DIA_RENDERER_GET_CLASS(self)->fill_rect (self, ul_corner, lr_corner, color);
}
-// the polygon is filled using the current fill type, no border is drawn
-void
-dia::Renderer::fill_polygon (Point *points, int num_points, Color *color)
-{
- assert (self);
- DIA_RENDERER_GET_CLASS(self)->fill_polygon (self, points, num_points, color);
-}
// Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle
void
dia::Renderer::draw_arc (Point *center, double width, double height,
@@ -199,12 +192,12 @@ dia::Renderer::draw_polyline (Point *points, int num_points, Color *color)
assert (self);
DIA_RENDERER_GET_CLASS(self)->draw_polyline (self, points, num_points, color);
}
-// Draw a polygone, using the current line style
+// Draw a polygon, using the current line and/or fill style
void
-dia::Renderer::draw_polygon (Point *points, int num_points, Color *color)
+dia::Renderer::draw_polygon (Point *points, int num_points, Color *fill, Color *stroke)
{
assert (self);
- DIA_RENDERER_GET_CLASS(self)->draw_polygon (self, points, num_points, color);
+ DIA_RENDERER_GET_CLASS(self)->draw_polygon (self, points, num_points, fill, stroke);
}
// draw a Text. It holds its own information like position, style, ...
void
diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h
index 9262844..47dc7b0 100644
--- a/bindings/dia-renderer.h
+++ b/bindings/dia-renderer.h
@@ -81,7 +81,7 @@ public :
virtual void fill_rect (Point *ul_corner, Point *lr_corner, Color *color);
//! the polygon is filled using the current fill type, no border is drawn
//! \ingroup RendererRequired
- virtual void fill_polygon (Point *points, int num_points, Color *color);
+ virtual void draw_polygon (Point *points, int num_points, Color *fill, Color *stroke);
//! Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle
//! \ingroup RendererRequired
virtual void draw_arc (Point *center, double width, double height,
@@ -118,9 +118,6 @@ public :
//! drawing a polyline - or fallback to single line segments
//! \ingroup RenderMedium
virtual void draw_polyline (Point *points, int num_points, Color *color);
- //! Draw a polygone, using the current line style
- //! \ingroup RenderMedium
- virtual void draw_polygon (Point *points, int num_points, Color *color);
//! draw a Text. It holds its own information like position, style, ...
//! \ingroup RenderMedium
virtual void draw_text (Text* text);
@@ -134,7 +131,7 @@ public :
//! a polyline with round coners
//! \ingroup RenderHigh
- virtual void draw_rounded_polyline (Point *points, int num_points, Color *color, double radius );
+ virtual void draw_rounded_polyline (Point *points, int num_points, Color *color, double radius);
//! specialized draw_rect() with round corners
//! \ingroup RenderHigh
virtual void draw_rounded_rect (Point *ul_corner, Point *lr_corner, Color *color, real radius);
diff --git a/lib/arrows.c b/lib/arrows.c
index ac945e0..1d5e84c 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -775,10 +775,9 @@ draw_fill_box(DiaRenderer *renderer, Point *to, Point *from,
calculate_box (poly, to, from, clength, cwidth);
if (fg_color == bg_color) {
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 4, fg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, fg_color, NULL);
} else {
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 4, bg_color);
- DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, fg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, bg_color, fg_color);
}
DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer,&poly[4],&poly[5],fg_color);
}
@@ -1089,7 +1088,7 @@ draw_triangle(DiaRenderer *renderer, Point *to, Point *from,
DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
- DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 3, fg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 3, bg_color, fg_color);
}
/** Draw a simple triangular arrow, with filled head.
@@ -1113,7 +1112,7 @@ fill_triangle(DiaRenderer *renderer, Point *to, Point *from,
DIA_RENDERER_GET_CLASS(renderer)->set_fillstyle(renderer, FILLSTYLE_SOLID);
DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 3, bg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 3, bg_color, NULL);
}
/** Calculate the points needed to draw a diamon arrowhead.
@@ -1189,7 +1188,7 @@ draw_diamond(DiaRenderer *renderer, Point *to, Point *from,
DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
- DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, NULL, color);
}
/** Draw a right-hand part of a diamond arrowhead.
@@ -1239,7 +1238,7 @@ fill_diamond(DiaRenderer *renderer, Point *to, Point *from,
DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 4, color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, color, NULL);
}
/** Calculate the points needed to draw a slashed-cross arrowhead.
@@ -1569,8 +1568,9 @@ draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from,
DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
if (fg_color == bg_color)
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 4, bg_color);
- DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, fg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, bg_color, NULL);
+ else
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 4, bg_color, fg_color);
}
/** Draw a rounded (half-circle) arrowhead.
@@ -1729,7 +1729,7 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from,
p_tri.y += delta.y * rapport;
}
calculate_arrow(poly, &p_tri, from, length, width);
- DIA_RENDERER_GET_CLASS(renderer)->fill_polygon(renderer, poly, 3, fg_color);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 3, fg_color, NULL);
}
/** Draw an arrowhead that is simply three dots (ellipsis)
diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c
index 87d7772..46a3a42 100644
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -61,9 +61,6 @@ static void set_fillstyle (DiaRenderer *renderer, FillStyle mode);
static void draw_line (DiaRenderer *renderer,
Point *start, Point *end,
Color *color);
-static void fill_polygon (DiaRenderer *renderer,
- Point *points, int num_points,
- Color *color);
static void draw_arc (DiaRenderer *renderer,
Point *center,
real width, real height,
@@ -111,7 +108,7 @@ static void draw_polyline (DiaRenderer *renderer,
Color *color);
static void draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static void draw_rounded_rect (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
Color *color, real radius);
@@ -230,7 +227,7 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
renderer_class->set_fillstyle = set_fillstyle;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
@@ -247,7 +244,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
/* medium level functions */
renderer_class->draw_rect = draw_rect;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
/* highest level functions */
renderer_class->draw_rounded_rect = draw_rounded_rect;
@@ -529,7 +525,8 @@ draw_line (DiaRenderer *object, Point *start, Point *end, Color *line_color)
}
static void
-fill_polygon (DiaRenderer *object, Point *points, int num_points, Color *line_color)
+draw_polygon (DiaRenderer *object, Point *points, int num_points,
+ Color *fill, Color *stroke)
{
DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
GdkGC *gc = renderer->gc;
@@ -544,11 +541,19 @@ fill_polygon (DiaRenderer *object, Point *points, int num_points, Color *line_co
gdk_points[i].x = x;
gdk_points[i].y = y;
}
+
+ if (fill) {
+ renderer_color_convert(renderer, fill, &color);
+ gdk_gc_set_foreground(gc, &color);
- renderer_color_convert(renderer, line_color, &color);
- gdk_gc_set_foreground(gc, &color);
+ gdk_draw_polygon(renderer->pixmap, gc, TRUE, gdk_points, num_points);
+ }
+ if (stroke) {
+ renderer_color_convert(renderer, stroke, &color);
+ gdk_gc_set_foreground(gc, &color);
- gdk_draw_polygon(renderer->pixmap, gc, TRUE, gdk_points, num_points);
+ gdk_draw_polygon(renderer->pixmap, gc, FALSE, gdk_points, num_points);
+ }
g_free(gdk_points);
}
@@ -953,32 +958,6 @@ draw_polyline (DiaRenderer *self,
g_free(gdk_points);
}
-static void
-draw_polygon (DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
-{
- DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self);
- GdkGC *gc = renderer->gc;
- GdkColor color;
- GdkPoint *gdk_points;
- int i,x,y;
-
- gdk_points = g_new(GdkPoint, num_points);
-
- for (i=0;i<num_points;i++) {
- dia_transform_coords(renderer->transform, points[i].x, points[i].y, &x, &y);
- gdk_points[i].x = x;
- gdk_points[i].y = y;
- }
-
- renderer_color_convert(renderer, line_color, &color);
- gdk_gc_set_foreground(gc, &color);
-
- gdk_draw_polygon(renderer->pixmap, gc, FALSE, gdk_points, num_points);
- g_free(gdk_points);
-}
-
/*!
* Implemented to avoid seams between arcs and lines caused by the base class working in real
* which than gets rounded independently to int here
diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c
index 82726f0..e153eb9 100644
--- a/lib/diaimportrenderer.c
+++ b/lib/diaimportrenderer.c
@@ -46,9 +46,6 @@ static void draw_line (DiaRenderer *renderer,
static void fill_rect (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
Color *color);
-static void fill_polygon (DiaRenderer *renderer,
- Point *points, int num_points,
- Color *color);
static void draw_arc (DiaRenderer *renderer,
Point *center,
real width, real height,
@@ -97,7 +94,7 @@ static void draw_rounded_polyline (DiaRenderer *renderer,
Color *color, real radius);
static void draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static void draw_rounded_rect (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
@@ -181,7 +178,7 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
renderer_class->draw_line = draw_line;
renderer_class->fill_rect = fill_rect;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_arc = draw_arc;
renderer_class->fill_arc = fill_arc;
renderer_class->draw_ellipse = draw_ellipse;
@@ -195,7 +192,6 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
renderer_class->draw_rect = draw_rect;
renderer_class->draw_rounded_polyline = draw_rounded_polyline;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
/* highest level functions */
renderer_class->draw_rounded_rect = draw_rounded_rect;
@@ -336,20 +332,6 @@ draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color)
draw_rounded_polyline (renderer, &points[0], 2, color, 0.0);
}
-/*!
- * \brief Fill the given ploygon
- * \memberof _DiaImportRenderer
- */
-static void
-fill_polygon (DiaRenderer *renderer, Point *points, int num_points, Color *color)
-{
- DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
- DiaObject *object = create_standard_polygon (num_points, points);
-
- _apply_style (self, object, color, NULL, 0.0);
- _push_object (self, object);
-}
-
static DiaObject *
_make_arc (Point *center,
real width, real height,
@@ -598,18 +580,18 @@ draw_rounded_polyline (DiaRenderer *renderer,
}
/*!
- * \brief Draw a polygon
+ * \brief Draw a polygon filled and/or stroked
* Creates a _Polygon object.
* \memberof _DiaImportRenderer
*/
static void
draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color)
+ Color *fill, Color *stroke)
{
DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
DiaObject *object = create_standard_polygon (num_points, points);
- _apply_style (self, object, NULL, color, 0.0);
+ _apply_style (self, object, fill, stroke, 0.0);
_push_object (self, object);
}
diff --git a/lib/diapathrenderer.c b/lib/diapathrenderer.c
index de1058d..991c48c 100644
--- a/lib/diapathrenderer.c
+++ b/lib/diapathrenderer.c
@@ -306,7 +306,7 @@ draw_line(DiaRenderer *self,
static void
_polyline(DiaRenderer *self,
Point *points, int num_points,
- const Color *stroke, const Color *fill)
+ const Color *fill, const Color *stroke)
{
DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
int i;
@@ -327,34 +327,24 @@ draw_polyline(DiaRenderer *self,
Point *points, int num_points,
Color *line_colour)
{
- _polyline (self, points, num_points, line_colour, NULL);
+ _polyline (self, points, num_points, NULL, line_colour);
_remove_duplicated_path (DIA_PATH_RENDERER (self));
}
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
- GArray *path = _get_current_path (renderer, line_colour, NULL);
+ GArray *path = _get_current_path (renderer, fill, stroke);
- /* FIXME: can't be that simple ;) */
- _polyline (self, points, num_points, line_colour, NULL);
+ /* can't be that simple ;) */
+ _polyline (self, points, num_points, fill, stroke);
_path_lineto (path, &points[0]);
+ /* usage of the optimized draw_polygon should imply this being superfluous */
_remove_duplicated_path (renderer);
}
static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
-{
- DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
- GArray *path = _get_current_path (renderer, NULL, color);
-
- _polyline (self, points, num_points, NULL, color);
- _path_lineto (path, &points[0]);
-}
-static void
_rect (DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
const Color *stroke, const Color *fill)
@@ -727,7 +717,7 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
renderer_class->set_fillstyle = set_fillstyle;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
@@ -741,7 +731,6 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
/* medium level functions */
renderer_class->draw_rect = draw_rect;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_bezier = draw_bezier;
renderer_class->draw_beziergon = draw_beziergon;
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index e0a6873..c31e610 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -70,9 +70,6 @@ static void draw_line (DiaRenderer *renderer,
static void fill_rect (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
Color *color);
-static void fill_polygon (DiaRenderer *renderer,
- Point *points, int num_points,
- Color *color);
static void draw_arc (DiaRenderer *renderer,
Point *center,
real width, real height,
@@ -125,7 +122,7 @@ static void draw_rounded_polyline (DiaRenderer *renderer,
Color *color, real radius);
static void draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static real get_text_width (DiaRenderer *renderer,
const gchar *text, int length);
@@ -270,7 +267,7 @@ draw_object (DiaRenderer *renderer,
DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
- DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, pt, 4, &red);
+ DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, pt, 4, NULL, &red);
DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &pt[0], &pt[2], &red);
DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &pt[1], &pt[3], &red);
#endif
@@ -325,7 +322,7 @@ dia_renderer_class_init (DiaRendererClass *klass)
renderer_class->draw_line = draw_line;
renderer_class->fill_rect = fill_rect;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_arc = draw_arc;
renderer_class->fill_arc = fill_arc;
renderer_class->draw_ellipse = draw_ellipse;
@@ -339,7 +336,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
renderer_class->draw_rect = draw_rect;
renderer_class->draw_rounded_polyline = draw_rounded_polyline;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_text = draw_text;
renderer_class->draw_text_line = draw_text_line;
@@ -433,13 +429,6 @@ draw_line (DiaRenderer *renderer, Point *start, Point *end, Color *color)
}
static void
-fill_polygon (DiaRenderer *renderer, Point *points, int num_points, Color *color)
-{
- g_warning ("%s::fill_polygon not implemented!",
- G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
-}
-
-static void
draw_arc (DiaRenderer *renderer, Point *center,
real width, real height, real angle1, real angle2,
Color *color)
@@ -745,16 +734,11 @@ draw_beziergon (DiaRenderer *renderer,
bezier->currpoint = 0;
approximate_bezier (bezier, points, numpoints);
- if (fill)
- DIA_RENDERER_GET_CLASS (renderer)->fill_polygon (renderer,
- bezier->points,
- bezier->currpoint,
- fill);
- if (stroke)
+ if (fill || stroke)
DIA_RENDERER_GET_CLASS (renderer)->draw_polygon (renderer,
bezier->points,
bezier->currpoint,
- stroke);
+ fill, stroke);
}
static void
@@ -864,15 +848,21 @@ draw_rounded_polyline (DiaRenderer *renderer,
klass->draw_line(renderer, &p3, &p4, color);
}
+/*!
+ * \brief Fallback implementation of draw_polygon mostly ignoring the fill
+ * \memberof _DiaRenderer
+ */
static void
draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color)
+ Color *fill, Color *stroke)
{
DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer);
int i;
+ Color *color = fill ? fill : stroke;
g_return_if_fail (num_points > 1);
+ g_return_if_fail (color != NULL);
for (i = 0; i < num_points - 1; i++)
klass->draw_line (renderer, &points[i+0], &points[i+1], color);
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 12c393b..43b049e 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -137,10 +137,10 @@ struct _DiaRendererClass
void (*fill_rect) (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
Color *color);
- /*! the polygon is filled using the current fill type, no border is drawn */
- void (*fill_polygon) (DiaRenderer *renderer,
+ /*! the polygon is filled using the current fill type and stroked with the current line style */
+ void (*draw_polygon) (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
/*! Draw an arc, given its center, the bounding box (widget, height),
the start angle and the end angle */
void (*draw_arc) (DiaRenderer *renderer,
@@ -197,12 +197,6 @@ struct _DiaRendererClass
void (*draw_polyline) (DiaRenderer *renderer,
Point *points, int num_points,
Color *color);
- /*! Draw a polygon, using the current line style
- The polygon is closed even if the first point is not the same as the
- last point */
- void (*draw_polygon) (DiaRenderer *renderer,
- Point *points, int num_points,
- Color *color);
/*! Print a Text. It holds its own information. */
void (*draw_text) (DiaRenderer *renderer,
Text *text);
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 3dea5dc..4f3da9e 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -466,9 +466,9 @@ draw_polyline(DiaRenderer *self,
}
static void
-draw_polygon(DiaRenderer *self,
+draw_polygon (DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
int i;
@@ -476,46 +476,26 @@ draw_polygon(DiaRenderer *self,
GString *str;
gchar px_buf[DTOSTR_BUF_SIZE];
gchar py_buf[DTOSTR_BUF_SIZE];
+ gchar *style;
node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL);
-
- xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, line_colour));
-
- str = g_string_new(NULL);
- for (i = 0; i < num_points; i++)
- g_string_append_printf(str, "%s,%s ",
- dia_svg_dtostr(px_buf, points[i].x),
- dia_svg_dtostr(py_buf, points[i].y) );
- xmlSetProp(node, (const xmlChar *)"points", (xmlChar *) str->str);
- g_string_free(str, TRUE);
-}
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *colour)
-{
- DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
- int i;
- xmlNodePtr node;
- GString *str;
- gchar px_buf[DTOSTR_BUF_SIZE];
- gchar py_buf[DTOSTR_BUF_SIZE];
+ style = g_strdup_printf ("%s;%s",
+ stroke ? get_draw_style (renderer, stroke) : "stroke:none",
+ fill ? get_fill_style (renderer, fill) : "fill:none");
+ xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
+ g_free (style);
- node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL);
-
- xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_fill_style(renderer, colour));
- xmlSetProp(node, (const xmlChar *)"fill-rule", (const xmlChar *) "evenodd");
+ if (fill)
+ xmlSetProp(node, (const xmlChar *)"fill-rule", (const xmlChar *) "evenodd");
str = g_string_new(NULL);
for (i = 0; i < num_points; i++)
g_string_append_printf(str, "%s,%s ",
dia_svg_dtostr(px_buf, points[i].x),
dia_svg_dtostr(py_buf, points[i].y) );
- xmlSetProp(node, (const xmlChar *)"points", (xmlChar *)str->str);
+ xmlSetProp(node, (const xmlChar *)"points", (xmlChar *) str->str);
g_string_free(str, TRUE);
- /* change this if our rendering model allows more */
- xmlSetProp(node, (const xmlChar *)"fill-rule", (const xmlChar *) "evenodd");
}
static void
@@ -1000,7 +980,6 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
renderer_class->set_pattern = set_pattern;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/lib/diatransformrenderer.c b/lib/diatransformrenderer.c
index e0f6449..2a8c136 100644
--- a/lib/diatransformrenderer.c
+++ b/lib/diatransformrenderer.c
@@ -237,10 +237,8 @@ _polyline(DiaRenderer *self,
for (i = 0; i < num_points; ++i)
transform_point (&a_pts[i], m);
}
- if (fill)
- DIA_RENDERER_GET_CLASS (renderer->worker)->fill_polygon (renderer->worker, a_pts, num_points, fill);
- else if (closed)
- DIA_RENDERER_GET_CLASS (renderer->worker)->draw_polygon (renderer->worker, a_pts, num_points, stroke);
+ if (closed)
+ DIA_RENDERER_GET_CLASS (renderer->worker)->draw_polygon (renderer->worker, a_pts, num_points, fill,
stroke);
else
DIA_RENDERER_GET_CLASS (renderer->worker)->draw_polyline (renderer->worker, a_pts, num_points, stroke);
}
@@ -266,17 +264,6 @@ draw_polygon(DiaRenderer *self,
{
_polyline (self, points, num_points, line_colour, NULL, TRUE);
}
-/*!
- * \brief Transform polygon and delegate fill
- * \memberof _DiaTransformRenderer
- */
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
-{
- _polyline (self, points, num_points, NULL, color, TRUE);
-}
static void
_rect (DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
@@ -570,7 +557,7 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
renderer_class->set_fillstyle = set_fillstyle;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
@@ -584,7 +571,6 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
/* medium level functions */
renderer_class->draw_rect = draw_rect;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_bezier = draw_bezier;
renderer_class->draw_beziergon = draw_beziergon;
diff --git a/makefile.msc b/makefile.msc
index a6579cc..94fedec 100644
--- a/makefile.msc
+++ b/makefile.msc
@@ -54,9 +54,6 @@ full: build \
compile :
cd lib
nmake -nologo -f makefile.msc
- cd ..\bindings
-# Comment out the following line, if you want to build without python
- nmake -nologo -f makefile.msc
cd ..\app
nmake -nologo -f makefile.msc
cd ..\objects
@@ -69,6 +66,9 @@ compile :
cd ..\..
cd tests
nmake -nologo -f makefile.msc
+ cd ..\bindings
+# Comment out the following line, if you want to build without python
+ nmake -nologo -f makefile.msc
cd ..
clean :
diff --git a/objects/AADL/aadlbus.c b/objects/AADL/aadlbus.c
index 0ab5e69..8ceb4f3 100755
--- a/objects/AADL/aadlbus.c
+++ b/objects/AADL/aadlbus.c
@@ -78,8 +78,7 @@ static void aadlbus_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, points, 10, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 10, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 10, &aadlbox->fill_color, &aadlbox->line_color);
}
static void aadlbus_draw(Aadlbox *aadlbox, DiaRenderer *renderer)
diff --git a/objects/AADL/aadldevice.c b/objects/AADL/aadldevice.c
index 7e2496d..5703fd5 100755
--- a/objects/AADL/aadldevice.c
+++ b/objects/AADL/aadldevice.c
@@ -62,8 +62,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[3].x = x + w, points[3].y = y;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
points[0].x = points[3].x, points[0].y = points[3].y;
points[1].x = points[0].x + AADL_DEVICE_DEPTH;
@@ -74,8 +73,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[3].x = points[0].x, points[3].y = points[0].y + h;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
points[0].x = x + w;
points[0].y = y + h;
@@ -89,8 +87,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[3].x = x;
points[3].y = y + h;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
points[0].x = x;
points[0].y = y;
@@ -98,8 +95,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[1].x = x - AADL_DEVICE_DEPTH;
points[1].y = y - AADL_DEVICE_DEPTH;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
}
diff --git a/objects/AADL/aadlpackage.c b/objects/AADL/aadlpackage.c
index bdca818..7169fa1 100755
--- a/objects/AADL/aadlpackage.c
+++ b/objects/AADL/aadlpackage.c
@@ -62,8 +62,7 @@ static void aadlpackage_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[7].x = x + w; points[7].y = y + h;
points[8].x = x ; points[8].y = y + h;
- renderer_ops->fill_polygon(renderer, points, 9, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 9, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 9, &aadlbox->fill_color, &aadlbox->line_color);
}
diff --git a/objects/AADL/aadlport.c b/objects/AADL/aadlport.c
index 2b16220..ac3f84f 100755
--- a/objects/AADL/aadlport.c
+++ b/objects/AADL/aadlport.c
@@ -94,8 +94,7 @@ rotate_around_origin (Point *p, real angle) /* FIXME: no namespace */
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER); \
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); \
\
- renderer_ops->fill_polygon(renderer, p, 3, &color_black); \
- renderer_ops->draw_polygon(renderer, p, 3, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 3, &color_black, &color_black);
#define draw_in_event_port() \
p[0].x = AADL_PORT_WIDTH_A; \
@@ -143,8 +142,7 @@ rotate_around_origin (Point *p, real angle) /* FIXME: no namespace */
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER); \
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); \
\
- renderer_ops->fill_polygon(renderer, p, 3, &color_black); \
- renderer_ops->draw_polygon(renderer, p, 3, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 3, &color_black, &color_black);
#define draw_out_event_port() \
p[0].x = - AADL_PORT_WIDTH_A; \
@@ -197,8 +195,7 @@ rotate_around_origin (Point *p, real angle) /* FIXME: no namespace */
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER); \
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); \
\
- renderer_ops->fill_polygon(renderer, p, 4, &color_black); \
- renderer_ops->draw_polygon(renderer, p, 4, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 4, &color_black, &color_black);
@@ -229,7 +226,7 @@ rotate_around_origin (Point *p, real angle) /* FIXME: no namespace */
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER); \
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); \
\
- renderer_ops->draw_polygon(renderer, p, 4, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 4, NULL, &color_black);
/* FIXME: should i make methods from this function ? */
@@ -277,8 +274,7 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, p, 5, &color_white);
- renderer_ops->draw_polygon(renderer, p, 5, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 5, &color_white, &color_black);
break;
@@ -314,8 +310,7 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, p, 5, &color_white);
- renderer_ops->draw_polygon(renderer, p, 5, &color_black);
+ renderer_ops->draw_polygon(renderer, p, 5, &color_white, &color_black);
break;
diff --git a/objects/AADL/aadlprocess.c b/objects/AADL/aadlprocess.c
index 3111368..af54d21 100755
--- a/objects/AADL/aadlprocess.c
+++ b/objects/AADL/aadlprocess.c
@@ -58,8 +58,7 @@ void aadlbox_draw_inclined_box(Aadlbox *aadlbox, DiaRenderer *renderer,
renderer_ops->set_linestyle(renderer, linestyle);
renderer_ops->set_dashlength(renderer, AADLBOX_DASH_LENGTH);
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
}
diff --git a/objects/AADL/aadlprocessor.c b/objects/AADL/aadlprocessor.c
index 4b9499b..15446ac 100755
--- a/objects/AADL/aadlprocessor.c
+++ b/objects/AADL/aadlprocessor.c
@@ -62,8 +62,7 @@ static void aadlprocessor_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[3].x = x + w, points[3].y = y;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
points[0].x = points[3].x, points[0].y = points[3].y;
points[1].x = points[0].x + AADL_PROCESSOR_DEPTH;
@@ -74,8 +73,7 @@ static void aadlprocessor_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
points[3].x = points[0].x, points[3].y = points[0].y + h;
- renderer_ops->fill_polygon(renderer, points, 4, &aadlbox->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
}
static Aadlbox_specific aadlprocessor_specific =
diff --git a/objects/Database/table.c b/objects/Database/table.c
index d834572..07b7994 100644
--- a/objects/Database/table.c
+++ b/objects/Database/table.c
@@ -661,7 +661,7 @@ fill_diamond (DiaRenderer *renderer, real half_height, real width,
DIA_RENDERER_GET_CLASS (renderer)->set_fillstyle (renderer, FILLSTYLE_SOLID);
DIA_RENDERER_GET_CLASS (renderer)->set_linejoin (renderer, LINEJOIN_MITER);
- DIA_RENDERER_GET_CLASS (renderer)->fill_polygon (renderer, poly, 4, color);
+ DIA_RENDERER_GET_CLASS (renderer)->draw_polygon (renderer, poly, 4, color, NULL);
}
static real
diff --git a/objects/ER/entity.c b/objects/ER/entity.c
index ed26a2b..30b78ef 100644
--- a/objects/ER/entity.c
+++ b/objects/ER/entity.c
@@ -284,15 +284,13 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
corners[3].y = elem->corner.y + elem->height;
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, corners, 4,
- &entity->inner_color);
-
renderer_ops->set_linewidth(renderer, entity->border_width);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->draw_polygon(renderer, corners, 4,
- &entity->border_color);
+ renderer_ops->draw_polygon (renderer, corners, 4,
+ &entity->inner_color,
+ &entity->border_color);
}
p.x = elem->corner.x + elem->width / 2.0;
diff --git a/objects/ER/relationship.c b/objects/ER/relationship.c
index 425c01e..f539caa 100644
--- a/objects/ER/relationship.c
+++ b/objects/ER/relationship.c
@@ -266,15 +266,13 @@ relationship_draw(Relationship *relationship, DiaRenderer *renderer)
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, corners, 4,
- &relationship->inner_color);
-
renderer_ops->set_linewidth(renderer, relationship->border_width);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->draw_polygon(renderer, corners, 4,
- &relationship->border_color);
+ renderer_ops->draw_polygon(renderer, corners, 4,
+ &relationship->inner_color,
+ &relationship->border_color);
if (relationship->rotate) {
lc.x = corners[1].x + 0.2;
@@ -298,7 +296,7 @@ relationship_draw(Relationship *relationship, DiaRenderer *renderer)
corners[3].y -= diff*DIAMOND_RATIO;
renderer_ops->draw_polygon(renderer, corners, 4,
- &relationship->border_color);
+ NULL, &relationship->border_color);
}
renderer_ops->set_font(renderer, relationship->font, relationship->font_height);
diff --git a/objects/Istar/other.c b/objects/Istar/other.c
index 662ff1d..27698c5 100644
--- a/objects/Istar/other.c
+++ b/objects/Istar/other.c
@@ -316,9 +316,8 @@ other_draw(Other *other, DiaRenderer *renderer)
case TASK:
compute_task(other,pl);
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, pl, 6, &OTHER_BG_COLOR);
renderer_ops->set_linewidth(renderer, OTHER_LINE_WIDTH);
- renderer_ops->draw_polygon(renderer, pl, 6, &OTHER_FG_COLOR);
+ renderer_ops->draw_polygon(renderer, pl, 6, &OTHER_BG_COLOR, &OTHER_FG_COLOR);
break;
}
diff --git a/objects/KAOS/goal.c b/objects/KAOS/goal.c
index d22a001..2b1c5d6 100644
--- a/objects/KAOS/goal.c
+++ b/objects/KAOS/goal.c
@@ -399,7 +399,6 @@ goal_draw(Goal *goal, DiaRenderer *renderer)
if (goal->type!=SOFTGOAL) {
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, pl, 4, &GOAL_BG_COLOR);
if ((goal->type==REQUIREMENT) || (goal->type==ASSUMPTION)) {
renderer_ops->set_linewidth(renderer, GOAL_LINE_DOUBLE_WIDTH);
@@ -407,7 +406,7 @@ goal_draw(Goal *goal, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, GOAL_LINE_SIMPLE_WIDTH);
}
- renderer_ops->draw_polygon(renderer, pl, 4, &GOAL_FG_COLOR);
+ renderer_ops->draw_polygon(renderer, pl, 4, &GOAL_BG_COLOR, &GOAL_FG_COLOR);
/* adding decoration for assumption */
if (goal->type==ASSUMPTION) {
diff --git a/objects/KAOS/metaandorrel.c b/objects/KAOS/metaandorrel.c
index 29b43ee..1523b3d 100644
--- a/objects/KAOS/metaandorrel.c
+++ b/objects/KAOS/metaandorrel.c
@@ -472,8 +472,7 @@ maor_draw(Maor *maor, DiaRenderer *renderer)
case MAOR_OPER_REF:
compute_oper(&p1,MAOR_REF_WIDTH,MAOR_REF_HEIGHT,pl);
- renderer_ops->fill_polygon(renderer,pl,7,&MAOR_BG_COLOR);
- renderer_ops->draw_polygon(renderer,pl,7,&MAOR_FG_COLOR);
+ renderer_ops->draw_polygon(renderer,pl,7,&MAOR_BG_COLOR,&MAOR_FG_COLOR);
draw_agent_icon(maor,MAOR_REF_WIDTH,MAOR_REF_HEIGHT,renderer);
break;
}
diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c
index c12c314..d39ef89 100644
--- a/objects/KAOS/other.c
+++ b/objects/KAOS/other.c
@@ -354,15 +354,11 @@ other_draw(Other *other, DiaRenderer *renderer)
if (other->type==AGENT) {
compute_agent(other,pl);
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer,
- pl,
- 6,
- &OTHER_BG_COLOR);
-
renderer_ops->set_linewidth(renderer, OTHER_LINE_SIMPLE_WIDTH);
renderer_ops->draw_polygon(renderer,
pl,
6,
+ &OTHER_BG_COLOR,
&OTHER_FG_COLOR);
draw_agent_icon(other,renderer);
diff --git a/objects/UML/association.c b/objects/UML/association.c
index c0814cd..caac8c5 100644
--- a/objects/UML/association.c
+++ b/objects/UML/association.c
@@ -466,7 +466,7 @@ association_draw(Association *assoc, DiaRenderer *renderer)
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
if (assoc_get_direction_poly (assoc, poly))
- renderer_ops->fill_polygon(renderer, poly, 3, &assoc->line_color);
+ renderer_ops->draw_polygon(renderer, poly, 3, &assoc->line_color, NULL);
for (i=0;i<2;i++) {
AssociationEnd *end = &assoc->end[i];
diff --git a/objects/UML/branch.c b/objects/UML/branch.c
index a1f4098..0e86940 100644
--- a/objects/UML/branch.c
+++ b/objects/UML/branch.c
@@ -218,8 +218,7 @@ static void branch_draw(Branch *branch, DiaRenderer *renderer)
renderer_ops->set_linewidth(renderer, BRANCH_BORDERWIDTH);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, points, 4, &branch->fill_color);
- renderer_ops->draw_polygon(renderer, points, 4, &branch->line_color);
+ renderer_ops->draw_polygon(renderer, points, 4, &branch->fill_color, &branch->line_color);
}
static void branch_update_data(Branch *branch)
diff --git a/objects/UML/node.c b/objects/UML/node.c
index 89379ba..afe165a 100644
--- a/objects/UML/node.c
+++ b/objects/UML/node.c
@@ -256,8 +256,7 @@ static void node_draw(Node *node, DiaRenderer *renderer)
points[5].x = x; points[5].y = y + h;
points[6].x = x; points[6].y = y;
- renderer_ops->fill_polygon(renderer, points, 7, &node->fill_color);
- renderer_ops->draw_polygon(renderer, points, 7, &node->line_color);
+ renderer_ops->draw_polygon(renderer, points, 7, &node->fill_color, &node->line_color);
/* Draw interior lines */
points[0].x = x; points[0].y = y;
diff --git a/objects/UML/note.c b/objects/UML/note.c
index 35c7940..dd03241 100644
--- a/objects/UML/note.c
+++ b/objects/UML/note.c
@@ -243,11 +243,9 @@ note_draw(Note *note, DiaRenderer *renderer)
poly[4].x = x;
poly[4].y = y+h;
- renderer_ops->fill_polygon(renderer,
- poly, 5,
- ¬e->fill_color);
renderer_ops->draw_polygon(renderer,
poly, 5,
+ ¬e->fill_color,
¬e->line_color);
poly[0] = poly[1];
diff --git a/objects/chronogram/chronoline.c b/objects/chronogram/chronoline.c
index 7013226..abf0b74 100644
--- a/objects/chronogram/chronoline.c
+++ b/objects/chronogram/chronoline.c
@@ -302,11 +302,11 @@ cld_onebit(Chronoline *chronoline,
if (fill) {
if ((s1 == CLE_UNKNOWN) || (s2 == CLE_UNKNOWN)) {
- renderer_ops->fill_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
- &chronoline->datagray);
+ renderer_ops->draw_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
+ &chronoline->datagray, NULL);
} else {
- renderer_ops->fill_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
- &color_white);
+ renderer_ops->draw_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
+ &color_white, NULL);
}
} else {
renderer_ops->draw_line(renderer,&pts[1],&pts[2],
@@ -346,12 +346,12 @@ cld_multibit(Chronoline *chronoline,
if (fill) {
if ((s1 == CLE_UNKNOWN) || (s2 == CLE_UNKNOWN)) {
- renderer_ops->fill_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
- &chronoline->datagray);
+ renderer_ops->draw_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
+ &chronoline->datagray, NULL);
} else {
- renderer_ops->fill_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
- &color_white);
- }
+ renderer_ops->draw_polygon(renderer,pts,sizeof(pts)/sizeof(pts[0]),
+ &color_white, NULL);
+ }
} else {
renderer_ops->draw_line(renderer,&pts[1],&pts[2],
&chronoline->data_color);
diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c
index 564af6f..7171758 100644
--- a/objects/custom/custom_object.c
+++ b/objects/custom/custom_object.c
@@ -974,14 +974,10 @@ custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer,
for (i = 0; i < el->polygon.npoints; i++)
transform_coord(custom, &el->polygon.points[i],
&g_array_index(arr, Point, i));
- if (custom->show_background && el->any.s.fill != DIA_SVG_COLOUR_NONE)
- renderer_ops->fill_polygon(renderer,
+ renderer_ops->draw_polygon(renderer,
(Point *)arr->data, el->polygon.npoints,
- bg);
- if (el->any.s.stroke != DIA_SVG_COLOUR_NONE)
- renderer_ops->draw_polygon(renderer,
- (Point *)arr->data, el->polygon.npoints,
- fg);
+ (custom->show_background && el->any.s.fill != DIA_SVG_COLOUR_NONE) ? bg :
NULL,
+ (el->any.s.stroke != DIA_SVG_COLOUR_NONE) ? fg : NULL);
break;
case GE_RECT:
transform_coord(custom, &el->rect.corner1, &p1);
diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c
index 62f2070..ffa37ab 100644
--- a/objects/flowchart/diamond.c
+++ b/objects/flowchart/diamond.c
@@ -343,21 +343,17 @@ diamond_draw(Diamond *diamond, DiaRenderer *renderer)
pts[2].y += elem->height;
pts[3].y += elem->height / 2.0;
- if (diamond->show_background) {
+ if (diamond->show_background)
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-
- renderer_ops->fill_polygon(renderer,
- pts, 4,
- &diamond->inner_color);
- }
renderer_ops->set_linewidth(renderer, diamond->border_width);
renderer_ops->set_linestyle(renderer, diamond->line_style);
renderer_ops->set_dashlength(renderer, diamond->dashlength);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->draw_polygon(renderer,
+ renderer_ops->draw_polygon (renderer,
pts, 4,
+ (diamond->show_background) ? &diamond->inner_color : NULL,
&diamond->border_color);
text_draw(diamond->text, renderer);
diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c
index b8c0867..7d4a20a 100644
--- a/objects/flowchart/parallelogram.c
+++ b/objects/flowchart/parallelogram.c
@@ -353,21 +353,17 @@ pgram_draw(Pgram *pgram, DiaRenderer *renderer)
pts[3].x -= offs;
}
- if (pgram->show_background) {
+ if (pgram->show_background)
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-
- renderer_ops->fill_polygon(renderer,
- pts, 4,
- &pgram->inner_color);
- }
renderer_ops->set_linewidth(renderer, pgram->border_width);
renderer_ops->set_linestyle(renderer, pgram->line_style);
renderer_ops->set_dashlength(renderer, pgram->dashlength);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
- renderer_ops->draw_polygon(renderer,
+ renderer_ops->draw_polygon (renderer,
pts, 4,
+ (pgram->show_background) ? &pgram->inner_color : NULL,
&pgram->border_color);
text_draw(pgram->text, renderer);
diff --git a/objects/network/basestation.c b/objects/network/basestation.c
index 7dd2728..428da71 100644
--- a/objects/network/basestation.c
+++ b/objects/network/basestation.c
@@ -258,9 +258,8 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
points[1] = ct; points[1].x += r/4.0; points[1].y -= 3.0*r/4.0;
points[2] = ct; points[2].x += r/4.0; points[2].y += 1.0;
points[3] = ct; points[3].x -= r/4.0; points[3].y += 1.0;
- renderer_ops->fill_polygon(renderer, points, 4,
- &basestation->fill_colour);
renderer_ops->draw_polygon(renderer, points, 4,
+ &basestation->fill_colour,
&basestation->line_colour);
/* bottom */
renderer_ops->fill_ellipse(renderer, &cb, r, r/2.0,
@@ -291,18 +290,16 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
points[1] = ct; points[1].x += 3.0*r/4.0; points[1].y -= r/2.0;
points[2] = ct; points[2].x += 3.0*r/4.0; points[2].y += 1.0 - r/2.0;
points[3] = ct; points[3].x += r/4.0; points[3].y += 1.0;
- renderer_ops->fill_polygon(renderer, points, 4,
- &basestation->fill_colour);
renderer_ops->draw_polygon(renderer, points, 4,
+ &basestation->fill_colour,
&basestation->line_colour);
/* antenna 3 */
points[0] = ct; points[0].x -= r/4.0; points[0].y -= 0;
points[1] = ct; points[1].x -= 3.0*r/4.0; points[1].y -= r/2.0;
points[2] = ct; points[2].x -= 3.0*r/4.0; points[2].y += 1.0 - r/2.0;
points[3] = ct; points[3].x -= r/4.0; points[3].y += 1.0;
- renderer_ops->fill_polygon(renderer, points, 4,
- &basestation->fill_colour);
renderer_ops->draw_polygon(renderer, points, 4,
+ &basestation->fill_colour,
&basestation->line_colour);
text_draw(basestation->text, renderer);
}
diff --git a/objects/network/radiocell.c b/objects/network/radiocell.c
index 636156d..c422bf5 100644
--- a/objects/network/radiocell.c
+++ b/objects/network/radiocell.c
@@ -252,16 +252,16 @@ radiocell_draw(RadioCell *radiocell, DiaRenderer *renderer)
points = &poly->points[0];
n = poly->numpoints;
- if (radiocell->show_background) {
+ if (radiocell->show_background)
renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
- renderer_ops->fill_polygon(renderer, points, n, &radiocell->fill_colour);
- }
renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
renderer_ops->set_linestyle(renderer, radiocell->line_style);
renderer_ops->set_linewidth(renderer, radiocell->line_width);
renderer_ops->set_dashlength(renderer, radiocell->dashlength);
- renderer_ops->draw_polygon(renderer, points, n, &radiocell->line_colour);
+ renderer_ops->draw_polygon(renderer, points, n,
+ (radiocell->show_background) ? &radiocell->fill_colour : NULL,
+ &radiocell->line_colour);
text_draw(radiocell->text, renderer);
}
diff --git a/objects/network/wanlink.c b/objects/network/wanlink.c
index 043347a..a966675 100644
--- a/objects/network/wanlink.c
+++ b/objects/network/wanlink.c
@@ -219,17 +219,16 @@ static void
wanlink_draw (WanLink *wanlink, DiaRenderer *renderer)
{
DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
-
+
assert (wanlink != NULL);
assert (renderer != NULL);
-
+
renderer_ops->set_linewidth(renderer, FLASH_LINE);
renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
-
-
- renderer_ops->fill_polygon(renderer, wanlink->poly, WANLINK_POLY_LEN, &wanlink->fill_color);
- renderer_ops->draw_polygon(renderer, wanlink->poly, WANLINK_POLY_LEN, &wanlink->line_color);
+
+ renderer_ops->draw_polygon (renderer, wanlink->poly, WANLINK_POLY_LEN,
+ &wanlink->fill_color, &wanlink->line_color);
}
static real
diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c
index 2444922..9f0b8ca 100644
--- a/objects/standard/polygon.c
+++ b/objects/standard/polygon.c
@@ -221,6 +221,7 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer)
PolyShape *poly = &polygon->poly;
Point *points;
int n;
+ Color fill;
points = &poly->points[0];
n = poly->numpoints;
@@ -232,15 +233,19 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer)
renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
if (polygon->show_background) {
- Color fill = polygon->inner_color;
+ fill = polygon->inner_color;
if (polygon->pattern) {
dia_pattern_get_fallback_color (polygon->pattern, &fill);
if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
renderer_ops->set_pattern (renderer, polygon->pattern);
}
- renderer_ops->fill_polygon(renderer, points, n, &fill);
}
- renderer_ops->draw_polygon(renderer, points, n, &polygon->line_color);
+ renderer_ops->draw_polygon (renderer, points, n,
+ (polygon->show_background) ? &fill : NULL,
+ &polygon->line_color);
+ if (polygon->show_background && polygon->pattern &&
+ renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
+ renderer_ops->set_pattern (renderer, NULL); /* reset*/
}
static DiaObject *
diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c
index 659a99d..e2e9271 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -636,17 +636,12 @@ _polygon(DiaRenderer *self,
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *color)
+ Color *fill, Color *stroke)
{
- _polygon (self, points, num_points, color, FALSE);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
-{
- _polygon (self, points, num_points, color, TRUE);
+ if (fill)
+ _polygon (self, points, num_points, fill, TRUE);
+ if (stroke)
+ _polygon (self, points, num_points, stroke, FALSE);
}
static void
@@ -1250,7 +1245,6 @@ cairo_renderer_class_init (DiaCairoRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c
index 62992f4..4d391d6 100644
--- a/plug-ins/cgm/cgm.c
+++ b/plug-ins/cgm/cgm.c
@@ -272,10 +272,7 @@ static void draw_polyline(DiaRenderer *self,
Color *line_colour);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_colour);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *colour);
@@ -781,31 +778,14 @@ draw_polyline(DiaRenderer *self,
}
static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_colour)
+draw_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
{
CgmRenderer *renderer = CGM_RENDERER(self);
int i;
- write_filledge_attributes(renderer, NULL, line_colour);
-
- write_elhead(renderer->file, 4, 7, num_points * 2 * REALSIZE);
- for (i = 0; i < num_points; i++) {
- write_real(renderer->file, points[i].x);
- write_real(renderer->file, swap_y(renderer, points[i].y));
- }
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *colour)
-{
- CgmRenderer *renderer = CGM_RENDERER(self);
- int i;
-
- write_filledge_attributes(renderer, colour, NULL);
+ write_filledge_attributes(renderer, fill, stroke);
write_elhead(renderer->file, 4, 7, num_points * 2 * REALSIZE);
for (i = 0; i < num_points; i++) {
@@ -1369,7 +1349,6 @@ cgm_renderer_class_init (CgmRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index d93ca4e..d9cdcf0 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -294,10 +294,8 @@ _render_object (xmlNodePtr render, DiaContext *ctx)
} else if ( xmlStrcmp (node->name, (const xmlChar *)"polygon") == 0) {
GArray *path = _parse_points (node, "points");
if (path) {
- if (fill)
- ops->fill_polygon (ir, &g_array_index(path,Point,0), path->len, fill);
- if (stroke)
- ops->draw_polygon (ir, &g_array_index(path,Point,0), path->len, stroke);
+ if (fill || stroke)
+ ops->draw_polygon (ir, &g_array_index(path,Point,0), path->len, fill, stroke);
g_array_free (path, TRUE);
}
} else if (xmlStrcmp (node->name, (const xmlChar *)"arc") == 0) {
diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c
index fce674b..7e9c5b4 100644
--- a/plug-ins/drs/dia-render-script-renderer.c
+++ b/plug-ins/drs/dia-render-script-renderer.c
@@ -435,10 +435,9 @@ draw_polyline(DiaRenderer *self,
}
static void
-_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color,
- gboolean fill)
+draw_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
{
DrsRenderer *renderer = DRS_RENDERER (self);
xmlNodePtr node;
@@ -449,24 +448,9 @@ _polygon(DiaRenderer *self,
(const xmlChar *)"polygon", NULL);
_node_set_points (node, points, num_points);
if (fill)
- _node_set_color (node, "fill", color);
- else
- _node_set_color (node, "stroke", color);
-}
-static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
-{
- _polygon (self, points, num_points, color, FALSE);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
-{
- _polygon (self, points, num_points, color, TRUE);
+ _node_set_color (node, "fill", fill);
+ if (stroke)
+ _node_set_color (node, "stroke", stroke);
}
static void
@@ -733,7 +717,6 @@ drs_renderer_class_init (DrsRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index a858c8e..7894c8d 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -138,9 +138,9 @@ static void draw_polyline(DiaRenderer *self,
static void fill_rect (DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
Color *color);
-static void fill_polygon (DiaRenderer *renderer,
+static void draw_polygon (DiaRenderer *renderer,
Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static void draw_arc(DiaRenderer *self,
Point *center,
real width, real height,
@@ -230,7 +230,7 @@ dxf_renderer_class_init (DxfRendererClass *klass)
renderer_class->draw_line = draw_line;
renderer_class->draw_polyline = draw_polyline;
renderer_class->fill_rect = fill_rect;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_arc = draw_arc;
renderer_class->fill_arc = fill_arc;
@@ -425,10 +425,11 @@ fill_rect (DiaRenderer *self,
}
static void
-fill_polygon (DiaRenderer *self,
+draw_polygon (DiaRenderer *self,
Point *points, int num_points,
- Color *color)
+ Color *fill, Color *stroke)
{
+ Color *color = fill ? fill : stroke;
DxfRenderer *renderer = DXF_RENDERER(self);
/* We could emulate all polygons with multiple SOLID but it might not be
* worth the effort. Following the easy part of polygons with 3 or 4 points.
@@ -442,6 +443,8 @@ fill_polygon (DiaRenderer *self,
gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
+ g_return_if_fail (color != NULL);
+
if (num_points == 3)
idx = idx3;
else if (num_points == 4)
diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c
index dbb16ad..a94f872 100644
--- a/plug-ins/hpgl/hpgl.c
+++ b/plug-ins/hpgl/hpgl.c
@@ -351,23 +351,15 @@ draw_polyline(DiaRenderer *object,
static void
draw_polygon(DiaRenderer *object,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
+ Color *color = fill ? fill : stroke;
DIAG_NOTE(g_message("draw_polygon n:%d %f,%f ...",
num_points, points->x, points->y));
- draw_polyline(object,points,num_points,line_colour);
+ g_return_if_fail (color != NULL);
+ draw_polyline(object,points,num_points, color);
/* last to first */
- draw_line(object, &points[num_points-1], &points[0], line_colour);
-}
-
-static void
-fill_polygon(DiaRenderer *object,
- Point *points, int num_points,
- Color *colour)
-{
- DIAG_NOTE(g_message("fill_polygon n:%d %f,%f ...",
- num_points, points->x, points->y));
- draw_polyline(object,points,num_points,colour);
+ draw_line(object, &points[num_points-1], &points[0], color);
}
static void
@@ -676,7 +668,7 @@ hpgl_renderer_class_init (HpglRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
@@ -690,7 +682,6 @@ hpgl_renderer_class_init (HpglRendererClass *klass)
/* medium level functions */
renderer_class->draw_rect = draw_rect;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
}
/* plug-in interface : export function */
diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c
index d59a2fc..f963c5f 100644
--- a/plug-ins/libart/dialibartrenderer.c
+++ b/plug-ins/libart/dialibartrenderer.c
@@ -426,9 +426,9 @@ draw_polyline(DiaRenderer *self,
}
static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
+stroke_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *line_color)
{
DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self);
ArtVpath *vpath, *vpath_dashed;
@@ -486,7 +486,7 @@ draw_polygon(DiaRenderer *self,
}
static void
-fill_polygon(DiaRenderer *self,
+fill_polygon (DiaRenderer *self,
Point *points, int num_points,
Color *color)
{
@@ -543,6 +543,18 @@ fill_polygon(DiaRenderer *self,
}
static void
+draw_polygon(DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
+{
+ /* XXX: simple port, not optimized */
+ if (fill)
+ fill_polygon (self, points, num_points, fill);
+ if (stroke)
+ stroke_polygon (self, points, num_points, stroke);
+}
+
+static void
draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *color)
@@ -1524,7 +1536,6 @@ dia_libart_renderer_class_init (DiaLibartRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c
index fbb03c4..0ce4264 100644
--- a/plug-ins/metapost/render_metapost.c
+++ b/plug-ins/metapost/render_metapost.c
@@ -167,10 +167,7 @@ static void draw_polyline(DiaRenderer *self,
Color *line_color);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_color);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *color);
@@ -281,7 +278,6 @@ metapost_renderer_class_init (MetapostRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
@@ -609,9 +605,9 @@ draw_polyline(DiaRenderer *self,
}
static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
+stroke_polygon(DiaRenderer *self,
+ Point *points, int num_points,
+ Color *line_color)
{
MetapostRenderer *renderer = METAPOST_RENDERER (self);
int i;
@@ -662,6 +658,17 @@ fill_polygon(DiaRenderer *self,
fprintf(renderer->file," fill p ");
end_draw_op(renderer);
}
+static void
+draw_polygon(DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
+{
+ /* XXX: simple port, not optimized */
+ if (fill)
+ fill_polygon (self, points, num_points, fill);
+ if (stroke)
+ stroke_polygon (self, points, num_points, stroke);
+}
static void
draw_rect(DiaRenderer *self,
@@ -928,6 +935,12 @@ draw_beziergon (DiaRenderer *self,
if (points[0].type != BEZ_MOVE_TO)
g_warning("first BezPoint must be a BEZ_MOVE_TO");
+ if (!fill) {
+ /* XXX: this is not closed */
+ draw_bezier (self, points, numpoints, stroke);
+ return;
+ }
+
fprintf(renderer->file, " path p;\n");
fprintf(renderer->file, " p = (%sx,%sy)",
mp_dtostr(p1x_buf, (gdouble) points[0].p1.x),
diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c
index 124f244..719900f 100644
--- a/plug-ins/pgf/render_pgf.c
+++ b/plug-ins/pgf/render_pgf.c
@@ -98,10 +98,7 @@ static void draw_rounded_polyline (DiaRenderer *self,
Color *color, real radius);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_color);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *color);
@@ -258,7 +255,6 @@ pgf_renderer_class_init (PgfRendererClass *klass)
renderer_class->draw_rounded_polyline = draw_rounded_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
@@ -566,21 +562,15 @@ pgf_polygon(PgfRenderer *renderer,
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_color)
-{
- PgfRenderer *renderer = PGF_RENDERER(self);
-
- pgf_polygon(renderer,points,num_points,line_color,FALSE);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
+ Color *fill, Color *stroke)
{
PgfRenderer *renderer = PGF_RENDERER(self);
- pgf_polygon(renderer,points,num_points,line_color,TRUE);
+ /* XXX: not optimized to fill and stroke at once */
+ if (fill)
+ pgf_polygon(renderer,points,num_points,fill,TRUE);
+ if (stroke)
+ pgf_polygon(renderer,points,num_points,stroke,FALSE);
}
static void
diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c
index 5fd8d31..86079af 100644
--- a/plug-ins/postscript/diapsrenderer.c
+++ b/plug-ins/postscript/diapsrenderer.c
@@ -372,21 +372,16 @@ psrenderer_polygon(DiaPsRenderer *renderer,
}
static void
-draw_polygon(DiaRenderer *self,
+draw_polygon (DiaRenderer *self,
Point *points, int num_points,
- Color *line_color)
+ Color *fill, Color *stroke)
{
DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
- psrenderer_polygon(renderer, points, num_points, line_color, FALSE);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *fill_color)
-{
- DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
- psrenderer_polygon(renderer, points, num_points, fill_color, TRUE);
+ /* XXX: not optimized to fill and stroke at once */
+ if (fill)
+ psrenderer_polygon(renderer, points, num_points, fill, TRUE);
+ if (stroke)
+ psrenderer_polygon(renderer, points, num_points, stroke, FALSE);
}
static void
@@ -1039,7 +1034,7 @@ dia_ps_renderer_class_init (DiaPsRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
+ renderer_class->draw_polygon = draw_polygon;
renderer_class->draw_arc = draw_arc;
renderer_class->fill_arc = fill_arc;
renderer_class->draw_ellipse = draw_ellipse;
@@ -1053,7 +1048,6 @@ dia_ps_renderer_class_init (DiaPsRendererClass *klass)
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_polyline = draw_polyline;
- renderer_class->draw_polygon = draw_polygon;
/* ps specific */
ps_renderer_class->begin_prolog = begin_prolog;
diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c
index afe10dc..3af6279 100644
--- a/plug-ins/pstricks/render_pstricks.c
+++ b/plug-ins/pstricks/render_pstricks.c
@@ -81,10 +81,7 @@ static void draw_polyline(DiaRenderer *self,
Color *line_color);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_color);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *color);
@@ -190,7 +187,6 @@ pstricks_renderer_class_init (PstricksRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
@@ -469,23 +465,16 @@ pstricks_polygon(PstricksRenderer *renderer,
}
static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
-{
- PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
-
- pstricks_polygon(renderer,points,num_points,line_color,FALSE);
-}
-
-static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *line_color)
+draw_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
{
PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
- pstricks_polygon(renderer,points,num_points,line_color,TRUE);
+ if (fill)
+ pstricks_polygon(renderer,points,num_points,fill,TRUE);
+ if (stroke)
+ pstricks_polygon(renderer,points,num_points,stroke,FALSE);
}
static void
diff --git a/plug-ins/python/diadissect.py b/plug-ins/python/diadissect.py
index c6b1912..4d2b812 100644
--- a/plug-ins/python/diadissect.py
+++ b/plug-ins/python/diadissect.py
@@ -95,8 +95,9 @@ class DissectRenderer :
def _polygon (self, points, fun) :
if len(points) < 3 :
self.Error ("%s with too few points" % (fun,))
- def draw_polygon (self, points, color) :
+ def draw_polygon (self, points, fill, stroke) :
self._polygon(points, "draw_polygon")
+ # obsolete with recent Dia
def fill_polygon (self, points, color) :
self._polygon(points, "draw_polygon")
def _rect (self, rect, fun) :
diff --git a/plug-ins/python/diastddia.py b/plug-ins/python/diastddia.py
index d4034aa..0f3d4b9 100644
--- a/plug-ins/python/diastddia.py
+++ b/plug-ins/python/diastddia.py
@@ -231,10 +231,15 @@ class StandardDiaRenderer :
</dia:object>''')
def draw_polyline (self, points, color) :
self._poly("PolyLine", points, color, None)
- def draw_polygon (self, points, color) :
+ def stroke_polygon (self, points, color) :
self._poly("Polygon", points, color, 0)
def fill_polygon (self, points, color) :
self._poly("Polygon", points, color, 1)
+ def draw_polygon (self, points, fill, stroke) :
+ if fill :
+ self.fill_polygon(points, fill)
+ if stroke :
+ self.stroke_polygon(points, fill)
def _bezier (self, type_name, points, color, fill) :
self.oid = self.oid + 1
diff --git a/plug-ins/python/diasvg.py b/plug-ins/python/diasvg.py
index 7d80d9e..1602e75 100644
--- a/plug-ins/python/diasvg.py
+++ b/plug-ins/python/diasvg.py
@@ -109,15 +109,9 @@ class SvgRenderer :
for pt in points :
self.f.write ('%.3f,%.3f ' % (pt.x, pt.y))
self.f.write('"/>\n')
- def draw_polygon (self, points, color) :
- self.f.write('<polygon fill="none" stroke="%s" stroke-width="%.3f" %s points="' \
- % (self._rgb(color), self.line_width, self._stroke_style()))
- for pt in points :
- self.f.write ('%.3f,%.3f ' % (pt.x, pt.y))
- self.f.write('"/>\n')
- def fill_polygon (self, points, color) :
- self.f.write('<polygon fill="%s" stroke="none" stroke-width="%.3f" points="' \
- % (self._rgb(color), self.line_width))
+ def draw_polygon (self, points, fill, stroke) :
+ self.f.write('<polygon fill="%s" stroke="%s" stroke-width="%.3f" %s points="' \
+ % (self._rgb(fill), self._rgb(stroke), self.line_width,
self._stroke_style()))
for pt in points :
self.f.write ('%.3f,%.3f ' % (pt.x, pt.y))
self.f.write('"/>\n')
diff --git a/plug-ins/python/export-render.py b/plug-ins/python/export-render.py
index 822579d..18ec028 100644
--- a/plug-ins/python/export-render.py
+++ b/plug-ins/python/export-render.py
@@ -68,14 +68,10 @@ class DumpRenderer :
self.f.write ("\t" + str(pt) + "\n")
## \brief Draw a polygon
# @param points An array of points in the diagram coordinate system
- # @param color The color to use for the line
- def draw_polygon (self, points, color) :
- self.f.write("draw_polygon: " + str(color) + "\n")
- for pt in points :
- self.f.write ("\t" + str(pt) + "\n")
- ## \brief Fill a polygon
- def fill_polygon (self, points, color) :
- self.f.write("fill_polygon: " + str(color) + "\n")
+ # @param fill The color to use for the interior
+ # @param stroke The color to use for the line
+ def draw_polygon (self, points, fill) :
+ self.f.write("draw_polygon: " + str(fill) + str(stroke) + "\n")
for pt in points :
self.f.write ("\t" + str(pt) + "\n")
## \brief Draw a rectangle
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 42d7982..5047445 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -600,74 +600,40 @@ draw_polyline(DiaRenderer *renderer,
static void
draw_polygon(DiaRenderer *renderer,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
func = PyObject_GetAttrString (self, "draw_polygon");
if (func && PyCallable_Check(func)) {
PyObject *optt = PyDiaPointTuple_New (points, num_points);
- PyObject *ocolor = PyDiaColor_New (line_colour);
+ PyObject *fill_po, *stroke_po;
- Py_INCREF(self);
- Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", optt, ocolor);
- if (arg) {
- res = PyEval_CallObject (func, arg);
- ON_RES(res, FALSE);
- }
- Py_XDECREF (arg);
- Py_XDECREF (optt);
- Py_XDECREF (ocolor);
- Py_DECREF(func);
- Py_DECREF(self);
- }
- else { /* member optional */
- PyErr_Clear();
- /* XXX: implementing the same fallback as DiaRenderer would do */
- DIA_RENDERER_CLASS (parent_class)->draw_polygon (renderer, points, num_points, line_colour);
- }
-}
-
-/*!
- * \brief Fill polygon
- *
- * Not optional on the PyDia side. If not implemented a runtime warning
- * will be generated when called.
- *
- * \memberof _DiaPyRenderer
- */
-static void
-fill_polygon(DiaRenderer *renderer,
- Point *points, int num_points,
- Color *colour)
-{
- PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
+ if (fill)
+ fill_po = PyDiaColor_New (fill);
+ else
+ Py_INCREF(Py_None), fill_po = Py_None;
- func = PyObject_GetAttrString (self, "fill_polygon");
- if (func && PyCallable_Check(func)) {
- PyObject *optt = PyDiaPointTuple_New (points, num_points);
- PyObject *ocolor = PyDiaColor_New (colour);
+ if (stroke)
+ stroke_po = PyDiaColor_New (stroke);
+ else
+ Py_INCREF(Py_None), stroke_po = Py_None;
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", optt, ocolor);
+ arg = Py_BuildValue ("(OO)", optt, fill_po, stroke_po);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
Py_XDECREF (optt);
- Py_XDECREF (ocolor);
+ Py_XDECREF (fill_po);
+ Py_XDECREF (stroke_po);
Py_DECREF(func);
Py_DECREF(self);
- }
- else { /* member not optional */
- gchar *msg = g_strdup_printf ("%s.fill_polygon() implmentation missing.",
- G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
- PyErr_Clear();
- PyErr_Warn (PyExc_RuntimeWarning, msg);
- g_free (msg);
+ } else { /* fill_polygon was not an optional member */
+ PyErr_Warn (PyExc_RuntimeWarning, "DiaPyRenderer : draw_polygon() method missing!\n");
}
}
@@ -1304,7 +1270,6 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index e42c0e8..a59696f 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -111,7 +111,7 @@ static void draw_polyline(DiaRenderer *self,
Color *line_colour);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *colour);
@@ -405,7 +405,7 @@ draw_polyline(DiaRenderer *self,
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
int i;
@@ -414,11 +414,15 @@ draw_polygon(DiaRenderer *self,
Point center;
gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE];
gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE];
+ gchar *style;
node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL);
-
- xmlSetProp(node, (const xmlChar *)"style",
- (xmlChar *) DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, line_colour));
+
+ style = g_strdup_printf ("%s;%s",
+ fill ? DIA_SVG_RENDERER_GET_CLASS(renderer)->get_fill_style(renderer, fill) :
"fill:none",
+ stroke ? DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, stroke) :
"stroke:none");
+ xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
+ g_free (style);
str = g_string_new(NULL);
for (i = 0; i < num_points; i++) {
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index de19208..5a5edb0 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -114,10 +114,7 @@ static void draw_polyline(DiaRenderer *self,
Color *color);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *color);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *color);
@@ -234,7 +231,6 @@ vdx_renderer_class_init (VDXRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
@@ -751,10 +747,10 @@ static void draw_polyline(DiaRenderer *self, Point *points, int num_points,
* @param num_points number of points
* @param color line colour
*/
-
-static void draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
+static void
+stroke_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *color)
{
Point *more_points = g_new0(Point, num_points+1);
memcpy(more_points, points, num_points*sizeof(Point));
@@ -770,10 +766,10 @@ static void draw_polygon(DiaRenderer *self,
* @param num_points number of points
* @param color line colour
*/
-
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
+static void
+fill_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *color)
{
VDXRenderer *renderer = VDX_RENDERER(self);
Point a, b;
@@ -878,16 +874,30 @@ static void fill_polygon(DiaRenderer *self,
g_free(LineTo);
}
+static void
+draw_polygon(DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
+{
+ /* XXX: simple port, not optimized
+ also draw_polygon is just calling draw_polyline with an extra point
+ */
+ if (fill)
+ fill_polygon (self, points, num_points, fill);
+ if (stroke)
+ stroke_polygon (self, points, num_points, stroke);
+}
+
/** Render a Dia rectangle
* @param self a renderer
* @param ul_corner Upper-left corner
* @param lr_corner Loower-right corner
* @param color line colour
*/
-
-static void draw_rect(DiaRenderer *self,
- Point *ul_corner, Point *lr_corner,
- Color *color)
+static void
+draw_rect (DiaRenderer *self,
+ Point *ul_corner, Point *lr_corner,
+ Color *color)
{
Point points[5]; /* 5 so we close path */
@@ -899,7 +909,7 @@ static void draw_rect(DiaRenderer *self,
points[3] = *ul_corner;
points[4] = points[0];
- draw_polygon(self, points, 5, color);
+ draw_polygon(self, points, 5, NULL, color);
}
/** Render a Dia filled rectangle
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index 93194fa..fe50454 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -662,13 +662,15 @@ draw_polyline(DiaRenderer *self,
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
WmfRenderer *renderer = WMF_RENDERER (self);
W32::HPEN hPen;
W32::POINT* pts;
int i;
+ W32::HBRUSH hBrush, hBrOld;
+ W32::COLORREF rgb = fill ? W32COLOR(fill) : 0;
DIAG_NOTE(renderer, "draw_polygon n:%d %f,%f ...\n",
num_points, points->x, points->y);
@@ -682,39 +684,26 @@ draw_polygon(DiaRenderer *self,
pts[i].y = SCY(points[i].y);
}
- hPen = UsePen(renderer, line_colour);
+ if (stroke)
+ hPen = UsePen(renderer, stroke);
+ if (fill) {
+ hBrush = W32::CreateSolidBrush(rgb);
+ hBrOld = (W32::HBRUSH)W32::SelectObject(renderer->hFileDC, hBrush);
+ }
W32::Polygon(renderer->hFileDC, pts, num_points);
- DonePen(renderer, hPen);
-
+ if (stroke)
+ DonePen(renderer, hPen);
+ if (fill) {
+ W32::SelectObject(renderer->hFileDC,
+ W32::GetStockObject(HOLLOW_BRUSH) );
+ W32::DeleteObject(hBrush);
+ }
g_free(pts);
}
static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *colour)
-{
- WmfRenderer *renderer = WMF_RENDERER (self);
-
- W32::HBRUSH hBrush, hBrOld;
- W32::COLORREF rgb = W32COLOR(colour);
-
- DIAG_NOTE(renderer, "fill_polygon n:%d %f,%f ...\n",
- num_points, points->x, points->y);
-
- hBrush = W32::CreateSolidBrush(rgb);
- hBrOld = (W32::HBRUSH)W32::SelectObject(renderer->hFileDC, hBrush);
-
- draw_polygon(self, points, num_points, NULL);
-
- W32::SelectObject(renderer->hFileDC,
- W32::GetStockObject(HOLLOW_BRUSH) );
- W32::DeleteObject(hBrush);
-}
-
-static void
draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *colour)
@@ -1298,7 +1287,6 @@ wmf_renderer_class_init (WmfRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index 6ab53ae..67a14a7 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -146,10 +146,11 @@ static void
_do_polygon (WpgImportRenderer *ren, Point *points, int iNum)
{
g_return_if_fail (iNum > 2);
- if (ren->LineAttr.Type != WPG_LA_NONE)
- DIA_RENDERER_GET_CLASS(ren)->draw_polygon (DIA_RENDERER(ren), points, iNum, &ren->stroke);
- if (ren->FillAttr.Type != WPG_FA_HOLLOW)
- DIA_RENDERER_GET_CLASS(ren)->fill_polygon (DIA_RENDERER(ren), points, iNum, &ren->fill);
+ if (ren->LineAttr.Type == WPG_LA_NONE && ren->FillAttr.Type == WPG_FA_HOLLOW)
+ return; /* nothing to do */
+ DIA_RENDERER_GET_CLASS(ren)->draw_polygon (DIA_RENDERER(ren), points, iNum,
+ (ren->LineAttr.Type != WPG_LA_NONE) ? &ren->stroke : NULL,
+ (ren->FillAttr.Type != WPG_FA_HOLLOW) ? &ren->fill : NULL);
}
static void
_do_rect (WpgImportRenderer *ren, Point *points)
diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c
index da2d986..e1a4cf2 100644
--- a/plug-ins/wpg/wpg.c
+++ b/plug-ins/wpg/wpg.c
@@ -518,16 +518,23 @@ draw_polyline(DiaRenderer *self,
static void
draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *line_colour)
+ Color *fill, Color *stroke)
{
WpgRenderer *renderer = WPG_RENDERER (self);
gint16* pData;
int i;
+ WPG_LineAttr lt = renderer->LineAttr.Type;
DIAG_NOTE(g_message("draw_polygon n:%d %f,%f ...",
num_points, points->x, points->y));
- WriteLineAttr(renderer, line_colour);
+ if (!stroke)
+ renderer->LineAttr.Type = WPG_LA_NONE;
+ WriteLineAttr(renderer, stroke ? stroke : fill);
+ if (fill)
+ WriteFillAttr(renderer, fill, TRUE);
+ else
+ WriteFillAttr(renderer, stroke, FALSE);
WriteRecHead(renderer, WPG_POLYGON, (num_points * 2 + 1) * sizeof(gint16));
pData = g_new(gint16, num_points * 2);
@@ -544,26 +551,16 @@ draw_polygon(DiaRenderer *self,
}
fwrite_le(pData, sizeof(gint16), num_points*2, renderer->file);
+ /* restore state */
+ if (!stroke)
+ renderer->LineAttr.Type = lt;
+ /* switch off fill */
+ WriteFillAttr(renderer, fill ? fill : stroke, FALSE);
g_free(pData);
}
static void
-fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *colour)
-{
- WpgRenderer *renderer = WPG_RENDERER (self);
-
- DIAG_NOTE(g_message("fill_polygon n:%d %f,%f ...",
- num_points, points->x, points->y));
-
- WriteFillAttr(renderer, colour, TRUE);
- draw_polygon(self,points,num_points,colour);
- WriteFillAttr(renderer, colour, FALSE);
-}
-
-static void
draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *colour)
@@ -1036,7 +1033,6 @@ wpg_renderer_class_init (WpgRendererClass *klass)
renderer_class->set_font = set_font;
renderer_class->draw_line = draw_line;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
renderer_class->draw_arc = draw_arc;
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index 0eeb342..b0bb6f5 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -131,10 +131,7 @@ static void draw_polyline_with_arrows(DiaRenderer *self,
Arrow *end_arrow);
static void draw_polygon(DiaRenderer *self,
Point *points, int num_points,
- Color *color);
-static void fill_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color);
+ Color *fill, Color *stroke);
static void draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
Color *colour);
@@ -258,7 +255,6 @@ xfig_renderer_class_init (XfigRendererClass *klass)
renderer_class->draw_polyline = draw_polyline;
renderer_class->draw_polygon = draw_polygon;
- renderer_class->fill_polygon = fill_polygon;
renderer_class->draw_rect = draw_rect;
renderer_class->fill_rect = fill_rect;
@@ -709,9 +705,9 @@ draw_polyline_with_arrows(DiaRenderer *self,
}
static void
-draw_polygon(DiaRenderer *self,
- Point *points, int num_points,
- Color *color)
+stroke_polygon (DiaRenderer *self,
+ Point *points, int num_points,
+ Color *color)
{
int i;
XfigRenderer *renderer = XFIG_RENDERER(self);
@@ -767,6 +763,18 @@ fill_polygon(DiaRenderer *self,
(int)figCoord(renderer, points[0].x), (int)figCoord(renderer, points[0].y));
}
+static void
+draw_polygon(DiaRenderer *self,
+ Point *points, int num_points,
+ Color *fill, Color *stroke)
+{
+ /* XXX: simple port, not optimized */
+ if (fill)
+ fill_polygon (self, points, num_points, fill);
+ if (stroke)
+ stroke_polygon (self, points, num_points, stroke);
+}
+
static void
draw_rect(DiaRenderer *self,
Point *ul_corner, Point *lr_corner,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]