reorganized wxSVGFileDC code

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48917 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2007-09-24 09:30:24 +00:00
parent 00a77b7c5d
commit d8416992be
2 changed files with 124 additions and 66 deletions

View File

@ -26,14 +26,30 @@
class WXDLLIMPEXP_FWD_BASE wxFileOutputStream; class WXDLLIMPEXP_FWD_BASE wxFileOutputStream;
#if wxUSE_NEW_DC
class WXDLLIMPEXP_FWD_BASE wxSVGFileDC;
class WXDLLIMPEXP_CORE wxSVGFileImplDC : public wxImplDC
#else
#define wxSVGFileImplDC wxSVGFileDC
class WXDLLIMPEXP_CORE wxSVGFileDC : public wxDC class WXDLLIMPEXP_CORE wxSVGFileDC : public wxDC
#endif
{ {
public: public:
wxSVGFileDC (wxString f);
wxSVGFileDC (wxString f, int Width, int Height);
wxSVGFileDC (wxString f, int Width, int Height, float dpi);
virtual ~wxSVGFileDC(); #if wxUSE_NEW_DC
wxSVGFileImplDC( wxSVGFileDC *owner, const wxString &filename,
int width=320, int height=240, double dpi=72.0 );
#else
wxSVGFileDC( const wxString &filename,
int width=320, int height=240, double dpi=72.0 );
#endif
virtual ~wxSVGFileImplDC();
bool IsOk() const { return m_OK; }
virtual bool CanDrawBitmap() const { return true; } virtual bool CanDrawBitmap() const { return true; }
virtual bool CanGetTextExtent() const { return true; } virtual bool CanGetTextExtent() const { return true; }
@ -91,14 +107,15 @@ public:
virtual void SetFont(const wxFont& font); virtual void SetFont(const wxFont& font);
virtual void SetPen(const wxPen& pen); virtual void SetPen(const wxPen& pen);
virtual bool IsOk() const {return m_OK;} #if wxUSE_NEW_DC
#else
virtual void SetMapMode( int mode ); virtual void SetMapMode( int mode );
virtual void SetUserScale( double x, double y ); virtual void SetUserScale( double x, double y );
virtual void SetLogicalScale( double x, double y ); virtual void SetLogicalScale( double x, double y );
virtual void SetLogicalOrigin( wxCoord x, wxCoord y ); virtual void SetLogicalOrigin( wxCoord x, wxCoord y );
virtual void SetDeviceOrigin( wxCoord x, wxCoord y ); virtual void SetDeviceOrigin( wxCoord x, wxCoord y );
virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp ); virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
#endif
private: private:
virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const
@ -172,10 +189,19 @@ private:
virtual void DoSetClippingRegionAsRegion(const wxRegion& WXUNUSED(region)) virtual void DoSetClippingRegionAsRegion(const wxRegion& WXUNUSED(region))
{ {
wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetClippingRegionAsRegion Call not yet implemented")); wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetClippingRegionAsRegion not yet implemented"));
} }
void Init (wxString f, int Width, int Height, float dpi); virtual void DoSetClippingRegion( int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
{
wxFAIL_MSG(wxT("wxSVGFILEDC::DoSetClippingRegion not yet implemented"));
}
virtual void DoGetSizeMM( int *width, int *height ) const;
virtual wxSize GetPPI() const;
void Init (const wxString &filename, int width, int height, double dpi);
void NewGraphics(); void NewGraphics();
@ -188,11 +214,26 @@ private:
bool m_OK; bool m_OK;
bool m_graphics_changed; bool m_graphics_changed;
int m_width, m_height; int m_width, m_height;
double m_dpi;
private: private:
DECLARE_ABSTRACT_CLASS(wxSVGFileDC) DECLARE_ABSTRACT_CLASS(wxSVGFileImplDC)
}; };
#if wxUSE_NEW_DC
class WXDLLIMPEXP_CORE wxSVGFileDC : public wxDC
{
public:
wxSVGFileDC( const wxString &filename,
int width=320, int height=240, double dpi=72.0 )
{
m_pimpl = new wxSVGFileImplDC( this, filename, width, height, dpi );
}
};
#endif
#endif // wxUSE_SVG #endif // wxUSE_SVG
#endif // _WX_DCSVG_H_ #endif // _WX_DCSVG_H_

View File

