[dia] DiaRenderer: replace fill_rect with extended draw_rect method



commit a95ae2263cdf0db7322b16a3e58f6f11454015f1
Author: Hans Breuer <hans breuer org>
Date:   Sun Apr 27 20:15:31 2014 +0200

    DiaRenderer: replace fill_rect with extended draw_rect method
    
    What started with draw_beziergon() is continued with draw_rect(): merge
    two calls into one to get rid of superfluous drawing commands and arbitrary
    object splits.
    
    Given that fill_rect was a required method it could be expected that now
    draw_rect is. But with draw_polygon also being required there is a perfect
    fallback for the base class. So some renderer's draw_rect/fill_rect
    implementation could just be removed.
    
    Just using the base class now are: DXF, LibArt, MetaPost, PGF, PS, PSTricks, VDX
    
    To reduce the risk of breaking file formats not yet tested the following
    pattern is introduced:
    - rename draw_rect to stroke_rect
    - keep fill_rect as local function
    - make new draw_rect call one or both for fill and stroke parameter
    As a result the output of these exporters wont change at all.
    
    This is only used by: XFig and diastddia.py
    
    Also not optimized, but simple are: HPGL, Skia
    
    Optimized to fill and stroke in one step are: SVG, GDK, cairo, diasvg.py, WMF, WPG
    
    Fully optimized shape rendering for: AADL, ER, FS, KAOS, Standard,
    Network, UML, etc. pp. - i.e. all programmed objects

 bindings/dia-renderer.cpp                 |   17 +---
 bindings/dia-renderer.h                   |    7 +-
 lib/arrows.c                              |    2 +-
 lib/diagdkrenderer.c                      |   61 +++++---------
 lib/diaimportrenderer.c                   |   36 +++-----
 lib/diapathrenderer.c                     |   23 +-----
 lib/diarenderer.c                         |   68 ++++++++--------
 lib/diarenderer.h                         |    6 +-
 lib/diasvgrenderer.c                      |   36 ++------
 lib/diatransformrenderer.c                |   41 ---------
 lib/layer.c                               |    2 +-
 objects/AADL/aadldata.c                   |    3 +-
 objects/AADL/aadldevice.c                 |    3 +-
 objects/AADL/aadlprocessor.c              |    3 +-
 objects/Database/table.c                  |    6 +-
 objects/ER/entity.c                       |    7 +-
 objects/FS/function.c                     |    9 +--
 objects/GRAFCET/action.c                  |    4 +-
 objects/GRAFCET/step.c                    |    7 +-
 objects/Istar/other.c                     |    3 +-
 objects/Jackson/domain.c                  |    5 +-
 objects/KAOS/metabinrel.c                 |    2 +-
 objects/Misc/diagram_as_object.c          |    2 +-
 objects/Misc/grid_object.c                |   11 +--
 objects/SADT/box.c                        |    7 +--
 objects/UML/class.c                       |   18 ++---
 objects/UML/component.c                   |   14 +---
 objects/UML/fork.c                        |    4 +-
 objects/UML/large_package.c               |   16 +---
 objects/UML/lifeline.c                    |    7 +-
 objects/UML/object.c                      |   10 +--
 objects/UML/small_package.c               |    9 +--
 objects/flowchart/box.c                   |   99 ++--------------------
 objects/network/basestation.c             |    4 +-
 objects/standard/box.c                    |   10 ++-
 objects/standard/image.c                  |    3 +-
 objects/standard/textobj.c                |    2 +-
 plug-ins/cairo/diacairo-renderer.c        |   19 ++---
 plug-ins/cgm/cgm.c                        |   28 +------
 plug-ins/drs/dia-render-script-renderer.c |   23 ++---
 plug-ins/dxf/dxf-export.c                 |   32 +-------
 plug-ins/hpgl/hpgl.c                      |   29 +------
 plug-ins/libart/dialibartrenderer.c       |  130 +----------------------------
 plug-ins/metapost/render_metapost.c       |   69 ---------------
 plug-ins/pgf/render_pgf.c                 |   29 -------
 plug-ins/postscript/diapsrenderer.c       |   47 ----------
 plug-ins/pstricks/render_pstricks.c       |   54 ------------
 plug-ins/python/codegen.py                |    1 -
 plug-ins/python/diadissect.py             |    4 +-
 plug-ins/python/diastddia.py              |    9 +-
 plug-ins/python/diasvg.py                 |   10 +--
 plug-ins/python/export-render.py          |    5 +-
 plug-ins/python/pydia-render.c            |   72 ++++------------
 plug-ins/shape/shape-export.c             |    9 +-
 plug-ins/vdx/vdx-export.c                 |   57 -------------
 plug-ins/wmf/wmf.cpp                      |   52 +++++-------
 plug-ins/wpg/wpg-import.c                 |    9 +-
 plug-ins/wpg/wpg.c                        |   40 ++++-----
 plug-ins/xfig/xfig-export.c               |   29 ++++---
 59 files changed, 272 insertions(+), 1052 deletions(-)
---
diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp
index 269b77c..535a3aa 100644
--- a/bindings/dia-renderer.cpp
+++ b/bindings/dia-renderer.cpp
@@ -117,12 +117,12 @@ dia::Renderer::draw_line (Point *start, Point *end, Color *color)
     assert (self);
     DIA_RENDERER_GET_CLASS(self)->draw_line (self, start, end, color);
 }
-// Fill a rectangle, given its upper-left and lower-right corners
+// Fill and/or stroke a rectangle, given its upper-left and lower-right corners
 void 
-dia::Renderer::fill_rect (Point *ul_corner, Point *lr_corner, Color *color)
+dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke)
 {
     assert (self);
-    DIA_RENDERER_GET_CLASS(self)->fill_rect (self, ul_corner, lr_corner, color);
+    DIA_RENDERER_GET_CLASS(self)->draw_rect (self, ul_corner, lr_corner, fill, stroke);
 }
 // Draw an arc, given its center, the bounding box (widget, height), the start angle and the end angle
 void 
@@ -206,15 +206,8 @@ dia::Renderer::draw_text (Text* text)
     assert (self);
     DIA_RENDERER_GET_CLASS(self)->draw_text (self, text);
 }
-// Draw a rectangle, given its upper-left and lower-right corners
-void 
-dia::Renderer::draw_rect (Point *ul_corner, Point *lr_corner, Color *color)
-{
-    assert (self);
-    DIA_RENDERER_GET_CLASS(self)->draw_rect (self, ul_corner, lr_corner, color);
-}
-// a polyline with round coners
-void 
+// Draw a polyline with round corners
+void
 dia::Renderer::draw_rounded_polyline (Point *points, int num_points, Color *color, double radius )
 {
     assert (self);
diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h
index 47dc7b0..d994ce8 100644
--- a/bindings/dia-renderer.h
+++ b/bindings/dia-renderer.h
@@ -76,9 +76,9 @@ public :
     //! Draw a line from start to end, using color and the current line style
     //! \ingroup RendererRequired
     virtual void draw_line (Point *start, Point *end, Color *color);
-    //! Fill a rectangle, given its upper-left and lower-right corners
+    //! Fill and/or stroke a rectangle, given its upper-left and lower-right corners
     //! \ingroup RendererRequired
-    virtual void fill_rect (Point *ul_corner, Point *lr_corner, Color *color);
+    virtual void draw_rect (Point *ul_corner, Point *lr_corner, Color *fill, Color *stroke);
     //! the polygon is filled using the current fill type, no border is drawn
     //! \ingroup RendererRequired
     virtual void draw_polygon (Point *points, int num_points, Color *fill, Color *stroke);
@@ -121,9 +121,6 @@ public :
     //! draw a Text.  It holds its own information like position, style, ...
     //! \ingroup RenderMedium
     virtual void draw_text (Text* text);
-    //! Draw a rectangle, given its upper-left and lower-right corners
-    //! \ingroup RenderMedium
-    virtual void draw_rect (Point *ul_corner, Point *lr_corner, Color *color);
     
     /// \defgroup RenderHigh Renderer Can Implement This
     //! Highest level functions, probably only to be implemented by 
diff --git a/lib/arrows.c b/lib/arrows.c
index 1d5e84c..8509906 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -2033,7 +2033,7 @@ arrow_draw(DiaRenderer *renderer, ArrowType type,
     p2.y = bbox.bottom;
 
     DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer,0.01);
-    DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, &col);
+    DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, NULL, &col);
   }
 }
 
diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c
index 46a3a42..2166d19 100644
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -96,13 +96,7 @@ static void draw_image (DiaRenderer *renderer,
 
 static void draw_rect (DiaRenderer *renderer,
                        Point *ul_corner, Point *lr_corner,
-                       Color *color);
-static void fill_rect (DiaRenderer *renderer,
-                      Point *ul_corner, Point *lr_corner,
-                      Color *color);
-static void draw_fill_rect (DiaGdkRenderer *renderer,
-                           Point *ul_corner, Point *lr_corner,
-                           Color *color, gboolean fill);
+                       Color *fill, Color *stroke);
 static void draw_polyline (DiaRenderer *renderer,
                            Point *points, int num_points,
                            Color *color);
@@ -229,7 +223,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
   renderer_class->draw_line    = draw_line;
   renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -242,7 +235,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
   renderer_class->draw_polyline  = draw_polyline;
 
   /* highest level functions */
