[dia] DiaRenderer: refine set_linestyle to also contain dashlength



commit e73883f26a6c1e247e5c47cb83b6508fa1443159
Author: Hans Breuer <hans breuer org>
Date:   Sun Jun 1 22:13:16 2014 +0200

    DiaRenderer: refine set_linestyle to also contain dashlength
    
    These two parameter are closely related, just fixed a bug where the line style was set
    without the dash length being set (i.e. still zero). Instead of putting all the burden
    on the renderer's site, just give both parameters at once.

 app/connectionpoint_ops.c                 |    2 +-
 app/grid.c                                |   19 ++++----
 app/handle_ops.c                          |    3 +-
 bindings/dia-renderer.cpp                 |   11 +----
 bindings/dia-renderer.h                   |    4 +-
 lib/arrows.c                              |   46 +++++++++---------
 lib/bezier-common.c                       |    3 +-
 lib/diagdkrenderer.c                      |   47 ++++++++-----------
 lib/diaimportrenderer.c                   |   16 ++-----
 lib/diapathrenderer.c                     |    7 +--
 lib/diarenderer.c                         |   15 +-----
 lib/diarenderer.h                         |    8 +--
 lib/diasvgrenderer.c                      |   38 +++++----------
 lib/diasvgrenderer.h                      |    4 --
 lib/diatransformrenderer.c                |   21 ++-------
 lib/standard-path.c                       |    2 +-
 lib/text.c                                |    2 +-
 objects/AADL/aadlbus.c                    |    2 +-
 objects/AADL/aadldata.c                   |    2 +-
 objects/AADL/aadldevice.c                 |    2 +-
 objects/AADL/aadlmemory.c                 |    2 +-
 objects/AADL/aadlpackage.c                |    2 +-
 objects/AADL/aadlport.c                   |   18 ++++----
 objects/AADL/aadlprocess.c                |    3 +-
 objects/AADL/aadlprocessor.c              |    2 +-
 objects/AADL/aadlsubprogram.c             |    2 +-
 objects/AADL/aadlsystem.c                 |    3 +-
 objects/Database/reference.c              |    3 +-
 objects/Database/table.c                  |    2 +-
 objects/ER/attribute.c                    |   10 ++--
 objects/ER/entity.c                       |    4 +-
 objects/ER/participation.c                |    2 +-
 objects/ER/relationship.c                 |    2 +-
 objects/FS/flow-ortho.c                   |    7 +--
 objects/FS/flow.c                         |    7 +--
 objects/FS/function.c                     |    8 ++--
 objects/GRAFCET/action.c                  |    2 +-
 objects/GRAFCET/action_text_draw.c        |    2 +-
 objects/GRAFCET/boolequation.c            |    2 +-
 objects/GRAFCET/condition.c               |    2 +-
 objects/GRAFCET/step.c                    |    2 +-
 objects/GRAFCET/transition.c              |    2 +-
 objects/GRAFCET/vector.c                  |    2 +-
 objects/GRAFCET/vergent.c                 |    2 +-
 objects/Istar/goal.c                      |    2 +-
 objects/Istar/link.c                      |    2 +-
 objects/Istar/other.c                     |    2 +-
 objects/Jackson/domain.c                  |    2 +-
 objects/Jackson/phenomenon.c              |    5 +-
 objects/Jackson/requirement.c             |    3 +-
 objects/KAOS/goal.c                       |    2 +-
 objects/KAOS/metaandorrel.c               |    2 +-
 objects/KAOS/metabinrel.c                 |    2 +-
 objects/KAOS/other.c                      |    2 +-
 objects/Misc/analog_clock.c               |    2 +-
 objects/Misc/grid_object.c                |    2 +-
 objects/Misc/measure.c                    |    2 +-
 objects/Misc/n_gon.c                      |    3 +-
 objects/Misc/tree.c                       |    2 +-
 objects/SADT/annotation.c                 |    2 +-
 objects/SADT/arrow.c                      |    2 +-
 objects/SADT/box.c                        |    2 +-
 objects/UML/activity.c                    |   19 ++++----
 objects/UML/actor.c                       |    2 +-
 objects/UML/association.c                 |    2 +-
 objects/UML/branch.c                      |    2 +-
 objects/UML/class.c                       |    5 +-
 objects/UML/classicon.c                   |    2 +-
 objects/UML/component.c                   |    2 +-
 objects/UML/component_feature.c           |    2 +-
 objects/UML/constraint.c                  |    3 +-
 objects/UML/dependency.c                  |    3 +-
 objects/UML/fork.c                        |    2 +-
 objects/UML/generalization.c              |    2 +-
 objects/UML/implements.c                  |    2 +-
 objects/UML/large_package.c               |    2 +-
 objects/UML/lifeline.c                    |    7 +--
 objects/UML/message.c                     |    9 ++--
 objects/UML/node.c                        |    2 +-
 objects/UML/note.c                        |    2 +-
 objects/UML/object.c                      |    2 +-
 objects/UML/realizes.c                    |    3 +-
 objects/UML/small_package.c               |    2 +-
 objects/UML/state.c                       |    2 +-
 objects/UML/state_term.c                  |    2 +-
 objects/UML/transition.c                  |    2 +-
 objects/UML/usecase.c                     |    4 +-
 objects/chronogram/chronoline.c           |    6 +-
 objects/chronogram/chronoref.c            |    2 +-
 objects/custom/custom_object.c            |   10 ++--
 objects/flowchart/box.c                   |    3 +-
 objects/flowchart/diamond.c               |    3 +-
 objects/flowchart/ellipse.c               |    3 +-
 objects/flowchart/parallelogram.c         |    3 +-
 objects/network/basestation.c             |    2 +-
 objects/network/bus.c                     |    2 +-
 objects/network/radiocell.c               |    3 +-
 objects/network/wanlink.c                 |    2 +-
 objects/standard/arc.c                    |    6 +--
 objects/standard/bezier.c                 |    3 +-
 objects/standard/beziergon.c              |    3 +-
 objects/standard/box.c                    |    3 +-
 objects/standard/ellipse.c                |    3 +-
 objects/standard/image.c                  |    3 +-
 objects/standard/line.c                   |    3 +-
 objects/standard/outline.c                |    2 +-
 objects/standard/polygon.c                |    3 +-
 objects/standard/polyline.c               |    3 +-
 objects/standard/zigzagline.c             |    3 +-
 plug-ins/cairo/diacairo-renderer.c        |   58 ++++++-----------------
 plug-ins/cairo/diacairo.h                 |    2 -
 plug-ins/cgm/cgm.c                        |   12 +----
 plug-ins/drs/dia-render-script-import.c   |    4 +-
 plug-ins/drs/dia-render-script-renderer.c |   15 +-----
 plug-ins/dxf/dxf-export.c                 |   11 +----
 plug-ins/hpgl/hpgl.c                      |   18 +------
 plug-ins/libart/dialibartrenderer.c       |   72 ++++++++++++----------------
 plug-ins/libart/dialibartrenderer.h       |    3 -
 plug-ins/metapost/render_metapost.c       |   23 +++------
 plug-ins/pgf/render_pgf.c                 |   49 ++++++-------------
 plug-ins/pgf/render_pgf.h                 |    4 --
 plug-ins/postscript/diapsrenderer.c       |   44 ++++++------------
 plug-ins/postscript/diapsrenderer.h       |    3 -
 plug-ins/pstricks/render_pstricks.c       |   48 ++++++-------------
 plug-ins/pstricks/render_pstricks.h       |    4 --
 plug-ins/python/diadissect.py             |    7 +--
 plug-ins/python/diastddia.py              |    3 +-
 plug-ins/python/diasvg.py                 |    3 +-
 plug-ins/python/export-render.py          |    6 +--
 plug-ins/python/pydia-render.c            |   34 +-------------
 plug-ins/shape/shape-export.c             |    3 -
 plug-ins/svg/render_svg.c                 |    3 -
 plug-ins/vdx/vdx-export.c                 |   20 +-------
 plug-ins/wmf/wmf.cpp                      |   16 +-----
 plug-ins/wpg/wpg-import.c                 |   17 ++----
 plug-ins/wpg/wpg.c                        |   20 +-------
 plug-ins/xfig/xfig-export.c               |   15 +-----
 137 files changed, 359 insertions(+), 707 deletions(-)
---
diff --git a/app/connectionpoint_ops.c b/app/connectionpoint_ops.c
index ac4b9e4..d507737 100644
--- a/app/connectionpoint_ops.c
+++ b/app/connectionpoint_ops.c
@@ -64,7 +64,7 @@ object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp)
 
   /* this does not change for any of the points */
   renderer_ops->set_linewidth (renderer, 0.0);
-  renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
 
   /* optimization to only draw the connection points at all if the size
    * of the object (bounding box) is bigger than the summed size of the 
diff --git a/app/grid.c b/app/grid.c
index c80eabf..458cf3d 100644
--- a/app/grid.c
+++ b/app/grid.c
@@ -118,9 +118,10 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length)
   while (y < height) {
     if (major_lines) {
       if (major_count == 0)
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
       else
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
+       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
+                                                       ddisplay_untransform_length(ddisp, 31));
       major_count = (major_count+1)%major_lines;
     }
     irenderer->draw_pixel_line(renderer, x, y, width, y,
@@ -156,9 +157,10 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length)
     ddisplay_transform_coords(ddisp, pos, update->top, &x, &y);
     if (major_lines) {
       if (major_count == 0)
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
       else
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
+       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
+                                                       ddisplay_untransform_length(ddisp, 31));
       major_count = (major_count+1)%major_lines;
     }
     irenderer->draw_pixel_line(renderer, x, y, x, height,
@@ -282,8 +284,6 @@ grid_draw(DDisplay *ddisp, Rectangle *update)
     }
 
     DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-    DIA_RENDERER_GET_CLASS(renderer)->set_dashlength(renderer,
-                                                    ddisplay_untransform_length(ddisp, 31));
     
     if (ddisp->diagram->grid.hex) {
       grid_draw_hex(ddisp, update, width_w);
@@ -317,12 +317,11 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update)
     int x,y;
 
     DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-    DIA_RENDERER_GET_CLASS(renderer)->set_dashlength(renderer,
-                                   ddisplay_untransform_length(ddisp, 31));
     if (prefs.pagebreak.solid)
-      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     else
-      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
+      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
+                                                     ddisplay_untransform_length(ddisp, 31));
 
     if (dia->data->paper.fitto) {
       origx = dia->data->extents.left;
diff --git a/app/handle_ops.c b/app/handle_ops.c
index e546f56..54a9b97 100644
--- a/app/handle_ops.c
+++ b/app/handle_ops.c
@@ -68,7 +68,7 @@ handle_draw(Handle *handle, DDisplay *ddisp)
   }
 
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_fillstyle(renderer, FILLSTYLE_SOLID);
   
@@ -105,6 +105,7 @@ handle_draw(Handle *handle, DDisplay *ddisp)
 void
 handle_add_update(Handle *handle, Diagram *dia)
 {
+  g_return_if_fail (handle != NULL);
   diagram_add_update_pixels(dia, &handle->pos,
                            HANDLE_SIZE, HANDLE_SIZE);
 }
diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp
index a6a46cc..a3461b9 100644
--- a/bindings/dia-renderer.cpp
+++ b/bindings/dia-renderer.cpp
@@ -91,17 +91,10 @@ dia::Renderer::set_linejoin (LineJoin join)
 }
 // set current linestyle
 void 
-dia::Renderer::set_linestyle (LineStyle style)
+dia::Renderer::set_linestyle (LineStyle style, real dash_length)
 {
     assert (self);
-    DIA_RENDERER_GET_CLASS(self)->set_linestyle (self, style);
-}
-// set current dashlength
-void 
-dia::Renderer::set_dashlength (double length)
-{
-    assert (self);
-    DIA_RENDERER_GET_CLASS(self)->set_dashlength (self, length);
+    DIA_RENDERER_GET_CLASS(self)->set_linestyle (self, style, dash_length);
 }
 // set current font
 void 
diff --git a/bindings/dia-renderer.h b/bindings/dia-renderer.h
index 367adc5..bc77090 100644
--- a/bindings/dia-renderer.h
+++ b/bindings/dia-renderer.h
@@ -64,11 +64,9 @@ public :
     //! \ingroup RendererRequired
     virtual void set_linejoin (LineJoin join);
     //! set current line style (dottet, dashed, solid)
-    //! \ingroup RendererRequired
-    virtual void set_linestyle (LineStyle style);
     //! set current length for dashes
     //! \ingroup RendererRequired
-    virtual void set_dashlength (double length);
+    virtual void set_linestyle (LineStyle style, real dash_length);
     //! set current font
     //! \ingroup RendererRequired
     //! \todo wrap font objecs ?
diff --git a/lib/arrows.c b/lib/arrows.c
index f3c85d2..32372cc 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -386,7 +386,7 @@ draw_none_or_many(DiaRenderer *renderer, Point *to, Point *from,
   /* use the middle of the arrow */
 
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
  
