only formatting changes. s/FALSE/false and s/TRUE/true; remove excessive empty lines; remove TABs; s/ ;/;

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57844 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2009-01-05 19:12:41 +00:00
parent 992ff3310e
commit 13cfc51d63

View File

@@ -28,57 +28,62 @@
#include "wx/wfstream.h" #include "wx/wfstream.h"
#include "wx/filename.h" #include "wx/filename.h"
#define wxSVG_DEBUG FALSE #define wxSVG_DEBUG false
// or TRUE to see the calls being executed // or true to see the calls being executed
#define newline wxString(wxT("\n")) #define newline wxString(wxT("\n"))
#define space wxString(wxT(" ")) #define space wxString(wxT(" "))
#define semicolon wxString(wxT(";")) #define semicolon wxString(wxT(";"))
#define wx_round(a) (int)((a)+.5) #define wx_round(a) (int)((a)+.5)
// ----------------------------------------------------------
// Global utilities
// ----------------------------------------------------------
static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
wxString wxColStr ( wxColour c ) wxString wxColStr ( wxColour c )
{ {
unsigned char r, g, b ; unsigned char r, g, b;
r = c.Red (); r = c.Red ();
g = c.Green (); g = c.Green ();
b = c. Blue (); b = c. Blue ();
// possible Unicode bug here // possible Unicode bug here
wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b) ; wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b);
return s ; return s;
} }
wxString wxBrushString ( wxColour c, int style ) wxString wxBrushString ( wxColour c, int style )
{ {
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ; wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space;
switch ( style ) switch ( style )
{ {
case wxBRUSHSTYLE_SOLID : case wxBRUSHSTYLE_SOLID :
s = s + wxT("fill-opacity:1.0; "); s = s + wxT("fill-opacity:1.0; ");
break ; break;
case wxBRUSHSTYLE_TRANSPARENT: case wxBRUSHSTYLE_TRANSPARENT:
s = s + wxT("fill-opacity:0.0; "); s = s + wxT("fill-opacity:0.0; ");
break ; break;
default : default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ; wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available"));
} }
s = s + newline ; s = s + newline;
return s ; return s;
} }
// ---------------------------------------------------------- // ----------------------------------------------------------
// wxSVGFileDC // wxSVGFileDCImpl
// ---------------------------------------------------------- // ----------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDCImpl, wxDC) IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDCImpl, wxDC)
wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename, wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename,
int width, int height, double dpi ) : int width, int height, double dpi ) :
wxDCImpl( owner ) wxDCImpl( owner )
{ {
Init( filename, width, height, dpi ); Init( filename, width, height, dpi );
@@ -86,12 +91,12 @@ wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename,
void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, double dpi) void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, double dpi)
{ {
m_width = Width ; m_width = Width;
m_height = Height ; m_height = Height;
m_dpi = dpi; m_dpi = dpi;
m_OK = TRUE; m_OK = true;
m_mm_to_pix_x = dpi/25.4; m_mm_to_pix_x = dpi/25.4;
m_mm_to_pix_y = dpi/25.4; m_mm_to_pix_y = dpi/25.4;
@@ -105,44 +110,41 @@ void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, dou
m_font = *wxNORMAL_FONT; m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH; m_brush = *wxWHITE_BRUSH;
m_graphics_changed = TRUE ; m_graphics_changed = true;
////////////////////code here ////////////////////code here
m_outfile = new wxFileOutputStream(filename) ; m_outfile = new wxFileOutputStream(filename);
m_OK = m_outfile->Ok (); m_OK = m_outfile->Ok ();
if (m_OK) if (m_OK)
{ {
m_filename = filename ; m_filename = filename;
m_sub_images = 0 ; m_sub_images = 0;
wxString s ; wxString s;
s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s = s + newline ; s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>"); s = s + newline;
write(s); write(s);
s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline ; s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline;
write(s); 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\"> ") + newline;
write(s); write(s);
s = wxT("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ") + newline; s = wxT("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ") + newline;
write(s);
s.Printf( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"> \n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
write(s);
s = wxT("<title>SVG Picture created as ") + wxFileNameFromPath(filename) + wxT(" </title>") + newline ;
write(s); write(s);
s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ; s.Printf( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"> \n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
write(s); write(s);
s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline ; s = wxT("<title>SVG Picture created as ") + wxFileName(filename).GetFullName() + wxT(" </title>") + newline;
write(s);
s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline;
write(s);
s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline;
write(s); write(s);
} }
} }
wxSVGFileDCImpl::~wxSVGFileDCImpl() wxSVGFileDCImpl::~wxSVGFileDCImpl()
{ {
wxString s = wxT("</g> \n</svg> \n") ; wxString s = wxT("</g> \n</svg> \n");
write(s); write(s);
delete m_outfile ; delete m_outfile;
} }
void wxSVGFileDCImpl::DoGetSizeMM( int *width, int *height ) const void wxSVGFileDCImpl::DoGetSizeMM( int *width, int *height ) const
@@ -162,53 +164,49 @@ wxSize wxSVGFileDCImpl::GetPPI() const
void wxSVGFileDCImpl::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 (); 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 ); s.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1,y1,x2,y2 );
if (m_OK) if (m_OK)
{ {
write(s); write(s);
} }
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed"));
CalcBoundingBox(x1, y1) ; CalcBoundingBox(x1, y1);
CalcBoundingBox(x2, y2) ; CalcBoundingBox(x2, y2);
return; return;
} }
void wxSVGFileDCImpl::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, 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 wxSVGFileDCImpl::DoDrawPoint (wxCoord x1, wxCoord y1) void wxSVGFileDCImpl::DoDrawPoint (wxCoord x1, wxCoord y1)
{ {
wxString s; wxString s;
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline ; s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline;
write(s); write(s);
DoDrawLine ( x1,y1,x1,y1 ); DoDrawLine ( x1,y1,x1,y1 );
s = wxT("</g>"); s = wxT("</g>");
write(s); write(s);
} }
void wxSVGFileDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height) void wxSVGFileDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
{ {
wxDCImpl::DoDrawCheckMark (x1,y1,width,height) ; wxDCImpl::DoDrawCheckMark (x1,y1,width,height);
} }
void wxSVGFileDCImpl::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) void wxSVGFileDCImpl::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
{ {
DoDrawRotatedText(text, x1,y1,0.0); 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 wxSVGFileDCImpl::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 //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
@@ -216,7 +214,7 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor
wxString s, sTmp; wxString s, sTmp;
// calculate bounding box // calculate bounding box
wxCoord w, h, desc ; wxCoord w, h, desc;
DoGetTextExtent(sText, &w, &h, &desc); DoGetTextExtent(sText, &w, &h, &desc);
double rad = DegToRad(angle); double rad = DegToRad(angle);
@@ -236,20 +234,20 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor
// draw background first // 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 // 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 ); 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 = sTmp + wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour) + wxT("; ");
s = s + wxT("stroke-width:1; stroke:#") + 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 ) ; sTmp.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle, x,y );
s = s + sTmp + newline ; s = s + sTmp + newline;
write(s); write(s);
} }
//now do the text itself //now do the text itself
s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y ); 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("; "); 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") }; 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] + semicolon + space;
@@ -258,90 +256,83 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor
s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space; s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
sTmp.Printf (wxT("font-size:%dpt; fill:#"), m_font.GetPointSize () ); sTmp.Printf (wxT("font-size:%dpt; fill:#"), m_font.GetPointSize () );
s = s + sTmp ; s = s + sTmp;
s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ; 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 ) ; sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle, x,y );
s = s + sTmp + sText + wxT("</text> ") + newline ; s = s + sTmp + sText + wxT("</text> ") + newline;
if (m_OK) if (m_OK)
{ {
write(s); write(s);
} }
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed"));
} }
void wxSVGFileDCImpl::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 wxSVGFileDCImpl::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 (); if (m_graphics_changed) NewGraphics ();
wxString s ; wxString s;
s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "), s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
x, y, width, height, radius ); x, y, width, height, radius );
s = s + wxT(" /> ") + newline ; s = s + wxT(" /> ") + newline;
write(s); write(s);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed"));
CalcBoundingBox(x, y) ; CalcBoundingBox(x, y);
CalcBoundingBox(x + width, y + height) ; CalcBoundingBox(x + width, y + height);
} }
void wxSVGFileDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle) void wxSVGFileDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
{ {
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
wxString s, sTmp ; wxString s, sTmp;
s = wxT("<polygon style=\"") ; s = wxT("<polygon style=\"");
if ( fillStyle == wxODDEVEN_RULE ) if ( fillStyle == wxODDEVEN_RULE )
s = s + wxT("fill-rule:evenodd; "); s = s + wxT("fill-rule:evenodd; ");
else else
s = s + wxT("fill-rule:nonzero; "); s = s + wxT("fill-rule:nonzero; ");
s = s + wxT("\" \npoints=\"") ; s = s + wxT("\" \npoints=\"");
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
{ {
sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset ); sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset );
s = s + sTmp + newline ; s = s + sTmp + newline;
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset); CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
} }
s = s + wxT("\" /> ") ; s = s + wxT("\" /> ");
s = s + newline ; s = s + newline;
write(s); write(s);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed"));
} }
void wxSVGFileDCImpl::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 (); if (m_graphics_changed) NewGraphics ();
int rh = height /2 ; int rh = height /2;
int rw = width /2 ; int rw = width /2;
wxString s; wxString s;
s.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x+rw,y+rh, rw, rh ); 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(" /> ") + newline;
write(s); write(s);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed"));
CalcBoundingBox(x, y) ; CalcBoundingBox(x, y);
CalcBoundingBox(x + width, y + height) ; CalcBoundingBox(x + width, y + height);
} }
void wxSVGFileDCImpl::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 /* Draws an arc of a circle, centred on (xc, yc), with starting point
@@ -354,16 +345,16 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
Might be better described as Pie drawing */ Might be better described as Pie drawing */
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
wxString s ; wxString s;
// we need the radius of the circle which has two estimates // 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 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) ) ); 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 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); write(s);
} }
@@ -371,18 +362,18 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2; if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2;
double theta2 = atan2((double)(yc-y2), (double)(x2-xc)); double theta2 = atan2((double)(yc-y2), (double)(x2-xc));
if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2; 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 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 ; 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 "), 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 ); x1,y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
// the z means close the path and fill // the z means close the path and fill
s = s + wxT(" \" /> ") + newline ; s = s + wxT(" \" /> ") + newline;
if (m_OK) if (m_OK)
@@ -390,10 +381,9 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
write(s); write(s);
} }
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed"));
} }
void wxSVGFileDCImpl::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)
{ {
/* /*
@@ -417,83 +407,83 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
wxString s ; wxString s;
//radius //radius
double rx = w / 2 ; double rx = w / 2;
double ry = h / 2 ; double ry = h / 2;
// center // center
double xc = x + rx ; double xc = x + rx;
double yc = y + ry ; double yc = y + ry;
double xs, ys, xe, ye ; double xs, ys, xe, ye;
xs = xc + rx * cos (DegToRad(sa)) ; xs = xc + rx * cos (DegToRad(sa));
xe = xc + rx * cos (DegToRad(ea)) ; xe = xc + rx * cos (DegToRad(ea));
ys = yc - ry * sin (DegToRad(sa)) ; ys = yc - ry * sin (DegToRad(sa));
ye = yc - ry * sin (DegToRad(ea)) ; ye = yc - ry * sin (DegToRad(ea));
///now same as circle arc... ///now same as circle arc...
double theta1 = atan2(ys-yc, xs-xc); double theta1 = atan2(ys-yc, xs-xc);
double theta2 = atan2(ye-yc, xe-xc); double theta2 = atan2(ye-yc, xe-xc);
int fArc ; // flag for large or small arc 0 means less than 180 degrees int fArc; // flag for large or small arc 0 means less than 180 degrees
if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ; if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0;
int fSweep ; int fSweep;
if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ; 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 "), 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), int(xs), int(ys), int(rx), int(ry),
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) ); fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
s = s + wxT(" \" /> ") + newline ; s = s + wxT(" \" /> ") + newline;
if (m_OK) if (m_OK)
{ {
write(s); write(s);
} }
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ; 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 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); sDC.SetFont (m_font);
if ( font != NULL ) sDC.SetFont ( *font ); if ( font != NULL ) sDC.SetFont ( *font );
sDC.GetTextExtent(string, w, h, descent, externalLeading ); 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 wxSVGFileDCImpl::GetCharHeight() const wxCoord wxSVGFileDCImpl::GetCharHeight() const
{ {
wxScreenDC sDC ; wxScreenDC sDC;
sDC.SetFont (m_font); 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() ); return ( sDC.GetCharHeight() );
} }
wxCoord wxSVGFileDCImpl::GetCharWidth() const wxCoord wxSVGFileDCImpl::GetCharWidth() const
{ {
wxScreenDC sDC ; wxScreenDC sDC;
sDC.SetFont (m_font); sDC.SetFont (m_font);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing"));
return ( sDC.GetCharWidth() ) ; return ( sDC.GetCharWidth() );
} }
/// Set Functions ///////////////////////////////////////////////////////////////// // ----------------------------------------------------------
// wxSVGFileDCImpl - set functions
// ----------------------------------------------------------
void wxSVGFileDCImpl::SetBackground( const wxBrush &brush ) void wxSVGFileDCImpl::SetBackground( const wxBrush &brush )
{ {
@@ -512,10 +502,10 @@ void wxSVGFileDCImpl::SetBackgroundMode( int mode )
void wxSVGFileDCImpl::SetBrush(const wxBrush& brush) void wxSVGFileDCImpl::SetBrush(const wxBrush& brush)
{ {
m_brush = brush ; m_brush = brush;
m_graphics_changed = TRUE ; m_graphics_changed = true;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed"));
} }
@@ -523,123 +513,122 @@ void wxSVGFileDCImpl::SetPen(const wxPen& pen)
{ {
// width, color, ends, joins : currently implemented // width, color, ends, joins : currently implemented
// dashes, stipple : not implemented // dashes, stipple : not implemented
m_pen = pen ; m_pen = pen;
m_graphics_changed = TRUE ; m_graphics_changed = true;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed"));
} }
void wxSVGFileDCImpl::NewGraphics () void wxSVGFileDCImpl::NewGraphics ()
{ {
int w = m_pen.GetWidth (); int w = m_pen.GetWidth ();
wxColour c = m_pen.GetColour () ; wxColour c = m_pen.GetColour ();
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn; wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () ) sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )
+ wxT(" stroke:#") + wxColStr (c) + wxT("; ") ; + wxT(" stroke:#") + wxColStr (c) + wxT("; ");
switch ( m_pen.GetCap () ) switch ( m_pen.GetCap () )
{ {
case wxCAP_PROJECTING : case wxCAP_PROJECTING :
sPenCap = wxT("stroke-linecap:square; ") ; sPenCap = wxT("stroke-linecap:square; ");
break ; break;
case wxCAP_BUTT : case wxCAP_BUTT :
sPenCap = wxT("stroke-linecap:butt; ") ; sPenCap = wxT("stroke-linecap:butt; ");
break ; break;
case wxCAP_ROUND : case wxCAP_ROUND :
default : default :
sPenCap = wxT("stroke-linecap:round; ") ; sPenCap = wxT("stroke-linecap:round; ");
}; };
switch ( m_pen.GetJoin () ) switch ( m_pen.GetJoin () )
{ {
case wxJOIN_BEVEL : case wxJOIN_BEVEL :
sPenJoin = wxT("stroke-linejoin:bevel; ") ; sPenJoin = wxT("stroke-linejoin:bevel; ");
break ; break;
case wxJOIN_MITER : case wxJOIN_MITER :
sPenJoin = wxT("stroke-linejoin:miter; ") ; sPenJoin = wxT("stroke-linejoin:miter; ");
break ; break;
case wxJOIN_ROUND : case wxJOIN_ROUND :
default : default :
sPenJoin = wxT("stroke-linejoin:round; ") ; sPenJoin = wxT("stroke-linejoin:round; ");
}; };
switch ( m_pen.GetStyle () ) switch ( m_pen.GetStyle () )
{ {
case wxPENSTYLE_SOLID : case wxPENSTYLE_SOLID :
sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ; sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ");
break ; break;
case wxPENSTYLE_TRANSPARENT : case wxPENSTYLE_TRANSPARENT :
sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ; sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ");
break ; break;
default : default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ; 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") ; 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)\">"), sLast.Printf( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
w, double(m_logicalOriginX), double(m_logicalOriginY), m_scaleX, m_scaleY ); w, double(m_logicalOriginX), double(m_logicalOriginY), m_scaleX, m_scaleY );
s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn; s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
write(s); write(s);
m_graphics_changed = FALSE ; m_graphics_changed = false;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed"));
} }
void wxSVGFileDCImpl::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 // export a bitmap as a raster image in png
bool wxSVGFileDCImpl::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, bool wxSVGFileDCImpl::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC* source, wxCoord xsrc, wxCoord ysrc, wxDC* source, wxCoord xsrc, wxCoord ysrc,
int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/, int logicalFunc /*= wxCOPY*/, bool useMask /*= false*/,
wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/) wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
{ {
if (logicalFunc != wxCOPY) if (logicalFunc != wxCOPY)
{ {
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ; wxASSERT_MSG(false, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible"));
return FALSE ; return false;
} }
if (useMask != FALSE) if (useMask != false)
{ {
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ; wxASSERT_MSG(false, wxT("wxSVGFileDC::DoBlit Call requested false mask; this is not possible"));
return FALSE ; return false;
} }
wxBitmap myBitmap (width, height) ; wxBitmap myBitmap (width, height);
wxMemoryDC memDC; wxMemoryDC memDC;
memDC.SelectObject( myBitmap ); memDC.SelectObject( myBitmap );
memDC.Blit(0, 0, width, height, source, xsrc, ysrc); memDC.Blit(0, 0, width, height, source, xsrc, ysrc);
memDC.SelectObject( wxNullBitmap ); memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, xdest, ydest); DoDrawBitmap(myBitmap, xdest, ydest);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed"));
return FALSE ; return false;
} }
void wxSVGFileDCImpl::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; wxMemoryDC memDC;
memDC.SelectObject( myBitmap ); memDC.SelectObject( myBitmap );
memDC.DrawIcon(myIcon,0,0); memDC.DrawIcon(myIcon,0,0);
memDC.SelectObject( wxNullBitmap ); memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, x, y); DoDrawBitmap(myBitmap, x, y);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed"));
return ; return;
} }
void wxSVGFileDCImpl::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 (); if (m_graphics_changed) NewGraphics ();
wxString sTmp, s, sPNG ; wxString sTmp, s, sPNG;
if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL ) if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL )
wxImage::AddHandler(new wxPNGHandler); wxImage::AddHandler(new wxPNGHandler);
@@ -648,13 +637,13 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp; sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
while (wxFile::Exists(sPNG) ) while (wxFile::Exists(sPNG) )
{ {
m_sub_images ++ ; m_sub_images ++;
sTmp.Printf ( wxT("_image%d.png"), m_sub_images); sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp; sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
} }
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap) //create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
wxBitmap myBitmap = bmp ; wxBitmap myBitmap = bmp;
//save it //save it
bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG); bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG);
@@ -662,11 +651,11 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
// only use filename & ext // only use filename & ext
sPNG = sPNG.AfterLast(wxFileName::GetPathSeparator()); sPNG = sPNG.AfterLast(wxFileName::GetPathSeparator());
// refrence the bitmap from the SVG doc // reference the bitmap from the SVG doc
int w = myBitmap.GetWidth(); int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight(); int h = myBitmap.GetHeight();
sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h ); 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() ); 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>") + newline;
@@ -675,9 +664,9 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
write(s); write(s);
} }
m_OK = m_outfile->Ok () && bPNG_OK; 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 wxSVGFileDCImpl::write(const wxString &s) void wxSVGFileDCImpl::write(const wxString &s)