X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b72ed64277a2b16c6c8681995e5f3f304a8fe38d..769c3372a2bd68c45d1a4afc8462d3b7939decb1:/src/common/dcsvg.cpp diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index 3a9a945d0a..449ad4791a 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -28,9 +28,6 @@ #include "wx/wfstream.h" #include "wx/filename.h" -#define wxSVG_DEBUG false -// or true to see the calls being executed - // ---------------------------------------------------------- // Global utilities // ---------------------------------------------------------- @@ -40,26 +37,6 @@ namespace inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } -wxString wxBrushString ( wxColour c, int style ) -{ - wxString s = wxT("fill:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); - switch ( style ) - { - case wxBRUSHSTYLE_SOLID : - s = s + wxT("fill-opacity:1.0; "); - break; - case wxBRUSHSTYLE_TRANSPARENT: - s = s + wxT("fill-opacity:0.0; "); - break; - - default : - wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available")); - - } - s = s + wxT("\n"); - return s; -} - // This function returns a string representation of a floating point number in // C locale (i.e. always using "." for the decimal separator) and with the // fixed precision (which is 2 for some unknown reason but this is what it was @@ -69,6 +46,58 @@ inline wxString NumStr(double f) return wxString::FromCDouble(f, 2); } +wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) +{ + wxString s = wxT("stroke:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); + // Use the color's alpha value (if not opaque) for the opacity. + // Note that a transparent pen will override the alpha value. + if (c.Alpha() != wxALPHA_OPAQUE && style != wxPENSTYLE_TRANSPARENT) + { + s += wxString::Format(wxT("stroke-opacity:%s; "), NumStr(c.Alpha()/255.)); + } + else + { + switch ( style ) + { + case wxPENSTYLE_SOLID: + s += wxT("stroke-opacity:1.0; "); + break; + case wxPENSTYLE_TRANSPARENT: + s += wxT("stroke-opacity:0.0; "); + break; + default : + wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Pen Style not available")); + } + } + return s; +} + +wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) +{ + wxString s = wxT("fill:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); + // Use the color's alpha value (if not opaque) for the opacity. + // Note that a transparent brush will override the alpha value. + if (c.Alpha() != wxALPHA_OPAQUE && style != wxBRUSHSTYLE_TRANSPARENT) + { + s += wxString::Format(wxT("fill-opacity:%s; "), NumStr(c.Alpha()/255.)); + } + else + { + switch ( style ) + { + case wxBRUSHSTYLE_SOLID: + s += wxT("fill-opacity:1.0; "); + break; + case wxBRUSHSTYLE_TRANSPARENT: + s += wxT("fill-opacity:0.0; "); + break; + default : + wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available")); + } + } + return s; +} + } // anonymous namespace // ---------------------------------------------------------- @@ -110,7 +139,7 @@ void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, dou ////////////////////code here m_outfile = new wxFileOutputStream(filename); - m_OK = m_outfile->Ok (); + m_OK = m_outfile->IsOk(); if (m_OK) { m_filename = filename; @@ -158,17 +187,15 @@ wxSize wxSVGFileDCImpl::GetPPI() const void wxSVGFileDCImpl::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) { - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s; s.Printf ( wxT(" \n"), x1,y1,x2,y2 ); if (m_OK) { write(s); } - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")); CalcBoundingBox(x1, y1); CalcBoundingBox(x2, y2); - return; } void wxSVGFileDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset ) @@ -183,7 +210,7 @@ void wxSVGFileDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxC void wxSVGFileDCImpl::DoDrawPoint (wxCoord x1, wxCoord y1) { wxString s; - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); s = wxT(" ") + wxString(wxT("\n")); write(s); DoDrawLine ( x1,y1,x1,y1 ); @@ -199,13 +226,12 @@ void wxSVGFileDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxC void wxSVGFileDCImpl::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) { DoDrawRotatedText(text, x1,y1,0.0); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawText Call executed")); } void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle) { //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s, sTmp; // calculate bounding box @@ -229,37 +255,36 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor // draw background first // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")); - sTmp.Printf ( wxT(" "), NumStr(-angle), x,y ); - s = s + sTmp + wxT("\n"); + sTmp.Printf ( wxT(" "), NumStr(-angle), x,y ); + s += sTmp + wxT("\n"); write(s); } //now do the text itself s.Printf (wxT(" 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; "); - else s = s + wxT("style=\" "); + sTmp = m_font.GetFaceName(); + if (sTmp.Len() > 0) s += wxT("style=\"font-family:") + sTmp + wxT("; "); + else s += wxT("style=\" "); wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") }; - s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + wxT("; "); + s += wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + wxT("; "); wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") }; - s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + wxT("; "); + s += wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + wxT("; "); - sTmp.Printf (wxT("font-size:%dpt; fill:"), m_font.GetPointSize () ); - s = s + sTmp; - s = s + m_textForegroundColour.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; stroke:") + m_textForegroundColour.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); + sTmp.Printf (wxT("font-size:%dpt; "), m_font.GetPointSize() ); + s += sTmp; + //text will be solid, unless alpha value isn't opaque in the foreground colour + s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour); sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %s %d %d ) \" >"), NumStr(-angle), x,y ); - s = s + sTmp + sText + wxT(" ") + wxT("\n"); + s += sTmp + sText + wxT(" ") + wxT("\n"); if (m_OK) { write(s); } - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")); } void wxSVGFileDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) @@ -270,16 +295,15 @@ void wxSVGFileDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoo void wxSVGFileDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius ) { - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s; s.Printf ( wxT(" \n"); + s += wxT(" /> \n"); write(s); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")); CalcBoundingBox(x, y); CalcBoundingBox(x + width, y + height); } @@ -288,43 +312,40 @@ void wxSVGFileDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) { - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s, sTmp; s = wxT(" \n"); + s += wxT("\" /> \n"); write(s); - - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")); } void wxSVGFileDCImpl::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height) { - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); int rh = height /2; int rw = width /2; wxString s; s.Printf ( wxT(" \n"); + s += wxT(" /> \n"); write(s); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")); CalcBoundingBox(x, y); CalcBoundingBox(x + width, y + height); } @@ -340,7 +361,7 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, Might be better described as Pie drawing */ - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s; // we need the radius of the circle which has two estimates @@ -369,15 +390,13 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, x1,y1, NumStr(r1), NumStr(r2), fArc, fSweep, x2, y2, xc, yc ); // the z means close the path and fill - s = s + wxT(" \" /> \n"); + s += wxT(" \" /> \n"); if (m_OK) { write(s); } - - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")); } void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) @@ -401,7 +420,7 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h, //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString s; //radius @@ -432,14 +451,12 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h, int(xs), int(ys), int(rx), int(ry), fArc, fSweep, int(xe), int(ye), int(xc), int(yc) ); - s = s + wxT(" \" /> \n"); + s += wxT(" \" /> \n"); if (m_OK) { write(s); } - - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")); } void wxSVGFileDCImpl::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const @@ -450,17 +467,14 @@ void wxSVGFileDCImpl::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoor sDC.SetFont (m_font); if ( font != NULL ) sDC.SetFont ( *font ); sDC.GetTextExtent(string, w, h, descent, externalLeading ); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed")); } wxCoord wxSVGFileDCImpl::GetCharHeight() const - { wxScreenDC sDC; sDC.SetFont (m_font); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")); - return ( sDC.GetCharHeight() ); + return sDC.GetCharHeight(); } @@ -469,9 +483,7 @@ wxCoord wxSVGFileDCImpl::GetCharWidth() const wxScreenDC sDC; sDC.SetFont (m_font); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")); - return ( sDC.GetCharWidth() ); - + return sDC.GetCharWidth(); } @@ -481,16 +493,13 @@ wxCoord wxSVGFileDCImpl::GetCharWidth() const void wxSVGFileDCImpl::SetBackground( const wxBrush &brush ) { - m_backgroundBrush = brush; - return; } void wxSVGFileDCImpl::SetBackgroundMode( int mode ) { m_backgroundMode = mode; - return; } @@ -500,7 +509,6 @@ void wxSVGFileDCImpl::SetBrush(const wxBrush& brush) m_brush = brush; m_graphics_changed = true; - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")); } @@ -511,21 +519,16 @@ void wxSVGFileDCImpl::SetPen(const wxPen& pen) m_pen = pen; m_graphics_changed = true; - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")); } -void wxSVGFileDCImpl::NewGraphics () +void wxSVGFileDCImpl::NewGraphics() { - - int w = m_pen.GetWidth (); - wxColour c = m_pen.GetColour (); - wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn; - sBrush = wxT("\n\n \n"); } sLast.Printf( wxT("stroke-width:%d\" \n transform=\"translate(%s %s) scale(%s %s)\">"), - w, NumStr(m_logicalOriginX), NumStr(m_logicalOriginY), NumStr(m_scaleX), NumStr(m_scaleY) ); + m_pen.GetWidth(), NumStr(m_logicalOriginX), NumStr(m_logicalOriginY), NumStr(m_scaleX), NumStr(m_scaleY) ); s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxT("\n") + sWarn; write(s); m_graphics_changed = false; - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")); } @@ -577,8 +567,6 @@ void wxSVGFileDCImpl::SetFont(const wxFont& font) { m_font = font; - - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")); } // export a bitmap as a raster image in png @@ -603,7 +591,6 @@ bool wxSVGFileDCImpl::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoor memDC.Blit(0, 0, width, height, source, xsrc, ysrc); memDC.SelectObject( wxNullBitmap ); DoDrawBitmap(myBitmap, xdest, ydest); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")); return false; } @@ -615,13 +602,11 @@ void wxSVGFileDCImpl::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord memDC.DrawIcon(myIcon,0,0); memDC.SelectObject( wxNullBitmap ); DoDrawBitmap(myBitmap, x, y); - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")); - return; } void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ ) { - if (m_graphics_changed) NewGraphics (); + if (m_graphics_changed) NewGraphics(); wxString sTmp, s, sPNG; if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL ) @@ -650,25 +635,22 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor int w = myBitmap.GetWidth(); int h = myBitmap.GetHeight(); sTmp.Printf ( wxT(" \n"), sPNG.c_str() ); - s = s + sTmp + wxT("Image from wxSVG ") + wxT("\n"); + s += sTmp + wxT("Image from wxSVG ") + wxT("\n"); if (m_OK && bPNG_OK) { write(s); } - m_OK = m_outfile->Ok () && bPNG_OK; - wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")); - - return; + m_OK = m_outfile->IsOk() && bPNG_OK; } void wxSVGFileDCImpl::write(const wxString &s) { const wxCharBuffer buf = s.utf8_str(); m_outfile->Write(buf, strlen((const char *)buf)); - m_OK = m_outfile->Ok(); + m_OK = m_outfile->IsOk(); }