[dia] DiaRenderer: replace fill_polygon with extended draw_polygon



commit f259ac09a953096435f8163bd9ae961a98fa2a54
Author: Hans Breuer <hans breuer org>
Date:   Fri May 2 22:30:08 2014 +0200

    DiaRenderer: replace fill_polygon with extended draw_polygon
    
    What started with draw_beziergon() is continued with fill_ellipse(): merge
    two calls into one to get rid of superfluous drawing commands and arbitrary
    object splits.
    
    To reduce the risk of breaking file formats not yet tested the following
    pattern is sometimes used:
     - rename draw_ellipse to stroke_ellipse
     - keep fill_ellipse as local function
     - make new draw_ellipse call one or both for fill and stroke parameter
    As a result the output of these exporters wont change at all.
    
    Not yet optimized are: PGF, VDX, XFig
    
    Also not optimized, but more simple are: GDK, Cairo, DXF, HPGL, LibArt, PS,
      Pstricks,
    
    Optimized to fill and stroke in one step are: Import, Path, SVG, Transform,
      DRS, Metapost, diadissect.py, diastddia.py, diasvg.py, PyDia, Shape, WMF,
      WPG
    
    Fully optimized shape rendering for all objects except with active pattern.

 bindings/dia-renderer.h                   |    5 +--
 lib/arrows.c                              |    6 +-
 lib/diagdkrenderer.c                      |   21 +++------
 lib/diaimportrenderer.c                   |   27 +----------
 lib/diapathrenderer.c                     |   28 ++----------
 lib/diarenderer.c                         |   17 +------
 lib/diarenderer.h                         |    7 +---
 lib/diasvgrenderer.c                      |   34 +++------------
 lib/diatransformrenderer.c                |   31 ++-----------
 objects/AADL/aadlport.c                   |    6 +--
 objects/AADL/aadlsubprogram.c             |    5 +-
 objects/Database/table.c                  |    6 +-
 objects/ER/attribute.c                    |   12 +++---
 objects/GRAFCET/step.c                    |    4 +-
 objects/Istar/actor.c                     |    6 +--
 objects/Jackson/requirement.c             |    3 +-
 objects/KAOS/metaandorrel.c               |    7 ++-
 objects/KAOS/other.c                      |    2 +-
 objects/Misc/analog_clock.c               |   13 ++---
 objects/SADT/arrow.c                      |    6 +-
 objects/UML/actor.c                       |    8 +---
 objects/UML/classicon.c                   |    7 +---
 objects/UML/implements.c                  |    7 +---
 objects/UML/state.c                       |   13 ++----
 objects/UML/state_term.c                  |   15 ++----
 objects/UML/usecase.c                     |    6 +--
 objects/custom/custom_object.c            |    7 +--
 objects/flowchart/ellipse.c               |   13 ++----
 objects/network/basestation.c             |    9 ++--
 objects/standard/ellipse.c                |   15 +++---
 plug-ins/cairo/diacairo-renderer.c        |   17 ++-----
 plug-ins/cgm/cgm.c                        |   34 +-------------
 plug-ins/drs/dia-render-script-import.c   |   10 ++---
 plug-ins/drs/dia-render-script-renderer.c |   32 +++-----------
 plug-ins/dxf/dxf-export.c                 |   22 ++--------
 plug-ins/hpgl/hpgl.c                      |   14 +-----
 plug-ins/libart/dialibartrenderer.c       |   17 ++-----
 plug-ins/metapost/render_metapost.c       |   59 ++++++++-----------------
 plug-ins/pgf/render_pgf.c                 |   26 +++--------
 plug-ins/postscript/diapsrenderer.c       |   18 ++------
 plug-ins/pstricks/render_pstricks.c       |   27 +++---------
 plug-ins/python/diadissect.py             |    4 +-
 plug-ins/python/diastddia.py              |    9 ++--
 plug-ins/python/diasvg.py                 |   14 +++---
 plug-ins/python/export-render.py          |   13 ++---
 plug-ins/python/pydia-render.c            |   67 +++++++---------------------
 plug-ins/shape/shape-export.c             |    9 ++--
 plug-ins/vdx/vdx-export.c                 |   28 ++++++++----
 plug-ins/wmf/wmf.cpp                      |   44 +++++++------------
 plug-ins/wpg/wpg-import.c                 |   11 +---
 plug-ins/wpg/wpg.c                        |   26 +++--------
 plug-ins/xfig/xfig-export.c               |   27 +++++++----
 52 files changed, 265 insertions(+), 609 deletions(-)
---
diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h
index 4158b99..367adc5 100644
--- a/bindings/dia-renderer.h
+++ b/bindings/dia-renderer.h
@@ -94,10 +94,7 @@ public :
                            Color *color);
     //! Draw an ellipse, given its center and the bounding box
     //! \ingroup RendererRequired
-    virtual void draw_ellipse (Point *center, double width, double height, Color *color);
-    //! Same a DrawEllipse, except the ellips is filled
-    //! \ingroup RendererRequired
-    virtual void fill_ellipse (Point *center, double width, double height, Color *color);
+    virtual void draw_ellipse (Point *center, double width, double height, Color *fill, Color *stroke);
     //! Print a string at pos, using the current font
     //! \ingroup RendererRequired
     virtual void draw_string (const gchar *text, Point *pos, Alignment alignment, Color *color);
diff --git a/lib/arrows.c b/lib/arrows.c
index 8509906..f3c85d2 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -1707,7 +1707,7 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from,
   
   delta = *from;
   
-  point_sub(&delta, to);       
+  point_sub(&delta, to);
   
   len = sqrt(point_dot(&delta, &delta)); /* line length */
  
@@ -1720,8 +1720,8 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from,
     p_dot.x += delta.x * rapport;
     p_dot.y += delta.y * rapport;
   }
