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:
@@ -28,70 +28,75 @@
|
||||
#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)
|
||||
|
||||
|
||||
// ----------------------------------------------------------
|
||||
// Global utilities
|
||||
// ----------------------------------------------------------
|
||||
|
||||
static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
|
||||
|
||||
wxString wxColStr ( wxColour c )
|
||||
{
|
||||
unsigned char r, g, b ;
|
||||
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 ;
|
||||
wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
wxString wxBrushString ( wxColour c, int style )
|
||||
{
|
||||
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
|
||||
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space;
|
||||
switch ( style )
|
||||
{
|
||||
case wxBRUSHSTYLE_SOLID :
|
||||
s = s + wxT("fill-opacity:1.0; ");
|
||||
break ;
|
||||
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 + newline;
|
||||
return s;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
// wxSVGFileDC
|
||||
// wxSVGFileDCImpl
|
||||
// ----------------------------------------------------------
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDCImpl, wxDC)
|
||||
|
||||
wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename,
|
||||
int width, int height, double dpi ) :
|
||||
wxSVGFileDCImpl::wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename,
|
||||
int width, int height, double dpi ) :
|
||||
wxDCImpl( owner )
|
||||
{
|
||||
Init( filename, width, height, dpi );
|
||||
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;
|
||||
@@ -105,55 +110,52 @@ void wxSVGFileDCImpl::Init (const wxString &filename, int Width, int Height, dou
|
||||
m_font = *wxNORMAL_FONT;
|
||||
m_brush = *wxWHITE_BRUSH;
|
||||
|
||||
m_graphics_changed = TRUE ;
|
||||
m_graphics_changed = true;
|
||||
|
||||
////////////////////code here
|
||||
|
||||
m_outfile = new wxFileOutputStream(filename) ;
|
||||
m_outfile = new wxFileOutputStream(filename);
|
||||
m_OK = m_outfile->Ok ();
|
||||
if (m_OK)
|
||||
{
|
||||
m_filename = filename ;
|
||||
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\"?>"); s = s + newline;
|
||||
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);
|
||||
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);
|
||||
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 ;
|
||||
s = wxT("<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" ") + newline;
|
||||
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);
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxSVGFileDCImpl::~wxSVGFileDCImpl()
|
||||
{
|
||||
wxString s = wxT("</g> \n</svg> \n") ;
|
||||
wxString s = wxT("</g> \n</svg> \n");
|
||||
write(s);
|
||||
delete m_outfile ;
|
||||
delete m_outfile;
|
||||
}
|
||||
|
||||
void wxSVGFileDCImpl::DoGetSizeMM( int *width, int *height ) const
|
||||
{
|
||||
if (width)
|
||||
*width = wxRound( (double)m_width / m_mm_to_pix_x );
|
||||
|
||||
|
||||
if (height)
|
||||
*height = wxRound( (double)m_height / m_mm_to_pix_y );
|
||||
}
|
||||
|
||||
|
||||
wxSize wxSVGFileDCImpl::GetPPI() const
|
||||
{
|
||||
return wxSize( wxRound(m_dpi), wxRound(m_dpi) );
|
||||
@@ -162,53 +164,49 @@ wxSize wxSVGFileDCImpl::GetPPI() const
|
||||
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 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 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;\" > ") + newline;
|
||||
write(s);
|
||||
DoDrawLine ( x1,y1,x1,y1 );
|
||||
s = wxT("</g>");
|
||||
write(s);
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
//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;
|
||||
|
||||
// calculate bounding box
|
||||
wxCoord w, h, desc ;
|
||||
wxCoord w, h, desc;
|
||||
DoGetTextExtent(sText, &w, &h, &desc);
|
||||
|
||||
double rad = DegToRad(angle);
|
||||
@@ -236,20 +234,20 @@ 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")) ;
|
||||
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:#") + 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;
|
||||
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;
|
||||
@@ -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;
|
||||
|
||||
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 ;
|
||||
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;
|
||||
if (m_OK)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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 )
|
||||
|
||||
{
|
||||
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 );
|
||||
x, y, width, height, radius );
|
||||
|
||||
s = s + wxT(" /> ") + newline ;
|
||||
s = s + wxT(" /> ") + newline;
|
||||
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 wxSVGFileDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int 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 + newline;
|
||||
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
|
||||
}
|
||||
s = s + wxT("\" /> ") ;
|
||||
s = s + newline ;
|
||||
s = s + wxT("\" /> ");
|
||||
s = s + newline;
|
||||
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)
|
||||
|
||||
{
|
||||
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(" /> ") + newline;
|
||||
|
||||
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 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
|
||||
@@ -354,16 +345,16 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -371,18 +362,18 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
|
||||
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 );
|
||||
|
||||
// the z means close the path and fill
|
||||
s = s + wxT(" \" /> ") + newline ;
|
||||
s = s + wxT(" \" /> ") + newline;
|
||||
|
||||
|
||||
if (m_OK)
|
||||
@@ -390,10 +381,9 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
|
||||
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)
|
||||
{
|
||||
/*
|
||||
@@ -417,83 +407,83 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,
|
||||
|
||||
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(" \" /> ") + newline;
|
||||
|
||||
if (m_OK)
|
||||
{
|
||||
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
|
||||
|
||||
{
|
||||
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 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 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 /////////////////////////////////////////////////////////////////
|
||||
// ----------------------------------------------------------
|
||||
// wxSVGFileDCImpl - set functions
|
||||
// ----------------------------------------------------------
|
||||
|
||||
void wxSVGFileDCImpl::SetBackground( const wxBrush &brush )
|
||||
{
|
||||
|
||||
@@ -512,10 +502,10 @@ void wxSVGFileDCImpl::SetBackgroundMode( int mode )
|
||||
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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -523,123 +513,122 @@ 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 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:#") + wxColStr (c) + 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 wxPENSTYLE_SOLID :
|
||||
sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
|
||||
break ;
|
||||
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 ;
|
||||
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), 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;
|
||||
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 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 wxSVGFileDCImpl::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*/)
|
||||
wxDC* source, wxCoord xsrc, wxCoord ysrc,
|
||||
int 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 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 wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
|
||||
wxString sTmp, s, sPNG ;
|
||||
wxString sTmp, s, sPNG;
|
||||
if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG) == NULL )
|
||||
wxImage::AddHandler(new wxPNGHandler);
|
||||
|
||||
@@ -648,13 +637,13 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
|
||||
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);
|
||||
|
||||
@@ -662,11 +651,11 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
|
||||
// only use filename & ext
|
||||
sPNG = sPNG.AfterLast(wxFileName::GetPathSeparator());
|
||||
|
||||
// refrence the bitmap from the SVG doc
|
||||
// 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;
|
||||
|
||||
@@ -675,9 +664,9 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor
|
||||
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 wxSVGFileDCImpl::write(const wxString &s)
|
||||
|
Reference in New Issue
Block a user