@@ -825,7 +817,7 @@ draw_image (DiaRenderer *object,
     lr = *point;
     lr.x += width;
     lr.y += height;
-    self_class->fill_rect(object, point, &lr, renderer->highlight_color);
+    self_class->draw_rect(object, point, &lr, renderer->highlight_color, NULL);
   } else {
     int real_width, real_height, real_x, real_y;
     const GdkPixbuf *org = dia_image_pixbuf (image);
@@ -886,10 +878,11 @@ draw_image (DiaRenderer *object,
  * medium level functions
  */
 static void
-draw_fill_rect (DiaGdkRenderer *renderer,
-                Point *ul_corner, Point *lr_corner,
-                Color *color, gboolean fill)
+draw_rect (DiaGdkRenderer *self,
+          Point *ul_corner, Point *lr_corner,
+          Color *fill, Color *stroke)
 {
+  DiaGdkRenderer *renderer = DIA_GDK_RENDERER (self);
   GdkGC *gc = renderer->gc;
   GdkColor gdkcolor;
   gint top, bottom, left, right;
@@ -902,34 +895,20 @@ draw_fill_rect (DiaGdkRenderer *renderer,
   if ((left>right) || (top>bottom))
     return;
 
-  renderer_color_convert(renderer, color, &gdkcolor);
-  gdk_gc_set_foreground(gc, &gdkcolor);
-
-  gdk_draw_rectangle (renderer->pixmap,
-                     gc, fill,
-                     left, top,
-                     right-left,
-                     bottom-top);
-}
-
-static void 
-draw_rect (DiaRenderer *object,
-           Point *ul_corner, Point *lr_corner,
-           Color *color)
-{
-  DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
-
-  draw_fill_rect (renderer, ul_corner, lr_corner, color, FALSE);
-}
+  if (fill) {
+    renderer_color_convert(renderer, fill, &gdkcolor);
+    gdk_gc_set_foreground(gc, &gdkcolor);
 
-static void 
-fill_rect (DiaRenderer *object,
-           Point *ul_corner, Point *lr_corner,
-           Color *color)
-{
-  DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
+    gdk_draw_rectangle (renderer->pixmap, gc, TRUE,
+                       left, top, right-left, bottom-top);
+  }
+  if (stroke) {
+    renderer_color_convert(renderer, stroke, &gdkcolor);
+    gdk_gc_set_foreground(gc, &gdkcolor);
 
-  draw_fill_rect (renderer, ul_corner, lr_corner, color, TRUE);
+    gdk_draw_rectangle (renderer->pixmap, gc, FALSE,
+                       left, top, right-left, bottom-top);
+  }
 }
 
 static void 
@@ -1040,7 +1019,7 @@ draw_rounded_rect (DiaRenderer *self,
   if (r > 0)
     draw_fill_rounded_rect (self, ul_corner, lr_corner, color, radius, FALSE);
   else
-    draw_rect (self, ul_corner, lr_corner, color);
+    draw_rect (self, ul_corner, lr_corner, NULL, color);
 }
 static void 
 fill_rounded_rect (DiaRenderer *self, 
@@ -1053,7 +1032,7 @@ fill_rounded_rect (DiaRenderer *self,
   if (r > 0)
     draw_fill_rounded_rect (self, ul_corner, lr_corner, color, radius, TRUE);
   else
-    fill_rect (self, ul_corner, lr_corner, color);
+    draw_rect (self, ul_corner, lr_corner, color, NULL);
 }
 
 static int
diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c
index e153eb9..6b1a2ea 100644
--- a/lib/diaimportrenderer.c
+++ b/lib/diaimportrenderer.c
@@ -43,9 +43,9 @@ static void set_fillstyle (DiaRenderer *renderer, FillStyle mode);
 static void draw_line (DiaRenderer *renderer,
                       Point *start, Point *end,
                       Color *color);
-static void fill_rect (DiaRenderer *renderer,
+static void draw_rect (DiaRenderer *renderer,
                       Point *ul_corner, Point *lr_corner,
-                      Color *color);
+                      Color *fill, Color *stroke);
 static void draw_arc (DiaRenderer *renderer,
                      Point *center,
                      real width, real height,
@@ -83,9 +83,6 @@ static void draw_image (DiaRenderer *renderer,
                        real width, real height,
                        DiaImage *image);
 
-static void draw_rect (DiaRenderer *renderer,
-                       Point *ul_corner, Point *lr_corner,
-                       Color *color);
 static void draw_polyline (DiaRenderer *renderer,
                            Point *points, int num_points,
                            Color *color);
@@ -177,7 +174,7 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_rect    = draw_rect;
   renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
@@ -189,7 +186,6 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
   /* medium level functions */
   renderer_class->draw_bezier  = draw_bezier;
   renderer_class->draw_beziergon  = draw_beziergon;
-  renderer_class->draw_rect = draw_rect;
   renderer_class->draw_rounded_polyline  = draw_rounded_polyline;
   renderer_class->draw_polyline  = draw_polyline;
 
@@ -374,15 +370,20 @@ draw_arc (DiaRenderer *renderer, Point *center,
 }
 
 /*!
- * \brief Fill a rectangle
+ * \brief Dtroke and/or fill a rectangle
  * \memberof _DiaImportRenderer
  */
 static void 
-fill_rect (DiaRenderer *renderer,
+draw_rect (DiaRenderer *renderer,
            Point *ul_corner, Point *lr_corner,
-           Color *color)
+           Color *fill, Color *stroke)
 {
-  fill_rounded_rect (renderer, ul_corner, lr_corner, color, 0.0);
+  DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
+  DiaObject *object = create_standard_box (ul_corner->x, ul_corner->y,
+                                          lr_corner->x - ul_corner->x,
+                                          lr_corner->y - ul_corner->y);
+  _apply_style (self, object, fill,stroke, 0.0);
+  _push_object (self, object);
 }
 
 /*!
@@ -538,19 +539,6 @@ draw_beziergon (DiaRenderer *renderer,
 }
 
 /*!
- * \brief Draw a simple rectangle
- * Creates a _Box object.
- * \memberof _DiaImportRenderer
- */
-static void
-draw_rect (DiaRenderer *renderer,
-           Point *ul_corner, Point *lr_corner,
-           Color *color)
-{
-  draw_rounded_rect (renderer, ul_corner, lr_corner, color, 0.0);
-}
-
-/*!
  * \brief Draw a polyline
  * Creates a _Polyline object.
  * \memberof _DiaImportRenderer
diff --git a/lib/diapathrenderer.c b/lib/diapathrenderer.c
index 991c48c..ec3c5b0 100644
--- a/lib/diapathrenderer.c
+++ b/lib/diapathrenderer.c
@@ -345,9 +345,9 @@ draw_polygon(DiaRenderer *self,
   _remove_duplicated_path (renderer);
 }
 static void
-_rect (DiaRenderer *self, 
-       Point *ul_corner, Point *lr_corner,
-       const Color *stroke, const Color *fill)
+draw_rect (DiaRenderer *self, 
+          Point *ul_corner, Point *lr_corner,
+          Color *fill, Color *stroke)
 {
   DiaPathRenderer *renderer = DIA_PATH_RENDERER (self);
   GArray *path = _get_current_path (renderer, stroke, fill);
@@ -368,21 +368,6 @@ _rect (DiaRenderer *self,
     g_array_append_val (path, bp);
   }
 }
-static void
-draw_rect (DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color)
-{
-  _rect (self, ul_corner, lr_corner, color, NULL);
-  _remove_duplicated_path (DIA_PATH_RENDERER (self));
-}
-static void
-fill_rect (DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color)
-{
-  _rect (self, ul_corner, lr_corner, NULL, color);
-}
 
 /*!
  * \brief Create a path from an arc
@@ -719,7 +704,6 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
   renderer_class->draw_line    = draw_line;
   renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -729,7 +713,6 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
   renderer_class->draw_polyline  = draw_polyline;
 
   renderer_class->draw_bezier    = draw_bezier;
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index c31e610..9f5491c 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -67,9 +67,9 @@ static void set_font (DiaRenderer *renderer, DiaFont *font, real height);
 static void draw_line (DiaRenderer *renderer,
                        Point *start, Point *end,
                        Color *color);
-static void fill_rect (DiaRenderer *renderer,
+static void draw_rect (DiaRenderer *renderer,
                        Point *ul_corner, Point *lr_corner,
-                       Color *color);
+                       Color *fill, Color *stroke);
 static void draw_arc (DiaRenderer *renderer,
                       Point *center,
                       real width, real height,
@@ -111,9 +111,6 @@ static void draw_text  (DiaRenderer *renderer,
 static void draw_text_line  (DiaRenderer *renderer,
                             TextLine *text_line, Point *pos, Alignment alignment, Color *color);
 
-static void draw_rect (DiaRenderer *renderer,
-                       Point *ul_corner, Point *lr_corner,
-                       Color *color);
 static void draw_polyline (DiaRenderer *renderer,
                            Point *points, int num_points,
                            Color *color);
@@ -321,7 +318,7 @@ dia_renderer_class_init (DiaRendererClass *klass)
   renderer_class->set_font       = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_rect    = draw_rect;
   renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
@@ -333,7 +330,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
   /* medium level functions */
   renderer_class->draw_bezier  = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
-  renderer_class->draw_rect = draw_rect;
   renderer_class->draw_rounded_polyline  = draw_rounded_polyline;
   renderer_class->draw_polyline  = draw_polyline;
   renderer_class->draw_text      = draw_text;
@@ -437,13 +433,36 @@ draw_arc (DiaRenderer *renderer, Point *center,
              G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
 }
 
+/*!
+ * \brief Stroke and/or fill a rectangle
+ *
+ * This only needs to be implemented in the derived class if it differs
+ * from draw_polygon. Given that draw_polygon is a required method we can
+ * use that instead of forcing every inherited class to implement
+ * draw_rect(), too.
+ *
+ * \memberof _DiaRenderer
+ */
 static void 
-fill_rect (DiaRenderer *renderer,
+draw_rect (DiaRenderer *renderer,
            Point *ul_corner, Point *lr_corner,
-           Color *color)
+           Color *fill, Color *stroke)
 {
-  g_warning ("%s::fill_rect not implemented!", 
-             G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
+  if (DIA_RENDERER_GET_CLASS(renderer)->draw_polygon == &draw_polygon) {
+    g_warning ("%s::draw_rect and draw_polygon not implemented!", 
+               G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
+  } else {
+    Point corner[4];
+    /* translate to polygon */
+    corner[0] = *ul_corner;
+    corner[1].x = lr_corner->x;
+    corner[1].y = ul_corner->y;
+    corner[2] = *lr_corner;
+    corner[3].x = ul_corner->x;
+    corner[3].y = lr_corner->y;
+    /* delegate transformation and drawing */
+    DIA_RENDERER_GET_CLASS(renderer)->draw_polygon (renderer, corner, 4, fill, stroke);
+  }
 }
 
 static void 
@@ -742,25 +761,6 @@ draw_beziergon (DiaRenderer *renderer,
 }
 
 static void 
-draw_rect (DiaRenderer *renderer,
-           Point *ul_corner, Point *lr_corner,
-           Color *color)
-{
-  DiaRendererClass *klass = DIA_RENDERER_GET_CLASS (renderer);
-  Point ur, ll;
-
-  ur.x = lr_corner->x;
-  ur.y = ul_corner->y;
-  ll.x = ul_corner->x;
-  ll.y = lr_corner->y;
-
-  klass->draw_line (renderer, ul_corner, &ur, color);
-  klass->draw_line (renderer, &ur, lr_corner, color);
-  klass->draw_line (renderer, lr_corner, &ll, color);
-  klass->draw_line (renderer, &ll, ul_corner, color);
-}
-
-static void 
 draw_polyline (DiaRenderer *renderer,
                Point *points, int num_points,
                Color *color)
@@ -925,7 +925,7 @@ draw_rounded_rect (DiaRenderer *renderer,
   radius = MIN(radius, (lr_corner->y-ul_corner->y)/2);
   
   if (radius < 0.00001) {
-    renderer_ops->draw_rect(renderer, ul_corner, lr_corner, color);
+    renderer_ops->draw_rect(renderer, ul_corner, lr_corner, NULL, color);
     return;
   }
 
@@ -981,7 +981,7 @@ fill_rounded_rect(DiaRenderer *renderer,
   radius = MIN(radius, (lr_corner->y-ul_corner->y)/2);
 
   if (radius < 0.00001) {
-    renderer_ops->fill_rect(renderer, ul_corner, lr_corner, color);
+    renderer_ops->draw_rect(renderer, ul_corner, lr_corner, color, NULL);
     return;
   }
   /* if the renderer has it's own draw_beziergon use that */
@@ -994,7 +994,7 @@ fill_rounded_rect(DiaRenderer *renderer,
   end.x = lr_corner->x-radius;
   start.y = ul_corner->y;
   end.y = lr_corner->y;
-  renderer_ops->fill_rect(renderer, &start, &end, color);
+  renderer_ops->draw_rect(renderer, &start, &end, color, NULL);
 
   center.y = ul_corner->y+radius;
   renderer_ops->fill_arc(renderer, &center, 
@@ -1010,7 +1010,7 @@ fill_rounded_rect(DiaRenderer *renderer,
   start.y = ul_corner->y+radius;
   end.x = lr_corner->x;
   end.y = center.y = lr_corner->y-radius;
-  renderer_ops->fill_rect(renderer, &start, &end, color);
+  renderer_ops->draw_rect(renderer, &start, &end, color, NULL);
 
   center.y = lr_corner->y-radius;
   center.x = ul_corner->x+radius;
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 43b049e..b7dda28 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -133,10 +133,6 @@ struct _DiaRendererClass
   void (*draw_line) (DiaRenderer *renderer,
                      Point *start, Point *end,
                      Color *color);
-  /*! Fill a rectangle, given its upper-left and lower-right corners */
-  void (*fill_rect) (DiaRenderer *renderer,
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
   /*! 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,
@@ -206,7 +202,7 @@ struct _DiaRendererClass
   /*! Draw a rectangle, given its upper-left and lower-right corners */
   void (*draw_rect) (DiaRenderer *renderer,
                      Point *ul_corner, Point *lr_corner,
-                     Color *color);
+                     Color *fill, Color *stroke);
 
   /*
    * Highest level functions, probably only to be implemented by 
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 4f3da9e..311960a 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -501,15 +501,20 @@ draw_polygon (DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
          Point *ul_corner, Point *lr_corner,
-         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, NULL, (const xmlChar *)"rect", NULL);
 
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *)get_draw_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, ul_corner->x);
   xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) d_buf);
@@ -522,29 +527,6 @@ draw_rect(DiaRenderer *self,
 }
 
 static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         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 *)"rect", NULL);
-
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_fill_style(renderer, colour));
-
-  dia_svg_dtostr(d_buf, ul_corner->x);
-  xmlSetProp(node, (const xmlChar *)"x", (xmlChar *)d_buf);
-  dia_svg_dtostr(d_buf, ul_corner->y);
-  xmlSetProp(node, (const xmlChar *)"y", (xmlChar *)d_buf);
-  dia_svg_dtostr(d_buf, lr_corner->x - ul_corner->x);
-  xmlSetProp(node, (const xmlChar *)"width", (xmlChar *)d_buf);
-  dia_svg_dtostr(d_buf, lr_corner->y - ul_corner->y);
-  xmlSetProp(node, (const xmlChar *)"height", (xmlChar *)d_buf);
-}
-
-static void
 draw_arc(DiaRenderer *self, 
         Point *center,
         real width, real height,
@@ -980,8 +962,7 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
   renderer_class->set_pattern    = set_pattern;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -993,7 +974,6 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *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/diatransformrenderer.c b/lib/diatransformrenderer.c
index 2a8c136..fd11bc3 100644
--- a/lib/diatransformrenderer.c
+++ b/lib/diatransformrenderer.c
@@ -264,44 +264,6 @@ draw_polygon(DiaRenderer *self,
 {
   _polyline (self, points, num_points, line_colour, NULL, TRUE);
 }
-static void
-_rect (DiaRenderer *self, 
-       Point *ul_corner, Point *lr_corner,
-       Color *stroke, Color *fill)
-{
-  Point corner[4];
-  /* translate to polygon */
-  corner[0] = *ul_corner;
-  corner[1].x = lr_corner->x;
-  corner[1].y = ul_corner->y;
-  corner[2] = *lr_corner;
-  corner[3].x = ul_corner->x;
-  corner[3].y = lr_corner->y;
-  /* delegate transformation and drawing */
-  _polyline (self, corner, 4, stroke, fill, TRUE);
-}
-/*!
- * \brief Transform rectangle and delegate draw
- * \memberof _DiaTransformRenderer
- */
-static void
-draw_rect (DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color)
-{
-  _rect (self, ul_corner, lr_corner, color, NULL);
-}
-/*!
- * \brief Transform rectangle and delegate fill
- * \memberof _DiaTransformRenderer
- */
-static void
-fill_rect (DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color)
-{
-  _rect (self, ul_corner, lr_corner, NULL, color);
-}
 /* ToDo: arc and ellipse to be emulated by bezier - in base class? */
 static void
 _bezier (DiaRenderer *self, 
@@ -558,8 +520,6 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
 
   renderer_class->draw_line    = draw_line;
   renderer_class->draw_polygon = draw_polygon;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -569,7 +529,6 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
   renderer_class->draw_polyline  = draw_polyline;
 
   renderer_class->draw_bezier   = draw_bezier;
diff --git a/lib/layer.c b/lib/layer.c
index 7723ed9..45bf867 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -104,7 +104,7 @@ layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
        col.alpha = 1.0;
 
         DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer,0.01);
-       DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, &col);
+       DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, NULL, &col);
       }
       (*obj_renderer)(obj, renderer, active_layer, data);
     }
diff --git a/objects/AADL/aadldata.c b/objects/AADL/aadldata.c
index 76019b3..7447507 100755
--- a/objects/AADL/aadldata.c
+++ b/objects/AADL/aadldata.c
@@ -52,8 +52,7 @@ aadldata_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
 
-  renderer_ops->fill_rect(renderer, points, points + 1, &aadlbox->fill_color);
-  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->line_color);
+  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->fill_color, &aadlbox->line_color);
 }
 
 static void 
diff --git a/objects/AADL/aadldevice.c b/objects/AADL/aadldevice.c
index 5703fd5..8d9f7f9 100755
--- a/objects/AADL/aadldevice.c
+++ b/objects/AADL/aadldevice.c
@@ -51,8 +51,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
 
-  renderer_ops->fill_rect(renderer, points, points + 1, &aadlbox->fill_color);
-  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->line_color);
+  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->fill_color, &aadlbox->line_color);
 
   points[1].x = x - AADL_DEVICE_DEPTH;
   points[1].y = y - AADL_DEVICE_DEPTH;
diff --git a/objects/AADL/aadlprocessor.c b/objects/AADL/aadlprocessor.c
index 15446ac..ed351b8 100755
--- a/objects/AADL/aadlprocessor.c
+++ b/objects/AADL/aadlprocessor.c
@@ -51,8 +51,7 @@ static void aadlprocessor_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
 
-  renderer_ops->fill_rect(renderer, points, points + 1, &aadlbox->fill_color);
-  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->line_color);
+  renderer_ops->draw_rect(renderer, points, points + 1, &aadlbox->fill_color, &aadlbox->line_color);
 
   points[1].x = x + AADL_PROCESSOR_DEPTH;
   points[1].y = y - AADL_PROCESSOR_DEPTH;
diff --git a/objects/Database/table.c b/objects/Database/table.c
index 07b7994..1af6517 100644
--- a/objects/Database/table.c
+++ b/objects/Database/table.c
@@ -552,8 +552,7 @@ table_draw_namebox (Table * table, DiaRenderer * renderer, Element * elem)
   endP.y = startP.y + table->namebox_height;
 
   /* first draw the outer box and fill for the class name object */
-  renderer_ops->fill_rect (renderer, &startP, &endP, &table->fill_color);
-  renderer_ops->draw_rect (renderer, &startP, &endP, &table->line_color);
+  renderer_ops->draw_rect (renderer, &startP, &endP, &table->fill_color, &table->line_color);
 
   if (IS_NOT_EMPTY(table->name))
     {
@@ -686,8 +685,7 @@ table_draw_attributesbox (Table * table, DiaRenderer * renderer,
   endP.x = startP.x + elem->width;
   endP.y = startP.y + table->attributesbox_height;
 
-  renderer_ops->fill_rect (renderer, &startP, &endP, fill_color);
-  renderer_ops->draw_rect (renderer, &startP, &endP, line_color);
+  renderer_ops->draw_rect (renderer, &startP, &endP, fill_color, line_color);
 
   startP.x += TABLE_ATTR_NAME_OFFSET;
   startP.x += (table->border_width/2.0 + 0.1);
diff --git a/objects/ER/entity.c b/objects/ER/entity.c
index 30b78ef..2107e50 100644
--- a/objects/ER/entity.c
+++ b/objects/ER/entity.c
@@ -248,11 +248,6 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   
-  renderer_ops->fill_rect(renderer, 
-                          &ul_corner,
-                          &lr_corner, 
-                          &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);
@@ -260,6 +255,7 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
   renderer_ops->draw_rect(renderer, 
                           &ul_corner,
                           &lr_corner, 
+                          &entity->inner_color,
                           &entity->border_color);
 
   if(entity->weak) {
@@ -270,6 +266,7 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
     lr_corner.y -= diff;
     renderer_ops->draw_rect(renderer, 
                             &ul_corner, &lr_corner,
+                            NULL,
                             &entity->border_color);
   }
   if(entity->associative){
diff --git a/objects/FS/function.c b/objects/FS/function.c
index 3e1122e..d699631 100644
--- a/objects/FS/function.c
+++ b/objects/FS/function.c
@@ -311,11 +311,9 @@ function_draw(Function *pkg, DiaRenderer *renderer)
   p2.x = x+w; p2.y = y+h;
 
   if (pkg->is_user) {
-    renderer_ops->fill_rect(renderer, 
-                            &p1, &p2,
-                            &color_white); 
     renderer_ops->draw_rect(renderer, 
                             &p1, &p2,
+                            &color_white,
                             &color_black);
     p1.x += font_height / FUNCTION_MARGIN_SCALE;
     p1.y += font_height / FUNCTION_MARGIN_SCALE;
@@ -323,12 +321,9 @@ function_draw(Function *pkg, DiaRenderer *renderer)
     p2.x -= font_height / FUNCTION_MARGIN_SCALE;
     /* y += FUNCTION_MARGIN_M; */
   }
-    
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &color_white);
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &color_white,
                           &color_black);
 
   
diff --git a/objects/GRAFCET/action.c b/objects/GRAFCET/action.c
index ed4acaf..fd695c8 100644
--- a/objects/GRAFCET/action.c
+++ b/objects/GRAFCET/action.c
@@ -358,7 +358,7 @@ action_draw(Action *action, DiaRenderer *renderer)
   br.x = ul.x + action->label_width;
   br.y = ul.y + ACTION_HEIGHT;
 
-  renderer_ops->fill_rect(renderer,&ul,&br,&color_white);
+  renderer_ops->draw_rect(renderer,&ul,&br,&color_white, NULL);
 
   action_text_draw(action->text,renderer);
 
@@ -379,7 +379,7 @@ action_draw(Action *action, DiaRenderer *renderer)
   }
 
   cl.red = 1.0; cl.blue = cl.green = .2; cl.alpha = 1.0;
-  renderer_ops->draw_rect(renderer,&ul,&br,&color_black);
+  renderer_ops->draw_rect(renderer,&ul,&br,NULL,&color_black);
 }
 
 static DiaObject *
diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c
index cccfec0..75e04a2 100644
--- a/objects/GRAFCET/step.c
+++ b/objects/GRAFCET/step.c
@@ -350,12 +350,11 @@ step_draw(Step *step, DiaRenderer *renderer)
   if ((step->type == STEP_INITIAL) ||
       (step->type == STEP_MACROCALL) ||
       (step->type == STEP_SUBPCALL)) {
-    renderer_ops->fill_rect(renderer, &step->I, &step->J, &color_white);
-    renderer_ops->draw_rect(renderer, &step->I, &step->J, &color_black);
+    renderer_ops->draw_rect(renderer, &step->I, &step->J, &color_white, &color_black);
+    renderer_ops->draw_rect(renderer, &step->E, &step->F, NULL, &color_black);
   } else {
-    renderer_ops->fill_rect(renderer, &step->E, &step->F, &color_white);
+    renderer_ops->draw_rect(renderer, &step->E, &step->F, &color_white, &color_black);
   }
-  renderer_ops->draw_rect(renderer, &step->E, &step->F, &color_black);
   
   if (step->type != STEP_MACROENTRY)
     renderer_ops->draw_line(renderer,&step->A,&step->B,&color_black);
diff --git a/objects/Istar/other.c b/objects/Istar/other.c
index 27698c5..0c6f58a 100644
--- a/objects/Istar/other.c
+++ b/objects/Istar/other.c
@@ -309,9 +309,8 @@ other_draw(Other *other, DiaRenderer *renderer)
       p1.y= elem->corner.y;
       p2.x=p1.x+elem->width;
       p2.y=p1.y+elem->height;
-      renderer_ops->fill_rect(renderer,&p1,&p2, &OTHER_BG_COLOR);
       renderer_ops->set_linewidth(renderer, OTHER_LINE_WIDTH);
-      renderer_ops->draw_rect(renderer,&p1,&p2, &OTHER_FG_COLOR);
+      renderer_ops->draw_rect(renderer,&p1,&p2, &OTHER_BG_COLOR, &OTHER_FG_COLOR);
       break;
     case TASK:
       compute_task(other,pl);
diff --git a/objects/Jackson/domain.c b/objects/Jackson/domain.c
index 4d69a03..a0f308e 100644
--- a/objects/Jackson/domain.c
+++ b/objects/Jackson/domain.c
@@ -348,13 +348,12 @@ jackson_box_draw(Box *box, DiaRenderer *renderer)
 
   /* drawing main box */
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-  renderer_ops->fill_rect(renderer, &b0, &b1, &JACKSON_BOX_BG_COLOR);
 
   renderer_ops->set_linewidth(renderer, JACKSON_BOX_LINE_WIDTH);
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
-  renderer_ops->draw_rect(renderer, &b0, &b1, &JACKSON_BOX_FG_COLOR);
+  renderer_ops->draw_rect(renderer, &b0, &b1, &JACKSON_BOX_BG_COLOR, &JACKSON_BOX_FG_COLOR);
 
   /* adding lines for designed/machine domains */
   if (box->domtype!=DOMAIN_GIVEN) {
@@ -382,7 +381,7 @@ jackson_box_draw(Box *box, DiaRenderer *renderer)
   }
 
   if (s!=NULL) {
-    renderer_ops->draw_rect(renderer, &b3, &b1, &JACKSON_BOX_FG_COLOR);
+    renderer_ops->draw_rect(renderer, &b3, &b1, NULL, &JACKSON_BOX_FG_COLOR);
     renderer_ops->draw_string(renderer, s, &b2, ALIGN_RIGHT, &box->text->color);
   }
 
diff --git a/objects/KAOS/metabinrel.c b/objects/KAOS/metabinrel.c
index 637da8d..fc4ab28 100644
--- a/objects/KAOS/metabinrel.c
+++ b/objects/KAOS/metabinrel.c
@@ -439,7 +439,7 @@ mbr_draw(Mbr *mbr, DiaRenderer *renderer)
       pa1.y=mbr->pm.y-mbr->text_ascent +0.1;  /* with some fix... */
       pa2.x=pa1.x+mbr->text_width;
       pa2.y=pa1.y+MBR_DECFONTHEIGHT    +0.1;  /* with some fix... */
