X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/621b83d9b34572321873cf3d54920a7749b2f53c..08670ea85abf4b4946a9ce64971b591d7b1ee30b:/src/common/dcsvg.cpp
diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp
index ebc4e74c6f..9aeb7e9530 100644
--- a/src/common/dcsvg.cpp
+++ b/src/common/dcsvg.cpp
@@ -1,10 +1,10 @@
/////////////////////////////////////////////////////////////////////////////
-// 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
/////////////////////////////////////////////////////////////////////////////
@@ -15,69 +15,120 @@
#pragma hdrstop
#endif
+#if wxUSE_SVG
+
#ifndef WX_PRECOMP
-#include "wx/wx.h"
+ #include "wx/dcmemory.h"
+ #include "wx/dcscreen.h"
+ #include "wx/icon.h"
+ #include "wx/image.h"
#endif
#include "wx/dcsvg.h"
-#include "wx/image.h"
+#include "wx/wfstream.h"
+#include "wx/filename.h"
-#define wxSVG_DEBUG FALSE
-// or TRUE to see the calls being executed
+// ----------------------------------------------------------
+// Global utilities
+// ----------------------------------------------------------
-#define newline wxString(wxT("\n"))
-#define space wxString(wxT(" "))
-#define semicolon wxString(wxT(";"))
-#define wx_round(a) (int)((a)+.5)
+namespace
+{
-static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
+inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
-wxString wxColStr ( wxColour c )
+// 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)
{
- 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 ;
+ return wxString::FromCDouble(f, 2);
}
+// Return the colour representation as HTML-like "#rrggbb" string and also
+// returns its alpha as opacity number in 0..1 range.
+wxString Col2SVG(wxColour c, float *opacity)
+{
+ if ( c.Alpha() != wxALPHA_OPAQUE )
+ {
+ *opacity = c.Alpha()/255.;
+
+ // Remove the alpha before using GetAsString(wxC2S_HTML_SYNTAX) as it
+ // doesn't support colours with alpha channel.
+ c = wxColour(c.GetRGB());
+ }
+ else // No alpha.
+ {
+ *opacity = 1.;
+ }
+
+ return c.GetAsString(wxC2S_HTML_SYNTAX);
+}
-wxString wxBrushString ( wxColour c, int style )
+wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID)
{
- wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
+ float opacity;
+ wxString s = wxT("stroke:") + Col2SVG(c, &opacity) + wxT("; ");
+
switch ( style )
{
- case wxSOLID :
- s = s + wxT("fill-opacity:1.0; ");
- break ;
- case wxTRANSPARENT:
- s = s + wxT("fill-opacity:0.0; ");
- break ;
-
+ case wxPENSTYLE_SOLID:
+ s += wxString::Format(wxT("stroke-opacity:%s; "), NumStr(opacity));
+ break;
+ case wxPENSTYLE_TRANSPARENT:
+ s += wxT("stroke-opacity:0.0; ");
+ break;
default :
- wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Pen Style not available"));
+ }
+ return s;
+}
+
+wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID)
+{
+ float opacity;
+ wxString s = wxT("fill:") + Col2SVG(c, &opacity) + wxT("; ");
+
+ switch ( style )
+ {
+ case wxBRUSHSTYLE_SOLID:
+ s += wxString::Format(wxT("fill-opacity:%s; "), NumStr(opacity));
+ break;
+ case wxBRUSHSTYLE_TRANSPARENT:
+ s += wxT("fill-opacity:0.0; ");
+ break;
+ default :
+ wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available"));
}
- s = s + newline ;
- return s ;
+
+ return s;
}
+} // 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;
@@ -91,121 +142,108 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH;
- m_graphics_changed = TRUE ;
+ m_graphics_changed = true;
////////////////////code here
- m_outfile = new wxFileOutputStream(f) ;
- m_OK = m_outfile->Ok ();
+ m_outfile = new wxFileOutputStream(filename);
+ m_OK = m_outfile->IsOk();
if (m_OK)
{
- m_filename = f ;
- m_sub_images = 0 ;
- wxString s ;
- s = wxT("") ; s = s + newline ;
+ m_filename = filename;
+ m_sub_images = 0;
+ wxString s;
+ s = wxT("") + wxString(wxT("\n"));
write(s);
- s = wxT(" ")+ newline ;
+ s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ") + wxString(wxT("\n"));
write(s);
- s.Printf ( wxT(" \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 ;
+ if (m_graphics_changed) NewGraphics();
+ wxString s;
s.Printf ( wxT(" \n"), x1,y1,x2,y2 );
if (m_OK)
{
write(s);
}
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")) ;
- CalcBoundingBox(x1, y1) ;
- CalcBoundingBox(x2, y2) ;
- return;
+ CalcBoundingBox(x1, y1);
+ CalcBoundingBox(x2, y2);
}
-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(" ") + newline ;
+ if (m_graphics_changed) NewGraphics();
+ s = wxT(" ") + wxString(wxT("\n"));
write(s);
- DrawLine ( x1,y1,x1,y1 );
+ DoDrawLine ( x1,y1,x1,y1 );
s = wxT("");
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")) ;
}
-
-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 ();
+ 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);
@@ -220,118 +258,107 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
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")) ;
- sTmp.Printf ( wxT(" "), -angle, x,y ) ;
- s = s + sTmp + newline ;
+ sTmp.Printf ( wxT(" "), NumStr(-angle), x,y );
+ s += sTmp + wxT("\n");
write(s);
}
//now do the text itself
s.Printf (wxT(" 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
- else s = s + wxT("style=\" ") ;
+ sTmp = m_font.GetFaceName();
+ if (sTmp.Len() > 0) s += wxT("style=\"font-family:") + sTmp + wxT("; ");
+ else s += wxT("style=\" ");
wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
- s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
+ 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;
-
- 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(" ") + newline ;
+ s += wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + wxT("; ");
+
+ sTmp.Printf (wxT("font-size:%dpt; "), m_font.GetPointSize() );
+ s += sTmp;
+ //text will be solid, unless alpha value isn't opaque in the foreground colour
+ s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour);
+ sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %s %d %d ) \" >"), NumStr(-angle), x,y );
+ s += sTmp + sText + wxT(" ") + wxT("\n");
if (m_OK)
{
write(s);
}
- 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 ;
+ if (m_graphics_changed) NewGraphics();
+ wxString s;
- s.Printf ( wxT(" ") + newline ;
+ s += wxT(" /> \n");
write(s);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
- CalcBoundingBox(x, y) ;
- CalcBoundingBox(x + width, y + height) ;
-
+ 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(" ") ;
- s = s + newline ;
+ s += wxT("\" /> \n");
write(s);
-
- 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 ();
+ 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(" ") + newline ;
+ s += wxT(" /> \n");
write(s);
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
- CalcBoundingBox(x, y) ;
- CalcBoundingBox(x + width, y + height) ;
+ 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
@@ -342,17 +369,17 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo
Might be better described as Pie drawing */
- if (m_graphics_changed) NewGraphics ();
- wxString s ;
+ if (m_graphics_changed) NewGraphics();
+ 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(" \n") ;
+ s = wxT(" \n");
write(s);
}
@@ -360,30 +387,27 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo
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(" ") + newline ;
+ s += wxT(" \" /> \n");
if (m_OK)
{
write(s);
}
-
- 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
@@ -404,384 +428,237 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub
//known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
- if (m_graphics_changed) NewGraphics ();
+ if (m_graphics_changed) NewGraphics();
- wxString s ;
+ 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(" ") + newline ;
+ s += wxT(" \" /> \n");
if (m_OK)
{
write(s);
}
-
- 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")) ;
}
-
-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")) ;
- return ( sDC.GetCharHeight() );
+ 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() ) ;
-
+ return sDC.GetCharWidth();
}
-/// Set Functions /////////////////////////////////////////////////////////////////
-void wxSVGFileDC::SetBackground( const wxBrush &brush )
-{
+// ----------------------------------------------------------
+// wxSVGFileDCImpl - set functions
+// ----------------------------------------------------------
+void wxSVGFileDCImpl::SetBackground( const wxBrush &brush )
+{
m_backgroundBrush = brush;
- return;
}
-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;
}
-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;
}
-void wxSVGFileDC::NewGraphics ()
+void wxSVGFileDCImpl::NewGraphics()
{
-
- int w = m_pen.GetWidth ();
- wxColour c = m_pen.GetColour () ;
-
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
- sBrush = wxT("\n\n \n") ;
+ sPenJoin = wxT("stroke-linejoin:round; ");
}
- 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)\">"),
+ m_pen.GetWidth(), 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;
}
-void wxSVGFileDC::SetFont(const wxFont& font)
+void wxSVGFileDCImpl::SetFont(const wxFont& font)
{
- m_font = font ;
-
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;
+ m_font = font;
}
-
// 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 ;
+ 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 ;
}
-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 ();
+ 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(" \n"), sPNG.c_str() );
- s = s + sTmp + wxT("Image from wxSVG ") + newline;
+ s += sTmp + wxT("Image from wxSVG ") + wxT("\n");
if (m_OK && bPNG_OK)
{
write(s);
}
- m_OK = m_outfile->Ok () && bPNG_OK;
- wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
-
- return ;
+ m_OK = m_outfile->IsOk() && bPNG_OK;
}
-void wxSVGFileDC::write(const wxString &s)
+void wxSVGFileDCImpl::write(const wxString &s)
{
- const wxWX2MBbuf buf = s.mb_str(wxConvUTF8);
+ const wxCharBuffer buf = s.utf8_str();
m_outfile->Write(buf, strlen((const char *)buf));
- m_OK = m_outfile->Ok();
-}
-
-// ---------------------------------------------------------------------------
-// coordinates transformations
-// ---------------------------------------------------------------------------
-
-wxCoord wxSVGFileDC::DeviceToLogicalX(wxCoord x) const
-{
- return wxRound((x - m_deviceOriginX) / m_scaleX) * m_signX + m_logicalOriginX;
-}
-
-wxCoord wxSVGFileDC::DeviceToLogicalY(wxCoord y) const
-{
- return wxRound((y - m_deviceOriginY) / m_scaleY) * m_signY + m_logicalOriginY;
-}
-
-wxCoord wxSVGFileDC::DeviceToLogicalXRel(wxCoord x) const
-{
- return wxRound(x / m_scaleX);
-}
-
-wxCoord wxSVGFileDC::DeviceToLogicalYRel(wxCoord y) const
-{
- return wxRound(y / m_scaleY);
-}
-
-wxCoord wxSVGFileDC::LogicalToDeviceX(wxCoord x) const
-{
- return wxRound((x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX;
-}
-
-wxCoord wxSVGFileDC::LogicalToDeviceY(wxCoord y) const
-{
- return wxRound((y - m_logicalOriginY) * m_scaleY) * m_signY + m_deviceOriginY;
-}
-
-wxCoord wxSVGFileDC::LogicalToDeviceXRel(wxCoord x) const
-{
- return wxRound(x * m_scaleX);
-}
-
-wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
-{
- return wxRound(y * m_scaleY);
-}
-
-void wxSVGFileDC::ComputeScaleAndOrigin()
-{
- m_scaleX = m_logicalScaleX * m_userScaleX;
- m_scaleY = m_logicalScaleY * m_userScaleY;
-}
-
-void wxSVGFileDC::SetMapMode( int mode )
-{
- switch (mode)
- {
- case wxMM_TWIPS:
- SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
- break;
- case wxMM_POINTS:
- SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
- break;
- case wxMM_METRIC:
- SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
- break;
- case wxMM_LOMETRIC:
- SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
- break;
- default:
- case wxMM_TEXT:
- SetLogicalScale( 1.0, 1.0 );
- break;
- }
- m_mappingMode = mode;
-}
-
-void wxSVGFileDC::SetUserScale( double x, double y )
-{
- // allow negative ? -> no
- m_userScaleX = x;
- m_userScaleY = y;
- ComputeScaleAndOrigin();
-}
-
-void wxSVGFileDC::SetLogicalScale( double x, double y )
-{
- // allow negative ?
- m_logicalScaleX = x;
- m_logicalScaleY = y;
- ComputeScaleAndOrigin();
-}
-
-void wxSVGFileDC::SetLogicalOrigin( wxCoord x, wxCoord y )
-{
- m_logicalOriginX = x * m_signX; // is this still correct ?
- m_logicalOriginY = y * m_signY;
- ComputeScaleAndOrigin();
-}
-
-void wxSVGFileDC::SetDeviceOrigin( wxCoord x, wxCoord y )
-{
- // only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
- m_deviceOriginX = x;
- m_deviceOriginY = y;
- ComputeScaleAndOrigin();
-}
-
-void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
-{
- // only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
- m_signX = (xLeftRight ? 1 : -1);
- m_signY = (yBottomUp ? -1 : 1);
- ComputeScaleAndOrigin();
+ m_OK = m_outfile->IsOk();
}
@@ -789,3 +666,6 @@ void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
#pragma warn .rch
#pragma warn .ccc
#endif
+
+#endif // wxUSE_SVG
+