-  DIA_RENDERER_GET_CLASS(renderer)->fill_ellipse(renderer, &p_dot,
-                                                width, width, fg_color);
+  DIA_RENDERER_GET_CLASS(renderer)->draw_ellipse(renderer, &p_dot,
+                                                width, width, fg_color, NULL);
   /* triangle */
   if (len > 0.0) {
     rapport = width / len;
diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c
index 228c6c9..021aa9f 100644
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -74,11 +74,7 @@ static void fill_arc (DiaRenderer *renderer,
 static void draw_ellipse (DiaRenderer *renderer,
                           Point *center,
                           real width, real height,
-                          Color *color);
-static void fill_ellipse (DiaRenderer *renderer,
-                          Point *center,
-                          real width, real height,
-                          Color *color);
+                          Color *fill, Color *stroke);
 static void draw_string (DiaRenderer *renderer,
                          const gchar *text,
                          Point *pos,
@@ -222,7 +218,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   /* use <draw|fill>_bezier from DiaRenderer */
 
@@ -602,16 +597,12 @@ fill_arc (DiaRenderer *object, Point *center,
 static void 
 draw_ellipse (DiaRenderer *object, Point *center,
               real width, real height, 
-              Color *color)
-{
-  draw_arc(object, center, width, height, 0.0, 360.0, color); 
-}
-
-static void 
-fill_ellipse (DiaRenderer *object, Point *center,
-              real width, real height, Color *color)
+              Color *fill, Color *stroke)
 {
-  fill_arc(object, center, width, height, 0.0, 360.0, color); 
+  if (fill)
+    fill_arc(object, center, width, height, 0.0, 360.0, fill);
+  if (stroke)    
+    draw_arc(object, center, width, height, 0.0, 360.0, stroke);
 }
 
 /* Draw a highlighted version of a string.
diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c
index 69eba5e..190473c 100644
--- a/lib/diaimportrenderer.c
+++ b/lib/diaimportrenderer.c
@@ -59,11 +59,7 @@ static void fill_arc (DiaRenderer *renderer,
 static void draw_ellipse (DiaRenderer *renderer,
                          Point *center,
                          real width, real height,
-                         Color *color);
-static void fill_ellipse (DiaRenderer *renderer,
-                         Point *center,
-                         real width, real height,
-                         Color *color);
+                         Color *fill, Color *stroke);
 static void draw_bezier (DiaRenderer *renderer,
                         BezPoint *points,
                         int numpoints,
@@ -177,7 +173,6 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
 
@@ -418,28 +413,12 @@ fill_arc (DiaRenderer *renderer, Point *center,
 static void 
 draw_ellipse (DiaRenderer *renderer, Point *center,
               real width, real height, 
-              Color *color)
-{
-  DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
-  DiaObject *object = create_standard_ellipse (center->x - width / 2, center->y - height / 2, width, height);
-
-  _apply_style (self, object, NULL, color, 0.0);
-  _push_object (self, object);
-}
-
-/*!
- * \brief Fill an ellipse
- * Creates a filled _Ellipse object.
- * \memberof _DiaImportRenderer
- */
-static void 
-fill_ellipse (DiaRenderer *renderer, Point *center,
-              real width, real height, Color *color)
+              Color *fill, Color *stroke)
 {
   DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
   DiaObject *object = create_standard_ellipse (center->x - width / 2, center->y - height / 2, width, height);
 
-  _apply_style (self, object, color, NULL, 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 ec3c5b0..a7519a5 100644
--- a/lib/diapathrenderer.c
+++ b/lib/diapathrenderer.c
@@ -336,7 +336,7 @@ draw_polygon(DiaRenderer *self,
              Color *fill, Color *stroke)
 {
   DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
-  GArray *path = _get_current_path (renderer, fill, stroke);
+  GArray *path = _get_current_path (renderer, stroke, fill);
 
   /* can't be that simple ;) */
   _polyline (self, points, num_points, fill, stroke);
@@ -516,10 +516,10 @@ path_build_ellipse (GArray *path,
   }
 }    
 static void
-_ellipse (DiaRenderer *self,
-         Point *center,
-         real width, real height,
-         const Color *stroke, const Color *fill)
+draw_ellipse (DiaRenderer *self,
+             Point *center,
+             real width, real height,
+             Color *fill, Color *stroke)
 {
   DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
   GArray *path = _get_current_path (renderer, stroke, fill);
@@ -527,23 +527,6 @@ _ellipse (DiaRenderer *self,
   path_build_ellipse (path, center, width, height);
 }
 static void
-draw_ellipse (DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, color, NULL);
-  _remove_duplicated_path (DIA_PATH_RENDERER (self));
-}
-static void
-fill_ellipse (DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, NULL, color);
-}
-static void
 _bezier (DiaRenderer *self, 
         BezPoint *points, int numpoints,
         const Color *fill, const Color *stroke)
@@ -707,7 +690,6 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index 12e5d3f..1bd433c 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -83,11 +83,7 @@ static void fill_arc (DiaRenderer *renderer,
 static void draw_ellipse (DiaRenderer *renderer,
                           Point *center,
                           real width, real height,
-                          Color *color);
-static void fill_ellipse (DiaRenderer *renderer,
-                          Point *center,
-                          real width, real height,
-                          Color *color);
+                          Color *fill, Color *stroke);
 static void draw_bezier (DiaRenderer *renderer,
                          BezPoint *points,
                          int numpoints,
@@ -320,7 +316,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
 
@@ -473,21 +468,13 @@ fill_arc (DiaRenderer *renderer, Point *center,
 static void 
 draw_ellipse (DiaRenderer *renderer, Point *center,
               real width, real height, 
-              Color *color)
+              Color *fill, Color *stroke)
 {
   g_warning ("%s::draw_ellipse not implemented!", 
              G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
 }
 
 static void 
-fill_ellipse (DiaRenderer *renderer, Point *center,
-              real width, real height, Color *color)
-{
-  g_warning ("%s::fill_ellipse not implemented!", 
-             G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
-}
-
-static void 
 draw_string (DiaRenderer *renderer,
              const gchar *text, Point *pos, Alignment alignment,
              Color *color)
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 92cf325..0c9f9b8 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -154,12 +154,7 @@ struct _DiaRendererClass
   void (*draw_ellipse) (DiaRenderer *renderer,
                         Point *center,
                         real width, real height,
-                        Color *color);
-  /*! Same a DrawEllipse, except the ellips is filled */
-  void (*fill_ellipse) (DiaRenderer *renderer,
-                        Point *center,
-                        real width, real height,
-                        Color *color);
+                        Color *fill, Color *stroke);
   /*! Print a string at pos, using the current font */
   void (*draw_string) (DiaRenderer *renderer,
                        const gchar *text,
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 311960a..819f228 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -612,39 +612,20 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *colour)
-{
-  DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
-  xmlNodePtr node;
-  gchar d_buf[DTOSTR_BUF_SIZE];
-
-  node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"ellipse", NULL);
-
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, colour));
-
-  dia_svg_dtostr(d_buf, center->x);
-  xmlSetProp(node, (const xmlChar *)"cx", (xmlChar *) d_buf);
-  dia_svg_dtostr(d_buf, center->y);
-  xmlSetProp(node, (const xmlChar *)"cy", (xmlChar *) d_buf);
-  dia_svg_dtostr(d_buf, width / 2);
-  xmlSetProp(node, (const xmlChar *)"rx", (xmlChar *) d_buf);
-  dia_svg_dtostr(d_buf, height / 2);
-  xmlSetProp(node, (const xmlChar *)"ry", (xmlChar *) d_buf);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
   gchar d_buf[DTOSTR_BUF_SIZE];
+  gchar *style;
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"ellipse", NULL);
 
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_fill_style(renderer, colour));
+  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);
 
   dia_svg_dtostr(d_buf, center->x);
   xmlSetProp(node, (const xmlChar *)"cx", (xmlChar *) d_buf);
@@ -966,7 +947,6 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/lib/diatransformrenderer.c b/lib/diatransformrenderer.c
index fd11bc3..7e6fdad 100644
--- a/lib/diatransformrenderer.c
+++ b/lib/diatransformrenderer.c
@@ -326,17 +326,6 @@ fill_arc (DiaRenderer *self,
 {
   _arc (self, center, width, height, angle1, angle2, NULL, color);
 }
-static void
-_ellipse (DiaRenderer *self,
-         Point *center,
-         real width, real height,
-         Color *stroke, Color *fill)
-{
-  GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint));
-  path_build_ellipse (path, center, width, height);
-  _bezier (self, &g_array_index (path, BezPoint, 0), path->len, fill, stroke, fill!=NULL);
-  g_array_free (path, TRUE);
-}
 /*!
  * \brief Transform ellipse and delegate draw
  * \memberof _DiaTransformRenderer
@@ -345,21 +334,12 @@ static void
 draw_ellipse (DiaRenderer *self, 
              Point *center,
              real width, real height,
-             Color *color)
+             Color *fill, Color *stroke)
 {
-  _ellipse (self, center, width, height, color, NULL);
-}
-/*!
- * \brief Transform ellipse and delegate fill
- * \memberof _DiaTransformRenderer
- */
-static void
-fill_ellipse (DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, NULL, color);
+  GArray *path = g_array_new (FALSE, FALSE, sizeof(BezPoint));
+  path_build_ellipse (path, center, width, height);
+  _bezier (self, &g_array_index (path, BezPoint, 0), path->len, fill, stroke, fill!=NULL);
+  g_array_free (path, TRUE);
 }
 /*!
  * \brief Transform bezier and delegate draw
@@ -523,7 +503,6 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/objects/AADL/aadlport.c b/objects/AADL/aadlport.c
index ac3f84f..3b6ab13 100755
--- a/objects/AADL/aadlport.c
+++ b/objects/AADL/aadlport.c
@@ -369,14 +369,10 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
       renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
       renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
       
-      renderer_ops->fill_ellipse(renderer, p, 
-                                6 * AADL_PORT_GROUP_SIZE,
-                                6 * AADL_PORT_GROUP_SIZE,
-                                &color_black);
       renderer_ops->draw_ellipse(renderer, p,
                                 6 * AADL_PORT_GROUP_SIZE,
                                 6 * AADL_PORT_GROUP_SIZE,
-                                &color_black);
+                                &color_black, &color_black);
 
       
       b[0].type = BEZ_MOVE_TO;
diff --git a/objects/AADL/aadlsubprogram.c b/objects/AADL/aadlsubprogram.c
index 5d4962e..0ab2ad3 100755
--- a/objects/AADL/aadlsubprogram.c
+++ b/objects/AADL/aadlsubprogram.c
@@ -50,9 +50,8 @@ static void aadlsubprogram_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
 
-  renderer_ops->fill_ellipse(renderer, &center, w, h, &aadlbox->fill_color);
-  renderer_ops->draw_ellipse(renderer, &center, w, h, &aadlbox->line_color);
-
+  renderer_ops->draw_ellipse(renderer, &center, w, h,
+                            &aadlbox->fill_color, &aadlbox->line_color);
 }
 
 #define heavyside(n) (n>0?1:0)
diff --git a/objects/Database/table.c b/objects/Database/table.c
index 1af6517..0128a27 100644
--- a/objects/Database/table.c
+++ b/objects/Database/table.c
@@ -733,15 +733,15 @@ table_draw_attributesbox (Table * table, DiaRenderer * renderer,
                                       &indicP,
                                       TABLE_ATTR_INDIC_WIDTH*scale,
                                       TABLE_ATTR_INDIC_WIDTH*scale,
-                                      &table->line_color);
+                                      NULL, &table->line_color);
         }
       else
         {
-          renderer_ops->fill_ellipse (renderer,
+          renderer_ops->draw_ellipse (renderer,
                                       &indicP,
                                       TABLE_ATTR_INDIC_WIDTH*scale,
                                       TABLE_ATTR_INDIC_WIDTH*scale,
-                                      &table->line_color);
+                                      &table->line_color, NULL);
         }
 
       if (IS_NOT_EMPTY(attr->name))
diff --git a/objects/ER/attribute.c b/objects/ER/attribute.c
index c129b6a..b63b6af 100644
--- a/objects/ER/attribute.c
+++ b/objects/ER/attribute.c
@@ -270,9 +270,9 @@ attribute_draw(Attribute *attribute, DiaRenderer *renderer)
   center.y = elem->corner.y + elem->height/2;
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-  renderer_ops->fill_ellipse(renderer, &center,
+  renderer_ops->draw_ellipse (renderer, &center,
                              elem->width, elem->height,
-                             &attribute->inner_color);
+                             &attribute->inner_color, NULL);
 
   renderer_ops->set_linewidth(renderer, attribute->border_width);
   if (attribute->derived) {
@@ -282,15 +282,15 @@ attribute_draw(Attribute *attribute, DiaRenderer *renderer)
     renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
   }
 
-  renderer_ops->draw_ellipse(renderer, &center,
+  renderer_ops->draw_ellipse (renderer, &center,
                              elem->width, elem->height,
-                             &attribute->border_color);
+                             NULL, &attribute->border_color);
 
   if(attribute->multivalue) {
-    renderer_ops->draw_ellipse(renderer, &center,
+    renderer_ops->draw_ellipse (renderer, &center,
                                elem->width - 2*MULTIVALUE_BORDER_WIDTH_X,
                                elem->height - 2*MULTIVALUE_BORDER_WIDTH_Y,
-                               &attribute->border_color);
+                               NULL, &attribute->border_color);
   }
 
   p.x = elem->corner.x + elem->width / 2.0;
diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c
index 75e04a2..6ad1526 100644
--- a/objects/GRAFCET/step.c
+++ b/objects/GRAFCET/step.c
@@ -368,10 +368,10 @@ step_draw(Step *step, DiaRenderer *renderer)
                             &step->G, ALIGN_CENTER, 
                             &step->font_color);
   if (step->active) 
-    renderer_ops->fill_ellipse(renderer,
+    renderer_ops->draw_ellipse(renderer,
                               &step->H,
                               STEP_DOT_RADIUS,STEP_DOT_RADIUS,
-                              &color_red);
+                              &color_red, NULL);
 }
 
 static void
diff --git a/objects/Istar/actor.c b/objects/Istar/actor.c
index 6f3b82e..75f2609 100644
--- a/objects/Istar/actor.c
+++ b/objects/Istar/actor.c
@@ -271,13 +271,11 @@ actor_draw(Actor *actor, DiaRenderer *renderer)
 
   /* background */
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-
-  renderer_ops->fill_ellipse(renderer, &center, elem->width, elem->height, &ACTOR_BG_COLOR);
-
   /* foreground */
   renderer_ops->set_linewidth(renderer, ACTOR_BORDER_WIDTH);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->draw_ellipse(renderer, &center, elem->width, elem->height, &ACTOR_FG_COLOR);