-      renderer_ops->fill_rect(renderer,&pa1,&pa2,&color_white);
+      renderer_ops->draw_rect(renderer,&pa1,&pa2,&color_white, NULL);
       renderer_ops->draw_string(renderer,annot,&mbr->pm,ALIGN_CENTER,&MBR_FG_COLOR);
   }
 
diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c
index 7b1911e..4516211 100644
--- a/objects/Misc/diagram_as_object.c
+++ b/objects/Misc/diagram_as_object.c
@@ -188,7 +188,7 @@ _dae_draw(DiagramAsElement *dae, DiaRenderer *renderer)
     };
 
     renderer_ops->draw_rect(renderer,&elem->corner, &lower_right, 
-                            &dae->border_color);
+                            NULL, &dae->border_color);
 
   } else {
     if (FALSE) {
diff --git a/objects/Misc/grid_object.c b/objects/Misc/grid_object.c
index efb52a2..5d16129 100644
--- a/objects/Misc/grid_object.c
+++ b/objects/Misc/grid_object.c
@@ -334,12 +334,6 @@ grid_object_draw(Grid_Object *grid_object, DiaRenderer *renderer)
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
 
-  /* draw background */
-  if (grid_object->show_background)
-    renderer_ops->fill_rect(renderer,&elem->corner,
-                                &lr_corner,
-                                &grid_object->inner_color);
-
   /* draw gridlines */
   renderer_ops->set_linewidth(renderer, grid_object->gridline_width);
   grid_object_draw_gridlines(grid_object, renderer, &lr_corner);
@@ -347,8 +341,9 @@ grid_object_draw(Grid_Object *grid_object, DiaRenderer *renderer)
   /* draw outline */
   renderer_ops->set_linewidth(renderer, grid_object->border_line_width);
   renderer_ops->draw_rect(renderer,&elem->corner,
-                              &lr_corner,
-                              &grid_object->border_color);
+                         &lr_corner,
+                         (grid_object->show_background) ? &grid_object->inner_color : NULL,
+                         &grid_object->border_color);
 }
 
 
diff --git a/objects/SADT/box.c b/objects/SADT/box.c
index c099f3b..76fd3c9 100644
--- a/objects/SADT/box.c
+++ b/objects/SADT/box.c
@@ -279,12 +279,6 @@ sadtbox_draw(Box *box, DiaRenderer *renderer)
   lr_corner.y = elem->corner.y + elem->height;
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
-  renderer_ops->fill_rect(renderer, 
-                          &elem->corner,
-                          &lr_corner, 
-                          &box->fill_color);
-
-
   renderer_ops->set_linewidth(renderer, SADTBOX_LINE_WIDTH);
   renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
@@ -292,6 +286,7 @@ sadtbox_draw(Box *box, DiaRenderer *renderer)
   renderer_ops->draw_rect(renderer, 
                           &elem->corner,
                           &lr_corner, 
+                          &box->fill_color,
                           &box->line_color);
 
 
diff --git a/objects/UML/class.c b/objects/UML/class.c
index cdeb398..dcbfa34 100644
--- a/objects/UML/class.c
+++ b/objects/UML/class.c
@@ -803,12 +803,9 @@ umlclass_draw_namebox(UMLClass *umlclass, DiaRenderer *renderer, Element *elem )
   LowerRightPoint.x += elem->width;
   LowerRightPoint.y  = Yoffset;
   
-  /*
-   * First draw the outer box and fill color for the class name
-   * object
-   */
-  renderer_ops->fill_rect(renderer, &StartPoint, &LowerRightPoint, &umlclass->fill_color);
-  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRightPoint, &umlclass->line_color);
+  /* First draw the outer box and fill color for the class name object */
+  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRightPoint,
+                         &umlclass->fill_color, &umlclass->line_color);
 
   /* Start at the midpoint on the X axis */
   StartPoint.x += elem->width / 2.0;
@@ -891,8 +888,7 @@ umlclass_draw_attributebox(UMLClass *umlclass, DiaRenderer *renderer, Element *e
   LowerRight.x += elem->width;
   LowerRight.y = Yoffset;
 
-  renderer_ops->fill_rect(renderer, &StartPoint, &LowerRight, fill_color);
-  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRight, line_color);
+  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRight, fill_color, line_color);
 
   if (!umlclass->suppress_attributes) {
     gint i = 0;
@@ -979,8 +975,7 @@ umlclass_draw_operationbox(UMLClass *umlclass, DiaRenderer *renderer, Element *e
   LowerRight.x += elem->width;
   LowerRight.y = Yoffset;
 
-  renderer_ops->fill_rect(renderer, &StartPoint, &LowerRight, fill_color);
-  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRight, line_color);
+  renderer_ops->draw_rect(renderer, &StartPoint, &LowerRight, fill_color, line_color);
 
   if (!umlclass->suppress_operations) {
     gint i = 0;
@@ -1134,10 +1129,9 @@ umlclass_draw_template_parameters_box(UMLClass *umlclass, DiaRenderer *renderer,
   LowerRight.x += umlclass->templates_width;
   LowerRight.y += umlclass->templates_height;
 
-  renderer_ops->fill_rect(renderer, &UpperLeft, &LowerRight, fill_color);
   renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
   renderer_ops->set_dashlength(renderer, 0.3);
-  renderer_ops->draw_rect(renderer, &UpperLeft, &LowerRight, line_color);
+  renderer_ops->draw_rect(renderer, &UpperLeft, &LowerRight, fill_color, line_color);
 
   TextInsert.x += 0.3;
   TextInsert.y += 0.1;
diff --git a/objects/UML/component.c b/objects/UML/component.c
index ce47943..887defc 100644
--- a/objects/UML/component.c
+++ b/objects/UML/component.c
@@ -242,33 +242,25 @@ component_draw(Component *cmp, DiaRenderer *renderer)
   p1.x = x + COMPONENT_CWIDTH/2; p1.y = y;
   p2.x = x+w; p2.y = y+h;
 
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &cmp->fill_color);
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &cmp->fill_color,
                           &cmp->line_color);
 
   p1.x= x; p1.y = y +(h - 3*COMPONENT_CHEIGHT)/2.0;
   p2.x = x+COMPONENT_CWIDTH; p2.y = p1.y + COMPONENT_CHEIGHT;
 
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &cmp->fill_color);
-  
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &cmp->fill_color,
                           &cmp->line_color);
   
   p1.y = p2.y + COMPONENT_CHEIGHT;
   p2.y = p1.y + COMPONENT_CHEIGHT;
 
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &cmp->fill_color);
-  
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &cmp->fill_color,
                           &cmp->line_color);
 
   if (cmp->st_stereotype != NULL &&
diff --git a/objects/UML/fork.c b/objects/UML/fork.c
index 098d187..02e922d 100644
--- a/objects/UML/fork.c
+++ b/objects/UML/fork.c
@@ -223,9 +223,9 @@ fork_draw(Fork *branch, DiaRenderer *renderer)
   p2.x = elem->corner.x + w;
   p2.y = elem->corner.y + h;
    
-  renderer_ops->fill_rect(renderer, 
+  renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
-                          &branch->fill_color);
+                          &branch->fill_color, NULL);
 }
 
 static void
diff --git a/objects/UML/large_package.c b/objects/UML/large_package.c
index 2530551..63f2c99 100644
--- a/objects/UML/large_package.c
+++ b/objects/UML/large_package.c
@@ -258,26 +258,18 @@ largepackage_draw(LargePackage *pkg, DiaRenderer *renderer)
 
   p1.x = x; p1.y = y;
   p2.x = x+w; p2.y = y+h;
-
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &pkg->fill_color);
-  renderer_ops->draw_rect(renderer, 
+  renderer_ops->draw_rect (renderer, 
                           &p1, &p2,
+                          &pkg->fill_color,
                           &pkg->line_color);
 
   p1.x= x; p1.y = y - pkg->topheight;
   p2.x = x + pkg->topwidth; p2.y = y;
-
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &pkg->fill_color);
-  
-  renderer_ops->draw_rect(renderer, 
+  renderer_ops->draw_rect (renderer, 
                           &p1, &p2,
+                          &pkg->fill_color,
                           &pkg->line_color);
 
-
   renderer_ops->set_font(renderer, pkg->font, pkg->font_height);
 
   p1.x = x + 0.1;
diff --git a/objects/UML/lifeline.c b/objects/UML/lifeline.c
index 351eff2..d0755d0 100644
--- a/objects/UML/lifeline.c
+++ b/objects/UML/lifeline.c
@@ -400,13 +400,10 @@ lifeline_draw(Lifeline *lifeline, DiaRenderer *renderer)
   p2.x = endpoints[0].x + LIFELINE_WIDTH/2.0;
   p2.y = endpoints[0].y + lifeline->rbot;
 
-  if (lifeline->draw_focuscontrol) {  
-      renderer_ops->fill_rect(renderer, 
-                              &p1, &p2,
-                              &lifeline->fill_color);
-  
+  if (lifeline->draw_focuscontrol) {
       renderer_ops->draw_rect(renderer, 
                               &p1, &p2,
+                              &lifeline->fill_color,
                               &lifeline->line_color);
   }
     
diff --git a/objects/UML/object.c b/objects/UML/object.c
index 437bb0e..97c47b4 100644
--- a/objects/UML/object.c
+++ b/objects/UML/object.c
@@ -303,11 +303,9 @@ objet_draw(Objet *ob, DiaRenderer *renderer)
   if (ob->is_multiple) {
     p1.x += OBJET_MARGIN_M(ob);
     p2.y -= OBJET_MARGIN_M(ob);
-    renderer_ops->fill_rect(renderer, 
-                            &p1, &p2,
-                            &ob->fill_color);
     renderer_ops->draw_rect(renderer, 
                             &p1, &p2,
+                            &ob->fill_color,
                             &ob->line_color);
     p1.x -= OBJET_MARGIN_M(ob);
     p1.y += OBJET_MARGIN_M(ob);
@@ -315,12 +313,10 @@ objet_draw(Objet *ob, DiaRenderer *renderer)
     p2.y += OBJET_MARGIN_M(ob);
     y += OBJET_MARGIN_M(ob);
   }
-    
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &ob->fill_color);
+
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &ob->fill_color,
                           &ob->line_color);
 
   
diff --git a/objects/UML/small_package.c b/objects/UML/small_package.c
index 72bbc31..85df889 100644
--- a/objects/UML/small_package.c
+++ b/objects/UML/small_package.c
@@ -257,22 +257,17 @@ smallpackage_draw(SmallPackage *pkg, DiaRenderer *renderer)
   p1.x = x; p1.y = y;
   p2.x = x+w; p2.y = y+h;
 
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &pkg->fill_color);
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &pkg->fill_color,
                           &pkg->line_color);
 
   p1.x= x; p1.y = y-SMALLPACKAGE_TOPHEIGHT;
   p2.x = x+SMALLPACKAGE_TOPWIDTH; p2.y = y;
 
-  renderer_ops->fill_rect(renderer, 
-                          &p1, &p2,
-                          &pkg->fill_color);
-  
   renderer_ops->draw_rect(renderer, 
                           &p1, &p2,
+                          &pkg->fill_color,
                           &pkg->line_color);
 
   text_draw(pkg->text, renderer);
diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c
index f3330c8..2556ac0 100644
--- a/objects/flowchart/box.c
+++ b/objects/flowchart/box.c
@@ -328,103 +328,22 @@ box_draw(Box *box, DiaRenderer *renderer)
   lr_corner.x = elem->corner.x + elem->width;
   lr_corner.y = elem->corner.y + elem->height;
 