@@ -463,7 +463,7 @@ draw_one_or_many(DiaRenderer *renderer, Point *to, Point *from,
   calculate_arrow(poly, to, from, length, width);
  
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
  
@@ -532,7 +532,7 @@ draw_crow_foot(DiaRenderer *renderer, Point *to, Point *from,
   calculate_crow(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
 
   DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer,&poly[0],&poly[1],fg_color);
@@ -558,7 +558,7 @@ draw_lines(DiaRenderer *renderer, Point *to, Point *from,
   calculate_arrow(poly, to, from, length, width);
     
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
     
@@ -593,7 +593,7 @@ draw_fill_ellipse(DiaRenderer *renderer, Point *to, Point *from,
   Point vl,vt;
 
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -659,7 +659,7 @@ draw_empty_ellipse(DiaRenderer *renderer, Point *to, Point *from,
   Point disp;
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -758,7 +758,7 @@ draw_fill_box(DiaRenderer *renderer, Point *to, Point *from,
   real lw_factor,clength,cwidth;
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -809,7 +809,7 @@ draw_fill_dot(DiaRenderer *renderer, Point *to, Point *from,
   real lw_factor,clength,cwidth;
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -895,7 +895,7 @@ draw_integral(DiaRenderer *renderer, Point *to, Point *from,
   Point vl,vt;
   Point bs,be, bs2,be2;
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -985,7 +985,7 @@ draw_slashed(DiaRenderer *renderer, Point *to, Point *from,
   calculate_slashed (poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1059,7 +1059,7 @@ draw_halfhead(DiaRenderer *renderer, Point *to, Point *from,
   calculate_halfhead(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
     
@@ -1085,7 +1085,7 @@ draw_triangle(DiaRenderer *renderer, Point *to, Point *from,
   calculate_arrow(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
 
   DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, poly, 3, bg_color, fg_color);
@@ -1184,7 +1184,7 @@ draw_diamond(DiaRenderer *renderer, Point *to, Point *from,
   calculate_diamond(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1210,7 +1210,7 @@ draw_half_diamond(DiaRenderer *renderer, Point *to, Point *from,
   calculate_diamond(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1234,7 +1234,7 @@ fill_diamond(DiaRenderer *renderer, Point *to, Point *from,
 
   calculate_diamond(poly, to, from, length, width);
   
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1310,7 +1310,7 @@ draw_slashed_cross(DiaRenderer *renderer, Point *to, Point *from,
   calculate_slashed_cross(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
   
@@ -1374,7 +1374,7 @@ draw_backslash(DiaRenderer *renderer, Point *to, Point *from,
   calculate_backslash (poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1400,7 +1400,7 @@ draw_cross(DiaRenderer *renderer, Point *to, Point *from,
   calculate_arrow(poly, to, from, length, width);
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
   
@@ -1563,7 +1563,7 @@ draw_concave_triangle(DiaRenderer *renderer, Point *to, Point *from,
 
   calculate_concave(poly, to, from, length, width);
   
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
@@ -1595,7 +1595,7 @@ draw_rounded(DiaRenderer *renderer, Point *to, Point *from,
   real angle_start;
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
   
@@ -1647,7 +1647,7 @@ draw_open_rounded(DiaRenderer *renderer, Point *to, Point *from,
   real angle_start;
   Point p_line;
 
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
   
@@ -1702,7 +1702,7 @@ draw_filled_dot_n_triangle(DiaRenderer *renderer, Point *to, Point *from,
 
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
   
   delta = *from;
@@ -1763,7 +1763,7 @@ draw_three_dots(DiaRenderer *renderer, Point *to, Point *from,
   hole_width = width / 3 - dot_width;
   
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, linewidth);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   for (i = 0; i < 3; i++) {
     dot_from.x = to->x - i  * (dot_width + hole_width) * delta.x;
diff --git a/lib/bezier-common.c b/lib/bezier-common.c
index 6c2d118..fef28ad 100644
--- a/lib/bezier-common.c
+++ b/lib/bezier-common.c
@@ -169,8 +169,7 @@ bezier_draw_control_lines (int          num_points,
   
   /* setup renderer ... */
   DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
-  DIA_RENDERER_GET_CLASS(renderer)->set_dashlength(renderer, 1);
+  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, 1);
   DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS(renderer)->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c
index 5f97ac1..6f94167 100644
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -54,8 +54,7 @@ static void end_render (DiaRenderer *);
 static void set_linewidth (DiaRenderer *renderer, real linewidth);
 static void set_linecaps (DiaRenderer *renderer, LineCaps mode);
 static void set_linejoin (DiaRenderer *renderer, LineJoin mode);
-static void set_linestyle (DiaRenderer *renderer, LineStyle mode);
-static void set_dashlength (DiaRenderer *renderer, real length);
+static void set_linestyle (DiaRenderer *renderer, LineStyle mode, real length);
 static void set_fillstyle (DiaRenderer *renderer, FillStyle mode);
 
 static void draw_line (DiaRenderer *renderer,
@@ -207,7 +206,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->draw_line    = draw_line;
@@ -414,9 +412,26 @@ dia_gdk_renderer_set_dashes(DiaGdkRenderer *renderer, int offset)
 }
 
 static void 
-set_linestyle (DiaRenderer *object, LineStyle mode)
+set_linestyle (DiaRenderer *object, LineStyle mode, real length)
 {
   DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
+  /* dot = 10% of len */
+  real ddisp_len;
+
+  ddisp_len =
+    dia_transform_length(renderer->transform, length);
+  
+  renderer->dash_length = (int)floor(ddisp_len+0.5);
+  renderer->dot_length = (int)floor(ddisp_len*0.1+0.5);
+
+  if (renderer->dash_length<=0)
+    renderer->dash_length = 1;
+  if (renderer->dash_length>255)
+    renderer->dash_length = 255;
+  if (renderer->dot_length<=0)
+    renderer->dot_length = 1;
+  if (renderer->dot_length>255)
+    renderer->dot_length = 255;
 
   renderer->saved_line_style = mode;
   switch(mode) {
@@ -448,30 +463,6 @@ set_linestyle (DiaRenderer *object, LineStyle mode)
 }
 
 static void 
-set_dashlength (DiaRenderer *object, real length)
-{
-  DiaGdkRenderer *renderer = DIA_GDK_RENDERER (object);
-  /* dot = 10% of len */
-  real ddisp_len;
-
-  ddisp_len =
-    dia_transform_length(renderer->transform, length);
-  
-  renderer->dash_length = (int)floor(ddisp_len+0.5);
-  renderer->dot_length = (int)floor(ddisp_len*0.1+0.5);
-  
-  if (renderer->dash_length<=0)
-    renderer->dash_length = 1;
-  if (renderer->dash_length>255)
-    renderer->dash_length = 255;
-  if (renderer->dot_length<=0)
-    renderer->dot_length = 1;
-  if (renderer->dot_length>255)
-    renderer->dot_length = 255;
-  set_linestyle(object, renderer->saved_line_style);
-}
-
-static void 
 set_fillstyle (DiaRenderer *object, FillStyle mode)
 {
   switch(mode) {
diff --git a/lib/diaimportrenderer.c b/lib/diaimportrenderer.c
index e53e947..2adffcf 100644
--- a/lib/diaimportrenderer.c
+++ b/lib/diaimportrenderer.c
@@ -36,8 +36,7 @@ static void end_render (DiaRenderer *);
 static void set_linewidth (DiaRenderer *renderer, real linewidth);
 static void set_linecaps (DiaRenderer *renderer, LineCaps mode);
 static void set_linejoin (DiaRenderer *renderer, LineJoin mode);
-static void set_linestyle (DiaRenderer *renderer, LineStyle mode);
-static void set_dashlength (DiaRenderer *renderer, real length);
+static void set_linestyle (DiaRenderer *renderer, LineStyle mode, real dash_length);
 static void set_fillstyle (DiaRenderer *renderer, FillStyle mode);
 
 static void draw_line (DiaRenderer *renderer,
@@ -164,7 +163,6 @@ dia_import_renderer_class_init (DiaImportRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->draw_line    = draw_line;
@@ -243,17 +241,11 @@ set_linejoin (DiaRenderer *renderer, LineJoin mode)
 }
 
 static void 
-set_linestyle (DiaRenderer *renderer, LineStyle mode)
+set_linestyle (DiaRenderer *renderer, LineStyle mode, real dash_length)
 {
   DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
   self->line_style = mode;
-}
-
-static void 
-set_dashlength (DiaRenderer *renderer, real length)
-{
-  DiaImportRenderer *self = DIA_IMPORT_RENDERER (renderer);
-  self->dash_length = length;
+  self->dash_length = dash_length;
 }
 
 static void 
@@ -480,7 +472,7 @@ draw_image (DiaRenderer *renderer,
   object->ops->set_props (object, props);
   prop_list_free (props);
 
-  dia_object_set_pixbuf (object, dia_image_pixbuf (image));
+  dia_object_set_pixbuf (object, (GdkPixbuf *)dia_image_pixbuf (image));
   _push_object (self, object);
 }
 
diff --git a/lib/diapathrenderer.c b/lib/diapathrenderer.c
index 6c5a6bd..dc19448 100644
--- a/lib/diapathrenderer.c
+++ b/lib/diapathrenderer.c
@@ -207,14 +207,10 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 {
 }
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
 }
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-}
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
 }
@@ -668,7 +664,6 @@ dia_path_renderer_class_init (DiaPathRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->draw_line    = draw_line;
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index 3745ef4..d63e491 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -59,8 +59,7 @@ static void end_render (DiaRenderer *);
 static void set_linewidth (DiaRenderer *renderer, real linewidth);
 static void set_linecaps (DiaRenderer *renderer, LineCaps mode);
 static void set_linejoin (DiaRenderer *renderer, LineJoin mode);
-static void set_linestyle (DiaRenderer *renderer, LineStyle mode);
-static void set_dashlength (DiaRenderer *renderer, real length);
+static void set_linestyle (DiaRenderer *renderer, LineStyle mode, real length);
 static void set_fillstyle (DiaRenderer *renderer, FillStyle mode);
 static void set_font (DiaRenderer *renderer, DiaFont *font, real height);
 
@@ -256,7 +255,7 @@ draw_object (DiaRenderer *renderer,
     pt[3].y = matrix->yx * bb->left + matrix->yy * bb->bottom + matrix->y0;
     
     DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-    DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED);
+    DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED, 1.0);
     DIA_RENDERER_GET_CLASS(renderer)->draw_polygon(renderer, pt, 4, NULL, &red);
     DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &pt[0], &pt[2], &red);
     DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &pt[1], &pt[3], &red);
@@ -306,7 +305,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
   renderer_class->set_font       = set_font;
 
@@ -376,20 +374,13 @@ set_linejoin (DiaRenderer *renderer, LineJoin mode)
 }
 
 static void 
-set_linestyle (DiaRenderer *renderer, LineStyle mode)
+set_linestyle (DiaRenderer *renderer, LineStyle mode, real dash_length)
 {
   g_warning ("%s::set_line_style not implemented!", 
              G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
 }
 
 static void 
-set_dashlength (DiaRenderer *renderer, real length)
-{
-  g_warning ("%s::set_dash_length not implemented!", 
-             G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
-}
-
-static void 
 set_fillstyle (DiaRenderer *renderer, FillStyle mode)
 {
   g_warning ("%s::set_fill_style not implemented!", 
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 51c2f1b..0f31629 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -119,11 +119,9 @@ struct _DiaRendererClass
   void (*set_linecaps) (DiaRenderer *renderer, LineCaps mode);
   /*! Set the current linejoin (the way two lines are joined together) */
   void (*set_linejoin) (DiaRenderer *renderer, LineJoin mode);
-  /*! Set the current line style */
-  void (*set_linestyle) (DiaRenderer *renderer, LineStyle mode);
-  /*! Set the dash length, when the style is not SOLID
-     A dot will be 10% of length */
-  void (*set_dashlength) (DiaRenderer *renderer, real length);
+  /*! Set the current line style and the dash length, when the style is
+   * not SOLID. A dot will be 10% of length */
+  void (*set_linestyle) (DiaRenderer *renderer, LineStyle mode, real length);
   /*! Set the fill style */
   void (*set_fillstyle) (DiaRenderer *renderer, FillStyle mode);
   /*! Set the current font */
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 5ce361b..034c12c 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -255,15 +255,18 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   real hole_width;
   gchar dash_length_buf[DTOSTR_BUF_SIZE];
   gchar dot_length_buf[DTOSTR_BUF_SIZE];
   gchar hole_width_buf[DTOSTR_BUF_SIZE];
+  real dot_length; /* dot = 20% of len */
 
-  renderer->saved_line_style = mode;
+  if (dash_length<0.001)
+    dash_length = 0.001;
+  dot_length = dash_length*0.2;
 
   g_free(renderer->linestyle);
   switch(mode) {
@@ -271,14 +274,14 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     renderer->linestyle = NULL;
     break;
   case LINESTYLE_DASHED:
-    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
+    dia_svg_dtostr(dash_length_buf, dash_length);
     renderer->linestyle = g_strdup_printf("%s", dash_length_buf);
     break;
   case LINESTYLE_DASH_DOT:
-    hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
+    hole_width = (dash_length - dot_length) / 2.0;
 
-    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
-    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+    dia_svg_dtostr(dash_length_buf, dash_length);
+    dia_svg_dtostr(dot_length_buf, dot_length);
     dia_svg_dtostr(hole_width_buf, hole_width);
 
     renderer->linestyle = g_strdup_printf("%s %s %s %s",
@@ -288,10 +291,10 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
                                          hole_width_buf );
     break;
   case LINESTYLE_DASH_DOT_DOT:
-    hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
+    hole_width = (dash_length - 2.0*dot_length) / 3.0;
 
-    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
-    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+    dia_svg_dtostr(dash_length_buf, dash_length);
+    dia_svg_dtostr(dot_length_buf, dot_length);
     dia_svg_dtostr(hole_width_buf, hole_width);
 
     renderer->linestyle = g_strdup_printf("%s %s %s %s %s %s",
@@ -304,7 +307,7 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     break;
   case LINESTYLE_DOTTED:
 
-    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+    dia_svg_dtostr(dot_length_buf, dot_length);
 
     renderer->linestyle = g_strdup_printf("%s", dot_length_buf);
     break;
@@ -314,20 +317,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-  DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
-
-  if (length<0.001)
-    length = 0.001;
-  
-  renderer->dash_length = length;
-  renderer->dot_length = length*0.2;
-  
-  set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
   switch(mode) {
@@ -902,7 +891,6 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
   renderer_class->set_pattern    = set_pattern;
 
diff --git a/lib/diasvgrenderer.h b/lib/diasvgrenderer.h
index 174f161..2821dd2 100644
--- a/lib/diasvgrenderer.h
+++ b/lib/diasvgrenderer.h
@@ -32,10 +32,6 @@ struct _DiaSvgRenderer
   xmlNodePtr root;
   xmlNsPtr svg_name_space;
 
-  LineStyle saved_line_style;
-  real dash_length;
-  real dot_length;
-
   real linewidth;
   const char *linecap;
   const char *linejoin;
diff --git a/lib/diatransformrenderer.c b/lib/diatransformrenderer.c
index 7e6fdad..7869d60 100644
--- a/lib/diatransformrenderer.c
+++ b/lib/diatransformrenderer.c
@@ -165,30 +165,18 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
   DIA_RENDERER_GET_CLASS (renderer->worker)->set_linejoin (renderer->worker, mode);
 }
 /*!
- * \brief Pass through line style
+ * \brief Pass through line style, transform dash length and pass through
  * \memberof _DiaTransformRenderer
  */
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   DiaTransformRenderer *renderer = DIA_TRANSFORM_RENDERER (self);
-  g_return_if_fail (renderer->worker != NULL);
-  DIA_RENDERER_GET_CLASS (renderer->worker)->set_linestyle (renderer->worker, mode);
-}
-/*!
- * \brief Transform dash length and pass through
- * \memberof _DiaTransformRenderer
- */
-static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-  DiaTransformRenderer *renderer = DIA_TRANSFORM_RENDERER (self);
-  real dl= length;
   DiaMatrix *m = g_queue_peek_tail (renderer->matrices);
   g_return_if_fail (renderer->worker != NULL);
   if (m)
-    transform_length (&dl, m);
-  DIA_RENDERER_GET_CLASS (renderer->worker)->set_dashlength (renderer->worker, dl);
+    transform_length (&dash_length, m);
+  DIA_RENDERER_GET_CLASS (renderer->worker)->set_linestyle (renderer->worker, mode, dash_length);
 }
 /*!
  * \brief Pass through fill style
@@ -495,7 +483,6 @@ dia_transform_renderer_class_init (DiaTransformRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->draw_line    = draw_line;
diff --git a/lib/standard-path.c b/lib/standard-path.c
index 46d0a00..3f2f224 100644
--- a/lib/standard-path.c
+++ b/lib/standard-path.c
@@ -413,7 +413,7 @@ static void
 stdpath_draw(StdPath *stdpath, DiaRenderer *renderer)
 {
   DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, stdpath->line_width);
-  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, stdpath->line_style);
+  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, stdpath->line_style, stdpath->dashlength);
   DIA_RENDERER_GET_CLASS (renderer)->set_linejoin(renderer, stdpath->line_join);
   DIA_RENDERER_GET_CLASS (renderer)->set_linecaps(renderer, stdpath->line_caps);
 
diff --git a/lib/text.c b/lib/text.c
index 592a4bc..261e929 100644
--- a/lib/text.c
+++ b/lib/text.c
@@ -586,7 +586,7 @@ text_draw(Text *text, DiaRenderer *renderer)
     p2.x = curs_x;
     p2.y = curs_y + height;
     
-    DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID);
+    DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, height/CURSOR_HEIGHT_RATIO);
     DIA_RENDERER_GET_CLASS(renderer)->draw_line(renderer, &p1, &p2, &color_black);
   }
diff --git a/objects/AADL/aadlbus.c b/objects/AADL/aadlbus.c
index 8ceb4f3..c1d8802 100755
--- a/objects/AADL/aadlbus.c
+++ b/objects/AADL/aadlbus.c
@@ -76,7 +76,7 @@ static void aadlbus_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_polygon(renderer, points, 10, &aadlbox->fill_color, &aadlbox->line_color);
 }
diff --git a/objects/AADL/aadldata.c b/objects/AADL/aadldata.c
index 7447507..d304efa 100755
--- a/objects/AADL/aadldata.c
+++ b/objects/AADL/aadldata.c
@@ -47,7 +47,7 @@ aadldata_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
diff --git a/objects/AADL/aadldevice.c b/objects/AADL/aadldevice.c
index 8d9f7f9..f36ed9f 100755
--- a/objects/AADL/aadldevice.c
+++ b/objects/AADL/aadldevice.c
@@ -46,7 +46,7 @@ static void aadldevice_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
diff --git a/objects/AADL/aadlmemory.c b/objects/AADL/aadlmemory.c
index 7bf2d50..26c4a96 100755
--- a/objects/AADL/aadlmemory.c
+++ b/objects/AADL/aadlmemory.c
@@ -72,7 +72,7 @@ static void aadlmemory_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_beziergon(renderer, bez, 5, &aadlbox->fill_color, &aadlbox->line_color);
 
diff --git a/objects/AADL/aadlpackage.c b/objects/AADL/aadlpackage.c
index 7169fa1..a0b1974 100755
--- a/objects/AADL/aadlpackage.c
+++ b/objects/AADL/aadlpackage.c
@@ -50,7 +50,7 @@ static void aadlpackage_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   points[0].x = x;                 points[0].y = y;
   points[1].x = x + 0.03 * w ;     points[1].y = y;
diff --git a/objects/AADL/aadlport.c b/objects/AADL/aadlport.c
index 3b6ab13..6510a8e 100755
--- a/objects/AADL/aadlport.c
+++ b/objects/AADL/aadlport.c
@@ -92,7 +92,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                  \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);          \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);        \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);      \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);  \
                                                                  \
     renderer_ops->draw_polygon(renderer, p,  3, &color_black, &color_black);
 
@@ -116,7 +116,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                     \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);             \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);           \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);         \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);     \
                                                                      \
     renderer_ops->draw_polyline(renderer, p,  3, &color_black);
 
@@ -140,7 +140,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                    \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);            \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);          \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);        \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);    \
                                                                    \
     renderer_ops->draw_polygon(renderer, p,  3, &color_black, &color_black);
 
@@ -164,7 +164,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                    \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);            \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);          \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);        \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);    \
                                                                    \
     renderer_ops->draw_polyline(renderer, p,  3, &color_black);
 
@@ -193,7 +193,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                    \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);            \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);          \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);        \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);    \
                                                                    \
     renderer_ops->draw_polygon(renderer, p,  4, &color_black, &color_black);
 
@@ -224,7 +224,7 @@ rotate_around_origin (Point *p, real angle)   /* FIXME: no namespace */
                                                                   \
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);           \
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);         \
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);       \
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);   \
                                                                   \
     renderer_ops->draw_polygon(renderer, p,  4, NULL, &color_black); 
 
@@ -272,7 +272,7 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
 
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
     renderer_ops->draw_polygon(renderer, p,  5, &color_white, &color_black);
 
@@ -308,7 +308,7 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
 
     renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
     renderer_ops->draw_polygon(renderer, p,  5, &color_white, &color_black);
 
@@ -367,7 +367,7 @@ aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer)
 
       renderer_ops->set_linewidth(renderer, AADL_PORT_LINEWIDTH);
       renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
       
       renderer_ops->draw_ellipse(renderer, p,
                                 6 * AADL_PORT_GROUP_SIZE,
diff --git a/objects/AADL/aadlprocess.c b/objects/AADL/aadlprocess.c
index af54d21..65f2a67 100755
--- a/objects/AADL/aadlprocess.c
+++ b/objects/AADL/aadlprocess.c
@@ -55,8 +55,7 @@ void aadlbox_draw_inclined_box(Aadlbox *aadlbox, DiaRenderer *renderer,
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, linestyle);
-  renderer_ops->set_dashlength(renderer, AADLBOX_DASH_LENGTH);
+  renderer_ops->set_linestyle(renderer, linestyle, AADLBOX_DASH_LENGTH);
 
   renderer_ops->draw_polygon(renderer, points, 4, &aadlbox->fill_color, &aadlbox->line_color);
 }
diff --git a/objects/AADL/aadlprocessor.c b/objects/AADL/aadlprocessor.c
index ed351b8..9e56cab 100755
--- a/objects/AADL/aadlprocessor.c
+++ b/objects/AADL/aadlprocessor.c
@@ -46,7 +46,7 @@ static void aadlprocessor_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   points[0].x = x;     points[0].y = y;
   points[1].x = x + w; points[1].y = y + h;
diff --git a/objects/AADL/aadlsubprogram.c b/objects/AADL/aadlsubprogram.c
index 0ab2ad3..80e4190 100755
--- a/objects/AADL/aadlsubprogram.c
+++ b/objects/AADL/aadlsubprogram.c
@@ -48,7 +48,7 @@ static void aadlsubprogram_draw_borders(Aadlbox *aadlbox, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_ellipse(renderer, &center, w, h,
                             &aadlbox->fill_color, &aadlbox->line_color);
diff --git a/objects/AADL/aadlsystem.c b/objects/AADL/aadlsystem.c
index 5b16d3a..a7e8db0 100755
--- a/objects/AADL/aadlsystem.c
+++ b/objects/AADL/aadlsystem.c
@@ -87,8 +87,7 @@ void aadlbox_draw_rounded_box (Aadlbox *aadlbox, DiaRenderer *renderer,
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, AADLBOX_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, linestyle);
-  renderer_ops->set_dashlength(renderer, AADLBOX_DASH_LENGTH);
+  renderer_ops->set_linestyle(renderer, linestyle, AADLBOX_DASH_LENGTH);
 
   renderer_ops->draw_beziergon(renderer, bez, 9, &aadlbox->fill_color, &aadlbox->line_color);
 }
diff --git a/objects/Database/reference.c b/objects/Database/reference.c
index ff98203..f85b6ef 100644
--- a/objects/Database/reference.c
+++ b/objects/Database/reference.c
@@ -225,8 +225,7 @@ reference_draw (TableReference *ref, DiaRenderer *renderer)
   num_points = orth->numpoints;
 
   renderer_ops->set_linewidth (renderer, ref->line_width);
-  renderer_ops->set_linestyle (renderer, ref->line_style);
-  renderer_ops->set_dashlength (renderer, ref->dashlength);
+  renderer_ops->set_linestyle (renderer, ref->line_style, ref->dashlength);
   renderer_ops->set_linejoin (renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps (renderer, LINECAPS_BUTT);
 
diff --git a/objects/Database/table.c b/objects/Database/table.c
index 0128a27..67f85f2 100644
--- a/objects/Database/table.c
+++ b/objects/Database/table.c
@@ -529,7 +529,7 @@ table_draw (Table *table, DiaRenderer *renderer)
 
   renderer_ops->set_linewidth (renderer, table->border_width);
   renderer_ops->set_fillstyle (renderer, FILLSTYLE_SOLID);
-  renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
 
   elem = &table->element;
 
diff --git a/objects/ER/attribute.c b/objects/ER/attribute.c
index b63b6af..61651c3 100644
--- a/objects/ER/attribute.c
+++ b/objects/ER/attribute.c
@@ -276,10 +276,9 @@ attribute_draw(Attribute *attribute, DiaRenderer *renderer)
 
   renderer_ops->set_linewidth(renderer, attribute->border_width);
   if (attribute->derived) {
-    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-    renderer_ops->set_dashlength(renderer, 0.3);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, 0.3);
   } else {
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   }
 
   renderer_ops->draw_ellipse (renderer, &center,
@@ -305,10 +304,9 @@ attribute_draw(Attribute *attribute, DiaRenderer *renderer)
 
   if (attribute->key || attribute->weakkey) {
     if (attribute->weakkey) {
-      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-      renderer_ops->set_dashlength(renderer, 0.3);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, 0.3);
     } else {
-      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     }
     width = dia_font_string_width(attribute->name,
                                   attribute->font, attribute->font_height);
diff --git a/objects/ER/entity.c b/objects/ER/entity.c
index 2107e50..999d9d5 100644
--- a/objects/ER/entity.c
+++ b/objects/ER/entity.c
@@ -249,7 +249,7 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   
   renderer_ops->set_linewidth(renderer, entity->border_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_rect(renderer, 
@@ -282,7 +282,7 @@ entity_draw(Entity *entity, DiaRenderer *renderer)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
 
     renderer_ops->set_linewidth(renderer, entity->border_width);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
     renderer_ops->draw_polygon (renderer, corners, 4,
diff --git a/objects/ER/participation.c b/objects/ER/participation.c
index 6fea3f9..71ccf3b 100644
--- a/objects/ER/participation.c
+++ b/objects/ER/participation.c
@@ -208,7 +208,7 @@ participation_draw(Participation *participation, DiaRenderer *renderer)
   last_right = 0.0;
   
   renderer_ops->set_linewidth(renderer, PARTICIPATION_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/ER/relationship.c b/objects/ER/relationship.c
index f539caa..1f89c56 100644
--- a/objects/ER/relationship.c
+++ b/objects/ER/relationship.c
@@ -267,7 +267,7 @@ relationship_draw(Relationship *relationship, DiaRenderer *renderer)
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
 
   renderer_ops->set_linewidth(renderer, relationship->border_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_polygon(renderer, corners, 4,
diff --git a/objects/FS/flow-ortho.c b/objects/FS/flow-ortho.c
index 3f662f2..7905a38 100644
--- a/objects/FS/flow-ortho.c
+++ b/objects/FS/flow-ortho.c
@@ -360,18 +360,17 @@ orthflow_draw(Orthflow *orthflow, DiaRenderer *renderer)
   switch (orthflow->type) {
   case ORTHFLOW_SIGNAL:
     linewidth = ORTHFLOW_WIDTH;
-    renderer_ops->set_dashlength(renderer, ORTHFLOW_DASHLEN);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, ORTHFLOW_DASHLEN);
     render_color = &orthflow_color_signal ;
     break ;
   case ORTHFLOW_MATERIAL:
     linewidth = ORTHFLOW_MATERIAL_WIDTH;
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     render_color = &orthflow_color_material ;
     break ;
   case ORTHFLOW_ENERGY:
     linewidth = ORTHFLOW_WIDTH;
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     render_color = &orthflow_color_energy ;
     break ;
   default:
diff --git a/objects/FS/flow.c b/objects/FS/flow.c
index 05a88db..b60914c 100644
--- a/objects/FS/flow.c
+++ b/objects/FS/flow.c
@@ -329,18 +329,17 @@ flow_draw(Flow *flow, DiaRenderer *renderer)
 
   switch (flow->type) {
   case FLOW_SIGNAL:
-    renderer_ops->set_dashlength(renderer, FLOW_DASHLEN);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, FLOW_DASHLEN);
     render_color = &flow_color_signal ;
     break ;
   case FLOW_MATERIAL:
     renderer_ops->set_linewidth(renderer, FLOW_MATERIAL_WIDTH ) ;
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     render_color = &flow_color_material ;
     break ;
   case FLOW_ENERGY:
     render_color = &flow_color_energy ;
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   }
 
   p1 = endpoints[n1];
diff --git a/objects/FS/function.c b/objects/FS/function.c
index d699631..b34fe18 100644
--- a/objects/FS/function.c
+++ b/objects/FS/function.c
@@ -302,10 +302,10 @@ function_draw(Function *pkg, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, font_height / FUNCTION_BORDERWIDTH_SCALE );
-  renderer_ops->set_linestyle(renderer, pkg->is_wish ? LINESTYLE_DASHED : LINESTYLE_SOLID);
-  if ( pkg->is_wish )
-    renderer_ops->set_dashlength( renderer, font_height / FUNCTION_DASHLENGTH_SCALE ) ;
-
+  if (pkg->is_wish)
+    renderer_ops->set_linestyle( renderer, LINESTYLE_DASHED, font_height / FUNCTION_DASHLENGTH_SCALE ) ;
+  else
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   p1.x = x; p1.y = y;
   p2.x = x+w; p2.y = y+h;
diff --git a/objects/GRAFCET/action.c b/objects/GRAFCET/action.c
index fd695c8..54d7068 100644
--- a/objects/GRAFCET/action.c
+++ b/objects/GRAFCET/action.c
@@ -330,7 +330,7 @@ action_draw(Action *action, DiaRenderer *renderer)
   Color cl;
 
   renderer_ops->set_linewidth(renderer, ACTION_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   /* first, draw the line or polyline from the step to the action label */
diff --git a/objects/GRAFCET/action_text_draw.c b/objects/GRAFCET/action_text_draw.c
index e6a2cab..d5565c6 100644
--- a/objects/GRAFCET/action_text_draw.c
+++ b/objects/GRAFCET/action_text_draw.c
@@ -98,7 +98,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
     p2.x = curs_x;
     p2.y = curs_y + text->height;
     
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     renderer_ops->set_linewidth(renderer, 0.1);
     renderer_ops->draw_line(renderer, &p1, &p2, &color_black);
   }
diff --git a/objects/GRAFCET/boolequation.c b/objects/GRAFCET/boolequation.c
index f446783..58b9c5a 100644
--- a/objects/GRAFCET/boolequation.c
+++ b/objects/GRAFCET/boolequation.c
@@ -293,7 +293,7 @@ overlineblock_draw(Block *block,Boolequation *booleq,DiaRenderer *renderer)
   Point ul,ur;
   g_assert(block); g_assert(block->type == BLOCK_OVERLINE);
   block->d.inside->ops->draw(block->d.inside,booleq,renderer);
-  renderer_ops->set_linestyle(renderer,LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer,LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linewidth(renderer,booleq->fontheight * OVERLINE_RATIO);
   ul.x = block->bl.x;
   ur.y = ul.y = block->ur.y;
diff --git a/objects/GRAFCET/condition.c b/objects/GRAFCET/condition.c
index 9984106..49876c5 100644
--- a/objects/GRAFCET/condition.c
+++ b/objects/GRAFCET/condition.c
@@ -294,7 +294,7 @@ condition_draw(Condition *condition, DiaRenderer *renderer)
   Connection *conn = &condition->connection;
 
   renderer_ops->set_linewidth(renderer, CONDITION_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   if (CONDITION_ARROW_SIZE > (CONDITION_LINE_WIDTH/2.0)) {
diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c
index 6ad1526..5de8f85 100644
--- a/objects/GRAFCET/step.c
+++ b/objects/GRAFCET/step.c
@@ -331,7 +331,7 @@ step_draw(Step *step, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, STEP_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   pts[0] = step->north.pos;
diff --git a/objects/GRAFCET/transition.c b/objects/GRAFCET/transition.c
index 870ceb1..152f7c9 100644
--- a/objects/GRAFCET/transition.c
+++ b/objects/GRAFCET/transition.c
@@ -343,7 +343,7 @@ transition_draw(Transition *transition, DiaRenderer *renderer)
   DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
   Point pts[6];
   renderer_ops->set_linewidth(renderer, TRANSITION_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   pts[0] = transition->north.pos;
diff --git a/objects/GRAFCET/vector.c b/objects/GRAFCET/vector.c
index 32806d7..a23bb78 100644
--- a/objects/GRAFCET/vector.c
+++ b/objects/GRAFCET/vector.c
@@ -207,7 +207,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, ARC_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/GRAFCET/vergent.c b/objects/GRAFCET/vergent.c
index 7e206b0..4bd2771 100644
--- a/objects/GRAFCET/vergent.c
+++ b/objects/GRAFCET/vergent.c
@@ -245,7 +245,7 @@ vergent_draw(Vergent *vergent, DiaRenderer *renderer)
   Connection *conn = &vergent->connection;
   Point p1,p2;
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   
   switch(vergent->type) {
   case VERGENT_OR:
diff --git a/objects/Istar/goal.c b/objects/Istar/goal.c
index 96d836d..21588be 100644
--- a/objects/Istar/goal.c
+++ b/objects/Istar/goal.c
@@ -321,7 +321,7 @@ goal_draw(Goal *goal, DiaRenderer *renderer)
 
   elem = &goal->element;
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linewidth(renderer, GOAL_LINE_WIDTH);
 
diff --git a/objects/Istar/link.c b/objects/Istar/link.c
index 44174b9..340f90f 100644
--- a/objects/Istar/link.c
+++ b/objects/Istar/link.c
@@ -506,7 +506,7 @@ link_draw(Link *link, DiaRenderer *renderer)
 
   /** drawing line **/
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linewidth(renderer, w);
   renderer_ops->draw_bezier_with_arrows(renderer, link->line, 3, w, &LINK_FG_COLOR, NULL, &arrow);
 
diff --git a/objects/Istar/other.c b/objects/Istar/other.c
index 0c6f58a..df32736 100644
--- a/objects/Istar/other.c
+++ b/objects/Istar/other.c
@@ -300,7 +300,7 @@ other_draw(Other *other, DiaRenderer *renderer)
 
   elem = &other->element;
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   switch (other->type) {
diff --git a/objects/Jackson/domain.c b/objects/Jackson/domain.c
index a0f308e..b961c37 100644
--- a/objects/Jackson/domain.c
+++ b/objects/Jackson/domain.c
@@ -350,7 +350,7 @@ jackson_box_draw(Box *box, DiaRenderer *renderer)
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
 
   renderer_ops->set_linewidth(renderer, JACKSON_BOX_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_rect(renderer, &b0, &b1, &JACKSON_BOX_BG_COLOR, &JACKSON_BOX_FG_COLOR);
diff --git a/objects/Jackson/phenomenon.c b/objects/Jackson/phenomenon.c
index df644dc..9f7075c 100644
--- a/objects/Jackson/phenomenon.c
+++ b/objects/Jackson/phenomenon.c
@@ -275,11 +275,10 @@ message_draw(Message *message, DiaRenderer *renderer)
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   if (message->type==MSG_REQ) {
-      renderer_ops->set_dashlength(renderer, MESSAGE_DASHLEN);
-      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, MESSAGE_DASHLEN);
       arrow.type = ARROW_FILLED_TRIANGLE;
   } else {
-      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
       arrow.type = ARROW_NONE;
   }
 
diff --git a/objects/Jackson/requirement.c b/objects/Jackson/requirement.c
index 5f19bb6..9498f86 100644
--- a/objects/Jackson/requirement.c
+++ b/objects/Jackson/requirement.c
@@ -242,8 +242,7 @@ req_draw(Requirement *req, DiaRenderer *renderer)
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, REQ_LINEWIDTH);
 
-  renderer_ops->set_dashlength(renderer, REQ_DASHLEN);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, REQ_DASHLEN);
 
   renderer_ops->draw_ellipse(renderer, &c, w, h, &color_white, &color_black);
 
diff --git a/objects/KAOS/goal.c b/objects/KAOS/goal.c
index 2b1c5d6..403b440 100644
--- a/objects/KAOS/goal.c
+++ b/objects/KAOS/goal.c
@@ -394,7 +394,7 @@ goal_draw(Goal *goal, DiaRenderer *renderer)
       break;
   }
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   if (goal->type!=SOFTGOAL) {
diff --git a/objects/KAOS/metaandorrel.c b/objects/KAOS/metaandorrel.c
index 1205659..510f53d 100644
--- a/objects/KAOS/metaandorrel.c
+++ b/objects/KAOS/metaandorrel.c
@@ -447,7 +447,7 @@ maor_draw(Maor *maor, DiaRenderer *renderer)
   /** drawing directed line **/
   renderer_ops->set_linewidth(renderer, MAOR_WIDTH);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->draw_line_with_arrows(renderer,&p1,&p2,MAOR_WIDTH,&MAOR_FG_COLOR,NULL,&arrow);
 
   /** drawing vector decoration  **/
diff --git a/objects/KAOS/metabinrel.c b/objects/KAOS/metabinrel.c
index fc4ab28..b8c96a1 100644
--- a/objects/KAOS/metabinrel.c
+++ b/objects/KAOS/metabinrel.c
@@ -381,7 +381,7 @@ mbr_draw(Mbr *mbr, DiaRenderer *renderer)
   /** drawing directed line **/
   renderer_ops->set_linewidth(renderer, MBR_WIDTH);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   dx=p1.x-p2.x;
   dy=p1.y-p2.y;
diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c
index d398bf7..8d4fac2 100644
--- a/objects/KAOS/other.c
+++ b/objects/KAOS/other.c
@@ -348,7 +348,7 @@ other_draw(Other *other, DiaRenderer *renderer)
   assert(other != NULL);
   assert(renderer != NULL);
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   if (other->type==AGENT) {
diff --git a/objects/Misc/analog_clock.c b/objects/Misc/analog_clock.c
index c2d31c7..51cd651 100644
--- a/objects/Misc/analog_clock.c
+++ b/objects/Misc/analog_clock.c
@@ -319,7 +319,7 @@ analog_clock_draw(Analog_Clock *analog_clock, DiaRenderer *renderer)
   g_assert(renderer != NULL);
 
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->set_linewidth(renderer, analog_clock->border_line_width);
 
   renderer_ops->draw_ellipse(renderer,&analog_clock->centre,
diff --git a/objects/Misc/grid_object.c b/objects/Misc/grid_object.c
index 5d16129..c572d97 100644
--- a/objects/Misc/grid_object.c
+++ b/objects/Misc/grid_object.c
@@ -332,7 +332,7 @@ grid_object_draw(Grid_Object *grid_object, DiaRenderer *renderer)
   lr_corner.y = elem->corner.y + elem->height;
 
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   /* draw gridlines */
   renderer_ops->set_linewidth(renderer, grid_object->gridline_width);
diff --git a/objects/Misc/measure.c b/objects/Misc/measure.c
index 5469c10..7b96268 100644
--- a/objects/Misc/measure.c
+++ b/objects/Misc/measure.c
@@ -265,7 +265,7 @@ measure_draw(Measure *measure, DiaRenderer *renderer)
   Arrow arrow = MEASURE_ARROW(measure);
 
   DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, measure->line_width);
-  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS (renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS (renderer)->set_linecaps(renderer, LINECAPS_ROUND);
   
diff --git a/objects/Misc/n_gon.c b/objects/Misc/n_gon.c
index c41c80f..ac92172 100644
--- a/objects/Misc/n_gon.c
+++ b/objects/Misc/n_gon.c
@@ -234,9 +234,8 @@ _ngon_draw(Ngon *ng, DiaRenderer *renderer)
   g_return_if_fail (ng->points->len);
 
   renderer_ops->set_linewidth(renderer, ng->line_width);
-  renderer_ops->set_linestyle(renderer, ng->line_style);
+  renderer_ops->set_linestyle(renderer, ng->line_style, ng->dashlength);
   renderer_ops->set_linejoin(renderer, ng->line_join);
-  renderer_ops->set_dashlength(renderer, ng->dashlength);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
   if (ng->pattern)
     dia_pattern_get_fallback_color (ng->pattern, &fill);
diff --git a/objects/Misc/tree.c b/objects/Misc/tree.c
index cad8823..1576d4b 100644
--- a/objects/Misc/tree.c
+++ b/objects/Misc/tree.c
@@ -303,7 +303,7 @@ tree_draw(Tree *tree, DiaRenderer *renderer)
   endpoints = &tree->real_ends[0];
   
   renderer_ops->set_linewidth(renderer, LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   renderer_ops->draw_line(renderer,
diff --git a/objects/SADT/annotation.c b/objects/SADT/annotation.c
index 463db4e..1464b08 100644
--- a/objects/SADT/annotation.c
+++ b/objects/SADT/annotation.c
@@ -286,7 +286,7 @@ annotation_draw(Annotation *annotation, DiaRenderer *renderer)
   assert(renderer != NULL);
 
   renderer_ops->set_linewidth(renderer, ANNOTATION_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   vect = annotation->connection.endpoints[1];
diff --git a/objects/SADT/arrow.c b/objects/SADT/arrow.c
index 268dd7a..f59d3de 100644
--- a/objects/SADT/arrow.c
+++ b/objects/SADT/arrow.c
@@ -250,7 +250,7 @@ sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, ARROW_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
   
   col = sadtarrow->line_color;
diff --git a/objects/SADT/box.c b/objects/SADT/box.c
index 76fd3c9..1981db4 100644
--- a/objects/SADT/box.c
+++ b/objects/SADT/box.c
@@ -280,7 +280,7 @@ sadtbox_draw(Box *box, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, SADTBOX_LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_rect(renderer, 
diff --git a/objects/UML/activity.c b/objects/UML/activity.c
index 216c19a..a724531 100644
--- a/objects/UML/activity.c
+++ b/objects/UML/activity.c
@@ -223,16 +223,15 @@ state_draw(State *state, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, STATE_LINEWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
-
-   p1.x = x;
-   p1.y = y;
-   p2.x = x + w;
-   p2.y = y + h;
-   renderer_ops->draw_rounded_rect(renderer, &p1, &p2,
-                                  &state->fill_color, &state->line_color, 1.0);
-   
-   text_draw(state->text, renderer);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
+
+  p1.x = x;
+  p1.y = y;
+  p2.x = x + w;
+  p2.y = y + h;
+  renderer_ops->draw_rounded_rect(renderer, &p1, &p2,
+                                 &state->fill_color, &state->line_color, 1.0);
+  text_draw(state->text, renderer);
 }
 
 
diff --git a/objects/UML/actor.c b/objects/UML/actor.c
index 5a034da..a65d7c1 100644
--- a/objects/UML/actor.c
+++ b/objects/UML/actor.c
@@ -230,7 +230,7 @@ actor_draw(Actor *actor, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, actor->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   r = ACTOR_HEAD(actor_height);
   r1 = 2*r;
diff --git a/objects/UML/association.c b/objects/UML/association.c
index caac8c5..9535699 100644
--- a/objects/UML/association.c
+++ b/objects/UML/association.c
@@ -419,7 +419,7 @@ association_draw(Association *assoc, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, assoc->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
   
diff --git a/objects/UML/branch.c b/objects/UML/branch.c
index 0e86940..cd56026 100644
--- a/objects/UML/branch.c
+++ b/objects/UML/branch.c
@@ -216,7 +216,7 @@ static void branch_draw(Branch *branch, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, BRANCH_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_polygon(renderer, points, 4, &branch->fill_color, &branch->line_color);
 }
diff --git a/objects/UML/class.c b/objects/UML/class.c
index dcbfa34..9851649 100644
--- a/objects/UML/class.c
+++ b/objects/UML/class.c
@@ -1129,8 +1129,7 @@ umlclass_draw_template_parameters_box(UMLClass *umlclass, DiaRenderer *renderer,
   LowerRight.x += umlclass->templates_width;
   LowerRight.y += umlclass->templates_height;
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-  renderer_ops->set_dashlength(renderer, 0.3);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, 0.3);
   renderer_ops->draw_rect(renderer, &UpperLeft, &LowerRight, fill_color, line_color);
 
   TextInsert.x += 0.3;
@@ -1177,7 +1176,7 @@ umlclass_draw(UMLClass *umlclass, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, umlclass->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   
   elem = &umlclass->element;
 
diff --git a/objects/UML/classicon.c b/objects/UML/classicon.c
index ac25e10..f6dd9b9 100644
--- a/objects/UML/classicon.c
+++ b/objects/UML/classicon.c
@@ -265,7 +265,7 @@ classicon_draw(Classicon *icon, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, icon->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_ellipse(renderer,
                              &center,
diff --git a/objects/UML/component.c b/objects/UML/component.c
index 887defc..6562c38 100644
--- a/objects/UML/component.c
+++ b/objects/UML/component.c
@@ -237,7 +237,7 @@ component_draw(Component *cmp, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, COMPONENT_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   p1.x = x + COMPONENT_CWIDTH/2; p1.y = y;
   p2.x = x+w; p2.y = y+h;
diff --git a/objects/UML/component_feature.c b/objects/UML/component_feature.c
index 4b04c32..49a75ec 100644
--- a/objects/UML/component_feature.c
+++ b/objects/UML/component_feature.c
@@ -331,7 +331,7 @@ compfeat_draw(Compfeat *compfeat, DiaRenderer *renderer)
   n = orth->numpoints;
 
   renderer_ops->set_linewidth(renderer, compfeat->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   if (compfeat->orth.orientation[orth->numorient - 1] == HORIZONTAL) {
diff --git a/objects/UML/constraint.c b/objects/UML/constraint.c
index 35baf3b..9f85339 100644
--- a/objects/UML/constraint.c
+++ b/objects/UML/constraint.c
@@ -260,8 +260,7 @@ constraint_draw(Constraint *constraint, DiaRenderer *renderer)
   endpoints = &constraint->connection.endpoints[0];
   
   renderer_ops->set_linewidth(renderer, constraint->line_width);
-  renderer_ops->set_dashlength(renderer, CONSTRAINT_DASHLEN);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, CONSTRAINT_DASHLEN);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   arrow.type = ARROW_LINES;
diff --git a/objects/UML/dependency.c b/objects/UML/dependency.c
index 2ca6957..f5cdd89 100644
--- a/objects/UML/dependency.c
+++ b/objects/UML/dependency.c
@@ -237,8 +237,7 @@ dependency_draw(Dependency *dep, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, dep->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-  renderer_ops->set_dashlength(renderer, DEPENDENCY_DASHLEN);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, DEPENDENCY_DASHLEN);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/UML/fork.c b/objects/UML/fork.c
index 02e922d..8669b33 100644
--- a/objects/UML/fork.c
+++ b/objects/UML/fork.c
@@ -216,7 +216,7 @@ fork_draw(Fork *branch, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, FORK_BORDERWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   p1.x = elem->corner.x;
   p1.y = elem->corner.y;
diff --git a/objects/UML/generalization.c b/objects/UML/generalization.c
index c4a9b01..21c762c 100644
--- a/objects/UML/generalization.c
+++ b/objects/UML/generalization.c
@@ -231,7 +231,7 @@ generalization_draw(Generalization *genlz, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, genlz->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/UML/implements.c b/objects/UML/implements.c
index 769d21a..a830644 100644
--- a/objects/UML/implements.c
+++ b/objects/UML/implements.c
@@ -269,7 +269,7 @@ implements_draw(Implements *implements, DiaRenderer *renderer)
   endpoints = &implements->connection.endpoints[0];
   
   renderer_ops->set_linewidth(renderer, implements->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   renderer_ops->draw_line(renderer,
diff --git a/objects/UML/large_package.c b/objects/UML/large_package.c
index 63f2c99..b6e5b72 100644
--- a/objects/UML/large_package.c
+++ b/objects/UML/large_package.c
@@ -253,7 +253,7 @@ largepackage_draw(LargePackage *pkg, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, pkg->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
 
   p1.x = x; p1.y = y;
diff --git a/objects/UML/lifeline.c b/objects/UML/lifeline.c
index d0755d0..c110a2b 100644
--- a/objects/UML/lifeline.c
+++ b/objects/UML/lifeline.c
@@ -371,10 +371,7 @@ lifeline_draw(Lifeline *lifeline, DiaRenderer *renderer)
   endpoints = &lifeline->connection.endpoints[0];
   
   renderer_ops->set_linewidth(renderer, LIFELINE_LINEWIDTH);    
-  renderer_ops->set_dashlength(renderer, LIFELINE_DASHLEN);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-
-  
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, LIFELINE_DASHLEN);
 
   /* Ok, instead rendering one big line between two endpoints we just
      from endpoints to rtop and rbottom respectively.
@@ -393,7 +390,7 @@ lifeline_draw(Lifeline *lifeline, DiaRenderer *renderer)
 
 
   renderer_ops->set_linewidth(renderer, LIFELINE_BOXWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   p1.x = endpoints[0].x - LIFELINE_WIDTH/2.0;
   p1.y = endpoints[0].y + lifeline->rtop;
diff --git a/objects/UML/message.c b/objects/UML/message.c
index 0160383..1e2f9a7 100644
--- a/objects/UML/message.c
+++ b/objects/UML/message.c
@@ -310,13 +310,12 @@ message_draw(Message *message, DiaRenderer *renderer)
   }
 
   if (message->type==MESSAGE_RETURN) {
-      renderer_ops->set_dashlength(renderer, MESSAGE_DASHLEN);
-      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+      renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, MESSAGE_DASHLEN);
       n1 = 0;
       n2 = 1;
-  } else 
-      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
-
+  } else {
+      renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
+  }
   p1 = endpoints[n1];
   p2 = endpoints[n2];
 
diff --git a/objects/UML/node.c b/objects/UML/node.c
index afe165a..e9111f9 100644
--- a/objects/UML/node.c
+++ b/objects/UML/node.c
@@ -245,7 +245,7 @@ static void node_draw(Node *node, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, node->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   /* Draw outer box */
   points[0].x = x;                  points[0].y = y;
diff --git a/objects/UML/note.c b/objects/UML/note.c
index dd03241..fa39f2c 100644
--- a/objects/UML/note.c
+++ b/objects/UML/note.c
@@ -230,7 +230,7 @@ note_draw(Note *note, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, note->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   poly[0].x = x;
   poly[0].y = y;
diff --git a/objects/UML/object.c b/objects/UML/object.c
index 97c47b4..6673d1f 100644
--- a/objects/UML/object.c
+++ b/objects/UML/object.c
@@ -294,7 +294,7 @@ objet_draw(Objet *ob, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, bw);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
 
   p1.x = x; p1.y = y;
diff --git a/objects/UML/realizes.c b/objects/UML/realizes.c
index 30c7c41..fcb2ede 100644
--- a/objects/UML/realizes.c
+++ b/objects/UML/realizes.c
@@ -230,8 +230,7 @@ realizes_draw(Realizes *realize, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, realize->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
-  renderer_ops->set_dashlength(renderer, REALIZES_DASHLEN);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, REALIZES_DASHLEN);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/UML/small_package.c b/objects/UML/small_package.c
index 85df889..16d3629 100644
--- a/objects/UML/small_package.c
+++ b/objects/UML/small_package.c
@@ -252,7 +252,7 @@ smallpackage_draw(SmallPackage *pkg, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, pkg->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   p1.x = x; p1.y = y;
   p2.x = x+w; p2.y = y+h;
diff --git a/objects/UML/state.c b/objects/UML/state.c
index f6f653a..e1de050 100644
--- a/objects/UML/state.c
+++ b/objects/UML/state.c
@@ -283,7 +283,7 @@ state_draw(State *state, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, state->line_width);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   if (state->state_type!=STATE_NORMAL) {
       p1.x = x + w/2;
diff --git a/objects/UML/state_term.c b/objects/UML/state_term.c
index 59e8507..fb851d3 100644
--- a/objects/UML/state_term.c
+++ b/objects/UML/state_term.c
@@ -213,7 +213,7 @@ state_draw(State *state, DiaRenderer *renderer)
   
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, STATE_LINEWIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
 
    p1.x = x + w/2;
    p1.y = y + h/2;
diff --git a/objects/UML/transition.c b/objects/UML/transition.c
index 0d5ab9a..9ca169c 100644
--- a/objects/UML/transition.c
+++ b/objects/UML/transition.c
@@ -359,7 +359,7 @@ static void transition_draw(Transition* transition, DiaRenderer* renderer)
   renderer_ops->set_linewidth(renderer, TRANSITION_WIDTH);
   /* TODO, find out about the meaning of this... */
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   if (transition->direction_inverted) {
       start_arrow = &arrow;
diff --git a/objects/UML/usecase.c b/objects/UML/usecase.c
index 8a2d43b..c52e8ef 100644
--- a/objects/UML/usecase.c
+++ b/objects/UML/usecase.c
@@ -264,9 +264,9 @@ usecase_draw(Usecase *usecase, DiaRenderer *renderer)
   renderer_ops->set_linewidth(renderer, usecase->line_width);
 
   if (usecase->collaboration)
-         renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_DASHED, 1.0);
   else 
-         renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   renderer_ops->draw_ellipse(renderer, 
                             &c,
diff --git a/objects/chronogram/chronoline.c b/objects/chronogram/chronoline.c
index abf0b74..c7f0743 100644
--- a/objects/chronogram/chronoline.c
+++ b/objects/chronogram/chronoline.c
@@ -382,7 +382,7 @@ chronoline_draw_really(Chronoline *chronoline, DiaRenderer *renderer,
 
   lst = chronoline->evtlist;
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linewidth(renderer,chronoline->data_lwidth);
 
   while (lst) {
@@ -435,7 +435,7 @@ chronoline_draw(Chronoline *chronoline, DiaRenderer *renderer)
   elem = &chronoline->element;
 
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1.0);
   renderer_ops->set_linewidth(renderer, chronoline->main_lwidth);
   p1.x = elem->corner.x + elem->width;
   p1.y = elem->corner.y;
@@ -444,7 +444,7 @@ chronoline_draw(Chronoline *chronoline, DiaRenderer *renderer)
   chronoline_draw_really(chronoline,renderer,TRUE);
   chronoline_draw_really(chronoline,renderer,FALSE);
 
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
   lr_corner.x = elem->corner.x + elem->width;
   lr_corner.y = elem->corner.y + elem->height;
diff --git a/objects/chronogram/chronoref.c b/objects/chronogram/chronoref.c
index aa207bc..a82e532 100644
--- a/objects/chronogram/chronoref.c
+++ b/objects/chronogram/chronoref.c
@@ -273,7 +273,7 @@ chronoref_draw(Chronoref *chronoref, DiaRenderer *renderer)
 
   elem = &chronoref->element;
   
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
 
diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c
index 9cb032f..9e22a9e 100644
--- a/objects/custom/custom_object.c
+++ b/objects/custom/custom_object.c
@@ -865,8 +865,7 @@ custom_draw(Custom *custom, DiaRenderer *renderer)
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linewidth(renderer, custom->border_width);
   cur_line = custom->border_width;
-  renderer_ops->set_linestyle(renderer, cur_style);
-  renderer_ops->set_dashlength(renderer, custom->dashlength);
+  renderer_ops->set_linestyle(renderer, cur_style, custom->dashlength);
   renderer_ops->set_linecaps(renderer, cur_caps);
   renderer_ops->set_linejoin(renderer, cur_join);
 
@@ -941,12 +940,13 @@ custom_draw_element(GraphicElement* el, Custom *custom, DiaRenderer *renderer,
       (*cur_style) != custom->line_style) || el->any.s.linestyle != (*cur_style)) {
     (*cur_style) = (el->any.s.linestyle!=DIA_SVG_LINESTYLE_DEFAULT) ?
     el->any.s.linestyle : custom->line_style;
-    renderer_ops->set_linestyle(renderer, (*cur_style));
+    renderer_ops->set_linestyle(renderer, (*cur_style),
+                               custom->dashlength*(*cur_dash));
   }
   if (el->any.s.dashlength != (*cur_dash)) {
     (*cur_dash) = el->any.s.dashlength;
-    renderer_ops->set_dashlength(renderer,
-                  custom->dashlength*(*cur_dash));
+    renderer_ops->set_linestyle(renderer, (*cur_style),
+                               custom->dashlength*(*cur_dash));
   }
       
   (*cur_line) = el->any.s.line_width;
diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c
index 1ae65dc..5441d95 100644
--- a/objects/flowchart/box.c
+++ b/objects/flowchart/box.c
@@ -332,8 +332,7 @@ box_draw(Box *box, DiaRenderer *renderer)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   
   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_linestyle(renderer, box->line_style, box->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
   /* Problem:  How do we make the fill with rounded corners?
    * It's solved in the base class ...
diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c
index ffa37ab..47fc99e 100644
--- a/objects/flowchart/diamond.c
+++ b/objects/flowchart/diamond.c
@@ -347,8 +347,7 @@ diamond_draw(Diamond *diamond, DiaRenderer *renderer)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
 
   renderer_ops->set_linewidth(renderer, diamond->border_width);
-  renderer_ops->set_linestyle(renderer, diamond->line_style);
-  renderer_ops->set_dashlength(renderer, diamond->dashlength);
+  renderer_ops->set_linestyle(renderer, diamond->line_style, diamond->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_polygon (renderer, 
diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c
index 8b4d67d..5a312a9 100644
--- a/objects/flowchart/ellipse.c
+++ b/objects/flowchart/ellipse.c
@@ -336,8 +336,7 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
   if (ellipse->show_background)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);  
   renderer_ops->set_linewidth(renderer, ellipse->border_width);
-  renderer_ops->set_linestyle(renderer, ellipse->line_style);
-  renderer_ops->set_dashlength(renderer, ellipse->dashlength);
+  renderer_ops->set_linestyle(renderer, ellipse->line_style, ellipse->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_ellipse (renderer, &center,
diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c
index 7d4a20a..1a12922 100644
--- a/objects/flowchart/parallelogram.c
+++ b/objects/flowchart/parallelogram.c
@@ -357,8 +357,7 @@ pgram_draw(Pgram *pgram, DiaRenderer *renderer)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
 
   renderer_ops->set_linewidth(renderer, pgram->border_width);
-  renderer_ops->set_linestyle(renderer, pgram->line_style);
-  renderer_ops->set_dashlength(renderer, pgram->dashlength);
+  renderer_ops->set_linestyle(renderer, pgram->line_style, pgram->dashlength);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
 
   renderer_ops->draw_polygon (renderer, 
diff --git a/objects/network/basestation.c b/objects/network/basestation.c
index 6bba40f..87be947 100644
--- a/objects/network/basestation.c
+++ b/objects/network/basestation.c
@@ -245,7 +245,7 @@ basestation_draw(Basestation *basestation, DiaRenderer *renderer)
 
   renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0);
   renderer_ops->set_linewidth(renderer, BASESTATION_LINEWIDTH);
 
   ct.x = x + w/2.0;
diff --git a/objects/network/bus.c b/objects/network/bus.c
index 7072542..3333058 100644
--- a/objects/network/bus.c
+++ b/objects/network/bus.c
@@ -311,7 +311,7 @@ bus_draw(Bus *bus, DiaRenderer *renderer)
   endpoints = &bus->real_ends[0];
   
   renderer_ops->set_linewidth(renderer, LINE_WIDTH);
-  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+  renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
   renderer_ops->draw_line(renderer,
diff --git a/objects/network/radiocell.c b/objects/network/radiocell.c
index c422bf5..1aaad21 100644
--- a/objects/network/radiocell.c
+++ b/objects/network/radiocell.c
@@ -256,9 +256,8 @@ radiocell_draw(RadioCell *radiocell, DiaRenderer *renderer)
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
   renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-  renderer_ops->set_linestyle(renderer, radiocell->line_style);
+  renderer_ops->set_linestyle(renderer, radiocell->line_style, radiocell->dashlength);
   renderer_ops->set_linewidth(renderer, radiocell->line_width);
-  renderer_ops->set_dashlength(renderer, radiocell->dashlength);
   renderer_ops->draw_polygon(renderer, points, n,
                             (radiocell->show_background) ? &radiocell->fill_colour : NULL,
                             &radiocell->line_colour);
diff --git a/objects/network/wanlink.c b/objects/network/wanlink.c
index a966675..61b4c1f 100644
--- a/objects/network/wanlink.c
+++ b/objects/network/wanlink.c
@@ -225,7 +225,7 @@ wanlink_draw (WanLink *wanlink, DiaRenderer *renderer)
 
     renderer_ops->set_linewidth(renderer, FLASH_LINE);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
 
     renderer_ops->draw_polygon (renderer, wanlink->poly,  WANLINK_POLY_LEN,
                                &wanlink->fill_color, &wanlink->line_color);
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index c40af2a..0b276fb 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -610,8 +610,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
   arc_compute_midpoint(arc, &gaptmp[0], &gaptmp[1], &gaptmp[2]); 
 
   renderer_ops->set_linewidth(renderer, arc->line_width);
-  renderer_ops->set_linestyle(renderer, arc->line_style);
-  renderer_ops->set_dashlength(renderer, arc->dashlength);
+  renderer_ops->set_linestyle(renderer, arc->line_style, arc->dashlength);
   renderer_ops->set_linecaps(renderer, arc->line_caps);
   
   /* Special case when almost line: */
@@ -657,8 +656,7 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
     Color line_color = { 0.0, 0.0, 0.6, 1.0 };
 
     renderer_ops->set_linewidth(renderer, 0);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED);
-    renderer_ops->set_dashlength(renderer, 1);
+    renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
     renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
     
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index e3286a2..183ceab 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -373,8 +373,7 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
   DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
   
   renderer_ops->set_linewidth(renderer, bezierline->line_width);
-  renderer_ops->set_linestyle(renderer, bezierline->line_style);
-  renderer_ops->set_dashlength(renderer, bezierline->dashlength);
+  renderer_ops->set_linestyle(renderer, bezierline->line_style, bezierline->dashlength);
   renderer_ops->set_linejoin(renderer, bezierline->line_join);
   renderer_ops->set_linecaps(renderer, bezierline->line_caps);
 
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index 9484eaf..6e905c5 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -225,8 +225,7 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
   n = bez->bezier.num_points;
 
   renderer_ops->set_linewidth(renderer, beziergon->line_width);
-  renderer_ops->set_linestyle(renderer, beziergon->line_style);
-  renderer_ops->set_dashlength(renderer, beziergon->dashlength);
+  renderer_ops->set_linestyle(renderer, beziergon->line_style, beziergon->dashlength);
   renderer_ops->set_linejoin(renderer, beziergon->line_join);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/standard/box.c b/objects/standard/box.c
index 172ea55..db8165c 100644
--- a/objects/standard/box.c
+++ b/objects/standard/box.c
@@ -312,8 +312,7 @@ box_draw(Box *box, DiaRenderer *renderer)
   lr_corner.y = elem->corner.y + elem->height;
 
   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_linestyle(renderer, box->line_style, box->dashlength);
   if (box->corner_radius > 0)
     renderer_ops->set_linejoin(renderer, LINEJOIN_ROUND);
   else
diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c
index 7f2e692..7fc7e80 100644
--- a/objects/standard/ellipse.c
+++ b/objects/standard/ellipse.c
@@ -309,8 +309,7 @@ ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer)
   center.y = elem->corner.y + elem->height/2;
 
   renderer_ops->set_linewidth(renderer, ellipse->border_width);
-  renderer_ops->set_linestyle(renderer, ellipse->line_style);
-  renderer_ops->set_dashlength(renderer, ellipse->dashlength);
+  renderer_ops->set_linestyle(renderer, ellipse->line_style, ellipse->dashlength);
   if (ellipse->show_background) {
     Color fill = ellipse->inner_color;
     renderer_ops->set_fillstyle(renderer, FILLSTYLE_SOLID);
diff --git a/objects/standard/image.c b/objects/standard/image.c
index 16fef11..95125b8 100644
--- a/objects/standard/image.c
+++ b/objects/standard/image.c
@@ -406,8 +406,7 @@ image_draw(Image *image, DiaRenderer *renderer)
 
   if (image->draw_border) {
     renderer_ops->set_linewidth(renderer, image->border_width);
-    renderer_ops->set_linestyle(renderer, image->line_style);
-    renderer_ops->set_dashlength(renderer, image->dashlength);
+    renderer_ops->set_linestyle(renderer, image->line_style, image->dashlength);
     renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
     
     renderer_ops->draw_rect(renderer, 
diff --git a/objects/standard/line.c b/objects/standard/line.c
index f2f2edf..3627a38 100644
--- a/objects/standard/line.c
+++ b/objects/standard/line.c
@@ -444,8 +444,7 @@ line_draw(Line *line, DiaRenderer *renderer)
   assert(renderer != NULL);
 
   renderer_ops->set_linewidth(renderer, line->line_width);
-  renderer_ops->set_linestyle(renderer, line->line_style);
-  renderer_ops->set_dashlength(renderer, line->dashlength);
+  renderer_ops->set_linestyle(renderer, line->line_style, line->dashlength);
   renderer_ops->set_linecaps(renderer, line->line_caps);
 
   if (line->absolute_start_gap || line->absolute_end_gap ) {
diff --git a/objects/standard/outline.c b/objects/standard/outline.c
index 147b0e5..1cb5541 100644
--- a/objects/standard/outline.c
+++ b/objects/standard/outline.c
@@ -354,7 +354,7 @@ outline_draw(Outline *outline, DiaRenderer *renderer)
   if (!outline->path)
     return;
   DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, outline->line_width);
-  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID);
+  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
   DIA_RENDERER_GET_CLASS (renderer)->set_linejoin(renderer, LINEJOIN_MITER);
   DIA_RENDERER_GET_CLASS (renderer)->set_linecaps(renderer, LINECAPS_ROUND);
 
diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c
index 9f0b8ca..fbe668e 100644
--- a/objects/standard/polygon.c
+++ b/objects/standard/polygon.c
@@ -227,8 +227,7 @@ polygon_draw(Polygon *polygon, DiaRenderer *renderer)
   n = poly->numpoints;
 
   renderer_ops->set_linewidth(renderer, polygon->line_width);
-  renderer_ops->set_linestyle(renderer, polygon->line_style);
-  renderer_ops->set_dashlength(renderer, polygon->dashlength);
+  renderer_ops->set_linestyle(renderer, polygon->line_style, polygon->dashlength);
   renderer_ops->set_linejoin(renderer, polygon->line_join);
   renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
 
diff --git a/objects/standard/polyline.c b/objects/standard/polyline.c
index 8fc8dca..ce27995 100644
--- a/objects/standard/polyline.c
+++ b/objects/standard/polyline.c
@@ -290,8 +290,7 @@ polyline_draw(Polyline *polyline, DiaRenderer *renderer)
   points = &poly->points[0];
   n = poly->numpoints;
   renderer_ops->set_linewidth(renderer, polyline->line_width);
-  renderer_ops->set_linestyle(renderer, polyline->line_style);
-  renderer_ops->set_dashlength(renderer, polyline->dashlength);
+  renderer_ops->set_linestyle(renderer, polyline->line_style, polyline->dashlength);
   renderer_ops->set_linejoin(renderer, polyline->line_join);
   renderer_ops->set_linecaps(renderer, polyline->line_caps);
 
diff --git a/objects/standard/zigzagline.c b/objects/standard/zigzagline.c
index 9953a35..af5456d 100644
--- a/objects/standard/zigzagline.c
+++ b/objects/standard/zigzagline.c
@@ -217,8 +217,7 @@ zigzagline_draw(Zigzagline *zigzagline, DiaRenderer *renderer)
   n = orth->numpoints;
   
   renderer_ops->set_linewidth(renderer, zigzagline->line_width);
-  renderer_ops->set_linestyle(renderer, zigzagline->line_style);
-  renderer_ops->set_dashlength(renderer, zigzagline->dashlength);
+  renderer_ops->set_linestyle(renderer, zigzagline->line_style, zigzagline->dashlength);
   renderer_ops->set_linejoin(renderer, zigzagline->line_join);
   renderer_ops->set_linecaps(renderer, zigzagline->line_caps);
 
diff --git a/plug-ins/cairo/diacairo-renderer.c b/plug-ins/cairo/diacairo-renderer.c
index b5d3c38..be660c7 100644
--- a/plug-ins/cairo/diacairo-renderer.c
+++ b/plug-ins/cairo/diacairo-renderer.c
@@ -424,7 +424,7 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   /* dot = 10% of len */
   DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self);
@@ -432,37 +432,36 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 
   DIAG_NOTE(g_message("set_linestyle %d", mode));
 
-  /* also stored for use in set_dashlength */
-  renderer->line_style = mode;
+  ensure_minimum_one_device_unit(renderer, &dash_length);
   /* line type */
   switch (mode) {
   case LINESTYLE_SOLID:
     cairo_set_dash (renderer->cr, NULL, 0, 0);
     break;
   case LINESTYLE_DASHED:
-    dash[0] = renderer->dash_length;
-    dash[1] = renderer->dash_length;
+    dash[0] = dash_length;
+    dash[1] = dash_length;
     cairo_set_dash (renderer->cr, dash, 2, 0);
     break;
   case LINESTYLE_DASH_DOT:
-    dash[0] = renderer->dash_length;
-    dash[1] = renderer->dash_length * 0.45;
-    dash[2] = renderer->dash_length * 0.1;
-    dash[3] = renderer->dash_length * 0.45;
+    dash[0] = dash_length;
+    dash[1] = dash_length * 0.45;
+    dash[2] = dash_length * 0.1;
+    dash[3] = dash_length * 0.45;
     cairo_set_dash (renderer->cr, dash, 4, 0);
     break;
   case LINESTYLE_DASH_DOT_DOT:
-    dash[0] = renderer->dash_length;
-    dash[1] = renderer->dash_length * (0.8/3);
-    dash[2] = renderer->dash_length * 0.1;
-    dash[3] = renderer->dash_length * (0.8/3);
-    dash[4] = renderer->dash_length * 0.1;
-    dash[5] = renderer->dash_length * (0.8/3);
+    dash[0] = dash_length;
+    dash[1] = dash_length * (0.8/3);
+    dash[2] = dash_length * 0.1;
+    dash[3] = dash_length * (0.8/3);
+    dash[4] = dash_length * 0.1;
+    dash[5] = dash_length * (0.8/3);
     cairo_set_dash (renderer->cr, dash, 6, 0);
     break;
   case LINESTYLE_DOTTED:
-    dash[0] = renderer->dash_length * 0.1;
-    dash[1] = renderer->dash_length * 0.1;
+    dash[0] = dash_length * 0.1;
+    dash[1] = dash_length * 0.1;
     cairo_set_dash (renderer->cr, dash, 2, 0);
     break;
   default:
@@ -471,22 +470,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
   DIAG_STATE(renderer->cr)
 }
 
-static void
-set_dashlength(DiaRenderer *self, real length)
-{
-  DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (self);
-
-  DIAG_NOTE(g_message("set_dashlength %f", length));
-
-  /* this call does not make sense, the value is certainly bigger
-   * than one device unit. But the side-effect seems to end the endless loop */
-  ensure_minimum_one_device_unit(renderer, &length);
-  renderer->dash_length = length;
-  /* updating the line style (potentially once more) make the real
-   * style and it's length indepndent of the calling sequence */
-  set_linestyle(self, renderer->line_style);
-}
-
 /*!
  * \brief Set the fill style
  * The fill style is one of the areas, where the cairo library offers a lot
@@ -1169,14 +1152,6 @@ dia_cairo_renderer_get_type (void)
 static void
 cairo_renderer_init (DiaCairoRenderer *renderer, void *p)
 {
-  renderer->line_style = LINESTYLE_SOLID;
-  /*
-   * Initialize fields where 0 init isn't good enough. Bug #151716
-   * appears to show that we are sometimes called to render a line
-   * without setting the linestyle first. Probably a bug elsewhere
-   * but it's this plug-in which hangs ;)
-   */
-  renderer->dash_length = 1.0;
   renderer->scale = 1.0;
 }
 
@@ -1215,7 +1190,6 @@ cairo_renderer_class_init (DiaCairoRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/cairo/diacairo.h b/plug-ins/cairo/diacairo.h
index 273886e..b970218 100644
--- a/plug-ins/cairo/diacairo.h
+++ b/plug-ins/cairo/diacairo.h
@@ -71,8 +71,6 @@ struct _DiaCairoRenderer
   cairo_t *cr; /**< if NULL it gets created from the surface */
   cairo_surface_t *surface; /**< can be NULL to use the provived cr */
 
-  double dash_length;
-  LineStyle line_style;
   DiagramData *dia; /*!< pointer to the diagram to render, might be NULL for the display case */
 
   real scale;
diff --git a/plug-ins/cgm/cgm.c b/plug-ins/cgm/cgm.c
index aafcfe0..4b59ad3 100644
--- a/plug-ins/cgm/cgm.c
+++ b/plug-ins/cgm/cgm.c
@@ -262,8 +262,7 @@ static void end_render(DiaRenderer *self);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -678,7 +677,7 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     CgmRenderer *renderer = CGM_RENDERER(self);
     gint16   style;
@@ -709,12 +708,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-    /* CGM doesn't support setting a dash length */
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
 #if 0
@@ -1322,7 +1315,6 @@ cgm_renderer_class_init (CgmRendererClass *klass)
     renderer_class->set_linecaps = set_linecaps;
     renderer_class->set_linejoin = set_linejoin;
     renderer_class->set_linestyle = set_linestyle;
-    renderer_class->set_dashlength = set_dashlength;
     renderer_class->set_fillstyle = set_fillstyle;
     renderer_class->set_font = set_font;
   
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index aeab0be..5b54edc 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -259,9 +259,7 @@ _render_object (xmlNodePtr render, DiaContext *ctx)
     if (xmlStrcmp (node->name, (const xmlChar *)"set-linewidth") == 0)
       ops->set_linewidth (ir, _parse_real (node, "width"));
     else if (xmlStrcmp (node->name, (const xmlChar *)"set-linestyle") == 0)
-      ops->set_linestyle (ir, _parse_linestyle (node, "mode"));
-    else if (xmlStrcmp (node->name, (const xmlChar *)"set-dashlength") == 0)
-      ops->set_dashlength (ir, _parse_real (node, "length"));
+      ops->set_linestyle (ir, _parse_linestyle (node, "mode"), _parse_real (node, "dash-length"));
     else if (xmlStrcmp (node->name, (const xmlChar *)"set-linecaps") == 0)
       ops->set_linecaps (ir, _parse_linecaps (node, "mode"));
     else if (xmlStrcmp (node->name, (const xmlChar *)"set-linejoin") == 0)
diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c
index c30c4fc..c5bae66 100644
--- a/plug-ins/drs/dia-render-script-renderer.c
+++ b/plug-ins/drs/dia-render-script-renderer.c
@@ -329,7 +329,7 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   DrsRenderer *renderer = DRS_RENDERER (self);
   xmlNodePtr node;
@@ -357,16 +357,8 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
   node =  xmlNewChild(renderer->root, NULL, (const xmlChar *)"set-linestyle", NULL);
   xmlSetProp(node, (const xmlChar *)"mode", 
              value ? (xmlChar *)value : (xmlChar *)"?");
-}
-
-static void
-set_dashlength(DiaRenderer *self, real length)
-{  
-  DrsRenderer *renderer = DRS_RENDERER (self);
-  xmlNodePtr node;
-  
-  node =  xmlNewChild(renderer->root, NULL, (const xmlChar *)"set-dashlength", NULL);
-  _node_set_real (node, "length", length);
+  if (mode != LINESTYLE_SOLID)
+    _node_set_real (node, "dash-length", dash_length);
 }
 
 static void
@@ -681,7 +673,6 @@ drs_renderer_class_init (DrsRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index b5bce1d..ff9fe80 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -125,8 +125,7 @@ static void end_render(DiaRenderer *self);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -219,7 +218,6 @@ dxf_renderer_class_init (DxfRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
@@ -278,7 +276,7 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     DxfRenderer *renderer = DXF_RENDERER(self);
     char   *style;
@@ -306,11 +304,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{ 
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
 }
diff --git a/plug-ins/hpgl/hpgl.c b/plug-ins/hpgl/hpgl.c
index ba2dcab..11fd2fc 100644
--- a/plug-ins/hpgl/hpgl.c
+++ b/plug-ins/hpgl/hpgl.c
@@ -80,7 +80,6 @@ struct _HpglRenderer
     int   has_it;
   } pen[HPGL_MAX_PENS];
   int last_pen;
-  real dash_length;
   real font_height;
 
   Point size;  /* extent size */
@@ -177,7 +176,6 @@ begin_render(DiaRenderer *object, const Rectangle *update)
         renderer->pen[i].has_it = 0;
     }
     renderer->last_pen = -1;
-    renderer->dash_length = 0.0;
 }
 
 static void
@@ -234,7 +232,7 @@ set_linejoin(DiaRenderer *object, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *object, LineStyle mode)
+set_linestyle(DiaRenderer *object, LineStyle mode, real dash_length)
 {
     HpglRenderer *renderer = HPGL_RENDERER (object);
 
@@ -246,7 +244,7 @@ set_linestyle(DiaRenderer *object, LineStyle mode)
       fprintf(renderer->file, "LT;\n");
       break;
     case LINESTYLE_DASHED:
-      if (renderer->dash_length > 0.5) /* ??? unit of dash_lenght ? */
+      if (dash_length > 0.5) /* ??? unit of dash_lenght ? */
           fprintf(renderer->file, "LT2;\n"); /* short */
       else
           fprintf(renderer->file, "LT3;\n"); /* long */
@@ -266,17 +264,6 @@ set_linestyle(DiaRenderer *object, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *object, real length)
-{  
-    HpglRenderer *renderer = HPGL_RENDERER (object);
-
-    DIAG_NOTE(diag_note("set_dashlength %f", length));
-
-    /* dot = 20% of len */
-    renderer->dash_length = length;
-}
-
-static void
 set_fillstyle(DiaRenderer *object, FillStyle mode)
 {
     DIAG_NOTE(g_message("set_fillstyle %d", mode));
@@ -640,7 +627,6 @@ hpgl_renderer_class_init (HpglRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/libart/dialibartrenderer.c b/plug-ins/libart/dialibartrenderer.c
index 788dc4c..419d2aa 100644
--- a/plug-ins/libart/dialibartrenderer.c
+++ b/plug-ins/libart/dialibartrenderer.c
@@ -212,13 +212,30 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real length)
 {
   DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self);
   static double dash[10];
   double hole_width;
+  real dash_length;
+  real dot_length;
+  real ddisp_len;
+
+  ddisp_len =
+    dia_transform_length(renderer->transform, length);
+  
+  dash_length = ddisp_len;
+  dot_length = ddisp_len*0.1;
   
-  renderer->saved_line_style = mode;
+  if (dash_length<1.0)
+    dash_length = 1.0;
+  if (dash_length>255.0)
+    dash_length = 255.0;
+  if (dot_length<1.0)
+    dot_length = 1.0;
+  if (dot_length>255.0)
+    dot_length = 255.0;
+
   switch(mode) {
   case LINESTYLE_SOLID:
     renderer->dash_enabled = 0;
@@ -228,20 +245,20 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     renderer->dash.offset = 0.0;
     renderer->dash.n_dash = 2;
     renderer->dash.dash = dash;
-    dash[0] = renderer->dash_length;
-    dash[1] = renderer->dash_length;
+    dash[0] = dash_length;
+    dash[1] = dash_length;
     break;
   case LINESTYLE_DASH_DOT:
     renderer->dash_enabled = 1;
     renderer->dash.offset = 0.0;
     renderer->dash.n_dash = 4;
     renderer->dash.dash = dash;
-    hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
+    hole_width = (dash_length - dot_length) / 2.0;
     if (hole_width<1.0)
       hole_width = 1.0;
-    dash[0] = renderer->dash_length;
+    dash[0] = dash_length;
     dash[1] = hole_width;
-    dash[2] = renderer->dot_length;
+    dash[2] = dot_length;
     dash[3] = hole_width;
     break;
   case LINESTYLE_DASH_DOT_DOT:
@@ -249,14 +266,14 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     renderer->dash.offset = 0.0;
     renderer->dash.n_dash = 6;
     renderer->dash.dash = dash;
-    hole_width = (renderer->dash_length - 2*renderer->dot_length) / 3;
+    hole_width = (dash_length - 2*dot_length) / 3;
     if (hole_width<1.0)
       hole_width = 1.0;
-    dash[0] = renderer->dash_length;
+    dash[0] = dash_length;
     dash[1] = hole_width;
-    dash[2] = renderer->dot_length;
+    dash[2] = dot_length;
     dash[3] = hole_width;
-    dash[4] = renderer->dot_length;
+    dash[4] = dot_length;
     dash[5] = hole_width;
     break;
   case LINESTYLE_DOTTED:
@@ -264,36 +281,13 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     renderer->dash.offset = 0.0;
     renderer->dash.n_dash = 2;
     renderer->dash.dash = dash;
-    dash[0] = renderer->dot_length;
-    dash[1] = renderer->dot_length;
+    dash[0] = dot_length;
+    dash[1] = dot_length;
     break;
   }
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 10% of len */
-  DiaLibartRenderer *renderer = DIA_LIBART_RENDERER (self);
-  real ddisp_len;
-
-  ddisp_len =
-    dia_transform_length(renderer->transform, length);
-  
-  renderer->dash_length = ddisp_len;
-  renderer->dot_length = ddisp_len*0.1;
-  
-  if (renderer->dash_length<1.0)
-    renderer->dash_length = 1.0;
-  if (renderer->dash_length>255.0)
-    renderer->dash_length = 255.0;
-  if (renderer->dot_length<1.0)
-    renderer->dot_length = 1.0;
-  if (renderer->dot_length>255.0)
-    renderer->dot_length = 255.0;
-  set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
   switch(mode) {
@@ -1266,11 +1260,8 @@ renderer_init (DiaLibartRenderer *renderer, gpointer g_class)
   renderer->line_width = 1.0;
   renderer->cap_style = ART_PATH_STROKE_CAP_BUTT;
   renderer->join_style = ART_PATH_STROKE_JOIN_MITER;
-  
-  renderer->saved_line_style = LINESTYLE_SOLID;
+
   renderer->dash_enabled = 0;
-  renderer->dash_length = 10;
-  renderer->dot_length = 1;
 
   renderer->highlight_color = NULL;
 
@@ -1405,7 +1396,6 @@ dia_libart_renderer_class_init (DiaLibartRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
diff --git a/plug-ins/libart/dialibartrenderer.h b/plug-ins/libart/dialibartrenderer.h
index d204873..b796acf 100644
--- a/plug-ins/libart/dialibartrenderer.h
+++ b/plug-ins/libart/dialibartrenderer.h
@@ -43,11 +43,8 @@ struct _DiaLibartRenderer
   ArtPathStrokeCapType cap_style;
   ArtPathStrokeJoinType join_style;
 
-  LineStyle saved_line_style;
   int dash_enabled;
   ArtVpathDash dash;
-  double dash_length;
-  double dot_length;
   Color *highlight_color;
 #endif
   DiaContext *ctx;
diff --git a/plug-ins/metapost/render_metapost.c b/plug-ins/metapost/render_metapost.c
index cfefe1d..7bce162 100644
--- a/plug-ins/metapost/render_metapost.c
+++ b/plug-ins/metapost/render_metapost.c
@@ -289,10 +289,16 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void 
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     MetapostRenderer *renderer = METAPOST_RENDERER (self);
     renderer->saved_line_style = mode;
+    /* dot = 10% of len */
+    if (dash_length < 0.001)
+       dash_length = 0.001;
+
+    renderer->dash_length = dash_length;
+    renderer->dot_length = dash_length * 0.1;
 }
 
 static void
@@ -346,20 +352,6 @@ draw_with_linestyle(MetapostRenderer *renderer)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 10% of len */
-    MetapostRenderer *renderer = METAPOST_RENDERER (self);
-
-    if (length<0.001)
-       length = 0.001;
-  
-    renderer->dash_length = length;
-    renderer->dot_length = length * 0.1;
-  
-    set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
     /*MetapostRenderer *renderer = METAPOST_RENDERER (self);*/
@@ -1014,7 +1006,6 @@ metapost_renderer_class_init (MetapostRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
diff --git a/plug-ins/pgf/render_pgf.c b/plug-ins/pgf/render_pgf.c
index 0f13231..fcca5e2 100644
--- a/plug-ins/pgf/render_pgf.c
+++ b/plug-ins/pgf/render_pgf.c
@@ -83,8 +83,7 @@ static void end_render(DiaRenderer *self);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -252,7 +251,6 @@ pgf_renderer_class_init (PgfRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
@@ -396,31 +394,35 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     PgfRenderer *renderer = PGF_RENDERER(self);
     real hole_width;
     gchar dash_length_buf[DTOSTR_BUF_SIZE];
     gchar dot_length_buf[DTOSTR_BUF_SIZE];
     gchar hole_width_buf[DTOSTR_BUF_SIZE];
+    real dot_length;
+
+    if (dash_length<0.001)
+       dash_length = 0.001;
+    /* dot = 20% of len - elsewhere 10% */
+    dot_length = dash_length * 0.2;
 
-    renderer->saved_line_style = mode;
-  
     switch(mode) {
     case LINESTYLE_SOLID:
        fprintf(renderer->file, "\\pgfsetdash{}{0pt}\n");
        break;
     case LINESTYLE_DASHED:
-       pgf_dtostr(dash_length_buf,renderer->dash_length);
+       pgf_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\pgfsetdash{{%s\\du}{%s\\du}}{0\\du}\n", 
                dash_length_buf,
                dash_length_buf);
        break;
     case LINESTYLE_DASH_DOT:
-       hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
+       hole_width = ( dash_length -  dot_length) / 2.0;
        pgf_dtostr(hole_width_buf,hole_width);
-       pgf_dtostr(dot_length_buf,renderer->dot_length);
-       pgf_dtostr(dash_length_buf,renderer->dash_length);
+       pgf_dtostr(dot_length_buf, dot_length);
+       pgf_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\pgfsetdash{{%s\\du}{%s\\du}{%s\\du}{%s\\du}}{0cm}\n",
                dash_length_buf,
                hole_width_buf,
@@ -428,10 +430,10 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
                hole_width_buf );
        break;
     case LINESTYLE_DASH_DOT_DOT:
-       hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
+       hole_width = ( dash_length - 2.0* dot_length) / 3.0;
        pgf_dtostr(hole_width_buf,hole_width);
-       pgf_dtostr(dot_length_buf,renderer->dot_length);
-       pgf_dtostr(dash_length_buf,renderer->dash_length);
+       pgf_dtostr(dot_length_buf, dot_length);
+       pgf_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\pgfsetdash{{%s\\du}{%s\\du}{%s\\du}{%s\\du}{%s\\du}{%s\\du}}{0cm}\n",
                dash_length_buf,
                hole_width_buf,
@@ -441,27 +443,13 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
                hole_width_buf );
        break;
     case LINESTYLE_DOTTED:
-       pgf_dtostr(dot_length_buf,renderer->dot_length);
+       pgf_dtostr(dot_length_buf, dot_length);
        fprintf(renderer->file, "\\pgfsetdash{{\\pgflinewidth}{%s\\du}}{0cm}\n", dot_length_buf);
        break;
     }
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-    PgfRenderer *renderer = PGF_RENDERER(self);
-
-    if (length<0.001)
-       length = 0.001;
-  
-    renderer->dash_length = length;
-    renderer->dot_length = length*0.2;
-  
-    set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
     switch(mode) {
@@ -1210,12 +1198,7 @@ export_pgf(DiagramData *data, DiaContext *ctx,
     renderer->file = file;
     renderer->ctx = ctx;
 
-    renderer->dash_length = 1.0;
-    renderer->dot_length = 0.2;
-    renderer->saved_line_style = LINESTYLE_SOLID;
-  
     time_now  = time(NULL);
-  
     name = g_get_user_name();
   
     fprintf(file,
diff --git a/plug-ins/pgf/render_pgf.h b/plug-ins/pgf/render_pgf.h
index d5b9ce5..03e1897 100644
--- a/plug-ins/pgf/render_pgf.h
+++ b/plug-ins/pgf/render_pgf.h
@@ -55,10 +55,6 @@ struct _PgfRenderer
     int is_ps;
     int pagenum;
 
-    LineStyle saved_line_style;
-    real dash_length;
-    real dot_length;
-
     DiaContext *ctx;
 };
 
diff --git a/plug-ins/postscript/diapsrenderer.c b/plug-ins/postscript/diapsrenderer.c
index 1a592c6..235bf92 100644
--- a/plug-ins/postscript/diapsrenderer.c
+++ b/plug-ins/postscript/diapsrenderer.c
@@ -200,29 +200,33 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
   real hole_width;
   gchar dashl_buf[DTOSTR_BUF_SIZE];
   gchar dotl_buf[DTOSTR_BUF_SIZE];
   gchar holew_buf[DTOSTR_BUF_SIZE];
+  real dot_length;
+
+  if (dash_length<0.001)
+     dash_length = 0.001;
+
+  dot_length = dash_length*0.2; /* dot = 20% of len */
 
-  renderer->saved_line_style = mode;
-  
   switch(mode) {
   case LINESTYLE_SOLID:
     fprintf(renderer->file, "[] 0 sd\n");
     break;
   case LINESTYLE_DASHED:
     fprintf(renderer->file, "[%s] 0 sd\n",
-           psrenderer_dtostr(dashl_buf, renderer->dash_length) );
+           psrenderer_dtostr(dashl_buf, dash_length) );
     break;
   case LINESTYLE_DASH_DOT:
-    hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
+    hole_width = (dash_length - dot_length) / 2.0;
     psrenderer_dtostr(holew_buf, hole_width);
-    psrenderer_dtostr(dashl_buf, renderer->dash_length);
-    psrenderer_dtostr(dotl_buf, renderer->dot_length);
+    psrenderer_dtostr(dashl_buf, dash_length);
+    psrenderer_dtostr(dotl_buf, dot_length);
     fprintf(renderer->file, "[%s %s %s %s] 0 sd\n",
            dashl_buf,
            holew_buf,
@@ -230,10 +234,10 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
            holew_buf );
     break;
   case LINESTYLE_DASH_DOT_DOT:
-    hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
+    hole_width = (dash_length - 2.0*dot_length) / 3.0;
     psrenderer_dtostr(holew_buf, hole_width);
-    psrenderer_dtostr(dashl_buf, renderer->dash_length);
-    psrenderer_dtostr(dotl_buf, renderer->dot_length);
+    psrenderer_dtostr(dashl_buf, dash_length);
+    psrenderer_dtostr(dotl_buf, dot_length);
     fprintf(renderer->file, "[%s %s %s %s %s %s] 0 sd\n",
            dashl_buf,
            holew_buf,
@@ -244,26 +248,12 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     break;
   case LINESTYLE_DOTTED:
     fprintf(renderer->file, "[%s] 0 sd\n",
-           psrenderer_dtostr(dotl_buf, renderer->dot_length) );
+           psrenderer_dtostr(dotl_buf, dot_length) );
     break;
   }
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-
-  if (length<0.001)
-    length = 0.001;
-  
-  renderer->dash_length = length;
-  renderer->dot_length = length*0.2;
-  
-  set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
   switch(mode) {
@@ -913,9 +903,6 @@ ps_renderer_init (GTypeInstance *instance, gpointer g_class)
 
   renderer->lcolor.red = -1.0;
   
-  renderer->dash_length = 1.0;
-  renderer->dot_length = 0.2;
-  renderer->saved_line_style = LINESTYLE_SOLID;
   renderer->is_portrait = TRUE;
 
   renderer->scale = 28.346;
@@ -983,7 +970,6 @@ dia_ps_renderer_class_init (DiaPsRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
   renderer_class->set_font       = set_font;
 
diff --git a/plug-ins/postscript/diapsrenderer.h b/plug-ins/postscript/diapsrenderer.h
index f7edb62..267330f 100644
--- a/plug-ins/postscript/diapsrenderer.h
+++ b/plug-ins/postscript/diapsrenderer.h
@@ -39,9 +39,6 @@ struct _DiaPsRenderer
   guint pagenum;
 
   Color lcolor;
-  real  dash_length;
-  real  dot_length;
-  LineStyle saved_line_style;
 
   gchar *title;
   gchar *paper;
diff --git a/plug-ins/pstricks/render_pstricks.c b/plug-ins/pstricks/render_pstricks.c
index 73222a3..7fddb58 100644
--- a/plug-ins/pstricks/render_pstricks.c
+++ b/plug-ins/pstricks/render_pstricks.c
@@ -69,8 +69,7 @@ static void end_render(DiaRenderer *self);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -194,7 +193,6 @@ pstricks_renderer_class_init (PstricksRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
@@ -317,64 +315,54 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
     real hole_width;
     gchar dash_length_buf[DTOSTR_BUF_SIZE];
     gchar dot_length_buf[DTOSTR_BUF_SIZE];
     gchar hole_width_buf[DTOSTR_BUF_SIZE];
+    real dot_length;
+
+    if (dash_length<0.001)
+       dash_length = 0.001;
+    /* dot = 20% of len - for some reason not the usual 10% */
+    dot_length = dash_length * 0.2;
 
-    renderer->saved_line_style = mode;
-  
     switch(mode) {
     case LINESTYLE_SOLID:
        fprintf(renderer->file, "\\psset{linestyle=solid}\n");
        break;
     case LINESTYLE_DASHED:
-       pstricks_dtostr(dash_length_buf,renderer->dash_length);
+       pstricks_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\psset{linestyle=dashed,dash=%s %s}\n", 
                dash_length_buf, dash_length_buf);
        break;
     case LINESTYLE_DASH_DOT:
-       hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
+       hole_width = (dash_length - dot_length) / 2.0;
        pstricks_dtostr(hole_width_buf,hole_width);
-       pstricks_dtostr(dot_length_buf,renderer->dot_length);
-       pstricks_dtostr(dash_length_buf,renderer->dash_length);
+       pstricks_dtostr(dot_length_buf, dot_length);
+       pstricks_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\psset{linestyle=dashed,dash=%s %s %s %s}\n",
                dash_length_buf, hole_width_buf, dot_length_buf, hole_width_buf );
        break;
     case LINESTYLE_DASH_DOT_DOT:
-       hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
+       hole_width = (dash_length - 2.0*dot_length) / 3.0;
        pstricks_dtostr(hole_width_buf,hole_width);
-       pstricks_dtostr(dot_length_buf,renderer->dot_length);
-       pstricks_dtostr(dash_length_buf,renderer->dash_length);
+       pstricks_dtostr(dot_length_buf,dot_length);
+       pstricks_dtostr(dash_length_buf, dash_length);
        fprintf(renderer->file, "\\psset{linestyle=dashed,dash=%s %s %s %s %s %s}\n",
                dash_length_buf, hole_width_buf, dot_length_buf, hole_width_buf,
                dot_length_buf, hole_width_buf );
        break;
     case LINESTYLE_DOTTED:
-       pstricks_dtostr(dot_length_buf,renderer->dot_length);
+       pstricks_dtostr(dot_length_buf, dot_length);
        fprintf(renderer->file, "\\psset{linestyle=dotted,dotsep=%s}\n", dot_length_buf);
        break;
     }
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  /* dot = 20% of len */
-    PstricksRenderer *renderer = PSTRICKS_RENDERER(self);
-
-    if (length<0.001)
-       length = 0.001;
-  
-    renderer->dash_length = length;
-    renderer->dot_length = length*0.2;
-  
-    set_linestyle(self, renderer->saved_line_style);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
     switch(mode) {
@@ -887,10 +875,6 @@ export_pstricks(DiagramData *data, DiaContext *ctx,
     renderer->file = file;
     renderer->ctx = ctx;
 
-    renderer->dash_length = 1.0;
-    renderer->dot_length = 0.2;
-    renderer->saved_line_style = LINESTYLE_SOLID;
-  
     time_now  = time(NULL);
     extent = &data->extents;
   
diff --git a/plug-ins/pstricks/render_pstricks.h b/plug-ins/pstricks/render_pstricks.h
index 3cdb1a5..6b98ef7 100644
--- a/plug-ins/pstricks/render_pstricks.h
+++ b/plug-ins/pstricks/render_pstricks.h
@@ -55,10 +55,6 @@ struct _PstricksRenderer
     int is_ps;
     int pagenum;
 
-    LineStyle saved_line_style;
-    real dash_length;
-    real dot_length;
-
     DiaContext *ctx;
 };
 
diff --git a/plug-ins/python/diadissect.py b/plug-ins/python/diadissect.py
index 27ba9de..23ee70a 100644
--- a/plug-ins/python/diadissect.py
+++ b/plug-ins/python/diadissect.py
@@ -74,12 +74,11 @@ class DissectRenderer :
        def set_linejoin (self, mode) :
                if mode < 0 or mode > 2 :
                        self.Error ("linejoin '%d' unknown" % (mode,))
-       def set_linestyle (self, style) :
+       def set_linestyle (self, style, dash_length) :
                if style < 0 or style > 4 :
                        self.Error ("linestyle '%d' unknown" % (style,))
-       def set_dashlength (self, length) :
-               if length < 0.001 or length > 1 :
-                       self.Warning ("dashlength '%f' out of range" % (length,))
+               if dash_length < 0.001 or dash_length > 1 :
+                       self.Warning ("dashlength '%f' out of range" % (dash_length,))
        def set_fillstyle (self, style) :
                # currently only 'solid' so not used anywhere else
                if style != 0 :
diff --git a/plug-ins/python/diastddia.py b/plug-ins/python/diastddia.py
index 130940c..a206dc4 100644
--- a/plug-ins/python/diastddia.py
+++ b/plug-ins/python/diastddia.py
@@ -129,9 +129,8 @@ class StandardDiaRenderer :
                self.line_caps = mode
        def set_linejoin (self, mode) :
                self.line_join = mode
-       def set_linestyle (self, style) :
+       def set_linestyle (self, style, length) :
                self.line_style = style
-       def set_dashlength (self, length) :
                self.dash_length = length
        def set_fillstyle (self, style) :
                # currently only 'solid' so not used anywhere else
diff --git a/plug-ins/python/diasvg.py b/plug-ins/python/diasvg.py
index 2384d6b..ee2934f 100644
--- a/plug-ins/python/diasvg.py
+++ b/plug-ins/python/diasvg.py
@@ -90,9 +90,8 @@ class SvgRenderer :
                self.line_caps = mode
        def set_linejoin (self, mode) :
                self.line_join = mode
-       def set_linestyle (self, style) :
+       def set_linestyle (self, style, length) :
                self.line_style = style
-       def set_dashlength (self, length) :
                self.dash_length = length
        def set_fillstyle (self, style) :
                # currently only 'solid' so not used anywhere else
diff --git a/plug-ins/python/export-render.py b/plug-ins/python/export-render.py
index d9c5822..9a9a2be 100644
--- a/plug-ins/python/export-render.py
+++ b/plug-ins/python/export-render.py
@@ -39,11 +39,9 @@ class DumpRenderer :
        ## \brief Remember the line join
        def set_linejoin (self, mode) :
                self.line_join = mode
-       ## \brief Remember the line style
-       def set_linestyle (self, style) :
+       ## \brief Remember the line style and dash length
+       def set_linestyle (self, style, length) :
                self.line_style = style
-       ## \brief Remember the dash length
-       def set_dashlength (self, length) :
                self.dash_length = length
        ## \brief Remember the fill style
        def set_fillstyle (self, style) :
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 36b35fd..8988b93 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -274,7 +274,7 @@ set_linejoin(DiaRenderer *renderer, LineJoin mode)
  * \memberof _DiaPyRenderer
  */
 static void
-set_linestyle(DiaRenderer *renderer, LineStyle mode)
+set_linestyle(DiaRenderer *renderer, LineStyle mode, real dash_length)
 {
   PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
 
@@ -298,36 +298,7 @@ set_linestyle(DiaRenderer *renderer, LineStyle mode)
   if (func && PyCallable_Check(func)) {
     Py_INCREF(self);
     Py_INCREF(func);
-    arg = Py_BuildValue ("(i)", mode);
-    if (arg) {
-      res = PyEval_CallObject (func, arg);
-      ON_RES(res, FALSE);
-    }
-    Py_XDECREF (arg);
-    Py_DECREF(func);
-    Py_DECREF(self);
-  }
-  else /* member optional */
-    PyErr_Clear();
-}
-
-/*!
- * \brief Set dash length for later use
- *
- * Optional on the PyDia side.
- *
- * \memberof _DiaPyRenderer
- */
-static void
-set_dashlength(DiaRenderer *renderer, real length)
-{  
-  PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
-
-  func = PyObject_GetAttrString (self, "set_dashlength");
-  if (func && PyCallable_Check(func)) {
-    Py_INCREF(self);
-    Py_INCREF(func);
-    arg = Py_BuildValue ("(d)", length);
+    arg = Py_BuildValue ("(id)", mode, dash_length);
     if (arg) {
       res = PyEval_CallObject (func, arg);
       ON_RES(res, FALSE);
@@ -1178,7 +1149,6 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index 4239a34..c1ca0a0 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -151,9 +151,6 @@ new_shape_renderer(DiagramData *data, const char *filename)
 
   renderer->filename = g_strdup(filename);
 
-  renderer->dash_length = 1.0;
-  renderer->dot_length = 0.2;
-  renderer->saved_line_style = LINESTYLE_SOLID;
   /* keep everything unscaled, i.e. in Dia's scale default */
   renderer->scale = 1.0;
 
diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c
index d3bd618..67bc975 100644
--- a/plug-ins/svg/render_svg.c
+++ b/plug-ins/svg/render_svg.c
@@ -246,9 +246,6 @@ new_svg_renderer(DiagramData *data, const char *filename)
 
   renderer->filename = g_strdup(filename);
 
-  renderer->dash_length = 1.0;
-  renderer->dot_length = 0.2;
-  renderer->saved_line_style = LINESTYLE_SOLID;
   /* apparently most svg readers don't like small values, especially not in the viewBox attribute */
   renderer->scale = 20.0;
 
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index 937bf65..b60c225 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -102,8 +102,7 @@ static void end_render(DiaRenderer *renderer);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -213,7 +212,6 @@ vdx_renderer_class_init (VDXRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
@@ -359,24 +357,12 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
  */
 
 static void 
-set_linestyle(DiaRenderer *self, LineStyle mode) 
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   VDXRenderer *renderer = VDX_RENDERER(self);
 
   renderer->stylemode = mode;
-}
-
-/** Set dash length
- * @param self a renderer
- * @param mode new dash length
- */
-
-static void 
-set_dashlength(DiaRenderer *self, real length) 
-{
-  VDXRenderer *renderer = VDX_RENDERER(self);
-
-  renderer->dashlength = length;
+  renderer->dashlength = dash_length;
 }
 
 /** Set fill style
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index 26eaca8..ef7f531 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -451,12 +451,14 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
     WmfRenderer *renderer = WMF_RENDERER (self);
 
     DIAG_NOTE(renderer, "set_linestyle %d\n", mode);
 
+    /* dot = 10% of len */
+    renderer->nDashLen = SC(dash_length);
     /* line type */
     renderer->fnPenStyle &= ~(PS_STYLE_MASK);
     switch (mode) {
@@ -498,17 +500,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  
-    WmfRenderer *renderer = WMF_RENDERER (self);
-
-    DIAG_NOTE(renderer, "set_dashlength %f\n", length);
-
-    /* dot = 10% of len */
-    renderer->nDashLen = SC(length);
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
     WmfRenderer *renderer = WMF_RENDERER (self);
@@ -1264,7 +1255,6 @@ wmf_renderer_class_init (WmfRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index 51e4693..3651bdd 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -293,27 +293,22 @@ _make_stroke (WpgImportRenderer *ren)
   ren->stroke.alpha = 1.0;
   switch (ren->LineAttr.Type) {
   case WPG_LA_SOLID:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_SOLID);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_SOLID, 0.0);
     break;
   case WPG_LA_MEDIUMDASH:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASHED);
-    DIA_RENDERER_GET_CLASS(ren)->set_dashlength (DIA_RENDERER(ren), 0.66);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASHED, 0.66);
     break;
   case WPG_LA_SHORTDASH:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASHED);
-    DIA_RENDERER_GET_CLASS(ren)->set_dashlength (DIA_RENDERER(ren), 0.33);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASHED, 0.33);
     break;
   case WPG_LA_DASHDOT:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASH_DOT);
-    DIA_RENDERER_GET_CLASS(ren)->set_dashlength (DIA_RENDERER(ren), 1.0);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASH_DOT, 1.0);
     break;
   case WPG_LA_DASHDOTDOT:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASH_DOT_DOT);
-    DIA_RENDERER_GET_CLASS(ren)->set_dashlength (DIA_RENDERER(ren), 1.0);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DASH_DOT_DOT, 1.0);
     break;
   case WPG_LA_DOTS:
-    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DOTTED);
-    DIA_RENDERER_GET_CLASS(ren)->set_dashlength (DIA_RENDERER(ren), 1.0);
+    DIA_RENDERER_GET_CLASS(ren)->set_linestyle (DIA_RENDERER(ren), LINESTYLE_DOTTED, 1.0);
     break;
   }
 
diff --git a/plug-ins/wpg/wpg.c b/plug-ins/wpg/wpg.c
index 05240b5..8389426 100644
--- a/plug-ins/wpg/wpg.c
+++ b/plug-ins/wpg/wpg.c
@@ -86,8 +86,6 @@ struct _WpgRenderer
   real Scale;   /* to WPU == 1/1200 inch */
   real XOffset, YOffset; /* in dia units */
 
-  real dash_length;
-
   WPGStartData Box;
   WPGFillAttr  FillAttr;
   WPGLineAttr  LineAttr;
@@ -371,11 +369,11 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void
-set_linestyle(DiaRenderer *self, LineStyle mode)
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   WpgRenderer *renderer = WPG_RENDERER (self);
 
-  DIAG_NOTE(g_message("set_linestyle %d", mode));
+  DIAG_NOTE(g_message("set_linestyle %d, %g", mode, dash_length));
 
   /* line type */
   switch (mode) {
@@ -383,7 +381,7 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
     renderer->LineAttr.Type = WPG_LA_SOLID;
     break;
   case LINESTYLE_DASHED:
-    if (renderer->dash_length < 0.5)
+    if (dash_length < 0.5)
       renderer->LineAttr.Type = WPG_LA_SHORTDASH;
     else
       renderer->LineAttr.Type = WPG_LA_MEDIUMDASH;
@@ -403,17 +401,6 @@ set_linestyle(DiaRenderer *self, LineStyle mode)
 }
 
 static void
-set_dashlength(DiaRenderer *self, real length)
-{  
-  WpgRenderer *renderer = WPG_RENDERER (self);
-
-  DIAG_NOTE(g_message("set_dashlength %f", length));
-
-  /* dot = 20% of len */
-  renderer->dash_length = length;
-}
-
-static void
 set_fillstyle(DiaRenderer *self, FillStyle mode)
 {
   WpgRenderer *renderer = WPG_RENDERER (self);
@@ -1034,7 +1021,6 @@ wpg_renderer_class_init (WpgRendererClass *klass)
   renderer_class->set_linecaps   = set_linecaps;
   renderer_class->set_linejoin   = set_linejoin;
   renderer_class->set_linestyle  = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle  = set_fillstyle;
 
   renderer_class->set_font  = set_font;
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index b4925a0..bb0e8ba 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -107,8 +107,7 @@ static void end_render(DiaRenderer *renderer);
 static void set_linewidth(DiaRenderer *self, real linewidth);
 static void set_linecaps(DiaRenderer *self, LineCaps mode);
 static void set_linejoin(DiaRenderer *self, LineJoin mode);
-static void set_linestyle(DiaRenderer *self, LineStyle mode);
-static void set_dashlength(DiaRenderer *self, real length);
+static void set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length);
 static void set_fillstyle(DiaRenderer *self, FillStyle mode);
 static void set_font(DiaRenderer *self, DiaFont *font, real height);
 static void draw_line(DiaRenderer *self, 
@@ -240,7 +239,6 @@ xfig_renderer_class_init (XfigRendererClass *klass)
   renderer_class->set_linecaps = set_linecaps;
   renderer_class->set_linejoin = set_linejoin;
   renderer_class->set_linestyle = set_linestyle;
-  renderer_class->set_dashlength = set_dashlength;
   renderer_class->set_fillstyle = set_fillstyle;
   renderer_class->set_font = set_font;
   
@@ -538,19 +536,12 @@ set_linejoin(DiaRenderer *self, LineJoin mode)
 }
 
 static void 
-set_linestyle(DiaRenderer *self, LineStyle mode) 
+set_linestyle(DiaRenderer *self, LineStyle mode, real dash_length)
 {
   XfigRenderer *renderer = XFIG_RENDERER(self);
 
   renderer->stylemode = mode;
-}
-
-static void 
-set_dashlength(DiaRenderer *self, real length) 
-{
-  XfigRenderer *renderer = XFIG_RENDERER(self);
-
-  renderer->dashlength = length;
+  renderer->dashlength = dash_length;
 }
 
 static void 


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