+  renderer_ops->draw_ellipse(renderer, &center, elem->width, elem->height,
+                            &ACTOR_BG_COLOR, &ACTOR_FG_COLOR);
 
   /* text */
   text_draw(actor->text, renderer);
diff --git a/objects/Jackson/requirement.c b/objects/Jackson/requirement.c
index 5b676f7..5f19bb6 100644
--- a/objects/Jackson/requirement.c
+++ b/objects/Jackson/requirement.c
@@ -245,8 +245,7 @@ req_draw(Requirement *req, DiaRenderer *renderer)
   renderer_ops->set_dashlength(renderer, REQ_DASHLEN);
   renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
 
-  renderer_ops->fill_ellipse(renderer, &c, w, h, &color_white);
-  renderer_ops->draw_ellipse(renderer, &c, w, h, &color_black);
+  renderer_ops->draw_ellipse(renderer, &c, w, h, &color_white, &color_black);
 
   text_draw(req->text, renderer);
 }
diff --git a/objects/KAOS/metaandorrel.c b/objects/KAOS/metaandorrel.c
index 1523b3d..1205659 100644
--- a/objects/KAOS/metaandorrel.c
+++ b/objects/KAOS/metaandorrel.c
@@ -372,7 +372,10 @@ static void compute_oper(Point *p, double w, double h, Point *pl) {
      pl[6].y=pl[0].y;
 }
 
-static void draw_agent_icon(Maor *maor, double w, double h, DiaRenderer *renderer) {
+static void
+draw_agent_icon(Maor *maor, double w, double h,
+               DiaRenderer *renderer)
+{
      DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
      double rx,ry;
      Point ref,c,p1,p2;
@@ -384,7 +387,7 @@ static void draw_agent_icon(Maor *maor, double w, double h, DiaRenderer *rendere
      /* head */
      c.x=rx;
      c.y=ry;
-     renderer_ops->fill_ellipse(renderer,&c,h/5,h/5,&MAOR_FG_COLOR);
+     renderer_ops->draw_ellipse(renderer,&c,h/5,h/5,&MAOR_FG_COLOR, NULL);
 
      /* body */
      p1.x=rx;
diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c
index d39ef89..d398bf7 100644
--- a/objects/KAOS/other.c
+++ b/objects/KAOS/other.c
@@ -306,7 +306,7 @@ draw_agent_icon(Other *other, DiaRenderer *renderer)
      /* head */
      c.x=rx;
      c.y=ry;
-     renderer_ops->fill_ellipse(renderer,&c,h/5,h/5,&OTHER_FG_COLOR);
+     renderer_ops->draw_ellipse(renderer,&c,h/5,h/5,&OTHER_FG_COLOR, NULL);
 
      /* body */
      p1.x=rx;
diff --git a/objects/Misc/analog_clock.c b/objects/Misc/analog_clock.c
index ae09384..c2d31c7 100644
--- a/objects/Misc/analog_clock.c
+++ b/objects/Misc/analog_clock.c
@@ -322,13 +322,10 @@ analog_clock_draw(Analog_Clock *analog_clock, DiaRenderer *renderer)
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, analog_clock->border_line_width);
 
-  if (analog_clock->show_background)
-    renderer_ops->fill_ellipse(renderer,&analog_clock->centre,
-                                2*analog_clock->radius,2*analog_clock->radius,
-                                &analog_clock->inner_color);
   renderer_ops->draw_ellipse(renderer,&analog_clock->centre,
-                              2*analog_clock->radius,2*analog_clock->radius,
-                              &analog_clock->border_color);
+                             2*analog_clock->radius,2*analog_clock->radius,
+                             (analog_clock->show_background) ? &analog_clock->inner_color : NULL,
+                             &analog_clock->border_color);
   if (analog_clock->show_ticks)
   {
     Point out, in;
@@ -366,10 +363,10 @@ analog_clock_draw(Analog_Clock *analog_clock, DiaRenderer *renderer)
   renderer_ops->draw_line(renderer,
                            &analog_clock->sec_tip.pos, &analog_clock->centre,
                            &analog_clock->sec_arrow_color);
-  renderer_ops->fill_ellipse(renderer,&analog_clock->centre,
+  renderer_ops->draw_ellipse (renderer,&analog_clock->centre,
                               analog_clock->arrow_line_width*2.25,
                               analog_clock->arrow_line_width*2.25,
-                              &analog_clock->sec_arrow_color);
+                              &analog_clock->sec_arrow_color, NULL);
 
 }
 
diff --git a/objects/SADT/arrow.c b/objects/SADT/arrow.c
index f03af29..268dd7a 100644
--- a/objects/SADT/arrow.c
+++ b/objects/SADT/arrow.c
@@ -314,9 +314,9 @@ static void draw_dot(DiaRenderer *renderer,
   point_add(&pt,&vt);
   
   renderer_ops->set_fillstyle(renderer,FILLSTYLE_SOLID);
-  renderer_ops->fill_ellipse(renderer,&pt,
-                        ARROW_DOT_RADIUS,ARROW_DOT_RADIUS,
-                        col);
+  renderer_ops->draw_ellipse(renderer,&pt,
+                            ARROW_DOT_RADIUS,ARROW_DOT_RADIUS,
+                            col, NULL);
 }
 
 static void draw_tunnel(DiaRenderer *renderer,
diff --git a/objects/UML/actor.c b/objects/UML/actor.c
index cdb59ad..5a034da 100644
--- a/objects/UML/actor.c
+++ b/objects/UML/actor.c
@@ -240,15 +240,11 @@ actor_draw(Actor *actor, DiaRenderer *renderer)
   cb.y = ch.y + r1 + r;
   
   /* head */
-  renderer_ops->fill_ellipse(renderer, 
-                            &ch,
-                            r, r,
-                            &actor->fill_color);
   renderer_ops->draw_ellipse(renderer, 
                             &ch,
                             r, r,
-                            &actor->line_color);  
-  
+                            &actor->fill_color, &actor->line_color);
+
   /* Arms */
   p1.x = ch.x - r1;
   p2.x = ch.x + r1;
diff --git a/objects/UML/classicon.c b/objects/UML/classicon.c
index 26730d3..ac25e10 100644
--- a/objects/UML/classicon.c
+++ b/objects/UML/classicon.c
@@ -264,18 +264,13 @@ classicon_draw(Classicon *icon, DiaRenderer *renderer)
       center.x += r/2.0;
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-
-  renderer_ops->fill_ellipse(renderer,
-                             &center,
-                             2*r, 2*r,
-                             &icon->fill_color);
-
   renderer_ops->set_linewidth(renderer, icon->line_width);
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
 
   renderer_ops->draw_ellipse(renderer,
                              &center,
                              2*r, 2*r,
+                             &icon->fill_color,
                              &icon->line_color);
 
 
diff --git a/objects/UML/implements.c b/objects/UML/implements.c
index cce4fac..769d21a 100644
--- a/objects/UML/implements.c
+++ b/objects/UML/implements.c
@@ -275,15 +275,10 @@ implements_draw(Implements *implements, DiaRenderer *renderer)
   renderer_ops->draw_line(renderer,
                           &endpoints[0], &endpoints[1],
                           &implements->line_color);
-
-  renderer_ops->fill_ellipse(renderer, &implements->circle_center,
-                             implements->circle_diameter,
-                             implements->circle_diameter,
-                             &color_white);
   renderer_ops->draw_ellipse(renderer, &implements->circle_center,
                              implements->circle_diameter,
                              implements->circle_diameter,
-                             &implements->line_color);
+                             &color_white, &implements->line_color);
 
 
   renderer_ops->set_font(renderer, implements->font, implements->font_height);
