diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index 69ef562f14..31a4315194 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -72,18 +72,23 @@ wxString Col2SVG(wxColour c, float *opacity) wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) { float opacity; - wxString s = wxT("stroke:") + Col2SVG(c, &opacity) + wxT("; "); + wxString s = wxS("stroke:") + Col2SVG(c, &opacity) + wxS("; "); switch ( style ) { case wxPENSTYLE_SOLID: - s += wxString::Format(wxT("stroke-opacity:%s; "), NumStr(opacity)); + case wxPENSTYLE_DOT: + case wxPENSTYLE_SHORT_DASH: + case wxPENSTYLE_LONG_DASH: + case wxPENSTYLE_DOT_DASH: + case wxPENSTYLE_USER_DASH: + s += wxString::Format(wxS("stroke-opacity:%s; "), NumStr(opacity)); break; case wxPENSTYLE_TRANSPARENT: - s += wxT("stroke-opacity:0.0; "); + s += wxS("stroke-opacity:0.0; "); break; default : - wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Pen Style not available")); + wxASSERT_MSG(false, wxS("wxSVGFileDC::Requested Pen Style not available")); } return s; @@ -109,6 +114,71 @@ wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) return s; } +wxString wxGetPenPattern(wxPen& pen) +{ + wxString s; + + // The length of the dashes and gaps have a constant factor. + // Dots have a width of 2, short dashes 10, long dashes 15 and gaps 8 (5 for dots). + // When the pen width increases, lines become thicker and unrecognizable. + // Multiplying with 1/3th of the width creates line styles matching the appearance of wxDC. + // The pen width is not used to modify user provided dash styles. + float w = pen.GetWidth(); + if (pen.GetWidth() == 0) + w = 1; + w = w / 3; + + switch (pen.GetStyle()) + { + case wxPENSTYLE_DOT: + s = wxString::Format(wxS("stroke-dasharray=\"%f,%f\" "), w * 2, w * 5); + break; + case wxPENSTYLE_SHORT_DASH: + s = wxString::Format(wxS("stroke-dasharray=\"%f,%f\" "), w * 10, w * 8); + break; + case wxPENSTYLE_LONG_DASH: + s = wxString::Format(wxS("stroke-dasharray=\"%f,%f\" "), w * 15, w * 8); + break; + case wxPENSTYLE_DOT_DASH: + s = wxString::Format(wxS("stroke-dasharray=\"%f,%f,%f,%f\" "), w * 8, w * 8, w * 2, w * 8); + break; + case wxPENSTYLE_USER_DASH: + { + s = wxS("stroke-dasharray=\""); + wxDash *dashes; + int count = pen.GetDashes(&dashes); + if ((dashes != NULL) && (count > 0)) + { + for (int i = 0; i < count; ++i) + { + s << dashes[i]; + if (i < count - 1) + s << ","; + } + } + s += wxS("\" "); + break; + } + case wxPENSTYLE_STIPPLE_MASK_OPAQUE: + case wxPENSTYLE_STIPPLE_MASK: + case wxPENSTYLE_STIPPLE: + case wxPENSTYLE_BDIAGONAL_HATCH: + case wxPENSTYLE_CROSSDIAG_HATCH: + case wxPENSTYLE_FDIAGONAL_HATCH: + case wxPENSTYLE_CROSS_HATCH: + case wxPENSTYLE_HORIZONTAL_HATCH: + case wxPENSTYLE_VERTICAL_HATCH: + wxASSERT_MSG(false, wxS("wxSVGFileDC::Requested Pen Pattern not available")); + break; + case wxPENSTYLE_SOLID: + case wxPENSTYLE_TRANSPARENT: + case wxPENSTYLE_INVALID: + // these penstyles do not need a pattern. + break; + } + return s; +} + } // anonymous namespace // ---------------------------------------------------------------------------- @@ -321,7 +391,7 @@ void wxSVGFileDCImpl::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) NewGraphicsIfNeeded(); wxString s; - s = wxString::Format(wxS(" \n"), x1, y1, x2, y2); + s = wxString::Format(wxS(" \n"), wxGetPenPattern(m_pen), x1, y1, x2, y2); write(s); @@ -336,7 +406,8 @@ void wxSVGFileDCImpl::DoDrawLines(int n, const wxPoint points[], wxCoord xoffset NewGraphicsIfNeeded(); wxString s; - s = wxString::Format(wxS("