@ -74,14 +74,30 @@ wxString wxBrushString ( wxColour c, int style )
// wxSVGFileDC // wxSVGFileDC
// ---------------------------------------------------------- // ----------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDC, wxDC) IMPLEMENT_ABSTRACT_CLASS(wxSVGFileImplDC, wxDC)
void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi) #if wxUSE_NEW_DC
wxSVGFileImplDC::wxSVGFileImplDC( wxSVGFileDC *owner, const wxString &filename,
int width, int height, double dpi ) :
wxImplDC( owner )
{
Init( filename, width, height, dpi );
}
#else
wxSVGFileDC::wxSVGFileDC( const wxString &filename,
int width, int height, double dpi )
{
Init( filename, width, height, dpi );
}
#endif
void wxSVGFileImplDC::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_OK = TRUE; m_OK = TRUE;
m_mm_to_pix_x = dpi/25.4; m_mm_to_pix_x = dpi/25.4;
@ -100,11 +116,11 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
////////////////////code here ////////////////////code here
m_outfile = new wxFileOutputStream(f) ; m_outfile = new wxFileOutputStream(filename) ;
m_OK = m_outfile->Ok (); m_OK = m_outfile->Ok ();
if (m_OK) if (m_OK)
{ {
m_filename = f ; 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 ;
@ -115,7 +131,7 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
write(s); 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.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 );
write(s); write(s);
s = wxT("<title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ; 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 = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
write(s); write(s);
@ -126,34 +142,29 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
} }
// constructors
wxSVGFileDC::wxSVGFileDC (wxString f)
{
// quarter 640x480 screen display at 72 dpi
Init (f,320,240,72.0);
}
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height) wxSVGFileImplDC::~wxSVGFileImplDC()
{
Init (f,Width,Height,72.0);
}
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
{
Init (f,Width,Height,dpi);
}
wxSVGFileDC::~wxSVGFileDC()
{ {
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 wxSVGFileImplDC::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 );
}
void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) wxSize wxSVGFileImplDC::GetPPI() const
{
return wxSize( wxRound(m_dpi), wxRound(m_dpi) );
}
void wxSVGFileImplDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
{ {
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
wxString s ; wxString s ;
@ -168,7 +179,7 @@ void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
return; return;
} }
void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset ) void wxSVGFileImplDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
{ {
for ( int i = 1; i < n ; i++ ) for ( int i = 1; i < n ; i++ )
{ {
@ -178,32 +189,36 @@ void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord
} }
void wxSVGFileDC::DoDrawPoint (wxCoord x1, wxCoord y1) void wxSVGFileImplDC::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);
DrawLine ( x1,y1,x1,y1 ); DoDrawLine ( x1,y1,x1,y1 );
s = wxT("</g>"); s = wxT("</g>");
write(s); write(s);
} }
void wxSVGFileDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height) void wxSVGFileImplDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
{ {
#if wxUSE_NEW_DC
wxImplDC::DoDrawCheckMark (x1,y1,width,height) ;
#else
wxDCBase::DoDrawCheckMark (x1,y1,width,height) ; wxDCBase::DoDrawCheckMark (x1,y1,width,height) ;
#endif
} }
void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1) void wxSVGFileImplDC::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 wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle) void wxSVGFileImplDC::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
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
@ -265,13 +280,13 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
} }
void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) void wxSVGFileImplDC::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 wxSVGFileImplDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
{ {
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
@ -290,7 +305,7 @@ void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx
} }
void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle) void wxSVGFileImplDC::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 ;
@ -316,7 +331,7 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor
} }
void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height) void wxSVGFileImplDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{ {
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
@ -336,7 +351,7 @@ void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord he
} }
void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) void wxSVGFileImplDC::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
(x1, y1) and ending at (x2, y2). The current pen is used for the outline (x1, y1) and ending at (x2, y2). The current pen is used for the outline
@ -388,7 +403,7 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo
} }
void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) void wxSVGFileImplDC::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 Draws an arc of an ellipse. The current pen is used for drawing the arc
@ -452,7 +467,7 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub
} }
void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const void wxSVGFileImplDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , const wxFont *font) const
{ {
wxScreenDC sDC ; wxScreenDC sDC ;
@ -464,7 +479,7 @@ void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h
} }
wxCoord wxSVGFileDC::GetCharHeight() const wxCoord wxSVGFileImplDC::GetCharHeight() const
{ {
wxScreenDC sDC ; wxScreenDC sDC ;
@ -476,7 +491,7 @@ wxCoord wxSVGFileDC::GetCharHeight() const
} }
wxCoord wxSVGFileDC::GetCharWidth() const wxCoord wxSVGFileImplDC::GetCharWidth() const
{ {
wxScreenDC sDC ; wxScreenDC sDC ;
sDC.SetFont (m_font); sDC.SetFont (m_font);
@ -488,7 +503,7 @@ wxCoord wxSVGFileDC::GetCharWidth() const
/// Set Functions ///////////////////////////////////////////////////////////////// /// Set Functions /////////////////////////////////////////////////////////////////
void wxSVGFileDC::SetBackground( const wxBrush &brush ) void wxSVGFileImplDC::SetBackground( const wxBrush &brush )
{ {
m_backgroundBrush = brush; m_backgroundBrush = brush;
@ -496,14 +511,14 @@ void wxSVGFileDC::SetBackground( const wxBrush &brush )
} }
void wxSVGFileDC::SetBackgroundMode( int mode ) void wxSVGFileImplDC::SetBackgroundMode( int mode )
{ {
m_backgroundMode = mode; m_backgroundMode = mode;
return; return;
} }
void wxSVGFileDC::SetBrush(const wxBrush& brush) void wxSVGFileImplDC::SetBrush(const wxBrush& brush)
{ {
m_brush = brush ; m_brush = brush ;
@ -513,7 +528,7 @@ void wxSVGFileDC::SetBrush(const wxBrush& brush)
} }
void wxSVGFileDC::SetPen(const wxPen& pen) void wxSVGFileImplDC::SetPen(const wxPen& pen)
{ {
// width, color, ends, joins : currently implemented // width, color, ends, joins : currently implemented
// dashes, stipple : not implemented // dashes, stipple : not implemented
@ -523,7 +538,7 @@ void wxSVGFileDC::SetPen(const wxPen& pen)
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ; wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;
} }
void wxSVGFileDC::NewGraphics () void wxSVGFileImplDC::NewGraphics ()
{ {
int w = m_pen.GetWidth (); int w = m_pen.GetWidth ();
@ -582,7 +597,7 @@ void wxSVGFileDC::NewGraphics ()
} }
void wxSVGFileDC::SetFont(const wxFont& font) void wxSVGFileImplDC::SetFont(const wxFont& font)
{ {
m_font = font ; m_font = font ;
@ -592,7 +607,7 @@ void wxSVGFileDC::SetFont(const wxFont& font)
// export a bitmap as a raster image in png // export a bitmap as a raster image in png
bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, bool wxSVGFileImplDC::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*/)
@ -617,7 +632,7 @@ bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
return FALSE ; return FALSE ;
} }
void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y) void wxSVGFileImplDC::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;
@ -629,7 +644,7 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
return ; return ;
} }
void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ ) void wxSVGFileImplDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
{ {
if (m_graphics_changed) NewGraphics (); if (m_graphics_changed) NewGraphics ();
@ -669,7 +684,7 @@ void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y
return ; return ;
} }
void wxSVGFileDC::write(const wxString &s) void wxSVGFileImplDC::write(const wxString &s)
{ {
const wxCharBuffer buf = s.utf8_str(); const wxCharBuffer buf = s.utf8_str();
m_outfile->Write(buf, strlen((const char *)buf)); m_outfile->Write(buf, strlen((const char *)buf));
@ -680,36 +695,38 @@ void wxSVGFileDC::write(const wxString &s)
// coordinates transformations // coordinates transformations
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) #if wxUSE_NEW_DC
#else
void wxSVGFileImplDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{ {
wxDCBase::SetAxisOrientation( xLeftRight, yBottomUp ); wxDCBase::SetAxisOrientation( xLeftRight, yBottomUp );
} }
void wxSVGFileDC::SetMapMode(int mode) void wxSVGFileImplDC::SetMapMode(int mode)
{ {
wxDCBase::SetMapMode(mode); wxDCBase::SetMapMode(mode);
} }
void wxSVGFileDC::SetUserScale(double x, double y) void wxSVGFileImplDC::SetUserScale(double x, double y)
{ {
wxDCBase::SetUserScale(x,y); wxDCBase::SetUserScale(x,y);
} }
void wxSVGFileDC::SetLogicalScale(double x, double y) void wxSVGFileImplDC::SetLogicalScale(double x, double y)
{ {
wxDCBase::SetLogicalScale(x,y); wxDCBase::SetLogicalScale(x,y);
} }
void wxSVGFileDC::SetLogicalOrigin(wxCoord x, wxCoord y) void wxSVGFileImplDC::SetLogicalOrigin(wxCoord x, wxCoord y)
{ {
wxDCBase::SetLogicalOrigin(x,y); wxDCBase::SetLogicalOrigin(x,y);
} }
void wxSVGFileDC::SetDeviceOrigin(wxCoord x, wxCoord y) void wxSVGFileImplDC::SetDeviceOrigin(wxCoord x, wxCoord y)
{ {
wxDCBase::SetDeviceOrigin(x,y); wxDCBase::SetDeviceOrigin(x,y);
} }
#endif
#ifdef __BORLANDC__ #ifdef __BORLANDC__