/////////////////////////////////////////////////////////////////////////////
-// Name: svg.cpp
+// Name: src/common/svg.cpp
// Purpose: SVG sample
// Author: Chris Elliott
// Modified by:
// RCS-ID: $Id$
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/dcsvg.h"
#include "wx/wfstream.h"
+#include "wx/filename.h"
-#define wxSVG_DEBUG FALSE
-// or TRUE to see the calls being executed
+#define wxSVG_DEBUG false
+// or true to see the calls being executed
-#define newline wxString(wxT("\n"))
-#define space wxString(wxT(" "))
-#define semicolon wxString(wxT(";"))
-#define wx_round(a) (int)((a)+.5)
-
-static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
+// ----------------------------------------------------------
+// Global utilities
+// ----------------------------------------------------------
-wxString wxColStr ( wxColour c )
+namespace
{
- unsigned char r, g, b ;
- r = c.Red ();
- g = c.Green ();
- b = c. Blue ();
-
- // possible Unicode bug here
- wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b) ;
- return s ;
-}
+inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
wxString wxBrushString ( wxColour c, int style )
{
- wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
+ wxString s = wxT("fill:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; ");
switch ( style )
{
- case wxSOLID :
+ case wxBRUSHSTYLE_SOLID :
s = s + wxT("fill-opacity:1.0; ");
- break ;
- case wxTRANSPARENT:
+ break;
+ case wxBRUSHSTYLE_TRANSPARENT:
s = s + wxT("fill-opacity:0.0; ");
- break ;
+ break;
default :
- wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available"));
}
- s = s + newline ;
- return s ;
+ 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
+// in this code originally).
+inline wxString NumStr(double f)
+{
+ return wxString::FromCDouble(f, 2);
+}
+
+} // anonymous namespace
+
// ----------------------------------------------------------
-// wxSVGFileDC
+// wxSVGFileDCImpl
// ----------------------------------------------------------
-IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDC, wxDC)
+IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDCImpl, wxDC)
-void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
+wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename,
+ int width, int height, double dpi ) :
+ wxDCImpl( owner )
+ {
+ Init( filename, width, height, dpi );
+ }
+void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, double dpi)
{
- m_width = Width ;
- m_height = Height ;
+ m_width = Width;
+ m_height = Height;
+
+ m_dpi = dpi;
- m_OK = TRUE;
+ m_OK = true;
m_mm_to_pix_x = dpi/25.4;
m_mm_to_pix_y = dpi/25.4;
m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH;
- m_graphics_changed = TRUE ;
+ m_graphics_changed = true;
////////////////////code here
- m_outfile = new wxFileOutputStream(f) ;
+ m_outfile = new wxFileOutputStream(filename);
m_OK = m_outfile->Ok ();
if (m_OK)
{
- m_filename = f ;
- m_sub_images = 0 ;
- wxString s ;
- s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s = s + newline ;
+ m_filename = filename;
+ m_sub_images = 0;
+ wxString s;
+ s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") + wxString(wxT("\n"));
write(s);
- s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline ;
+ s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + wxString(wxT("\n"));
write(s);
- s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ")+ newline ;
+ s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ") + wxString(wxT("\n"));
write(s);
- s.Printf ( wxT("<svg width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"> \n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
+ s = wxT("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ") + wxString(wxT("\n"));
write(s);
- s = wxT("<title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ;
+ s.Printf( wxT(" width=\"%scm\" height=\"%scm\" viewBox=\"0 0 %d %d \"> \n"), NumStr(float(Width)/dpi*2.54), NumStr(float(Height)/dpi*2.54), Width, Height );
write(s);
- s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
+ s = wxT("<title>SVG Picture created as ") + wxFileName(filename).GetFullName() + wxT(" </title>") + wxT("\n");
write(s);
- s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline ;
+ s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ wxT("\n");
+ write(s);
+ s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + wxString(wxT("\n"));
write(s);
-
}
}
-
-// constructors
-wxSVGFileDC::wxSVGFileDC (wxString f)
+wxSVGFileDCImpl::~wxSVGFileDCImpl()
{
- // quarter 640x480 screen display at 72 dpi
- Init (f,320,240,72.0);
+ wxString s = wxT("</g> \n</svg> \n");
+ write(s);
+ delete m_outfile;
}
-wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height)
+void wxSVGFileDCImpl::DoGetSizeMM( int *width, int *height ) const
{
- Init (f,Width,Height,72.0);
-}
+ if (width)
+ *width = wxRound( (double)m_width / m_mm_to_pix_x );
-wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
-{
- Init (f,Width,Height,dpi);
+ if (height)
+ *height = wxRound( (double)m_height / m_mm_to_pix_y );
}
-wxSVGFileDC::~wxSVGFileDC()
+wxSize wxSVGFileDCImpl::GetPPI() const
{
- wxString s = wxT("</g> \n</svg> \n") ;
- write(s);
- delete m_outfile ;
+ return wxSize( wxRound(m_dpi), wxRound(m_dpi) );
}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-
-void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
+void wxSVGFileDCImpl::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
{
if (m_graphics_changed) NewGraphics ();
- wxString s ;
+ wxString s;
s.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \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) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed"));
+ CalcBoundingBox(x1, y1);
+ CalcBoundingBox(x2, y2);
return;
}
-void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
+void wxSVGFileDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
{
- for ( int i = 1; i < n ; i++ )
+ for ( int i = 1; i < n; i++ )
{
DoDrawLine ( points [i-1].x + xoffset, points [i-1].y + yoffset,
- points [ i ].x + xoffset, points [ i ].y + yoffset ) ;
+ points [ i ].x + xoffset, points [ i ].y + yoffset );
}
}
-
-void wxSVGFileDC::DoDrawPoint (wxCoord x1, wxCoord y1)
+void wxSVGFileDCImpl::DoDrawPoint (wxCoord x1, wxCoord y1)
{
wxString s;
if (m_graphics_changed) NewGraphics ();
- s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline ;
+ s = wxT("<g style = \"stroke-linecap:round;\" > ") + wxString(wxT("\n"));
write(s);
- DrawLine ( x1,y1,x1,y1 );
+ DoDrawLine ( x1,y1,x1,y1 );
s = wxT("</g>");
write(s);
}
-
-void wxSVGFileDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
+void wxSVGFileDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
{
- wxDCBase::DoDrawCheckMark (x1,y1,width,height) ;
+ wxDCImpl::DoDrawCheckMark (x1,y1,width,height);
}
-
-void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
+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")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawText Call executed"));
}
-
-void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle)
+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 ();
wxString s, sTmp;
// calculate bounding box
- wxCoord w, h, desc ;
+ wxCoord w, h, desc;
DoGetTextExtent(sText, &w, &h, &desc);
double rad = DegToRad(angle);
CalcBoundingBox(x, y);
CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad)));
- if (m_backgroundMode == wxSOLID)
+ if (m_backgroundMode == wxBRUSHSTYLE_SOLID)
{
// 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")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background"));
sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h );
- s = sTmp + wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
- s = s + wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
- sTmp.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle, x,y ) ;
- s = s + sTmp + newline ;
+ s = sTmp + wxT("style=\"fill:") + m_textBackgroundColour.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; ");
+ s = s + wxT("stroke-width:1; stroke:") + m_textBackgroundColour.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; ");
+ sTmp.Printf ( wxT("\" transform=\"rotate( %s %d %d ) \">"), NumStr(-angle), x,y );
+ s = s + sTmp + wxT("\n");
write(s);
}
//now do the text itself
s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y );
- sTmp = m_font.GetFaceName () ;
+ sTmp = m_font.GetFaceName ();
if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
- else s = s + wxT("style=\" ") ;
+ else s = s + wxT("style=\" ");
wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
- s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
+ s = 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] + semicolon + space;
+ s = 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 + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ;
- sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle, x,y ) ;
- s = s + sTmp + sText + wxT("</text> ") + newline ;
+ 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("stroke-width:0;\" transform=\"rotate( %s %d %d ) \" >"), NumStr(-angle), x,y );
+ s = s + sTmp + sText + wxT("</text> ") + wxT("\n");
if (m_OK)
{
write(s);
}
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
-
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed"));
}
-
-void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+void wxSVGFileDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
- DoDrawRoundedRectangle(x, y, width, height, 0) ;
+ DoDrawRoundedRectangle(x, y, width, height, 0);
}
-
-void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
+void wxSVGFileDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
{
if (m_graphics_changed) NewGraphics ();
- wxString s ;
+ wxString s;
- s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
- x, y, width, height, radius );
+ s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%s\" "),
+ x, y, width, height, NumStr(radius) );
- s = s + wxT(" /> ") + newline ;
+ s = s + wxT(" /> ") + wxT("\n");
write(s);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
- CalcBoundingBox(x, y) ;
- CalcBoundingBox(x + width, y + height) ;
-
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed"));
+ CalcBoundingBox(x, y);
+ CalcBoundingBox(x + width, y + height);
}
-
-void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
+void wxSVGFileDCImpl::DoDrawPolygon(int n, wxPoint points[],
+ wxCoord xoffset, wxCoord yoffset,
+ wxPolygonFillMode fillStyle)
{
if (m_graphics_changed) NewGraphics ();
- wxString s, sTmp ;
- s = wxT("<polygon style=\"") ;
+ wxString s, sTmp;
+ s = wxT("<polygon style=\"");
if ( fillStyle == wxODDEVEN_RULE )
s = s + wxT("fill-rule:evenodd; ");
else
s = s + wxT("fill-rule:nonzero; ");
- s = s + wxT("\" \npoints=\"") ;
+ s = s + wxT("\" \npoints=\"");
for (int i = 0; i < n; i++)
{
sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset );
- s = s + sTmp + newline ;
+ s = s + sTmp + wxT("\n");
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
}
- s = s + wxT("\" /> ") ;
- s = s + newline ;
+ s = s + wxT("\" /> ");
+ s = s + wxT("\n");
write(s);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed"));
}
-
-void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+void wxSVGFileDCImpl::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
if (m_graphics_changed) NewGraphics ();
- int rh = height /2 ;
- int rw = width /2 ;
+ int rh = height /2;
+ int rw = width /2;
wxString s;
s.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x+rw,y+rh, rw, rh );
- s = s + wxT(" /> ") + newline ;
+ s = s + wxT(" /> ") + wxT("\n");
write(s);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
- CalcBoundingBox(x, y) ;
- CalcBoundingBox(x + width, y + height) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed"));
+ CalcBoundingBox(x, y);
+ CalcBoundingBox(x + width, y + height);
}
-
-void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
+void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
{
/* Draws an arc of a circle, centred on (xc, yc), with starting point
(x1, y1) and ending at (x2, y2). The current pen is used for the outline
Might be better described as Pie drawing */
if (m_graphics_changed) NewGraphics ();
- wxString s ;
+ wxString s;
// we need the radius of the circle which has two estimates
double r1 = sqrt ( double( (x1-xc)*(x1-xc) ) + double( (y1-yc)*(y1-yc) ) );
double r2 = sqrt ( double( (x2-xc)*(x2-xc) ) + double( (y2-yc)*(y2-yc) ) );
- wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
+ wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle"));
if ( fabs ( r2-r1 ) > 3 ) //pixels
{
- s = wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
+ s = wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n");
write(s);
}
if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2;
double theta2 = atan2((double)(yc-y2), (double)(x2-xc));
if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2;
- if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ;
+ if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2;
- int fArc ; // flag for large or small arc 0 means less than 180 degrees
- if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0 ;
+ int fArc; // flag for large or small arc 0 means less than 180 degrees
+ if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0;
- int fSweep = 0 ; // flag for sweep always 0
+ int fSweep = 0; // flag for sweep always 0
- s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
- x1,y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
+ s.Printf ( wxT("<path d=\"M%d %d A%s %s 0.0 %d %d %d %d L%d %d z "),
+ x1,y1, NumStr(r1), NumStr(r2), fArc, fSweep, x2, y2, xc, yc );
// the z means close the path and fill
- s = s + wxT(" \" /> ") + newline ;
+ s = s + wxT(" \" /> ") + wxT("\n");
if (m_OK)
write(s);
}
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed"));
}
-
-void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
+void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
{
/*
Draws an arc of an ellipse. The current pen is used for drawing the arc
if (m_graphics_changed) NewGraphics ();
- wxString s ;
+ wxString s;
//radius
- double rx = w / 2 ;
- double ry = h / 2 ;
+ double rx = w / 2;
+ double ry = h / 2;
// center
- double xc = x + rx ;
- double yc = y + ry ;
+ double xc = x + rx;
+ double yc = y + ry;
- double xs, ys, xe, ye ;
- xs = xc + rx * cos (DegToRad(sa)) ;
- xe = xc + rx * cos (DegToRad(ea)) ;
- ys = yc - ry * sin (DegToRad(sa)) ;
- ye = yc - ry * sin (DegToRad(ea)) ;
+ double xs, ys, xe, ye;
+ xs = xc + rx * cos (DegToRad(sa));
+ xe = xc + rx * cos (DegToRad(ea));
+ ys = yc - ry * sin (DegToRad(sa));
+ ye = yc - ry * sin (DegToRad(ea));
///now same as circle arc...
double theta1 = atan2(ys-yc, xs-xc);
double theta2 = atan2(ye-yc, xe-xc);
- int fArc ; // flag for large or small arc 0 means less than 180 degrees
- if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ;
+ int fArc; // flag for large or small arc 0 means less than 180 degrees
+ if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0;
- int fSweep ;
- if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ;
+ int fSweep;
+ if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0;
s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
int(xs), int(ys), int(rx), int(ry),
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
- s = s + wxT(" \" /> ") + newline ;
+ s = s + wxT(" \" /> ") + wxT("\n");
if (m_OK)
{
write(s);
}
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed"));
}
-
-void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const
+void wxSVGFileDCImpl::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const
{
- wxScreenDC sDC ;
+ wxScreenDC sDC;
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")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed"));
}
-
-wxCoord wxSVGFileDC::GetCharHeight() const
+wxCoord wxSVGFileDCImpl::GetCharHeight() const
{
- wxScreenDC sDC ;
+ wxScreenDC sDC;
sDC.SetFont (m_font);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing"));
return ( sDC.GetCharHeight() );
}
-
-wxCoord wxSVGFileDC::GetCharWidth() const
+wxCoord wxSVGFileDCImpl::GetCharWidth() const
{
- wxScreenDC sDC ;
+ wxScreenDC sDC;
sDC.SetFont (m_font);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
- return ( sDC.GetCharWidth() ) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing"));
+ return ( sDC.GetCharWidth() );
}
-/// Set Functions /////////////////////////////////////////////////////////////////
-void wxSVGFileDC::SetBackground( const wxBrush &brush )
+// ----------------------------------------------------------
+// wxSVGFileDCImpl - set functions
+// ----------------------------------------------------------
+
+void wxSVGFileDCImpl::SetBackground( const wxBrush &brush )
{
m_backgroundBrush = brush;
}
-void wxSVGFileDC::SetBackgroundMode( int mode )
+void wxSVGFileDCImpl::SetBackgroundMode( int mode )
{
m_backgroundMode = mode;
return;
}
-void wxSVGFileDC::SetBrush(const wxBrush& brush)
+void wxSVGFileDCImpl::SetBrush(const wxBrush& brush)
{
- m_brush = brush ;
+ m_brush = brush;
- m_graphics_changed = TRUE ;
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ;
+ m_graphics_changed = true;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed"));
}
-void wxSVGFileDC::SetPen(const wxPen& pen)
+void wxSVGFileDCImpl::SetPen(const wxPen& pen)
{
// width, color, ends, joins : currently implemented
// dashes, stipple : not implemented
- m_pen = pen ;
+ m_pen = pen;
- m_graphics_changed = TRUE ;
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;
+ m_graphics_changed = true;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed"));
}
-void wxSVGFileDC::NewGraphics ()
+void wxSVGFileDCImpl::NewGraphics ()
{
int w = m_pen.GetWidth ();
- wxColour c = m_pen.GetColour () ;
+ wxColour c = m_pen.GetColour ();
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )
- + wxT(" stroke:#") + wxColStr (c) + wxT("; ") ;
+ + wxT(" stroke:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; ");
switch ( m_pen.GetCap () )
{
case wxCAP_PROJECTING :
- sPenCap = wxT("stroke-linecap:square; ") ;
- break ;
+ sPenCap = wxT("stroke-linecap:square; ");
+ break;
case wxCAP_BUTT :
- sPenCap = wxT("stroke-linecap:butt; ") ;
- break ;
+ sPenCap = wxT("stroke-linecap:butt; ");
+ break;
case wxCAP_ROUND :
default :
- sPenCap = wxT("stroke-linecap:round; ") ;
+ sPenCap = wxT("stroke-linecap:round; ");
};
switch ( m_pen.GetJoin () )
{
case wxJOIN_BEVEL :
- sPenJoin = wxT("stroke-linejoin:bevel; ") ;
- break ;
+ sPenJoin = wxT("stroke-linejoin:bevel; ");
+ break;
case wxJOIN_MITER :
- sPenJoin = wxT("stroke-linejoin:miter; ") ;
- break ;
+ sPenJoin = wxT("stroke-linejoin:miter; ");
+ break;
case wxJOIN_ROUND :
default :
- sPenJoin = wxT("stroke-linejoin:round; ") ;
+ sPenJoin = wxT("stroke-linejoin:round; ");
};
switch ( m_pen.GetStyle () )
{
- case wxSOLID :
- sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
- break ;
- case wxTRANSPARENT :
- sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
- break ;
+ case wxPENSTYLE_SOLID :
+ sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ");
+ break;
+ case wxPENSTYLE_TRANSPARENT :
+ sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ");
+ break;
default :
- wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
- sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available"));
+ sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n");
}
- sLast.Printf( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
- w, (double)m_logicalOriginX, m_logicalOriginY, m_scaleX, m_scaleY );
+ 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) );
- s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
+ s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxT("\n") + sWarn;
write(s);
- m_graphics_changed = FALSE ;
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
+ m_graphics_changed = false;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed"));
}
-void wxSVGFileDC::SetFont(const wxFont& font)
+void wxSVGFileDCImpl::SetFont(const wxFont& font)
{
- m_font = font ;
+ m_font = font;
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed"));
}
-
// export a bitmap as a raster image in png
-bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
- wxDC* source, wxCoord xsrc, wxCoord ysrc,
- int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,
- wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
+bool wxSVGFileDCImpl::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
+ wxDC* source, wxCoord xsrc, wxCoord ysrc,
+ wxRasterOperationMode logicalFunc /*= wxCOPY*/, bool useMask /*= false*/,
+ wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
{
if (logicalFunc != wxCOPY)
{
- wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
- return FALSE ;
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible"));
+ return false;
}
- if (useMask != FALSE)
+ if (useMask != false)
{
- wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
- return FALSE ;
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::DoBlit Call requested false mask; this is not possible"));
+ return false;
}
- wxBitmap myBitmap (width, height) ;
+ wxBitmap myBitmap (width, height);
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
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 ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed"));
+ return false;
}
-void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
+void wxSVGFileDCImpl::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
{
- wxBitmap myBitmap (myIcon.GetWidth(), myIcon.GetHeight() ) ;
+ wxBitmap myBitmap (myIcon.GetWidth(), myIcon.GetHeight() );
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.DrawIcon(myIcon,0,0);
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, x, y);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
- return ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed"));
+ return;
}
-void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
+void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
{
if (m_graphics_changed) NewGraphics ();
- wxString sTmp, s, sPNG ;
- wxImage::AddHandler(new wxPNGHandler);
+ wxString sTmp, s, sPNG;
+ if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL )
+ wxImage::AddHandler(new wxPNGHandler);
// create suitable file name
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
while (wxFile::Exists(sPNG) )
{
- m_sub_images ++ ;
+ m_sub_images ++;
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
}
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
- wxBitmap myBitmap = bmp ;
+ wxBitmap myBitmap = bmp;
//save it
bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG);
-// refrence the bitmap from the SVG doc
+// reference the bitmap from the SVG doc
+// only use filename & ext
+ sPNG = sPNG.AfterLast(wxFileName::GetPathSeparator());
+
+// reference the bitmap from the SVG doc
int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight();
sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h );
- s = s + sTmp ;
+ s = s + sTmp;
sTmp.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG.c_str() );
- s = s + sTmp + wxT("<title>Image from wxSVG</title> </image>") + newline;
+ s = s + sTmp + wxT("<title>Image from wxSVG</title> </image>") + 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")) ;
+ wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed"));
- return ;
+ return;
}
-void wxSVGFileDC::write(const wxString &s)
+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();
}
-// ---------------------------------------------------------------------------
-// coordinates transformations
-// ---------------------------------------------------------------------------
-
-void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
-{
- wxDCBase::SetAxisOrientation( xLeftRight, yBottomUp );
-}
-
-void wxSVGFileDC::SetMapMode(int mode)
-{
- wxDCBase::SetMapMode(mode);
-}
-
-void wxSVGFileDC::SetUserScale(double x, double y)
-{
- wxDCBase::SetUserScale(x,y);
-}
-
-void wxSVGFileDC::SetLogicalScale(double x, double y)
-{
- wxDCBase::SetLogicalScale(x,y);
-}
-
-void wxSVGFileDC::SetLogicalOrigin(wxCoord x, wxCoord y)
-{
- wxDCBase::SetLogicalOrigin(x,y);
-}
-
-void wxSVGFileDC::SetDeviceOrigin(wxCoord x, wxCoord y)
-{
- wxDCBase::SetDeviceOrigin(x,y);
-}
-
-
#ifdef __BORLANDC__
#pragma warn .rch