[dia] DiaRenderer: replace fill_polygon() with extended draw_polygon() method



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,
-                             &note->fill_color);
   renderer_ops->draw_polygon(renderer, 
                              poly, 5,
+                             &note->fill_color,
                              &note->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]