-  if (box->show_background) {
-  renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
+  if (box->show_background)
+    renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   
-  /* Problem:  How do we make the fill with rounded corners? */
-  if (box->corner_radius > 0) {
-    Point start, end, center;
-
-    radius = box->corner_radius;
-    radius = MIN(radius, elem->width/2);
-    radius = MIN(radius, elem->height/2);
-    start.x = center.x = elem->corner.x+radius;
-    end.x = lr_corner.x-radius;
-    start.y = elem->corner.y;
-    end.y = lr_corner.y;
-    renderer_ops->fill_rect(renderer, &start, &end, &box->inner_color);
-
-    center.y = elem->corner.y+radius;
-    renderer_ops->fill_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           90.0, 180.0, &box->inner_color);
-    center.x = end.x;
-    renderer_ops->fill_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           0.0, 90.0, &box->inner_color);
-
-    start.x = elem->corner.x;
-    start.y = elem->corner.y+radius;
-    end.x = lr_corner.x;
-    end.y = center.y = lr_corner.y-radius;
-    renderer_ops->fill_rect(renderer, &start, &end, &box->inner_color);
-
-    center.y = lr_corner.y-radius;
-    center.x = elem->corner.x+radius;
-    renderer_ops->fill_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           180.0, 270.0, &box->inner_color);
-    center.x = lr_corner.x-radius;
-    renderer_ops->fill_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           270.0, 360.0, &box->inner_color);
-  } else {
-  renderer_ops->fill_rect(renderer, 
-                          &elem->corner,
-                          &lr_corner, 
-                          &box->inner_color);
-  }
-  }
+  /* Problem:  How do we make the fill with rounded corners?
+   * It's solved in the base class ...
+   */
+  renderer_ops->fill_rounded_rect (renderer, &elem->corner, &lr_corner,
+                                  &box->inner_color, box->corner_radius);
 
   renderer_ops->set_linewidth(renderer, box->border_width);
   renderer_ops->set_linestyle(renderer, box->line_style);
   renderer_ops->set_dashlength(renderer, box->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
-  if (box->corner_radius > 0) {
-    Point start, end, center;
-
-    radius = box->corner_radius;
-    radius = MIN(radius, elem->width/2);
-    radius = MIN(radius, elem->height/2);
-    start.x = center.x = elem->corner.x+radius;
-    end.x = lr_corner.x-radius;
-    start.y = end.y = elem->corner.y;
-    renderer_ops->draw_line(renderer, &start, &end, &box->border_color);
-    start.y = end.y = lr_corner.y;
-    renderer_ops->draw_line(renderer, &start, &end, &box->border_color);
-
-    center.y = elem->corner.y+radius;
-    renderer_ops->draw_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           90.0, 180.0, &box->border_color);
-    center.x = end.x;
-    renderer_ops->draw_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           0.0, 90.0, &box->border_color);
-
-    start.y = elem->corner.y+radius;
-    start.x = end.x = elem->corner.x;
-    end.y = center.y = lr_corner.y-radius;
-    renderer_ops->draw_line(renderer, &start, &end, &box->border_color);
-    start.x = end.x = lr_corner.x;
-    renderer_ops->draw_line(renderer, &start, &end, &box->border_color);
-
-    center.y = lr_corner.y-radius;
-    center.x = elem->corner.x+radius;
-    renderer_ops->draw_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           180.0, 270.0, &box->border_color);
-    center.x = lr_corner.x-radius;
-    renderer_ops->draw_arc(renderer, &center, 
-                           2.0*radius, 2.0*radius,
-                           270.0, 360.0, &box->border_color);
-  } else {
-  renderer_ops->draw_rect(renderer, 
-                          &elem->corner,
-                          &lr_corner, 
-                          &box->border_color);
-  }
+  renderer_ops->draw_rounded_rect (renderer, &elem->corner, &lr_corner,
+                                  &box->border_color, box->corner_radius);
   text_draw(box->text, renderer);
 }
 
diff --git a/objects/network/basestation.c b/objects/network/basestation.c
index 428da71..9297988 100644
--- a/objects/network/basestation.c
+++ b/objects/network/basestation.c
@@ -271,8 +271,8 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
   p1.x -= r/2.0;
   p2 = cb;
   p2.x += r/2.0;
-  renderer_ops->fill_rect(renderer, &p1, &p2,
-                          &basestation->fill_colour);
+  renderer_ops->draw_rect(renderer, &p1, &p2,
+                          &basestation->fill_colour, NULL);
   p2.x -= r;
   renderer_ops->draw_line(renderer, &p1, &p2,
                           &basestation->line_colour);
diff --git a/objects/standard/box.c b/objects/standard/box.c
index b295678..f18aca6 100644
--- a/objects/standard/box.c
+++ b/objects/standard/box.c
@@ -327,6 +327,7 @@ box_draw(Box *box, DiaRenderer *renderer)
       if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
         renderer_ops->set_pattern (renderer, box->pattern);
     }
+    /* we only want separate calls for potential pattern fill */
     if (box->corner_radius > 0) {
       renderer_ops->fill_rounded_rect(renderer,
                                       &elem->corner,
@@ -334,10 +335,10 @@ box_draw(Box *box, DiaRenderer *renderer)
                                       &fill,
                                       box->corner_radius);
     } else {
-      renderer_ops->fill_rect(renderer, 
+      renderer_ops->draw_rect(renderer, 
                               &elem->corner,
                               &lr_corner, 
-                              &fill);
+                              &fill, NULL);
     }
     if (renderer_ops->is_capable_to(renderer, RENDER_PATTERN))
       renderer_ops->set_pattern (renderer, NULL);
@@ -346,13 +347,14 @@ box_draw(Box *box, DiaRenderer *renderer)
   if (box->corner_radius > 0) {
     renderer_ops->draw_rounded_rect(renderer, 
                             &elem->corner,
-                            &lr_corner, 
+                            &lr_corner,
                             &box->border_color,
                             box->corner_radius);
   } else {
     renderer_ops->draw_rect(renderer, 
                             &elem->corner,
-                            &lr_corner, 
+                            &lr_corner,
+                            NULL,
                             &box->border_color);
   }
 }
diff --git a/objects/standard/image.c b/objects/standard/image.c
index 6a2bce4..16fef11 100644
--- a/objects/standard/image.c
+++ b/objects/standard/image.c
@@ -412,7 +412,8 @@ image_draw(Image *image, DiaRenderer *renderer)
     
     renderer_ops->draw_rect(renderer, 
                             &ul_corner,
-                            &lr_corner, 
+                            &lr_corner,
+                            NULL,
                             &image->border_color);
   }
   /* Draw the image */
diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c
index bec7e8e..53abd72 100644
--- a/objects/standard/textobj.c
+++ b/objects/standard/textobj.c
@@ -249,7 +249,7 @@ textobj_draw(Textobj *textobj, DiaRenderer *renderer)
     ul.y = box.top;
     lr.x = box.right;
     lr.y = box.bottom;
-    DIA_RENDERER_GET_CLASS (renderer)->fill_rect (renderer, &ul, &lr, &textobj->fill_color);
+    DIA_RENDERER_GET_CLASS (renderer)->draw_rect (renderer, &ul, &lr, &textobj->fill_color, NULL);
   }
   text_draw(textobj->text, renderer);
 }
diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c
index e2e9271..1bf5376 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -672,17 +672,12 @@ _rect(DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
           Point *ul_corner, Point *lr_corner,
-          Color *color)
+          Color *fill, Color *stroke)
 {
-  _rect (self, ul_corner, lr_corner, color, FALSE);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color)
-{
-  _rect (self, ul_corner, lr_corner, color, TRUE);
+  if (fill)
+    _rect (self, ul_corner, lr_corner, fill, TRUE);
+  if (stroke)
+    _rect (self, ul_corner, lr_corner, stroke, FALSE);
 }
 
 static void