diff --git a/objects/UML/state.c b/objects/UML/state.c
index 97800d2..f6f653a 100644
--- a/objects/UML/state.c
+++ b/objects/UML/state.c
@@ -290,21 +290,16 @@ state_draw(State *state, DiaRenderer *renderer)
       p1.y = y + h/2;
       if (state->state_type==STATE_END) {
          r = STATE_ENDRATIO;
-         renderer_ops->fill_ellipse(renderer, 
+         renderer_ops->draw_ellipse (renderer, 
                                      &p1,
                                      r, r,
-                                     &state->fill_color);
-         
-         renderer_ops->draw_ellipse(renderer, 
-                                     &p1,
-                                     r, r,
-                                     &state->line_color);
+                                     &state->fill_color, &state->line_color);
       }  
       r = STATE_RATIO;
-      renderer_ops->fill_ellipse(renderer, 
+      renderer_ops->draw_ellipse (renderer, 
                                  &p1,
                                  r, r,
-                                 &state->line_color);
+                                 NULL, &state->line_color);
   } else {
       p1.x = x;
       p1.y = y;
diff --git a/objects/UML/state_term.c b/objects/UML/state_term.c
index 925e722..59e8507 100644
--- a/objects/UML/state_term.c
+++ b/objects/UML/state_term.c
@@ -218,22 +218,17 @@ state_draw(State *state, DiaRenderer *renderer)
    p1.x = x + w/2;
    p1.y = y + h/2;
    if (state->is_final==1) {
-      r = STATE_ENDRATIO;
-      renderer_ops->fill_ellipse(renderer, 
+      r = STATE_ENDRATIO;      
+      renderer_ops->draw_ellipse (renderer, 
                                  &p1,
                                  r, r,
-                                 &state->fill_color);
-      
-      renderer_ops->draw_ellipse(renderer, 
-                                 &p1,
-                                 r, r,
-                                 &state->line_color);
+                                 &state->fill_color, &state->line_color);
    }  
    r = STATE_RATIO;
-   renderer_ops->fill_ellipse(renderer, 
+   renderer_ops->draw_ellipse (renderer, 
                               &p1,
                               r, r,
-                              &state->line_color); /* line_color not a typo! */
+                              &state->line_color, NULL); /* line_color not a typo! */
 }
 
 
diff --git a/objects/UML/usecase.c b/objects/UML/usecase.c
index 3159940..8a2d43b 100644
--- a/objects/UML/usecase.c
+++ b/objects/UML/usecase.c
@@ -268,14 +268,10 @@ usecase_draw(Usecase *usecase, DiaRenderer *renderer)
   else 
          renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
 
-  renderer_ops->fill_ellipse(renderer, 
-                            &c,
-                            w, h,
-                            &usecase->fill_color);
   renderer_ops->draw_ellipse(renderer, 
                             &c,
                             w, h,
-                            &usecase->line_color);  
+                            &usecase->fill_color, &usecase->line_color);  
   
   text_draw(usecase->text, renderer);
 }
diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c
index 459706a..9cb032f 100644
--- a/objects/custom/custom_object.c
+++ b/objects/custom/custom_object.c
@@ -1009,10 +1009,9 @@ custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer,
   case GE_ELLIPSE:
     transform_coord(custom, &el->ellipse.center, &p1);
     transform_size(custom, el->ellipse.width, el->ellipse.height, &width, &height);
-    if (custom->show_background && el->any.s.fill != DIA_SVG_COLOUR_NONE)
-      renderer_ops->fill_ellipse(renderer, &p1, width,  height, bg);
-    if (el->any.s.stroke != DIA_SVG_COLOUR_NONE)
-      renderer_ops->draw_ellipse(renderer, &p1, width, height, fg);
+    renderer_ops->draw_ellipse (renderer, &p1, width, height,
+                               (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_IMAGE:
     transform_coord(custom, &el->image.topleft, &p1);
diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c
index f1ebab5..8b4d67d 100644
--- a/objects/flowchart/ellipse.c
+++ b/objects/flowchart/ellipse.c
@@ -333,21 +333,16 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
   center.x = elem->corner.x + elem->width/2;
   center.y = elem->corner.y + elem->height/2;
 
-  if (ellipse->show_background) {
-    renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-  
-    renderer_ops->fill_ellipse(renderer, &center,
-                               elem->width, elem->height,
-                               &ellipse->inner_color);
-  }
-
+  if (ellipse->show_background)
+    renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);  
   renderer_ops->set_linewidth(renderer, ellipse->border_width);
   renderer_ops->set_linestyle(renderer, ellipse->line_style);
   renderer_ops->set_dashlength(renderer, ellipse->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
-  renderer_ops->draw_ellipse(renderer, &center,
+  renderer_ops->draw_ellipse (renderer, &center,
                              elem->width, elem->height,
+                             (ellipse->show_background) ? &ellipse->inner_color : NULL,
                              &ellipse->border_color);
 
   text_draw(ellipse->text, renderer);
diff --git a/objects/network/basestation.c b/objects/network/basestation.c
index 9297988..6bba40f 100644
--- a/objects/network/basestation.c
+++ b/objects/network/basestation.c
@@ -262,8 +262,8 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
                              &basestation->fill_colour,
                              &basestation->line_colour);
   /* bottom */
-  renderer_ops->fill_ellipse(renderer, &cb, r, r/2.0,
-                             &basestation->fill_colour);
+  renderer_ops->draw_ellipse(renderer, &cb, r, r/2.0,
+                             &basestation->fill_colour, NULL);
   renderer_ops->draw_arc(renderer, &cb, r, r/2.0, 180, 0,
                          &basestation->line_colour);
   /* bar */
@@ -281,10 +281,9 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
   renderer_ops->draw_line(renderer, &p1, &p2,
                           &basestation->line_colour);
   /* top */
-  renderer_ops->fill_ellipse(renderer, &ct, r, r/2.0,
-                             &basestation->fill_colour);
   renderer_ops->draw_ellipse(renderer, &ct, r, r/2.0,
-                             &basestation->line_colour);
+                            &basestation->fill_colour,
+                            &basestation->line_colour);
   /* antenna 2 */
   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;
diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c
index 1264279..475ba26 100644
--- a/objects/standard/ellipse.c
+++ b/objects/standard/ellipse.c
@@ -315,22 +315,23 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
       dia_pattern_get_fallback_color (ellipse->pattern, &fill);
       if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
         renderer_ops->set_pattern (renderer, ellipse->pattern);
+      /* still two calls with pattern */
+      renderer_ops->draw_ellipse (renderer, 
+                                 &center,
+                                 elem->width, elem->height,
+                                 &fill, NULL);
+      if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
+       renderer_ops->set_pattern (renderer, NULL);
     }
