]>
git.saurik.com Git - wxWidgets.git/blob - src/common/dcsvg.cpp
1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Chris Elliott
7 // Licence: wxWindows license
8 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
21 #include "wx/dcmemory.h"
22 #include "wx/dcscreen.h"
28 #include "wx/wfstream.h"
30 #define wxSVG_DEBUG FALSE
31 // or TRUE to see the calls being executed
33 #define newline wxString(wxT("\n"))
34 #define space wxString(wxT(" "))
35 #define semicolon wxString(wxT(";"))
36 #define wx_round(a) (int)((a)+.5)
38 static inline double DegToRad(double deg
) { return (deg
* M_PI
) / 180.0; }
40 wxString
wxColStr ( wxColour c
)
42 unsigned char r
, g
, b
;
47 // possible Unicode bug here
48 wxString s
= wxDecToHex(r
) + wxDecToHex(g
) + wxDecToHex(b
) ;
53 wxString
wxBrushString ( wxColour c
, int style
)
55 wxString s
= wxT("fill:#") + wxColStr (c
) + semicolon
+ space
;
59 s
= s
+ wxT("fill-opacity:1.0; ");
62 s
= s
+ wxT("fill-opacity:0.0; ");
66 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
73 // ----------------------------------------------------------
75 // ----------------------------------------------------------
77 IMPLEMENT_ABSTRACT_CLASS(wxSVGFileImplDC
, wxDC
)
80 wxSVGFileImplDC::wxSVGFileImplDC( wxSVGFileDC
*owner
, const wxString
&filename
,
81 int width
, int height
, double dpi
) :
84 Init( filename
, width
, height
, dpi
);
87 wxSVGFileDC::wxSVGFileDC( const wxString
&filename
,
88 int width
, int height
, double dpi
)
90 Init( filename
, width
, height
, dpi
);
94 void wxSVGFileImplDC::Init (const wxString
&filename
, int Width
, int Height
, double dpi
)
103 m_mm_to_pix_x
= dpi
/25.4;
104 m_mm_to_pix_y
= dpi
/25.4;
106 m_backgroundBrush
= *wxTRANSPARENT_BRUSH
;
107 m_textForegroundColour
= *wxBLACK
;
108 m_textBackgroundColour
= *wxWHITE
;
109 m_colour
= wxColourDisplay();
111 m_pen
= *wxBLACK_PEN
;
112 m_font
= *wxNORMAL_FONT
;
113 m_brush
= *wxWHITE_BRUSH
;
115 m_graphics_changed
= TRUE
;
117 ////////////////////code here
119 m_outfile
= new wxFileOutputStream(filename
) ;
120 m_OK
= m_outfile
->Ok ();
123 m_filename
= filename
;
126 s
= wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s
= s
+ newline
;
128 s
= wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline
;
130 s
= wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ")+ newline
;
132 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
);
134 s
= wxT("<title>SVG Picture created as ") + wxFileNameFromPath(filename
) + wxT(" </title>") + newline
;
136 s
= wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion
+ wxT(" </desc>")+ newline
;
138 s
= wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline
;
146 wxSVGFileImplDC::~wxSVGFileImplDC()
148 wxString s
= wxT("</g> \n</svg> \n") ;
153 void wxSVGFileImplDC::DoGetSizeMM( int *width
, int *height
) const
156 *width
= wxRound( (double)m_width
/ m_mm_to_pix_x
);
159 *height
= wxRound( (double)m_height
/ m_mm_to_pix_y
);
162 wxSize
wxSVGFileImplDC::GetPPI() const
164 return wxSize( wxRound(m_dpi
), wxRound(m_dpi
) );
167 void wxSVGFileImplDC::DoDrawLine (wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
)
169 if (m_graphics_changed
) NewGraphics ();
171 s
.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1
,y1
,x2
,y2
);
176 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawLine Call executed")) ;
177 CalcBoundingBox(x1
, y1
) ;
178 CalcBoundingBox(x2
, y2
) ;
182 void wxSVGFileImplDC::DoDrawLines(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
)
184 for ( int i
= 1; i
< n
; i
++ )
186 DoDrawLine ( points
[i
-1].x
+ xoffset
, points
[i
-1].y
+ yoffset
,
187 points
[ i
].x
+ xoffset
, points
[ i
].y
+ yoffset
) ;
192 void wxSVGFileImplDC::DoDrawPoint (wxCoord x1
, wxCoord y1
)
195 if (m_graphics_changed
) NewGraphics ();
196 s
= wxT("<g style = \"stroke-linecap:round;\" > ") + newline
;
198 DoDrawLine ( x1
,y1
,x1
,y1
);
204 void wxSVGFileImplDC::DoDrawCheckMark(wxCoord x1
, wxCoord y1
, wxCoord width
, wxCoord height
)
207 wxImplDC::DoDrawCheckMark (x1
,y1
,width
,height
) ;
209 wxDCBase::DoDrawCheckMark (x1
,y1
,width
,height
) ;
214 void wxSVGFileImplDC::DoDrawText(const wxString
& text
, wxCoord x1
, wxCoord y1
)
216 DoDrawRotatedText(text
, x1
,y1
,0.0);
217 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawText Call executed")) ;
221 void wxSVGFileImplDC::DoDrawRotatedText(const wxString
& sText
, wxCoord x
, wxCoord y
, double angle
)
223 //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
224 if (m_graphics_changed
) NewGraphics ();
227 // calculate bounding box
229 DoGetTextExtent(sText
, &w
, &h
, &desc
);
231 double rad
= DegToRad(angle
);
233 // wxT("upper left") and wxT("upper right")
234 CalcBoundingBox(x
, y
);
235 CalcBoundingBox((wxCoord
)(x
+ w
*cos(rad
)), (wxCoord
)(y
- h
*sin(rad
)));
237 // wxT("bottom left") and wxT("bottom right")
238 x
+= (wxCoord
)(h
*sin(rad
));
239 y
+= (wxCoord
)(h
*cos(rad
));
240 CalcBoundingBox(x
, y
);
241 CalcBoundingBox((wxCoord
)(x
+ h
*sin(rad
)), (wxCoord
)(y
+ h
*cos(rad
)));
243 if (m_backgroundMode
== wxSOLID
)
245 // draw background first
246 // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
248 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
249 sTmp
.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x
,y
+desc
-h
, w
, h
);
250 s
= sTmp
+ wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour
) + wxT("; ") ;
251 s
= s
+ wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour
) + wxT("; ") ;
252 sTmp
.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle
, x
,y
) ;
253 s
= s
+ sTmp
+ newline
;
256 //now do the text itself
257 s
.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x
,y
);
259 sTmp
= m_font
.GetFaceName () ;
260 if (sTmp
.Len () > 0) s
= s
+ wxT("style=\"font-family:") + sTmp
+ wxT("; ");
261 else s
= s
+ wxT("style=\" ") ;
263 wxString fontweights
[3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
264 s
= s
+ wxT("font-weight:") + fontweights
[m_font
.GetWeight() - wxNORMAL
] + semicolon
+ space
;
266 wxString fontstyles
[5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
267 s
= s
+ wxT("font-style:") + fontstyles
[m_font
.GetStyle() - wxNORMAL
] + semicolon
+ space
;
269 sTmp
.Printf (wxT("font-size:%dpt; fill:#"), m_font
.GetPointSize () );
271 s
= s
+ wxColStr (m_textForegroundColour
) + wxT("; stroke:#") + wxColStr (m_textForegroundColour
) + wxT("; ") ;
272 sTmp
.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle
, x
,y
) ;
273 s
= s
+ sTmp
+ sText
+ wxT("</text> ") + newline
;
278 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
283 void wxSVGFileImplDC::DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
285 DoDrawRoundedRectangle(x
, y
, width
, height
, 0) ;
289 void wxSVGFileImplDC::DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
, double radius
)
292 if (m_graphics_changed
) NewGraphics ();
295 s
.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
296 x
, y
, width
, height
, radius
);
298 s
= s
+ wxT(" /> ") + newline
;
301 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
302 CalcBoundingBox(x
, y
) ;
303 CalcBoundingBox(x
+ width
, y
+ height
) ;
308 void wxSVGFileImplDC::DoDrawPolygon(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
,int fillStyle
)
310 if (m_graphics_changed
) NewGraphics ();
312 s
= wxT("<polygon style=\"") ;
313 if ( fillStyle
== wxODDEVEN_RULE
)
314 s
= s
+ wxT("fill-rule:evenodd; ");
316 s
= s
+ wxT("fill-rule:nonzero; ");
318 s
= s
+ wxT("\" \npoints=\"") ;
320 for (int i
= 0; i
< n
; i
++)
322 sTmp
.Printf ( wxT("%d,%d"), points
[i
].x
+xoffset
, points
[i
].y
+yoffset
);
323 s
= s
+ sTmp
+ newline
;
324 CalcBoundingBox ( points
[i
].x
+xoffset
, points
[i
].y
+yoffset
);
326 s
= s
+ wxT("\" /> ") ;
330 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
334 void wxSVGFileImplDC::DoDrawEllipse (wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
337 if (m_graphics_changed
) NewGraphics ();
343 s
.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x
+rw
,y
+rh
, rw
, rh
);
344 s
= s
+ wxT(" /> ") + newline
;
348 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
349 CalcBoundingBox(x
, y
) ;
350 CalcBoundingBox(x
+ width
, y
+ height
) ;
354 void wxSVGFileImplDC::DoDrawArc(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
, wxCoord xc
, wxCoord yc
)
356 /* Draws an arc of a circle, centred on (xc, yc), with starting point
357 (x1, y1) and ending at (x2, y2). The current pen is used for the outline
358 and the current brush for filling the shape.
360 The arc is drawn in an anticlockwise direction from the start point to
363 Might be better described as Pie drawing */
365 if (m_graphics_changed
) NewGraphics ();
368 // we need the radius of the circle which has two estimates
369 double r1
= sqrt ( double( (x1
-xc
)*(x1
-xc
) ) + double( (y1
-yc
)*(y1
-yc
) ) );
370 double r2
= sqrt ( double( (x2
-xc
)*(x2
-xc
) ) + double( (y2
-yc
)*(y2
-yc
) ) );
372 wxASSERT_MSG( (fabs ( r2
-r1
) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
373 if ( fabs ( r2
-r1
) > 3 ) //pixels
375 s
= wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
379 double theta1
= atan2((double)(yc
-y1
),(double)(x1
-xc
));
380 if ( theta1
< 0 ) theta1
= theta1
+ M_PI
* 2;
381 double theta2
= atan2((double)(yc
-y2
), (double)(x2
-xc
));
382 if ( theta2
< 0 ) theta2
= theta2
+ M_PI
* 2;
383 if ( theta2
< theta1
) theta2
= theta2
+ M_PI
*2 ;
385 int fArc
; // flag for large or small arc 0 means less than 180 degrees
386 if ( fabs(theta2
- theta1
) > M_PI
) fArc
= 1; else fArc
= 0 ;
388 int fSweep
= 0 ; // flag for sweep always 0
390 s
.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
391 x1
,y1
, r1
, r2
, fArc
, fSweep
, x2
, y2
, xc
, yc
);
393 // the z means close the path and fill
394 s
= s
+ wxT(" \" /> ") + newline
;
402 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
406 void wxSVGFileImplDC::DoDrawEllipticArc(wxCoord x
,wxCoord y
,wxCoord w
,wxCoord h
,double sa
,double ea
)
409 Draws an arc of an ellipse. The current pen is used for drawing the arc
410 and the current brush is used for drawing the pie. This function is
411 currently only available for X window and PostScript device contexts.
413 x and y specify the x and y coordinates of the upper-left corner of the
414 rectangle that contains the ellipse.
416 width and height specify the width and height of the rectangle that
417 contains the ellipse.
419 start and end specify the start and end of the arc relative to the
420 three-o'clock position from the center of the rectangle. Angles are
421 specified in degrees (360 is a complete circle). Positive values mean
422 counter-clockwise motion. If start is equal to end, a complete ellipse
425 //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
427 if (m_graphics_changed
) NewGraphics ();
437 double xs
, ys
, xe
, ye
;
438 xs
= xc
+ rx
* cos (DegToRad(sa
)) ;
439 xe
= xc
+ rx
* cos (DegToRad(ea
)) ;
440 ys
= yc
- ry
* sin (DegToRad(sa
)) ;
441 ye
= yc
- ry
* sin (DegToRad(ea
)) ;
443 ///now same as circle arc...
445 double theta1
= atan2(ys
-yc
, xs
-xc
);
446 double theta2
= atan2(ye
-yc
, xe
-xc
);
448 int fArc
; // flag for large or small arc 0 means less than 180 degrees
449 if ( (theta2
- theta1
) > 0 ) fArc
= 1; else fArc
= 0 ;
452 if ( fabs(theta2
- theta1
) > M_PI
) fSweep
= 1; else fSweep
= 0 ;
454 s
.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
455 int(xs
), int(ys
), int(rx
), int(ry
),
456 fArc
, fSweep
, int(xe
), int(ye
), int(xc
), int(yc
) );
459 s
= s
+ wxT(" \" /> ") + newline
;
466 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
470 void wxSVGFileImplDC::DoGetTextExtent(const wxString
& string
, wxCoord
*w
, wxCoord
*h
, wxCoord
*descent
, wxCoord
*externalLeading
, const wxFont
*font
) const
475 sDC
.SetFont (m_font
);
476 if ( font
!= NULL
) sDC
.SetFont ( *font
);
477 sDC
.GetTextExtent(string
, w
, h
, descent
, externalLeading
);
478 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;
482 wxCoord
wxSVGFileImplDC::GetCharHeight() const
486 sDC
.SetFont (m_font
);
488 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
489 return ( sDC
.GetCharHeight() );
494 wxCoord
wxSVGFileImplDC::GetCharWidth() const
497 sDC
.SetFont (m_font
);
499 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
500 return ( sDC
.GetCharWidth() ) ;
505 /// Set Functions /////////////////////////////////////////////////////////////////
506 void wxSVGFileImplDC::SetBackground( const wxBrush
&brush
)
509 m_backgroundBrush
= brush
;
514 void wxSVGFileImplDC::SetBackgroundMode( int mode
)
516 m_backgroundMode
= mode
;
521 void wxSVGFileImplDC::SetBrush(const wxBrush
& brush
)
526 m_graphics_changed
= TRUE
;
527 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetBrush Call executed")) ;
531 void wxSVGFileImplDC::SetPen(const wxPen
& pen
)
533 // width, color, ends, joins : currently implemented
534 // dashes, stipple : not implemented
537 m_graphics_changed
= TRUE
;
538 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetPen Call executed")) ;
541 void wxSVGFileImplDC::NewGraphics ()
544 int w
= m_pen
.GetWidth ();
545 wxColour c
= m_pen
.GetColour () ;
547 wxString s
, sBrush
, sPenCap
, sPenJoin
, sPenStyle
, sLast
, sWarn
;
549 sBrush
= wxT("</g>\n<g style=\"") + wxBrushString ( m_brush
.GetColour (), m_brush
.GetStyle () )
550 + wxT(" stroke:#") + wxColStr (c
) + wxT("; ") ;
552 switch ( m_pen
.GetCap () )
554 case wxCAP_PROJECTING
:
555 sPenCap
= wxT("stroke-linecap:square; ") ;
558 sPenCap
= wxT("stroke-linecap:butt; ") ;
562 sPenCap
= wxT("stroke-linecap:round; ") ;
564 switch ( m_pen
.GetJoin () )
567 sPenJoin
= wxT("stroke-linejoin:bevel; ") ;
570 sPenJoin
= wxT("stroke-linejoin:miter; ") ;
574 sPenJoin
= wxT("stroke-linejoin:round; ") ;
577 switch ( m_pen
.GetStyle () )
580 sPenStyle
= wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
583 sPenStyle
= wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
586 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
587 sWarn
= sWarn
+ wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
590 sLast
.Printf( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
591 w
, (double)m_logicalOriginX
, m_logicalOriginY
, m_scaleX
, m_scaleY
);
593 s
= sBrush
+ sPenCap
+ sPenJoin
+ sPenStyle
+ sLast
+ newline
+ sWarn
;
595 m_graphics_changed
= FALSE
;
596 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
600 void wxSVGFileImplDC::SetFont(const wxFont
& font
)
605 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetFont Call executed")) ;
609 // export a bitmap as a raster image in png
610 bool wxSVGFileImplDC::DoBlit(wxCoord xdest
, wxCoord ydest
, wxCoord width
, wxCoord height
,
611 wxDC
* source
, wxCoord xsrc
, wxCoord ysrc
,
612 int logicalFunc
/*= wxCOPY*/, bool useMask
/*= FALSE*/,
613 wxCoord
/*xsrcMask = -1*/, wxCoord
/*ysrcMask = -1*/)
615 if (logicalFunc
!= wxCOPY
)
617 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
620 if (useMask
!= FALSE
)
622 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
625 wxBitmap
myBitmap (width
, height
) ;
627 memDC
.SelectObject( myBitmap
);
628 memDC
.Blit(0, 0, width
, height
, source
, xsrc
, ysrc
);
629 memDC
.SelectObject( wxNullBitmap
);
630 DoDrawBitmap(myBitmap
, xdest
, ydest
);
631 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoBlit Call executed")) ;
635 void wxSVGFileImplDC::DoDrawIcon(const class wxIcon
& myIcon
, wxCoord x
, wxCoord y
)
637 wxBitmap
myBitmap (myIcon
.GetWidth(), myIcon
.GetHeight() ) ;
639 memDC
.SelectObject( myBitmap
);
640 memDC
.DrawIcon(myIcon
,0,0);
641 memDC
.SelectObject( wxNullBitmap
);
642 DoDrawBitmap(myBitmap
, x
, y
);
643 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
647 void wxSVGFileImplDC::DoDrawBitmap(const class wxBitmap
& bmp
, wxCoord x
, wxCoord y
, bool WXUNUSED(bTransparent
) /*=0*/ )
649 if (m_graphics_changed
) NewGraphics ();
651 wxString sTmp
, s
, sPNG
;
652 if ( wxImage::FindHandler(wxBITMAP_TYPE_PNG
) == NULL
)
653 wxImage::AddHandler(new wxPNGHandler
);
655 // create suitable file name
656 sTmp
.Printf ( wxT("_image%d.png"), m_sub_images
);
657 sPNG
= m_filename
.BeforeLast(wxT('.')) + sTmp
;
658 while (wxFile::Exists(sPNG
) )
661 sTmp
.Printf ( wxT("_image%d.png"), m_sub_images
);
662 sPNG
= m_filename
.BeforeLast(wxT('.')) + sTmp
;
665 //create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
666 wxBitmap myBitmap
= bmp
;
668 bool bPNG_OK
= myBitmap
.SaveFile(sPNG
,wxBITMAP_TYPE_PNG
);
670 // refrence the bitmap from the SVG doc
671 int w
= myBitmap
.GetWidth();
672 int h
= myBitmap
.GetHeight();
673 sTmp
.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x
,y
,w
,h
);
675 sTmp
.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG
.c_str() );
676 s
= s
+ sTmp
+ wxT("<title>Image from wxSVG</title> </image>") + newline
;
682 m_OK
= m_outfile
->Ok () && bPNG_OK
;
683 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
688 void wxSVGFileImplDC::write(const wxString
&s
)
690 const wxCharBuffer buf
= s
.utf8_str();
691 m_outfile
->Write(buf
, strlen((const char *)buf
));
692 m_OK
= m_outfile
->Ok();
695 // ---------------------------------------------------------------------------
696 // coordinates transformations
697 // ---------------------------------------------------------------------------
701 void wxSVGFileImplDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp
)
703 wxDCBase::SetAxisOrientation( xLeftRight
, yBottomUp
);
706 void wxSVGFileImplDC::SetMapMode(int mode
)
708 wxDCBase::SetMapMode(mode
);
711 void wxSVGFileImplDC::SetUserScale(double x
, double y
)
713 wxDCBase::SetUserScale(x
,y
);
716 void wxSVGFileImplDC::SetLogicalScale(double x
, double y
)
718 wxDCBase::SetLogicalScale(x
,y
);
721 void wxSVGFileImplDC::SetLogicalOrigin(wxCoord x
, wxCoord y
)
723 wxDCBase::SetLogicalOrigin(x
,y
);
726 void wxSVGFileImplDC::SetDeviceOrigin(wxCoord x
, wxCoord y
)
728 wxDCBase::SetDeviceOrigin(x
,y
);