@@ -1245,8 +1240,7 @@ cairo_renderer_class_init (DiaCairoRendererClass *klass)
   renderer_class->set_font  = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -1258,7 +1252,6 @@ cairo_renderer_class_init (DiaCairoRendererClass *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/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c
index 4d391d6..ca3ba4f 100644
--- a/plug-ins/cgm/cgm.c
+++ b/plug-ins/cgm/cgm.c
@@ -275,10 +275,7 @@ static void draw_polygon(DiaRenderer *self,
                         Color *fill, Color *stroke);
 static void draw_rect(DiaRenderer *self, 
                      Point *ul_corner, Point *lr_corner,
-                     Color *colour);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *colour);
+                     Color *fill, Color *stroke);
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
@@ -797,27 +794,11 @@ draw_polygon (DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
          Point *ul_corner, Point *lr_corner,
-         Color *colour)
+         Color *fill, Color *stroke)
 {
     CgmRenderer *renderer = CGM_RENDERER(self);
 
-    write_filledge_attributes(renderer, NULL, colour);
-
-    write_elhead(renderer->file, 4, 11, 4 * REALSIZE);
-    write_real(renderer->file, ul_corner->x);
-    write_real(renderer->file, swap_y(renderer, ul_corner->y));
-    write_real(renderer->file, lr_corner->x);
-    write_real(renderer->file, swap_y(renderer, lr_corner->y));
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *colour)
-{
-    CgmRenderer *renderer = CGM_RENDERER(self);
-
-    write_filledge_attributes(renderer, colour, NULL);
+    write_filledge_attributes(renderer, fill, stroke);
 
     write_elhead(renderer->file, 4, 11, 4 * REALSIZE);
     write_real(renderer->file, ul_corner->x);
@@ -826,8 +807,6 @@ fill_rect(DiaRenderer *self,
     write_real(renderer->file, swap_y(renderer, lr_corner->y));
 }
 
-
-
 static void
 write_ellarc(CgmRenderer *renderer,
              int   elemid,
@@ -1351,7 +1330,6 @@ cgm_renderer_class_init (CgmRendererClass *klass)
     renderer_class->draw_polygon = draw_polygon;
 
     renderer_class->draw_rect = draw_rect;
-    renderer_class->fill_rect = fill_rect;
 
     renderer_class->draw_arc = draw_arc;
     renderer_class->fill_arc = fill_arc;
diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c
index 7e9c5b4..2dbb15a 100644
--- a/plug-ins/drs/dia-render-script-renderer.c
+++ b/plug-ins/drs/dia-render-script-renderer.c
@@ -480,17 +480,14 @@ _rounded_rect(DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
           Point *lefttop, Point *rightbottom,
-          Color *color)
+          Color *fill, Color *stroke)
 {
-  _rounded_rect(self, lefttop, rightbottom, color, NULL, FALSE);
-}
-static void
-fill_rect(DiaRenderer *self, 
-          Point *lefttop, Point *rightbottom,
-          Color *color)
-{
-  _rounded_rect(self, lefttop, rightbottom, color, NULL, TRUE);
+  if (fill)
+    _rounded_rect(self, lefttop, rightbottom, fill, NULL, FALSE);
+  if (stroke)
+    _rounded_rect(self, lefttop, rightbottom, stroke, NULL, TRUE);
 }
+
 static void
 draw_rounded_rect(DiaRenderer *self, 
                   Point *lefttop, Point *rightbottom,
@@ -717,8 +714,7 @@ drs_renderer_class_init (DrsRendererClass *klass)
   renderer_class->set_font  = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -728,11 +724,10 @@ drs_renderer_class_init (DrsRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
+  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_bezier    = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
 
   renderer_class->draw_rounded_polyline = draw_rounded_polyline;
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index 7894c8d..77378bf 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -135,9 +135,9 @@ static void draw_line(DiaRenderer *self,
 static void draw_polyline(DiaRenderer *self, 
                           Point *points, int num_points, 
                           Color *color);
-static void fill_rect (DiaRenderer *renderer,
+static void draw_rect (DiaRenderer *renderer,
                        Point *ul_corner, Point *lr_corner,
-                       Color *color);
+                       Color *fill, Color *stroke);
 static void draw_polygon (DiaRenderer *renderer,
                           Point *points, int num_points,
                           Color *fill, Color *stroke);
@@ -228,9 +228,8 @@ dxf_renderer_class_init (DxfRendererClass *klass)
   renderer_class->set_font = set_font;
   
   renderer_class->draw_line = draw_line;
-  renderer_class->draw_polyline = draw_polyline;
-  renderer_class->fill_rect = fill_rect;
   renderer_class->draw_polygon = draw_polygon;
+  renderer_class->draw_polyline = draw_polyline;
 
   renderer_class->draw_arc = draw_arc;
   renderer_class->fill_arc = fill_arc;
@@ -400,31 +399,6 @@ draw_polyline(DiaRenderer *self,
 }
 
 static void 
-fill_rect (DiaRenderer *self,
-           Point *ul_corner, Point *lr_corner,
-           Color *color)
-{
-  DxfRenderer *renderer = DXF_RENDERER(self);
-  Point pts[4] = { 
-    {ul_corner->x, -lr_corner->y}, 
-    {ul_corner->x, -ul_corner->y},
-    {lr_corner->x, -lr_corner->y},
-    {lr_corner->x, -ul_corner->y} 
-  };
-  int i;
-  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-  gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
-  
-  fprintf(renderer->file, "  0\nSOLID\n");
-  fprintf(renderer->file, "  8\n%s\n", renderer->layername);
-  fprintf(renderer->file, " 62\n%d\n", dxf_color (color));
-  for (i = 0; i < 4; ++i)
-    fprintf(renderer->file, " %d\n%s\n %d\n%s\n", 
-            10+i, g_ascii_formatd (buf, sizeof(buf), "%g", pts[i].x), 
-           20+i, g_ascii_formatd (buf2, sizeof(buf2), "%g", pts[i].y));
-}
-
-static void 
 draw_polygon (DiaRenderer *self,
               Point *points, int num_points,
               Color *fill, Color *stroke)
diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c
index a94f872..4c4f556 100644
--- a/plug-ins/hpgl/hpgl.c
+++ b/plug-ins/hpgl/hpgl.c
@@ -365,10 +365,13 @@ draw_polygon(DiaRenderer *object,
 static void
 draw_rect(DiaRenderer *object, 
          Point *ul_corner, Point *lr_corner,
-         Color *colour)
+         Color *fill, Color *stroke)
 {
+    Color *colour = fill ? fill : stroke;
     HpglRenderer *renderer = HPGL_RENDERER (object);
 
+    g_return_if_fail (colour != NULL);
+
     DIAG_NOTE(g_message("draw_rect %f,%f -> %f,%f", 
               ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y));
     hpgl_select_pen(renderer, colour, 0.0);
@@ -380,28 +383,6 @@ draw_rect(DiaRenderer *object,
 }
 
 static void
-fill_rect(DiaRenderer *object, 
-         Point *ul_corner, Point *lr_corner,
-         Color *colour)
-{
-    DIAG_NOTE(g_message("fill_rect %f,%f -> %f,%f", 
-              ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y));
-#if 0
-    HpglRenderer *renderer = HPGL_RENDERER (object);
-
-    hpgl_select_pen(renderer, colour, 0.0);
-    fprintf (renderer->file, "PU%d,%d;PD;RA%d,%d;\n",
-             hpgl_scale(renderer, ul_corner->x),
-             hpgl_scale(renderer, -ul_corner->y),
-             hpgl_scale(renderer, lr_corner->x),
-             hpgl_scale(renderer, -lr_corner->y));
-#else
-    /* the fill modes aren't really compatible ... */
-   draw_rect(object, ul_corner, lr_corner, colour);
-#endif
-}
-
-static void
 draw_arc(DiaRenderer *object, 
         Point *center,
         real width, real height,
@@ -669,8 +650,6 @@ hpgl_renderer_class_init (HpglRendererClass *klass)
 
   renderer_class->draw_line    = draw_line;
   renderer_class->draw_polygon = draw_polygon;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c
index f963c5f..7e0b55a 100644
--- a/plug-ins/libart/dialibartrenderer.c
+++ b/plug-ins/libart/dialibartrenderer.c
@@ -555,131 +555,6 @@ draw_polygon(DiaRenderer *self,
 }
 
 static void
-draw_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-  DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self);
-  ArtVpath *vpath, *vpath_dashed;
-  ArtSVP *svp;
-  guint32 rgba;
-  double top, bottom, left, right;
-    
-  dia_transform_coords_double(renderer->transform,
-                              ul_corner->x, ul_corner->y, &left, &top);
-  dia_transform_coords_double(renderer->transform,
-                              lr_corner->x, lr_corner->y, &right, &bottom);
-  
-  if ((left>right) || (top>bottom))
-    return;
-
-  rgba = color_to_rgba(renderer, color);
-  
-  vpath = art_new (ArtVpath, 6);
-
-  vpath[0].code = ART_MOVETO;
-  vpath[0].x = left;
-  vpath[0].y = top;
-  vpath[1].code = ART_LINETO;
-  vpath[1].x = right;
-  vpath[1].y = top;
-  vpath[2].code = ART_LINETO;
-  vpath[2].x = right;
-  vpath[2].y = bottom;
-  vpath[3].code = ART_LINETO;
-  vpath[3].x = left;
-  vpath[3].y = bottom;
-  vpath[4].code = ART_LINETO;
-  vpath[4].x = left;
-  vpath[4].y = top;
-  vpath[5].code = ART_END;
-  vpath[5].x = 0;
-  vpath[5].y = 0;
-  
-  if (renderer->dash_enabled) {
-    vpath_dashed = art_vpath_dash(vpath, &renderer->dash);
-    art_free( vpath );
-    vpath = vpath_dashed;
-  }
-
-  svp = art_svp_vpath_stroke (vpath,
-                             renderer->join_style,
-                             renderer->cap_style,
-                             renderer->line_width,
-                             4,
-                             0.25);
-  
-  art_free( vpath );
-  
-  art_rgb_svp_alpha (svp,
-                    0, 0, 
-                    renderer->pixel_width,
-                    renderer->pixel_height,
-                    rgba,
-                    renderer->rgb_buffer, renderer->pixel_width*3,
-                    NULL);
-
-  art_svp_free( svp );
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-  DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self);
-  ArtVpath *vpath;
-  ArtSVP *svp;
-  guint32 rgba;
-  double top, bottom, left, right;
-    
-  dia_transform_coords_double(renderer->transform,
-                              ul_corner->x, ul_corner->y, &left, &top);
-  dia_transform_coords_double(renderer->transform,
-                              lr_corner->x, lr_corner->y, &right, &bottom);
-  
-  if ((left>right) || (top>bottom))
-    return;
-
-  rgba = color_to_rgba(renderer, color);
-  
-  vpath = art_new (ArtVpath, 6);
-
-  vpath[0].code = ART_MOVETO;
-  vpath[0].x = left;
-  vpath[0].y = top;
-  vpath[1].code = ART_LINETO;
-  vpath[1].x = right;
-  vpath[1].y = top;
-  vpath[2].code = ART_LINETO;
-  vpath[2].x = right;
-  vpath[2].y = bottom;
-  vpath[3].code = ART_LINETO;
-  vpath[3].x = left;
-  vpath[3].y = bottom;
-  vpath[4].code = ART_LINETO;
-  vpath[4].x = left;
-  vpath[4].y = top;
-  vpath[5].code = ART_END;
-  vpath[5].x = 0;
-  vpath[5].y = 0;
-  
-  svp = art_svp_from_vpath (vpath);
-  
-  art_free( vpath );
-  
-  art_rgb_svp_alpha (svp,
-                    0, 0, 
-                    renderer->pixel_width,
-                    renderer->pixel_height,
-                    rgba,
-                    renderer->rgb_buffer, renderer->pixel_width*3,
-                    NULL);
-
-  art_svp_free( svp );
-}
-
-static void
 draw_arc(DiaRenderer *self, 
         Point *center,
         real width, real height,
@@ -1323,7 +1198,7 @@ draw_image(DiaRenderer *self,
     lr = *point;
     lr.x += width;
     lr.y += height;
-    self_class->fill_rect(self, point, &lr, renderer->highlight_color);
+    self_class->draw_rect(self, point, &lr, renderer->highlight_color, NULL);
   } else {
     double real_width, real_height;
     double x,y;
@@ -1537,9 +1412,6 @@ dia_libart_renderer_class_init (DiaLibartRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   renderer_class->draw_arc = draw_arc;
   renderer_class->fill_arc = fill_arc;
 
diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c
index 0ce4264..6ddcd8c 100644
--- a/plug-ins/metapost/render_metapost.c
+++ b/plug-ins/metapost/render_metapost.c
@@ -168,12 +168,6 @@ static void draw_polyline(DiaRenderer *self,
 static void draw_polygon(DiaRenderer *self, 
                         Point *points, int num_points, 
                         Color *fill, Color *stroke);
-static void draw_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
@@ -279,9 +273,6 @@ metapost_renderer_class_init (MetapostRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   renderer_class->draw_arc = draw_arc;
   renderer_class->fill_arc = fill_arc;
 
@@ -671,66 +662,6 @@ draw_polygon(DiaRenderer *self,
 }
 
 static void
-draw_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    MetapostRenderer *renderer = METAPOST_RENDERER (self);
-    gchar ulx_buf[DTOSTR_BUF_SIZE];
-    gchar uly_buf[DTOSTR_BUF_SIZE];
-    gchar lrx_buf[DTOSTR_BUF_SIZE];
-    gchar lry_buf[DTOSTR_BUF_SIZE];
-
-    mp_dtostr(ulx_buf, (gdouble) ul_corner->x);
-    mp_dtostr(uly_buf, (gdouble) ul_corner->y);
-    mp_dtostr(lrx_buf, (gdouble) lr_corner->x);
-    mp_dtostr(lry_buf, (gdouble) lr_corner->y);
-
-    set_line_color(renderer,color);
-
-    fprintf(renderer->file, 
-           "  draw (%sx,%sy)--(%sx,%sy)--(%sx,%sy)--(%sx,%sy)--cycle",
-           ulx_buf, uly_buf,
-           ulx_buf, lry_buf,
-           lrx_buf, lry_buf,
-           lrx_buf, uly_buf );
-    end_draw_op(renderer);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    MetapostRenderer *renderer = METAPOST_RENDERER (self);
-    gchar ulx_buf[DTOSTR_BUF_SIZE];
-    gchar uly_buf[DTOSTR_BUF_SIZE];
-    gchar lrx_buf[DTOSTR_BUF_SIZE];
-    gchar lry_buf[DTOSTR_BUF_SIZE];
-    gchar red_buf[DTOSTR_BUF_SIZE];
-    gchar green_buf[DTOSTR_BUF_SIZE];
-    gchar blue_buf[DTOSTR_BUF_SIZE];
-
-    mp_dtostr(ulx_buf, (gdouble) ul_corner->x);
-    mp_dtostr(uly_buf, (gdouble) ul_corner->y);
-    mp_dtostr(lrx_buf, (gdouble) lr_corner->x);
-    mp_dtostr(lry_buf, (gdouble) lr_corner->y);
-
-    fprintf(renderer->file, 
-           "  path p;\n"
-           "  p = (%sx,%sy)--(%sx,%sy)--(%sx,%sy)--(%sx,%sy)--cycle;\n",
-           ulx_buf, uly_buf,
-           ulx_buf, lry_buf,
-           lrx_buf, lry_buf,
-           lrx_buf, uly_buf );
-    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) );
-}
-
-static void
 metapost_arc(MetapostRenderer *renderer, 
             Point *center,
             real width, real height,
diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c
index 719900f..3b4d55d 100644
--- a/plug-ins/pgf/render_pgf.c
+++ b/plug-ins/pgf/render_pgf.c
@@ -99,12 +99,6 @@ static void draw_rounded_polyline (DiaRenderer *self,
 static void draw_polygon(DiaRenderer *self, 
                         Point *points, int num_points, 
                         Color *fill, Color *stroke);
-static void draw_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
 static void draw_rounded_rect(DiaRenderer *self, 
                              Point *ul_corner, Point *lr_corner,
                              Color *color, real radius);
@@ -256,9 +250,6 @@ pgf_renderer_class_init (PgfRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   renderer_class->draw_rounded_rect = draw_rounded_rect;
   renderer_class->fill_rounded_rect = fill_rounded_rect;
 
@@ -599,26 +590,6 @@ pgf_rect(PgfRenderer *renderer,
            lrx_buf, uly_buf );
 }
 
-static void
-draw_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    PgfRenderer *renderer = PGF_RENDERER(self);
-
-    pgf_rect(renderer,ul_corner,lr_corner,color,FALSE);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    PgfRenderer *renderer = PGF_RENDERER(self);
-
-    pgf_rect(renderer,ul_corner,lr_corner,color,TRUE);
-}
-
 static void 
 draw_rounded_rect(DiaRenderer *self, 
                              Point *ul_corner, Point *lr_corner,
diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c
index 86079af..d0dd7ba 100644
--- a/plug-ins/postscript/diapsrenderer.c
+++ b/plug-ins/postscript/diapsrenderer.c
@@ -385,51 +385,6 @@ draw_polygon (DiaRenderer *self,
 }
 
 static void
-psrenderer_rect(DiaPsRenderer *renderer,
-               Point *ul_corner,
-               Point *lr_corner,
-               Color *color,
-               gboolean filled)
-{
-  gchar ulx_buf[DTOSTR_BUF_SIZE];
-  gchar uly_buf[DTOSTR_BUF_SIZE];
-  gchar lrx_buf[DTOSTR_BUF_SIZE];
-  gchar lry_buf[DTOSTR_BUF_SIZE];
-
-  lazy_setcolor(renderer,color);
-
-  psrenderer_dtostr(ulx_buf, (gdouble) ul_corner->x);
-  psrenderer_dtostr(uly_buf, (gdouble) ul_corner->y);
-  psrenderer_dtostr(lrx_buf, (gdouble) lr_corner->x);
-  psrenderer_dtostr(lry_buf, (gdouble) lr_corner->y);
-  
-  fprintf(renderer->file, "n %s %s m %s %s l %s %s l %s %s l %s\n",
-         ulx_buf, uly_buf,
-         ulx_buf, lry_buf,
-         lrx_buf, lry_buf,
-         lrx_buf, uly_buf,
-         filled ? "f" : "cp s" );
-}
-
-static void
-draw_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  psrenderer_rect(renderer, ul_corner, lr_corner, color, FALSE);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  psrenderer_rect(renderer, ul_corner, lr_corner, color, TRUE);
-}
-
-static void
 psrenderer_arc(DiaPsRenderer *renderer,
               Point *center,
               real width, real height,
@@ -1045,8 +1000,6 @@ dia_ps_renderer_class_init (DiaPsRendererClass *klass)
   /* medium level functions */
   renderer_class->draw_bezier  = draw_bezier;
   renderer_class->draw_beziergon  = draw_beziergon;
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
   renderer_class->draw_polyline  = draw_polyline;
 
   /* ps specific */
diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c
index 3af6279..481e6f2 100644
--- a/plug-ins/pstricks/render_pstricks.c
+++ b/plug-ins/pstricks/render_pstricks.c
@@ -82,12 +82,6 @@ static void draw_polyline(DiaRenderer *self,
 static void draw_polygon(DiaRenderer *self, 
                         Point *points, int num_points, 
                         Color *fill, Color *stroke);
-static void draw_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
@@ -188,9 +182,6 @@ pstricks_renderer_class_init (PstricksRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   renderer_class->draw_arc = draw_arc;
   renderer_class->fill_arc = fill_arc;
 
@@ -478,51 +469,6 @@ draw_polygon (DiaRenderer *self,
 }
 
 static void
-pstricks_rect(PstricksRenderer *renderer,
-             Point *ul_corner, Point *lr_corner,
-             Color *color, gboolean filled)
-{
-    gchar ulx_buf[DTOSTR_BUF_SIZE];
-    gchar uly_buf[DTOSTR_BUF_SIZE];
-    gchar lrx_buf[DTOSTR_BUF_SIZE];
-    gchar lry_buf[DTOSTR_BUF_SIZE];
-
-    set_line_color(renderer,color);
-
-    pstricks_dtostr(ulx_buf, (gdouble) ul_corner->x);
-    pstricks_dtostr(uly_buf, (gdouble) ul_corner->y);
-    pstricks_dtostr(lrx_buf, (gdouble) lr_corner->x);
-    pstricks_dtostr(lry_buf, (gdouble) lr_corner->y);
-    
-    fprintf(renderer->file, "\\pspolygon%s(%s,%s)(%s,%s)(%s,%s)(%s,%s)\n",
-           (filled?"*":""),
-           ulx_buf, uly_buf,
-           ulx_buf, lry_buf,
-           lrx_buf, lry_buf,
-           lrx_buf, uly_buf );
-}
-
-static void
-draw_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
-
-    pstricks_rect(renderer,ul_corner,lr_corner,color,FALSE);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *color)
-{
-    PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
-
-    pstricks_rect(renderer,ul_corner,lr_corner,color,TRUE);
-}
-
-static void
 pstricks_arc(PstricksRenderer *renderer, 
             Point *center,
             real width, real height,
diff --git a/plug-ins/python/codegen.py b/plug-ins/python/codegen.py
index 04c55c7..1a96f90 100644
--- a/plug-ins/python/codegen.py
+++ b/plug-ins/python/codegen.py
@@ -701,7 +701,6 @@ class PhpRenderer(ObjRenderer) :
                mainfile.close()
                ObjRenderer.end_render(self)
 
-       def fill_rect(*args):pass
        def draw_line(*args):pass
        def draw_string(*args):pass
 
diff --git a/plug-ins/python/diadissect.py b/plug-ins/python/diadissect.py
index 4d2b812..427c451 100644
--- a/plug-ins/python/diadissect.py
+++ b/plug-ins/python/diadissect.py
@@ -105,13 +105,11 @@ class DissectRenderer :
                        self.Warning ("%s negative height" % (fun,))
                if rect.left > rect.right :
                        self.Warning ("%s negative width" % (fun,))
-       def draw_rect (self, rect, color) :
+       def draw_rect (self, rect, fill, stroke) :
                self._rect (rect, "draw_rect")
        def draw_rounded_rect (self, rect, color, rounding) :
                # XXX: check rounding to be positive (smaller than half width, height?)
                self._rect (rect, "draw_rect")
-       def fill_rect (self, rect, color) :
-               self._rect (rect, "draw_rect")
        def fill_rounded_rect (self, rect, color, rounding) :
                self._rect (rect, "draw_rect")
        def _arc (self, center, width, height, angle1, angle2, fun) :
diff --git a/plug-ins/python/diastddia.py b/plug-ins/python/diastddia.py
index 0f3d4b9..bc13d78 100644
--- a/plug-ins/python/diastddia.py
+++ b/plug-ins/python/diastddia.py
@@ -157,10 +157,11 @@ class StandardDiaRenderer :
 %s%s
     </dia:object>''' % (self.oid, rect.left,rect.top, rect.right - rect.left, rect.bottom - rect.top, 
                        self._tinting(color, fill, 'border_color', 'border_width'), self._stroke_style()))
-       def draw_rect (self, rect, color) :
-               self._box(rect, color, 0)
-       def fill_rect (self, rect, color) :
-               self._box(rect, color, 1)
+       def draw_rect (self, rect, fill, stroke) :
+               if fill :
+                       self._box(rect, fill, 1)
+               if stroke :
+                       self._box(rect, stroke, 0)
 
        def _ellipse (self, center, width, height, color, fill) :
                self.oid = self.oid + 1
diff --git a/plug-ins/python/diasvg.py b/plug-ins/python/diasvg.py
index 1602e75..b173cac 100644
--- a/plug-ins/python/diasvg.py
+++ b/plug-ins/python/diasvg.py
@@ -115,18 +115,14 @@ class SvgRenderer :
                for pt in points :
                        self.f.write ('%.3f,%.3f ' % (pt.x, pt.y))
                self.f.write('"/>\n')
-       def draw_rect (self, rect, color) :
-               self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="none" stroke="%s" 
stroke-width="%.3f" %s/>\n' \
+       def draw_rect (self, rect, fill, stroke) :
+               self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="%s" stroke="%s" 
stroke-width="%.3f" %s/>\n' \
                                        % (     rect.left, rect.top, rect.right - rect.left, rect.bottom - 
rect.top,
-                                               self._rgb(color), self.line_width, self._stroke_style()))
+                                               self._rgb(fill), self._rgb(stroke), self.line_width, 
self._stroke_style()))
        def draw_rounded_rect (self, rect, color, rounding) :
                self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="none" stroke="%s" 
stroke-width="%.3f" %s rx="%.3f" />\n' \
                                        % (     rect.left, rect.top, rect.right - rect.left, rect.bottom - 
rect.top,
                                                self._rgb(color), self.line_width, self._stroke_style(), 
rounding))
-       def fill_rect (self, rect, color) :
-               self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="%s" stroke="none" 
stroke-width="0"/>\n' \
-                                       % (     rect.left, rect.top, rect.right - rect.left, rect.bottom - 
rect.top,
-                                               self._rgb(color)))
        def fill_rounded_rect (self, rect, color, rounding) :
                self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="%s" stroke="none" 
rx="%.3f" />\n' \
                                        % (     rect.left, rect.top, rect.right - rect.left, rect.bottom - 
rect.top,
diff --git a/plug-ins/python/export-render.py b/plug-ins/python/export-render.py
index 18ec028..9790830 100644
--- a/plug-ins/python/export-render.py
+++ b/plug-ins/python/export-render.py
@@ -76,10 +76,7 @@ class DumpRenderer :
                        self.f.write ("\t" + str(pt) + "\n")
        ## \brief Draw a rectangle
        def draw_rect (self, rect, color) :
-               self.f.write("draw_rect: " + str(rect) + str(color) + "\n")
-       ## \brief Fill a rectangle
-       def fill_rect (self, rect, color) :
-               self.f.write("fill_rect: " + str(rect) + str(color) + "\n")
+               self.f.write("draw_rect: " + str(rect) + str(fill) + str(stroke) + "\n")
        ## \brief Draw an arc
        def draw_arc (self, center, width, height, angle1, angle2, color) :
                self.f.write("draw_arc: " + str(center) + ";" \
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 5047445..b3ff2af 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -613,7 +613,6 @@ draw_polygon(DiaRenderer *renderer,
       fill_po = PyDiaColor_New (fill);
     else
       Py_INCREF(Py_None), fill_po = Py_None;
-
     if (stroke)
       stroke_po = PyDiaColor_New (stroke);
     else
@@ -621,7 +620,7 @@ draw_polygon(DiaRenderer *renderer,
 
     Py_INCREF(self);
     Py_INCREF(func);
-    arg = Py_BuildValue ("(OO)", optt, fill_po, stroke_po);
+    arg = Py_BuildValue ("(OOO)", optt, fill_po, stroke_po);
     if (arg) {
       res = PyEval_CallObject (func, arg);
       ON_RES(res, FALSE);
@@ -640,31 +639,42 @@ draw_polygon(DiaRenderer *renderer,
 static void
 draw_rect(DiaRenderer *renderer, 
          Point *ul_corner, Point *lr_corner,
-         Color *colour)
+         Color *fill, Color *stroke)
 {
   PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
 
   func = PyObject_GetAttrString (self, "draw_rect");
   if (func && PyCallable_Check(func)) {
     PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
-    PyObject *ocolor = PyDiaColor_New (colour);
+    PyObject *fill_po, *stroke_po;
     Py_INCREF(self);
     Py_INCREF(func);
-    arg = Py_BuildValue ("(OO)", orect, ocolor);
+
+    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;
+
+    arg = Py_BuildValue ("(OOO)", orect, fill_po, stroke_po);
     if (arg) {
       res = PyEval_CallObject (func, arg);
       ON_RES(res, FALSE);
     }
     Py_XDECREF (arg);
     Py_XDECREF (orect);
-    Py_XDECREF (ocolor);
+    Py_XDECREF (fill_po);
+    Py_XDECREF (stroke_po);
     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_rect (renderer, ul_corner, lr_corner, colour);
+    DIA_RENDERER_CLASS (parent_class)->draw_rect(renderer, ul_corner, lr_corner, fill, stroke);
   }
 }
 
@@ -701,48 +711,6 @@ draw_rounded_rect(DiaRenderer *renderer,
 }
 
 
-/*!
- * \brief Fill rectangle
- *
- * Not optional on the PyDia side. If not implemented a runtime warning 
- * will be generated when called.
- *
- * \memberof _DiaPyRenderer
- */
-static void
-fill_rect(DiaRenderer *renderer, 
-         Point *ul_corner, Point *lr_corner,
-         Color *colour)
-{
-  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
-
-  func = PyObject_GetAttrString (self, "fill_rect");
-  if (func && PyCallable_Check(func)) {
-    PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
-    PyObject *ocolor = PyDiaColor_New (colour);
-
-    Py_INCREF(self);
-    Py_INCREF(func);
-    arg = Py_BuildValue ("(OO)", orect, ocolor);
-    if (arg) {
-      res = PyEval_CallObject (func, arg);
-      ON_RES(res, FALSE);
-    }
-    Py_XDECREF (arg);
-    Py_XDECREF (orect);
-    Py_XDECREF (ocolor);
-    Py_DECREF(func);
-    Py_DECREF(self);
-  }
-  else { /* member not optional */
-    gchar *msg = g_strdup_printf ("%s.fill_rect() implmentation missing.",
-                                 G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
-    PyErr_Clear();
-    PyErr_Warn (PyExc_RuntimeWarning, msg);
-    g_free (msg);
-  }
-}
-
 static void
 fill_rounded_rect(DiaRenderer *renderer, 
          Point *ul_corner, Point *lr_corner,
@@ -1270,8 +1238,7 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
   renderer_class->set_font  = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -1281,9 +1248,8 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
+  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/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index a59696f..e08da56 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -114,7 +114,7 @@ static void draw_polygon(DiaRenderer *self,
                         Color *fill, Color *stroke);
 static void draw_rect(DiaRenderer *self, 
                      Point *ul_corner, Point *lr_corner,
-                     Color *colour);
+                     Color *fill, Color *stroke);
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
@@ -475,14 +475,15 @@ add_rectangle_connection_points (ShapeRenderer *renderer,
 static void
 draw_rect (DiaRenderer *self, 
            Point *ul_corner, Point *lr_corner,
-           Color *colour) 
+           Color *fill, Color *stroke) 
 {
   ShapeRenderer *renderer = SHAPE_RENDERER(self);
 
   /* use base class implementation */
-  DIA_RENDERER_CLASS(parent_class)->draw_rect (self, ul_corner, lr_corner, colour);
+  DIA_RENDERER_CLASS(parent_class)->draw_rect (self, ul_corner, lr_corner, fill, stroke);
   /* do our own stuff */
-  add_rectangle_connection_points(renderer, ul_corner, lr_corner);
+  if (stroke)
+    add_rectangle_connection_points(renderer, ul_corner, lr_corner);
 }
 
 static void 
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index 5a5edb0..134d0ea 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -115,12 +115,6 @@ static void draw_polyline(DiaRenderer *self,
 static void draw_polygon(DiaRenderer *self, 
                         Point *points, int num_points, 
                         Color *fill, Color *stroke);
-static void draw_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color);
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
@@ -232,9 +226,6 @@ vdx_renderer_class_init (VDXRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   renderer_class->draw_arc = draw_arc;
   renderer_class->fill_arc = fill_arc;
 
@@ -888,53 +879,6 @@ draw_polygon(DiaRenderer *self,
     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)
-{
-    Point points[5];            /* 5 so we close path */
-
-    g_debug("draw_rect((%f,%f), (%f,%f)) -> draw_polyline", 
-            ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y);
-    points[0].x = ul_corner->x; points[0].y = lr_corner->y;
-    points[1] = *lr_corner;
-    points[2].x = lr_corner->x; points[2].y = ul_corner->y;
-    points[3] = *ul_corner;
-    points[4] = points[0];
-    
-    draw_polygon(self, points, 5, NULL, color);
-}
-
-/** Render a Dia filled rectangle
- * @param self a renderer
- * @param ul_corner Upper-left corner
- * @param lr_corner Lower-right corner
- * @param color line colour
- */
-
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *color)
-{
-    Point points[5];            /* 5 so we close path */
-
-    g_debug("fill_rect -> fill_polygon");
-    points[0].x = ul_corner->x; points[0].y = lr_corner->y;
-    points[1] = *lr_corner;
-    points[2].x = lr_corner->x; points[2].y = ul_corner->y;
-    points[3] = *ul_corner;
-    points[4] = points[0];
-    
-    fill_polygon(self, points, 5, color);
-}
-
 /** Render a Dia arc
  * @param self a renderer
  * @param center centre of arc
@@ -945,7 +889,6 @@ static void fill_rect(DiaRenderer *self,
  * @param color line colour
  * @todo Not done yet
  */
-
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index fe50454..1f319d4 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -706,7 +706,7 @@ draw_polygon(DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
          Point *ul_corner, Point *lr_corner,
-         Color *colour)
+         Color *fill, Color *stroke)
 {
     WmfRenderer *renderer = WMF_RENDERER (self);
 
@@ -715,35 +715,27 @@ draw_rect(DiaRenderer *self,
     DIAG_NOTE(renderer, "draw_rect %f,%f -> %f,%f\n", 
               ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y);
 
-    hPen = UsePen(renderer, colour);
-
-    W32::Rectangle(renderer->hFileDC,
-                   SCX(ul_corner->x), SCY(ul_corner->y),
-                   SCX(lr_corner->x), SCY(lr_corner->y));
-
-    DonePen(renderer, hPen);
-}
-
-static void
-fill_rect(DiaRenderer *self, 
-         Point *ul_corner, Point *lr_corner,
-         Color *colour)
-{
-    WmfRenderer *renderer = WMF_RENDERER (self);
-    W32::HGDIOBJ hBrush, hBrOld;
-    W32::COLORREF rgb = W32COLOR(colour);
-
-    DIAG_NOTE(renderer, "fill_rect %f,%f -> %f,%f\n", 
-              ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y);
-
-    hBrush = W32::CreateSolidBrush(rgb);
-    hBrOld = W32::SelectObject(renderer->hFileDC, hBrush);
+    if (fill) {
+       W32::HGDIOBJ hBrush, hBrOld;
+       W32::COLORREF rgb = W32COLOR(fill);
+       hBrush = W32::CreateSolidBrush(rgb);
+       hBrOld = W32::SelectObject(renderer->hFileDC, hBrush);
+       W32::Rectangle (renderer->hFileDC,
+                       SCX(ul_corner->x), SCY(ul_corner->y),
+                       SCX(lr_corner->x), SCY(lr_corner->y));
+       W32::SelectObject (renderer->hFileDC, 
+                          W32::GetStockObject (HOLLOW_BRUSH) );
+       W32::DeleteObject(hBrush);
+    }
+    if (stroke) {
+       hPen = UsePen(renderer, stroke);
 
-    draw_rect(self, ul_corner, lr_corner, NULL);
+       W32::Rectangle (renderer->hFileDC,
+                       SCX(ul_corner->x), SCY(ul_corner->y),
+                       SCX(lr_corner->x), SCY(lr_corner->y));
 
-    W32::SelectObject(renderer->hFileDC, 
-                    W32::GetStockObject (HOLLOW_BRUSH) );
-    W32::DeleteObject(hBrush);
+       DonePen(renderer, hPen);
+    }
 }
 
 static void
@@ -1287,8 +1279,7 @@ wmf_renderer_class_init (WmfRendererClass *klass)
   renderer_class->set_font  = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
 #ifndef HAVE_LIBEMF
   renderer_class->fill_arc     = fill_arc;
@@ -1303,7 +1294,6 @@ wmf_renderer_class_init (WmfRendererClass *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;
 #ifndef DIRECT_WMF
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index 67a14a7..9536b41 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -155,12 +155,11 @@ _do_polygon (WpgImportRenderer *ren, Point *points, int iNum)
 static void
 _do_rect (WpgImportRenderer *ren, Point *points)
 {
-  if (ren->LineAttr.Type != WPG_LA_NONE)
+  if (ren->LineAttr.Type != WPG_LA_NONE || ren->FillAttr.Type != WPG_FA_HOLLOW)
     DIA_RENDERER_GET_CLASS(ren)->draw_rect (DIA_RENDERER(ren),
-                                           &points[0], &points[1], &ren->stroke);
-  if (ren->FillAttr.Type != WPG_FA_HOLLOW)
-    DIA_RENDERER_GET_CLASS(ren)->fill_rect (DIA_RENDERER(ren),
-                                           &points[0], &points[1], &ren->fill);
+                                           &points[0], &points[1],
+                                           (ren->FillAttr.Type != WPG_FA_HOLLOW) ? &ren->fill : NULL,
+                                           (ren->LineAttr.Type != WPG_LA_NONE) ? &ren->stroke : NULL);
 }
 static void
 _do_bezier (WpgImportRenderer *ren, WPGPoint *pts, int iNum)
diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c
index e1a4cf2..10bd7c6 100644
--- a/plug-ins/wpg/wpg.c
+++ b/plug-ins/wpg/wpg.c
@@ -563,14 +563,24 @@ draw_polygon(DiaRenderer *self,
 static void
 draw_rect(DiaRenderer *self, 
           Point *ul_corner, Point *lr_corner,
-          Color *colour)
+          Color *fill, Color *stroke)
 {
   WpgRenderer *renderer = WPG_RENDERER (self);
   gint16* pData;
+  WPG_LineAttr lt = renderer->LineAttr.Type;
+
   DIAG_NOTE(g_message("draw_rect %f,%f -> %f,%f", 
             ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y));
 
-  WriteLineAttr(renderer, colour);
+  g_return_if_fail (fill || stroke);
+
+  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_RECTANGLE, 4*sizeof(gint16));
 
   pData = g_new(gint16, 4);
@@ -580,26 +590,14 @@ draw_rect(DiaRenderer *self,
   pData[3] = SC(lr_corner->y - ul_corner->y); /* height */
 
   fwrite_le(pData, sizeof(gint16), 4, renderer->file);
-
+  if (!stroke)
+    renderer->LineAttr.Type = lt;
+  /* switch off fill */
+  WriteFillAttr(renderer, fill ? fill : stroke, FALSE);
   g_free(pData);
 }
 
 static void
-fill_rect(DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *colour)
-{
-  WpgRenderer *renderer = WPG_RENDERER (self);
-
-  DIAG_NOTE(g_message("fill_rect %f,%f -> %f,%f", 
-            ul_corner->x, ul_corner->y, lr_corner->x, lr_corner->y));
-
-  WriteFillAttr(renderer, colour, TRUE);
-  draw_rect(self, ul_corner, lr_corner, colour);
-  WriteFillAttr(renderer, colour, FALSE);
-}
-
-static void
 draw_arc(DiaRenderer *self, 
         Point *center,
         real width, real height,
@@ -1033,8 +1031,7 @@ wpg_renderer_class_init (WpgRendererClass *klass)
   renderer_class->set_font  = set_font;
 
   renderer_class->draw_line    = draw_line;
-  renderer_class->draw_rect    = draw_rect;
-  renderer_class->fill_rect    = fill_rect;
+  renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_arc     = draw_arc;
   renderer_class->fill_arc     = fill_arc;
   renderer_class->draw_ellipse = draw_ellipse;
@@ -1044,9 +1041,8 @@ wpg_renderer_class_init (WpgRendererClass *klass)
   renderer_class->draw_image   = draw_image;
 
   /* medium level functions */
-  renderer_class->draw_rect = draw_rect;
+  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/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index b0bb6f5..68f9e3e 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -134,10 +134,7 @@ static void draw_polygon(DiaRenderer *self,
                         Color *fill, Color *stroke);
 static void draw_rect(DiaRenderer *self, 
                      Point *ul_corner, Point *lr_corner,
-                     Color *colour);
-static void fill_rect(DiaRenderer *self, 
-                     Point *ul_corner, Point *lr_corner,
-                     Color *colour);
+                     Color *fill, Color *stroke);
 static void draw_arc(DiaRenderer *self, 
                     Point *center,
                     real width, real height,
@@ -256,15 +253,13 @@ xfig_renderer_class_init (XfigRendererClass *klass)
   
   renderer_class->draw_polygon = draw_polygon;
 
-  renderer_class->draw_rect = draw_rect;
-  renderer_class->fill_rect = fill_rect;
-
   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_rect = draw_rect;
   renderer_class->draw_bezier = draw_bezier;
   renderer_class->draw_beziergon = draw_beziergon;
 
@@ -776,9 +771,9 @@ draw_polygon(DiaRenderer *self,
 }
 
 static void 
-draw_rect(DiaRenderer *self, 
-          Point *ul_corner, Point *lr_corner,
-          Color *color) 
+stroke_rect(DiaRenderer *self, 
+            Point *ul_corner, Point *lr_corner,
+            Color *color)
 {
   XfigRenderer *renderer = XFIG_RENDERER(self);
   gchar d_buf[DTOSTR_BUF_SIZE];
@@ -805,7 +800,7 @@ draw_rect(DiaRenderer *self,
 static void 
 fill_rect(DiaRenderer *self, 
           Point *ul_corner, Point *lr_corner,
-          Color *color) 
+          Color *color)
 {
   XfigRenderer *renderer = XFIG_RENDERER(self);
   gchar d_buf[DTOSTR_BUF_SIZE];
@@ -829,7 +824,17 @@ fill_rect(DiaRenderer *self,
          (int)figCoord(renderer, ul_corner->x), (int)figCoord(renderer, lr_corner->y), 
          (int)figCoord(renderer, ul_corner->x), (int)figCoord(renderer, ul_corner->y));
 }
-
+static void
+draw_rect(DiaRenderer *self, 
+          Point *ul_corner, Point *lr_corner,
+          Color *fill, Color *stroke) 
+{
+  /* XXX: optimize to one call? */
+  if (fill)
+    fill_rect (self, ul_corner, lr_corner, fill);
+  if (stroke)
+    stroke_rect (self, ul_corner, lr_corner, stroke);
+}
 static void 
 draw_arc(DiaRenderer *self, 
          Point *center,


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