-    renderer_ops->fill_ellipse(renderer, 
-                               &center,
-                               elem->width, elem->height,
-                               &fill);
-    if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
-      renderer_ops->set_pattern (renderer, NULL);
   }
 
   renderer_ops->set_linewidth(renderer, ellipse->border_width);
   renderer_ops->set_linestyle(renderer, ellipse->line_style);
   renderer_ops->set_dashlength(renderer, ellipse->dashlength);
-
   renderer_ops->draw_ellipse(renderer, 
                          &center,
                          elem->width, elem->height,
+                         (ellipse->show_background && !ellipse->pattern) ? &ellipse->inner_color : NULL,
                          &ellipse->border_color);
 }
 
diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c
index 5702ec8..b7f2938 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -795,18 +795,12 @@ static void
 draw_ellipse(DiaRenderer *self, 
              Point *center,
              real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, color, FALSE);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
+             Color *fill, Color *stroke)
 {
-  _ellipse (self, center, width, height, color, TRUE);
+  if (fill)
+    _ellipse (self, center, width, height, fill, TRUE);
+  if (stroke)
+    _ellipse (self, center, width, height, stroke, FALSE);
 }
 
 static void
@@ -1174,7 +1168,6 @@ cairo_renderer_class_init (DiaCairoRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c
index d089d44..214def6 100644
--- a/plug-ins/cgm/cgm.c
+++ b/plug-ins/cgm/cgm.c
@@ -289,11 +289,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *colour);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *colour);
+                        Color *fill, Color *stroke);
 static void draw_bezier(DiaRenderer *self, 
                        BezPoint *points,
                        int numpoints,
@@ -884,33 +880,12 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
     CgmRenderer *renderer = CGM_RENDERER(self);
     real  ynew;
 
-    write_filledge_attributes(renderer, NULL, colour);
-
-    ynew = swap_y(renderer, center->y);
-    write_elhead(renderer->file, 4, 17, 6 * REALSIZE);
-    write_real(renderer->file, center->x); /* center */
-    write_real(renderer->file, ynew);
-    write_real(renderer->file, center->x + width/2); /* axes 1 */
-    write_real(renderer->file, ynew);
-    write_real(renderer->file, center->x); /* axes 2 */
-    write_real(renderer->file, ynew + height/2);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *colour)
-{
-    CgmRenderer *renderer = CGM_RENDERER(self);
-    real ynew;
-
-    write_filledge_attributes(renderer, colour, NULL);
+    write_filledge_attributes(renderer, fill, stroke);
 
     ynew = swap_y(renderer, center->y);
     write_elhead(renderer->file, 4, 17, 6 * REALSIZE);
@@ -922,7 +897,6 @@ fill_ellipse(DiaRenderer *self,
     write_real(renderer->file, ynew + height/2);
 }
 
-
 static void 
 write_bezier(CgmRenderer *renderer, 
              BezPoint *points, 
@@ -1336,9 +1310,7 @@ cgm_renderer_class_init (CgmRendererClass *klass)
 
     renderer_class->draw_arc = draw_arc;
     renderer_class->fill_arc = fill_arc;
-
     renderer_class->draw_ellipse = draw_ellipse;
-    renderer_class->fill_ellipse = fill_ellipse;
 
     renderer_class->draw_bezier = draw_bezier;
     renderer_class->draw_beziergon = draw_beziergon;
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index c7cc079..aeab0be 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -308,12 +308,10 @@ _render_object (xmlNodePtr render, DiaContext *ctx)
                         _parse_real (node, "angle1"),  _parse_real (node, "angle2"), stroke);
       } else if (xmlStrcmp (node->name, (const xmlChar *)"ellipse") == 0) {
        Point center = _parse_point (node, "center");
-       if (fill)
-         ops->fill_ellipse (ir, &center, _parse_real (node, "width"),
-                            _parse_real (node, "height"), fill);
-       if (stroke)
-         ops->draw_ellipse (ir, &center, _parse_real (node, "width"),
-                            _parse_real (node, "height"), stroke);
+       ops->draw_ellipse (ir, &center,
+                          _parse_real (node, "width"),
+                          _parse_real (node, "height"),
+                          fill, stroke);
       } else if (xmlStrcmp (node->name, (const xmlChar *)"bezier") == 0) {
        GArray *path = _parse_bezpoints (node, "bezpoints");
        if (path) {
diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c
index 18e2055..c30c4fc 100644
--- a/plug-ins/drs/dia-render-script-renderer.c
+++ b/plug-ins/drs/dia-render-script-renderer.c
@@ -535,11 +535,10 @@ fill_arc(DiaRenderer *self,
 }
 
 static void
-_ellipse(DiaRenderer *self, 
-         Point *center,
-         real width, real height,
-         Color *color,
-         gboolean fill)
+draw_ellipse(DiaRenderer *self, 
+             Point *center,
+             real width, real height,
+             Color *fill, Color *stroke)
 {
   DrsRenderer *renderer = DRS_RENDERER (self);
   xmlNodePtr node;
@@ -550,25 +549,9 @@ _ellipse(DiaRenderer *self,
   _node_set_real (node, "width", width);
   _node_set_real (node, "height", height);
   if (fill)
-    _node_set_color (node, "fill", color);
-  else
-    _node_set_color (node, "stroke", color);
-}
-static void
-draw_ellipse(DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, color, FALSE);
-}
-static void
-fill_ellipse(DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color)
-{
-  _ellipse (self, center, width, height, color, TRUE);
+    _node_set_color (node, "fill", fill);
+  if (stroke)
+    _node_set_color (node, "stroke", stroke);
 }
 
 static void
@@ -708,7 +691,6 @@ drs_renderer_class_init (DrsRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index 77378bf..4643234 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -154,11 +154,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *colour);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *colour);
+                        Color *fill, Color *stroke);
 static void draw_string(DiaRenderer *self,
                        const char *text,
                        Point *pos, Alignment alignment,
@@ -235,7 +231,6 @@ dxf_renderer_class_init (DxfRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string = draw_string;
 
@@ -476,10 +471,11 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
     DxfRenderer *renderer = DXF_RENDERER(self);
     gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+    Color *color = fill ? fill : stroke; /* emulate fill by SOLID? */
 
     /* draw a circle instead of an ellipse, if it's one */
     if(width == height){
@@ -503,19 +499,9 @@ draw_ellipse(DiaRenderer *self,
         fprintf(renderer->file, " 41\n%s\n", g_ascii_formatd (buf, sizeof(buf), "%g", 0.0)); /*Start 
Parameter full ellipse */
         fprintf(renderer->file, " 42\n%s\n", g_ascii_formatd (buf, sizeof(buf), "%g", 2.0*3.14)); /* End 
Parameter full ellipse */             
     }
-    fprintf(renderer->file, " 62\n%d\n", dxf_color (colour));
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *colour)
-{
-    /* emulate by SOLID? */
+    fprintf(renderer->file, " 62\n%d\n", dxf_color (color));
 }
 
-
 static void
 draw_string(DiaRenderer *self,
            const char *text,
diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c
index 4c4f556..15322a3 100644
--- a/plug-ins/hpgl/hpgl.c
+++ b/plug-ins/hpgl/hpgl.c
@@ -488,9 +488,10 @@ static void
 draw_ellipse(DiaRenderer *object, 
             Point *center,
             real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
   HpglRenderer *renderer = HPGL_RENDERER (object);
+  Color *colour = fill ? fill : stroke;
 
   DIAG_NOTE(g_message("draw_ellipse %fx%f center @ %f,%f", 
             width, height, center->x, center->y));
@@ -511,16 +512,6 @@ draw_ellipse(DiaRenderer *object,
 }
 
 static void
-fill_ellipse(DiaRenderer *object, 
-            Point *center,
-            real width, real height,
-            Color *colour)
-{
-    DIAG_NOTE(g_message("fill_ellipse %fx%f center @ %f,%f", 
-              width, height, center->x, center->y));
-}
-
-static void
 draw_string(DiaRenderer *object,
            const char *text,
            Point *pos, Alignment alignment,
@@ -653,7 +644,6 @@ hpgl_renderer_class_init (HpglRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c
index 7e0b55a..7b57142 100644
--- a/plug-ins/libart/dialibartrenderer.c
+++ b/plug-ins/libart/dialibartrenderer.c
@@ -725,18 +725,12 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *color)
-{
-  draw_arc(self, center, width, height, 0.0, 360.0, color); 
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *color)
+            Color *fill, Color *stroke)
 {
-  fill_arc(self, center, width, height, 0.0, 360.0, color); 
+  if (fill)
+    fill_arc(self, center, width, height, 0.0, 360.0, fill);
+  if (stroke)
+    draw_arc(self, center, width, height, 0.0, 360.0, stroke); 
 }
 
 static void
@@ -1416,7 +1410,6 @@ dia_libart_renderer_class_init (DiaLibartRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_bezier = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c
index bb00992..d7d913d 100644
--- a/plug-ins/metapost/render_metapost.c
+++ b/plug-ins/metapost/render_metapost.c
@@ -596,34 +596,7 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *color)
-{
-    MetapostRenderer *renderer = METAPOST_RENDERER (self);
-    gchar d1_buf[DTOSTR_BUF_SIZE];
-    gchar d2_buf[DTOSTR_BUF_SIZE];
-
-    set_line_color(renderer,color);
-    
-    fprintf(renderer->file, "  draw (%sx,%sy)..",
-           mp_dtostr(d1_buf, (gdouble) center->x+width/2.0),
-           mp_dtostr(d2_buf, (gdouble) center->y) );
-    fprintf(renderer->file, "(%sx,%sy)..",
-           mp_dtostr(d1_buf, (gdouble) center->x),
-           mp_dtostr(d2_buf, (gdouble) center->y+height/2.0) );
-    fprintf(renderer->file, "(%sx,%sy)..",
-           mp_dtostr(d1_buf, (gdouble) center->x-width/2.0),
-           mp_dtostr(d2_buf, (gdouble) center->y) );
-    fprintf(renderer->file, "(%sx,%sy)..cycle",
-           mp_dtostr(d1_buf, (gdouble) center->x),
-           mp_dtostr(d2_buf, (gdouble) center->y-height/2.0) );
-    end_draw_op(renderer);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *color)
+            Color *fill, Color *stroke)
 {
     MetapostRenderer *renderer = METAPOST_RENDERER (self);
     gchar d1_buf[DTOSTR_BUF_SIZE];
@@ -632,6 +605,9 @@ fill_ellipse(DiaRenderer *self,
     gchar green_buf[DTOSTR_BUF_SIZE];
     gchar blue_buf[DTOSTR_BUF_SIZE];
 
+    if (stroke)
+       set_line_color(renderer,stroke);
+
     fprintf(renderer->file, 
            "  path p;\n"
            "  p = (%sx,%sy)..",
@@ -647,14 +623,18 @@ fill_ellipse(DiaRenderer *self,
            mp_dtostr(d1_buf, (gdouble) center->x),
            mp_dtostr(d2_buf, (gdouble) center->y-height/2.0) );
 
-    fprintf(renderer->file,
-           "  fill p withcolor (%s,%s,%s);\n",
-           mp_dtostr(red_buf, (gdouble) color->red),
-           mp_dtostr(green_buf, (gdouble) color->green),
-           mp_dtostr(blue_buf, (gdouble) color->blue) );
-}
-
+    if (fill)
+       fprintf(renderer->file,
+               "  fill p withcolor (%s,%s,%s);\n",
+               mp_dtostr(red_buf, (gdouble) fill->red),
+               mp_dtostr(green_buf, (gdouble) fill->green),
+               mp_dtostr(blue_buf, (gdouble) fill->blue) );
 
+    if (stroke) {
+       fprintf(renderer->file, "  draw p");
+       end_draw_op(renderer);
+    }
+}
 
 static void
 draw_bezier(DiaRenderer *self, 
@@ -703,8 +683,6 @@ draw_bezier(DiaRenderer *self,
     end_draw_op(renderer);
 }
 
-
-
 static void
 draw_beziergon (DiaRenderer *self, 
                BezPoint *points,
@@ -792,8 +770,8 @@ draw_string(DiaRenderer *self,
     set_line_color(renderer,color);
 
     /* text position is correct for baseline. Uses macros defined
-        * at top of MetaPost file (see export_metapost) to correctly
-        * align text. See bug # 332554 */
+     * at top of MetaPost file (see export_metapost) to correctly
+     * align text. See bug # 332554 */
     switch (alignment) {
     case ALIGN_LEFT:
        fprintf(renderer->file,"  draw");
@@ -887,7 +865,7 @@ draw_text_line(DiaRenderer *self, TextLine *text_line,
 
     fprintf(renderer->file,";\n");
 }
-              
+
 
 static void
 draw_image(DiaRenderer *self,
@@ -1050,7 +1028,6 @@ metapost_renderer_class_init (MetapostRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_bezier = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c
index 74a9223..99c764e 100644
--- a/plug-ins/pgf/render_pgf.c
+++ b/plug-ins/pgf/render_pgf.c
@@ -115,11 +115,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *color);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *color);
+                        Color *fill, Color *stroke);
 static void draw_bezier(DiaRenderer *self, 
                        BezPoint *points,
                        int numpoints,
@@ -277,7 +273,6 @@ pgf_renderer_class_init (PgfRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_bezier = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
@@ -760,22 +755,14 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *color)
-{
-    PgfRenderer *renderer = PGF_RENDERER(self);
-
-    pgf_ellipse(renderer,center,width,height,color,FALSE);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *color)
+            Color *fill, Color *stroke)
 {
     PgfRenderer *renderer = PGF_RENDERER(self);
 
-    pgf_ellipse(renderer,center,width,height,color,TRUE);
+    if (fill)
+       pgf_ellipse(renderer,center,width,height,fill,TRUE);
+    if (stroke)
+       pgf_ellipse(renderer,center,width,height,stroke,FALSE);
 }
 
 static void
@@ -1254,6 +1241,7 @@ export_pgf(DiagramData *data, DiaContext *ctx,
     initial_color.red=0.;
     initial_color.green=0.;
     initial_color.blue=0.;
+    initial_color.alpha=1.;
     set_line_color(renderer,&initial_color);
 
     initial_color.red=1.;
diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c
index d0dd7ba..b09864d 100644
--- a/plug-ins/postscript/diapsrenderer.c
+++ b/plug-ins/postscript/diapsrenderer.c
@@ -467,20 +467,13 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *color)
+            Color *fill, Color *stroke)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  psrenderer_ellipse(renderer, center, width, height, color, FALSE);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *color)
-{
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  psrenderer_ellipse(renderer, center, width, height, color, TRUE);
+  if (fill)
+    psrenderer_ellipse(renderer, center, width, height, fill, TRUE);
+  if (stroke)
+    psrenderer_ellipse(renderer, center, width, height, stroke, FALSE);
 }
 
 static void
@@ -993,7 +986,6 @@ dia_ps_renderer_class_init (DiaPsRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
 
diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c
index 2df0a89..286237d 100644
--- a/plug-ins/pstricks/render_pstricks.c
+++ b/plug-ins/pstricks/render_pstricks.c
@@ -95,11 +95,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *color);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *color);
+                        Color *fill, Color *stroke);
 static void draw_bezier(DiaRenderer *self, 
                        BezPoint *points,
                        int numpoints,
@@ -211,7 +207,6 @@ pstricks_renderer_class_init (PstricksRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_bezier = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
@@ -577,22 +572,14 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *color)
-{
-    PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
-
-    pstricks_ellipse(renderer,center,width,height,color,FALSE);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *color)
+            Color *fill, Color *stroke)
 {
     PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
 
-    pstricks_ellipse(renderer,center,width,height,color,TRUE);
+    if (fill)
+       pstricks_ellipse(renderer,center,width,height,fill,TRUE);
+    if (stroke)
+       pstricks_ellipse(renderer,center,width,height,stroke,FALSE);
 }
 
 static void
@@ -745,7 +732,7 @@ draw_string(DiaRenderer *self,
     if (strncmp (text, "\\tex", 4) != 0)
       escaped = tex_escape_string(text, renderer->ctx);
 
-    set_line_color(renderer,color);
+    set_fill_color(renderer,color);
 
     fprintf(renderer->file,"\\rput");
     switch (alignment) {
diff --git a/plug-ins/python/diadissect.py b/plug-ins/python/diadissect.py
index edbd2dd..59fd5b4 100644
--- a/plug-ins/python/diadissect.py
+++ b/plug-ins/python/diadissect.py
@@ -120,10 +120,8 @@ class DissectRenderer :
                self._arc(center, width, height, angle1, angle2, "draw_arc")
        def fill_arc (self, center, width, height, angle1, angle2, color) :
                self._arc(center, width, height, angle1, angle2, "fill_arc")
-       def draw_ellipse (self, center, width, height, color) :
+       def draw_ellipse (self, center, width, height, fill, stroke) :
                self._arc(center, width, height, 0, 360, "draw_ellipse")
-       def fill_ellipse (self, center, width, height, color) :
-               self._arc(center, width, height, 0, 360, "fill_elipse")
        def _bezier (self, bezpoints, fun) :
                nMoves = 0
                for bp in bezpoints :
diff --git a/plug-ins/python/diastddia.py b/plug-ins/python/diastddia.py
index bc13d78..ac526f4 100644
--- a/plug-ins/python/diastddia.py
+++ b/plug-ins/python/diastddia.py
@@ -179,10 +179,11 @@ class StandardDiaRenderer :
 %s%s
     </dia:object>''' % (self.oid, center.x-width/2, center.y-height/2, width, height, 
                        self._tinting(color, fill, 'border_color', 'border_width'), self._stroke_style()))
-       def draw_ellipse (self, center, width, height, color) :
-               self._ellipse(center, width, height, color, 0)
-       def fill_ellipse (self, center, width, height, color) :
-               self._ellipse(center, width, height, 0, color)
+       def draw_ellipse (self, center, width, height, fill, stroke) :
+               if fill :
+                       self._ellipse(center, width, height, fill, 1)
+               if stroke :
+                       self._ellipse(center, width, height, stroke, 0)
 
        def _arc(self, center, width, height, angle1, angle2, color, fill) :
                self.oid = self.oid + 1
diff --git a/plug-ins/python/diasvg.py b/plug-ins/python/diasvg.py
index 68c6191..ba6d6e4 100644
--- a/plug-ins/python/diasvg.py
+++ b/plug-ins/python/diasvg.py
@@ -147,12 +147,12 @@ class SvgRenderer :
                self._arc(center, width, height, angle1, angle2, color)
        def fill_arc (self, center, width, height, angle1, angle2, color) :
                self._arc(center, width, height, angle1, angle2, color, 1)
-       def draw_ellipse (self, center, width, height, color) :
-               self.f.write('<ellipse cx="%.3f" cy="%.3f" rx="%.3f" ry="%.3f" fill="none" stroke="%s"  
stroke-width="%.3f" %s/>' \
-                                       % (center.x, center.y, width / 2, height / 2, self._rgb(color), 
self.line_width, self._stroke_style()))
-       def fill_ellipse (self, center, width, height, color) :
-               self.f.write('<ellipse cx="%.3f" cy="%.3f" rx="%.3f" ry="%.3f" fill="%s" stroke="none"  />' \
-                                       % (center.x, center.y, width / 2, height / 2, self._rgb(color)))
+       def draw_ellipse (self, center, width, height, fill, stroke) :
+               self.f.write('<ellipse cx="%.3f" cy="%.3f" rx="%.3f" ry="%.3f"' \
+                               'fill="%s" stroke="%s"  stroke-width="%.3f" %s/>\n' \
+                               % (center.x, center.y, width / 2, height / 2,
+                                  self._rgb(fill), self._rgb(stroke),
+                                  self.line_width, self._stroke_style()))
        def _bezier (self, bezpoints) :
                for bp in bezpoints :
                        if bp.type == 0 : # BEZ_MOVE_TO
@@ -177,7 +177,7 @@ class SvgRenderer :
                self.f.write('"/>\n')
        def draw_beziergon (self, bezpoints, fill, stroke) :
                self.f.write('<path stroke="%s" fill="%s" stroke-width="%.3f" %s d="' \
-                                       % (self._rgb(stroke), self._rgb(fill), self.line_width, 
self._stroke_style()))
+                               % (self._rgb(stroke), self._rgb(fill), self.line_width, self._stroke_style()))
                self._bezier (bezpoints)
                self.f.write('z"/>\n')
        def draw_string (self, text, pos, alignment, color) :
diff --git a/plug-ins/python/export-render.py b/plug-ins/python/export-render.py
index 9790830..d9c5822 100644
--- a/plug-ins/python/export-render.py
+++ b/plug-ins/python/export-render.py
@@ -88,21 +88,18 @@ class DumpRenderer :
                                + str(width) + "x" + str(height) + ";" \
                                + str(angle1) + "," + str(angle2) + ";" + str(color) + "\n")
        ## \brief Draw an ellipse
-       def draw_ellipse (self, center, width, height, color) :
+       def draw_ellipse (self, center, width, height, fill, stroke) :
                self.f.write("draw_ellipse: " + str(center) \
-                               + str(width) + "x" +str(height) + ";" + str(color) + "\n")
-       ## \brief Fill an ellipse
-       def fill_ellipse (self, center, width, height, color) :
-               self.f.write("fill_ellipse: " + str(center) \
-                               + str(width) + "x" +str(height) + ";" + str(color) + "\n")
+                               + str(width) + "x" +str(height)
+                               + ";" + str(fill) + ";" + str(stroke) + "\n")
        ## \brief Draw a bezier line
        def draw_bezier (self, bezpoints, color) :
                self.f.write("draw_bezier: " + str(color) + "\n")
                for pt in bezpoints :
                        self.f.write ("\t" + str(pt) + "\n")
        ## \brief Fill a bezier shape
-       def fill_bezier (self, bezpoints, color) :
-               self.f.write("fill_bezier: " + str(color) + "\n")
+       def draw_beziergon (self, bezpoints, fill, stroke) :
+               self.f.write("draw_bezier: " + str(fill) + "; " + str(stroke) + "\n")
                for pt in bezpoints :
                        self.f.write ("\t" + str(pt) + "\n")
        ## \brief Draw a string
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 477dc17..36b35fd 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -817,72 +817,40 @@ static void
 draw_ellipse(DiaRenderer *renderer, 
             Point *center,
             real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
   PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
 
   func = PyObject_GetAttrString (self, "draw_ellipse");
   if (func && PyCallable_Check(func)) {
     PyObject *opoint = PyDiaPoint_New (center);
-    PyObject *ocolor = PyDiaColor_New (colour);
-
+    PyObject *fill_po;
+    PyObject *stroke_po;
     Py_INCREF(self);
     Py_INCREF(func);
-    arg = Py_BuildValue ("(OddO)", opoint, width, height, ocolor);
-    if (arg) {
-      res = PyEval_CallObject (func, arg);
-      ON_RES(res, FALSE);
-    }
-    Py_XDECREF (arg);
-    Py_XDECREF (opoint);
-    Py_XDECREF (ocolor);
-    Py_DECREF(func);
-    Py_DECREF(self);
-  }
-  else { /* member not optional */
-    gchar *msg = g_strdup_printf ("%s.draw_ellipse() implmentation missing.",
-                                 G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
-    PyErr_Clear();
-    PyErr_Warn (PyExc_RuntimeWarning, msg);
-    g_free (msg);
-  }
-}
-
-/*!
- * \brief Fill ellipse
- *
- * Not optional on the PyDia side. If not implemented a runtime warning 
- * will be generated when called.
- *
- * \memberof _DiaPyRenderer
- */
-static void
-fill_ellipse(DiaRenderer *renderer, 
-            Point *center,
-            real width, real height,
-            Color *colour)
-{
-  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
+    /* we have to provide a Python object even if there is no color */
+    if (fill)
+      fill_po = PyDiaColor_New (fill);
+    else
+      Py_INCREF(Py_None), fill_po = Py_None;
+    if (stroke)
+      stroke_po = PyDiaColor_New (stroke);
+    else
+      Py_INCREF(Py_None), stroke_po = Py_None;
 
-  func = PyObject_GetAttrString (self, "fill_ellipse");
-  if (func && PyCallable_Check(func)) {
-    PyObject *opoint = PyDiaPoint_New (center);
-    PyObject *ocolor = PyDiaColor_New (colour);
-    Py_INCREF(self);
-    Py_INCREF(func);
-    arg = Py_BuildValue ("(OddO)", opoint, width, height, ocolor);
+    arg = Py_BuildValue ("(OddOO)", opoint, width, height, fill_po, stroke_po);
     if (arg) {
       res = PyEval_CallObject (func, arg);
       ON_RES(res, FALSE);
     }
     Py_XDECREF (arg);
     Py_XDECREF (opoint);
-    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_ellipse() implmentation missing.",
+  } else { /* member not optional */
+    gchar *msg = g_strdup_printf ("%s.draw_ellipse() implementation missing.",
                                  G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
     PyErr_Clear();
     PyErr_Warn (PyExc_RuntimeWarning, msg);
@@ -1220,7 +1188,6 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index e08da56..5656029 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -118,7 +118,7 @@ static void draw_rect(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *colour);
+                        Color *fill, Color *stroke);
 
 /* helper functions */
 static void add_connection_point(ShapeRenderer *renderer, 
@@ -510,15 +510,16 @@ static void
 draw_ellipse(DiaRenderer *self, 
              Point *center,
              real width, real height,
-             Color *colour)
+             Color *fill, Color *stroke)
 {
   ShapeRenderer *renderer = SHAPE_RENDERER(self);
 
   /* use base class implementation */
-  DIA_RENDERER_CLASS(parent_class)->draw_ellipse (self, center, width, height, colour);
+  DIA_RENDERER_CLASS(parent_class)->draw_ellipse (self, center, width, height, fill, stroke);
 
   /* do our own stuff */
-  add_ellipse_connection_points(renderer, center, width, height);
+  if (stroke)
+    add_ellipse_connection_points(renderer, center, width, height);
 }
 
 static gboolean
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index 134d0ea..b98c365 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -128,11 +128,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *color);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *color);
+                        Color *fill, Color *stroke);
 static void draw_string(DiaRenderer *self,
                        const char *text,
                        Point *pos, Alignment alignment,
@@ -230,7 +226,6 @@ vdx_renderer_class_init (VDXRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   /* Until we have NURBS, let Dia use lines */
   /* renderer_class->draw_bezier = draw_bezier; */
@@ -1054,10 +1049,11 @@ static void fill_arc(DiaRenderer *self,
  * @param color line colour
  */
 
-static void draw_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *color)
+static void
+stroke_ellipse (DiaRenderer *self, 
+               Point *center,
+               real width, real height,
+               Color *color)
 {
     VDXRenderer *renderer = VDX_RENDERER(self);
     Point a;
@@ -1222,6 +1218,18 @@ static void fill_ellipse(DiaRenderer *self,
     g_slist_free(Shape.any.children);
 }
 
+static void
+draw_ellipse (DiaRenderer *self, 
+             Point *center,
+             real width, real height,
+             Color *fill, Color *stroke)
+{
+    if (fill)
+       fill_ellipse (self, center, width, height, fill);
+    if (stroke)
+       stroke_ellipse (self, center, width, height, stroke);
+}
+
 /** Render a Dia string
  * @param self a renderer
  * @param text the string
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index baa8df9..e1310e5 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -814,15 +814,22 @@ static void
 draw_ellipse(DiaRenderer *self, 
             Point *center,
             real width, real height,
-            Color *colour)
+            Color *fill, Color *stroke)
 {
     WmfRenderer *renderer = WMF_RENDERER (self);
     W32::HPEN hPen;
+    W32::HGDIOBJ hBrush, hBrOld;
 
     DIAG_NOTE(renderer, "draw_ellipse %fx%f @ %f,%f\n", 
               width, height, center->x, center->y);
 
-    hPen = UsePen(renderer, colour);
+    if (fill) {
+       W32::COLORREF rgb = W32COLOR(fill);
+       hBrush = W32::CreateSolidBrush(rgb);
+       hBrOld = W32::SelectObject(renderer->hFileDC, hBrush);
+    }
+    if (stroke)
+       hPen = UsePen(renderer, stroke);
 
     W32::Ellipse(renderer->hFileDC,
                  SCX(center->x - width / 2), /* bbox corners */
@@ -830,31 +837,13 @@ draw_ellipse(DiaRenderer *self,
                  SCX(center->x + width / 2), 
                  SCY(center->y + height / 2));
 
-    DonePen(renderer, hPen);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-            Point *center,
-            real width, real height,
-            Color *colour)
-{
-    WmfRenderer *renderer = WMF_RENDERER (self);
-    W32::HPEN    hPen;
-    W32::HGDIOBJ hBrush, hBrOld;
-    W32::COLORREF rgb = W32COLOR(colour);
-
-    DIAG_NOTE(renderer, "fill_ellipse %fx%f @ %f,%f\n", 
-              width, height, center->x, center->y);
-
-    hBrush = W32::CreateSolidBrush(rgb);
-    hBrOld = W32::SelectObject(renderer->hFileDC, hBrush);
-
-    draw_ellipse(self, center, width, height, NULL);
-
-    W32::SelectObject(renderer->hFileDC, 
-                      W32::GetStockObject (HOLLOW_BRUSH) );
-    W32::DeleteObject(hBrush);
+    if (stroke)
+       DonePen(renderer, hPen);
+    if (fill) {
+       W32::SelectObject(renderer->hFileDC, 
+                         W32::GetStockObject (HOLLOW_BRUSH) );
+       W32::DeleteObject(hBrush);
+    }
 }
 
 #ifndef DIRECT_WMF
@@ -1275,7 +1264,6 @@ wmf_renderer_class_init (WmfRendererClass *klass)
   renderer_class->fill_arc     = fill_arc;
 #endif
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
 #ifndef HAVE_LIBEMF
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index 9536b41..f3c48bb 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -129,16 +129,11 @@ _do_ellipse (WpgImportRenderer *ren, WPGEllipse* pEll)
                                             pEll->StartAngle, pEll->EndAngle,
                                             &ren->fill);
   } else {
-    if (ren->LineAttr.Type != WPG_LA_NONE)
-      DIA_RENDERER_GET_CLASS(ren)->draw_ellipse (DIA_RENDERER(ren), &center,
-                                                2 * pEll->rx / WPU_PER_DCM,
-                                                2 * pEll->ry / WPU_PER_DCM,
-                                                &ren->stroke);
-    if (ren->FillAttr.Type != WPG_FA_HOLLOW)
-      DIA_RENDERER_GET_CLASS(ren)->fill_ellipse (DIA_RENDERER(ren), &center,
+    DIA_RENDERER_GET_CLASS(ren)->draw_ellipse (DIA_RENDERER(ren), &center,
                                                 2 * pEll->rx / WPU_PER_DCM,
                                                 2 * pEll->ry / WPU_PER_DCM,
-                                                &ren->fill);
+                                                (ren->FillAttr.Type != WPG_FA_HOLLOW) ? &ren->fill : NULL,
+                                                (ren->LineAttr.Type != WPG_LA_NONE) ? &ren->stroke : NULL);
   }
 }
 
diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c
index 10bd7c6..333865a 100644
--- a/plug-ins/wpg/wpg.c
+++ b/plug-ins/wpg/wpg.c
@@ -662,7 +662,7 @@ static void
 draw_ellipse(DiaRenderer *self, 
              Point *center,
              real width, real height,
-             Color *colour)
+             Color *fill, Color *stroke)
 {
   WpgRenderer *renderer = WPG_RENDERER (self);
   WPGEllipse ell;
@@ -680,27 +680,16 @@ draw_ellipse(DiaRenderer *self,
   ell.EndAngle   = 360;
   ell.Flags = 0;
 
-  WriteLineAttr(renderer, colour);
+  if (stroke)
+    WriteLineAttr(renderer, stroke);
+  if (fill)
+    WriteFillAttr(renderer, fill, TRUE);
   WriteRecHead(renderer, WPG_ELLIPSE, sizeof(WPGEllipse));
 
   g_assert(16 == sizeof(WPGEllipse));
   fwrite_le(&ell, sizeof(guint16), sizeof(WPGEllipse) / sizeof(guint16), renderer->file);
-}
-
-static void
-fill_ellipse(DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *colour)
-{
-  WpgRenderer *renderer = WPG_RENDERER (self);
-
-  DIAG_NOTE(g_message("fill_ellipse %fx%f center @ %f,%f", 
-            width, height, center->x, center->y));
-
-  WriteFillAttr(renderer, colour, TRUE);
-  draw_ellipse(self,center,width,height,colour);
-  WriteFillAttr(renderer, colour, FALSE);
+  if (fill)
+    WriteFillAttr(renderer, fill, FALSE);
 }
 
 static void
@@ -1035,7 +1024,6 @@ wpg_renderer_class_init (WpgRendererClass *klass)
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_image   = draw_image;
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index 68f9e3e..8c7cf33 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -156,11 +156,7 @@ static void fill_arc(DiaRenderer *self,
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
-                        Color *colour);
-static void fill_ellipse(DiaRenderer *self, 
-                        Point *center,
-                        real width, real height,
-                        Color *colour);
+                        Color *fill, Color *stroke);
 static void draw_bezier(DiaRenderer *self, 
                        BezPoint *points,
                        int numpoints,
@@ -257,7 +253,6 @@ xfig_renderer_class_init (XfigRendererClass *klass)
   renderer_class->fill_arc = fill_arc;
 
   renderer_class->draw_ellipse = draw_ellipse;
-  renderer_class->fill_ellipse = fill_ellipse;
 
   renderer_class->draw_rect = draw_rect;
   renderer_class->draw_bezier = draw_bezier;
@@ -1004,10 +999,10 @@ fill_arc(DiaRenderer *self,
 }
 
 static void 
-draw_ellipse(DiaRenderer *self, 
-             Point *center,
-             real width, real height,
-             Color *color) 
+stroke_ellipse(DiaRenderer *self, 
+               Point *center,
+               real width, real height,
+               Color *color) 
 {
   XfigRenderer *renderer = XFIG_RENDERER(self);
   gchar d_buf[DTOSTR_BUF_SIZE];
@@ -1053,6 +1048,18 @@ fill_ellipse(DiaRenderer *self,
          (int)figCoord(renderer, width/2), (int)figCoord(renderer, height/2));
 }
 
+static void
+draw_ellipse (DiaRenderer *self, 
+             Point *center,
+             real width, real height,
+             Color *fill, Color *stroke)
+{
+  if (fill)
+    fill_ellipse (self, center, width, height, fill);
+  if (stroke)
+    stroke_ellipse (self, center, width, height, stroke);
+}
+
 static void 
 draw_bezier(DiaRenderer *self, 
             BezPoint *points,


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