]>
git.saurik.com Git - wxWidgets.git/blob - src/common/dcsvg.cpp
ad0f6426cc8e28a7cec5f5fdad8b6d371db81acd
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"
25 #include "wx/wfstream.h"
27 #define wxSVG_DEBUG FALSE
28 // or TRUE to see the calls being executed
30 #define newline wxString(wxT("\n"))
31 #define space wxString(wxT(" "))
32 #define semicolon wxString(wxT(";"))
33 #define wx_round(a) (int)((a)+.5)
35 static inline double DegToRad(double deg
) { return (deg
* M_PI
) / 180.0; }
37 wxString
wxColStr ( wxColour c
)
39 unsigned char r
, g
, b
;
44 // possible Unicode bug here
45 wxString s
= wxDecToHex(r
) + wxDecToHex(g
) + wxDecToHex(b
) ;
50 wxString
wxBrushString ( wxColour c
, int style
)
52 wxString s
= wxT("fill:#") + wxColStr (c
) + semicolon
+ space
;
56 s
= s
+ wxT("fill-opacity:1.0; ");
59 s
= s
+ wxT("fill-opacity:0.0; ");
63 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
70 // ----------------------------------------------------------
72 // ----------------------------------------------------------
74 IMPLEMENT_ABSTRACT_CLASS(wxSVGFileDC
, wxDC
)
76 void wxSVGFileDC::Init (wxString f
, int Width
, int Height
, float dpi
)
84 m_mm_to_pix_x
= dpi
/25.4;
85 m_mm_to_pix_y
= dpi
/25.4;
87 m_backgroundBrush
= *wxTRANSPARENT_BRUSH
;
88 m_textForegroundColour
= *wxBLACK
;
89 m_textBackgroundColour
= *wxWHITE
;
90 m_colour
= wxColourDisplay();
93 m_font
= *wxNORMAL_FONT
;
94 m_brush
= *wxWHITE_BRUSH
;
96 m_graphics_changed
= TRUE
;
98 ////////////////////code here
100 m_outfile
= new wxFileOutputStream(f
) ;
101 m_OK
= m_outfile
->Ok ();
107 s
= wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s
= s
+ newline
;
109 s
= wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline
;
111 s
= wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ")+ newline
;
113 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
);
115 s
= wxT("<title>SVG Picture created as ") + wxFileNameFromPath(f
) + wxT(" </title>") + newline
;
117 s
= wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion
+ wxT(" </desc>")+ newline
;
119 s
= wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline
;
127 wxSVGFileDC::wxSVGFileDC (wxString f
)
129 // quarter 640x480 screen display at 72 dpi
130 Init (f
,320,240,72.0);
133 wxSVGFileDC::wxSVGFileDC (wxString f
, int Width
, int Height
)
135 Init (f
,Width
,Height
,72.0);
138 wxSVGFileDC::wxSVGFileDC (wxString f
, int Width
, int Height
, float dpi
)
140 Init (f
,Width
,Height
,dpi
);
143 wxSVGFileDC::~wxSVGFileDC()
145 wxString s
= wxT("</g> \n</svg> \n") ;
151 //////////////////////////////////////////////////////////////////////////////////////////
153 void wxSVGFileDC::DoDrawLine (wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
)
155 if (m_graphics_changed
) NewGraphics ();
157 s
.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1
,y1
,x2
,y2
);
162 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawLine Call executed")) ;
163 CalcBoundingBox(x1
, y1
) ;
164 CalcBoundingBox(x2
, y2
) ;
168 void wxSVGFileDC::DoDrawLines(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
)
170 for ( int i
= 1; i
< n
; i
++ )
172 DoDrawLine ( points
[i
-1].x
+ xoffset
, points
[i
-1].y
+ yoffset
,
173 points
[ i
].x
+ xoffset
, points
[ i
].y
+ yoffset
) ;
178 void wxSVGFileDC::DoDrawPoint (wxCoord x1
, wxCoord y1
)
181 if (m_graphics_changed
) NewGraphics ();
182 s
= wxT("<g style = \"stroke-linecap:round;\" > ") + newline
;
184 DrawLine ( x1
,y1
,x1
,y1
);
190 void wxSVGFileDC::DoDrawCheckMark(wxCoord x1
, wxCoord y1
, wxCoord width
, wxCoord height
)
192 wxDCBase::DoDrawCheckMark (x1
,y1
,width
,height
) ;
196 void wxSVGFileDC::DoDrawText(const wxString
& text
, wxCoord x1
, wxCoord y1
)
198 DoDrawRotatedText(text
, x1
,y1
,0.0);
199 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawText Call executed")) ;
203 void wxSVGFileDC::DoDrawRotatedText(const wxString
& sText
, wxCoord x
, wxCoord y
, double angle
)
205 //known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
206 if (m_graphics_changed
) NewGraphics ();
209 // calculate bounding box
211 DoGetTextExtent(sText
, &w
, &h
, &desc
);
213 double rad
= DegToRad(angle
);
215 // wxT("upper left") and wxT("upper right")
216 CalcBoundingBox(x
, y
);
217 CalcBoundingBox((wxCoord
)(x
+ w
*cos(rad
)), (wxCoord
)(y
- h
*sin(rad
)));
219 // wxT("bottom left") and wxT("bottom right")
220 x
+= (wxCoord
)(h
*sin(rad
));
221 y
+= (wxCoord
)(h
*cos(rad
));
222 CalcBoundingBox(x
, y
);
223 CalcBoundingBox((wxCoord
)(x
+ h
*sin(rad
)), (wxCoord
)(y
+ h
*cos(rad
)));
225 if (m_backgroundMode
== wxSOLID
)
227 // draw background first
228 // just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
230 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
231 sTmp
.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x
,y
+desc
-h
, w
, h
);
232 s
= sTmp
+ wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour
) + wxT("; ") ;
233 s
= s
+ wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour
) + wxT("; ") ;
234 sTmp
.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle
, x
,y
) ;
235 s
= s
+ sTmp
+ newline
;
238 //now do the text itself
239 s
.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x
,y
);
241 sTmp
= m_font
.GetFaceName () ;
242 if (sTmp
.Len () > 0) s
= s
+ wxT("style=\"font-family:") + sTmp
+ wxT("; ");
243 else s
= s
+ wxT("style=\" ") ;
245 wxString fontweights
[3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
246 s
= s
+ wxT("font-weight:") + fontweights
[m_font
.GetWeight() - wxNORMAL
] + semicolon
+ space
;
248 wxString fontstyles
[5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
249 s
= s
+ wxT("font-style:") + fontstyles
[m_font
.GetStyle() - wxNORMAL
] + semicolon
+ space
;
251 sTmp
.Printf (wxT("font-size:%dpt; fill:#"), m_font
.GetPointSize () );
253 s
= s
+ wxColStr (m_textForegroundColour
) + wxT("; stroke:#") + wxColStr (m_textForegroundColour
) + wxT("; ") ;
254 sTmp
.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle
, x
,y
) ;
255 s
= s
+ sTmp
+ sText
+ wxT("</text> ") + newline
;
260 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
265 void wxSVGFileDC::DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
267 DoDrawRoundedRectangle(x
, y
, width
, height
, 0) ;
271 void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
, double radius
)
274 if (m_graphics_changed
) NewGraphics ();
277 s
.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
278 x
, y
, width
, height
, radius
);
280 s
= s
+ wxT(" /> ") + newline
;
283 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
284 CalcBoundingBox(x
, y
) ;
285 CalcBoundingBox(x
+ width
, y
+ height
) ;
290 void wxSVGFileDC::DoDrawPolygon(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
,int fillStyle
)
292 if (m_graphics_changed
) NewGraphics ();
294 s
= wxT("<polygon style=\"") ;
295 if ( fillStyle
== wxODDEVEN_RULE
)
296 s
= s
+ wxT("fill-rule:evenodd; ");
298 s
= s
+ wxT("fill-rule:nonzero; ");
300 s
= s
+ wxT("\" \npoints=\"") ;
302 for (int i
= 0; i
< n
; i
++)
304 sTmp
.Printf ( wxT("%d,%d"), points
[i
].x
+xoffset
, points
[i
].y
+yoffset
);
305 s
= s
+ sTmp
+ newline
;
306 CalcBoundingBox ( points
[i
].x
+xoffset
, points
[i
].y
+yoffset
);
308 s
= s
+ wxT("\" /> ") ;
312 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
316 void wxSVGFileDC::DoDrawEllipse (wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
319 if (m_graphics_changed
) NewGraphics ();
325 s
.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x
+rw
,y
+rh
, rw
, rh
);
326 s
= s
+ wxT(" /> ") + newline
;
330 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
331 CalcBoundingBox(x
, y
) ;
332 CalcBoundingBox(x
+ width
, y
+ height
) ;
336 void wxSVGFileDC::DoDrawArc(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
, wxCoord xc
, wxCoord yc
)
338 /* Draws an arc of a circle, centred on (xc, yc), with starting point
339 (x1, y1) and ending at (x2, y2). The current pen is used for the outline
340 and the current brush for filling the shape.
342 The arc is drawn in an anticlockwise direction from the start point to
345 Might be better described as Pie drawing */
347 if (m_graphics_changed
) NewGraphics ();
350 // we need the radius of the circle which has two estimates
351 double r1
= sqrt ( double( (x1
-xc
)*(x1
-xc
) ) + double( (y1
-yc
)*(y1
-yc
) ) );
352 double r2
= sqrt ( double( (x2
-xc
)*(x2
-xc
) ) + double( (y2
-yc
)*(y2
-yc
) ) );
354 wxASSERT_MSG( (fabs ( r2
-r1
) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
355 if ( fabs ( r2
-r1
) > 3 ) //pixels
357 s
= wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
361 double theta1
= atan2((double)(yc
-y1
),(double)(x1
-xc
));
362 if ( theta1
< 0 ) theta1
= theta1
+ M_PI
* 2;
363 double theta2
= atan2((double)(yc
-y2
), (double)(x2
-xc
));
364 if ( theta2
< 0 ) theta2
= theta2
+ M_PI
* 2;
365 if ( theta2
< theta1
) theta2
= theta2
+ M_PI
*2 ;
367 int fArc
; // flag for large or small arc 0 means less than 180 degrees
368 if ( fabs(theta2
- theta1
) > M_PI
) fArc
= 1; else fArc
= 0 ;
370 int fSweep
= 0 ; // flag for sweep always 0
372 s
.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
373 x1
,y1
, r1
, r2
, fArc
, fSweep
, x2
, y2
, xc
, yc
);
375 // the z means close the path and fill
376 s
= s
+ wxT(" \" /> ") + newline
;
384 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
388 void wxSVGFileDC::DoDrawEllipticArc(wxCoord x
,wxCoord y
,wxCoord w
,wxCoord h
,double sa
,double ea
)
391 Draws an arc of an ellipse. The current pen is used for drawing the arc
392 and the current brush is used for drawing the pie. This function is
393 currently only available for X window and PostScript device contexts.
395 x and y specify the x and y coordinates of the upper-left corner of the
396 rectangle that contains the ellipse.
398 width and height specify the width and height of the rectangle that
399 contains the ellipse.
401 start and end specify the start and end of the arc relative to the
402 three-o'clock position from the center of the rectangle. Angles are
403 specified in degrees (360 is a complete circle). Positive values mean
404 counter-clockwise motion. If start is equal to end, a complete ellipse
407 //known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
409 if (m_graphics_changed
) NewGraphics ();
419 double xs
, ys
, xe
, ye
;
420 xs
= xc
+ rx
* cos (DegToRad(sa
)) ;
421 xe
= xc
+ rx
* cos (DegToRad(ea
)) ;
422 ys
= yc
- ry
* sin (DegToRad(sa
)) ;
423 ye
= yc
- ry
* sin (DegToRad(ea
)) ;
425 ///now same as circle arc...
427 double theta1
= atan2(ys
-yc
, xs
-xc
);
428 double theta2
= atan2(ye
-yc
, xe
-xc
);
430 int fArc
; // flag for large or small arc 0 means less than 180 degrees
431 if ( (theta2
- theta1
) > 0 ) fArc
= 1; else fArc
= 0 ;
434 if ( fabs(theta2
- theta1
) > M_PI
) fSweep
= 1; else fSweep
= 0 ;
436 s
.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
437 int(xs
), int(ys
), int(rx
), int(ry
),
438 fArc
, fSweep
, int(xe
), int(ye
), int(xc
), int(yc
) );
441 s
= s
+ wxT(" \" /> ") + newline
;
448 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
452 void wxSVGFileDC::DoGetTextExtent(const wxString
& string
, wxCoord
*w
, wxCoord
*h
, wxCoord
*descent
, wxCoord
*externalLeading
, const wxFont
*font
) const
457 sDC
.SetFont (m_font
);
458 if ( font
!= NULL
) sDC
.SetFont ( *font
);
459 sDC
.GetTextExtent(string
, w
, h
, descent
, externalLeading
);
460 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;
464 wxCoord
wxSVGFileDC::GetCharHeight() const
468 sDC
.SetFont (m_font
);
470 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
471 return ( sDC
.GetCharHeight() );
476 wxCoord
wxSVGFileDC::GetCharWidth() const
479 sDC
.SetFont (m_font
);
481 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
482 return ( sDC
.GetCharWidth() ) ;
487 /// Set Functions /////////////////////////////////////////////////////////////////
488 void wxSVGFileDC::SetBackground( const wxBrush
&brush
)
491 m_backgroundBrush
= brush
;
496 void wxSVGFileDC::SetBackgroundMode( int mode
)
498 m_backgroundMode
= mode
;
503 void wxSVGFileDC::SetBrush(const wxBrush
& brush
)
508 m_graphics_changed
= TRUE
;
509 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetBrush Call executed")) ;
513 void wxSVGFileDC::SetPen(const wxPen
& pen
)
515 // width, color, ends, joins : currently implemented
516 // dashes, stipple : not implemented
519 m_graphics_changed
= TRUE
;
520 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetPen Call executed")) ;
523 void wxSVGFileDC::NewGraphics ()
526 int w
= m_pen
.GetWidth ();
527 wxColour c
= m_pen
.GetColour () ;
529 wxString s
, sBrush
, sPenCap
, sPenJoin
, sPenStyle
, sLast
, sWarn
;
531 sBrush
= wxT("</g>\n<g style=\"") + wxBrushString ( m_brush
.GetColour (), m_brush
.GetStyle () )
532 + wxT(" stroke:#") + wxColStr (c
) + wxT("; ") ;
534 switch ( m_pen
.GetCap () )
536 case wxCAP_PROJECTING
:
537 sPenCap
= wxT("stroke-linecap:square; ") ;
540 sPenCap
= wxT("stroke-linecap:butt; ") ;
544 sPenCap
= wxT("stroke-linecap:round; ") ;
546 switch ( m_pen
.GetJoin () )
549 sPenJoin
= wxT("stroke-linejoin:bevel; ") ;
552 sPenJoin
= wxT("stroke-linejoin:miter; ") ;
556 sPenJoin
= wxT("stroke-linejoin:round; ") ;
559 switch ( m_pen
.GetStyle () )
562 sPenStyle
= wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
565 sPenStyle
= wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
568 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
569 sWarn
= sWarn
+ wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
572 sLast
.Printf( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
573 w
, (double)m_logicalOriginX
, m_logicalOriginY
, m_scaleX
, m_scaleY
);
575 s
= sBrush
+ sPenCap
+ sPenJoin
+ sPenStyle
+ sLast
+ newline
+ sWarn
;
577 m_graphics_changed
= FALSE
;
578 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
582 void wxSVGFileDC::SetFont(const wxFont
& font
)
587 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::SetFont Call executed")) ;
591 // export a bitmap as a raster image in png
592 bool wxSVGFileDC::DoBlit(wxCoord xdest
, wxCoord ydest
, wxCoord width
, wxCoord height
,
593 wxDC
* source
, wxCoord xsrc
, wxCoord ysrc
,
594 int logicalFunc
/*= wxCOPY*/, bool useMask
/*= FALSE*/,
595 wxCoord
/*xsrcMask = -1*/, wxCoord
/*ysrcMask = -1*/)
597 if (logicalFunc
!= wxCOPY
)
599 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
602 if (useMask
!= FALSE
)
604 wxASSERT_MSG(FALSE
, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
607 wxBitmap
myBitmap (width
, height
) ;
609 memDC
.SelectObject( myBitmap
);
610 memDC
.Blit(0, 0, width
, height
, source
, xsrc
, ysrc
);
611 memDC
.SelectObject( wxNullBitmap
);
612 DoDrawBitmap(myBitmap
, xdest
, ydest
);
613 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoBlit Call executed")) ;
617 void wxSVGFileDC::DoDrawIcon(const class wxIcon
& myIcon
, wxCoord x
, wxCoord y
)
619 wxBitmap
myBitmap (myIcon
.GetWidth(), myIcon
.GetHeight() ) ;
621 memDC
.SelectObject( myBitmap
);
622 memDC
.DrawIcon(myIcon
,0,0);
623 memDC
.SelectObject( wxNullBitmap
);
624 DoDrawBitmap(myBitmap
, x
, y
);
625 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
629 void wxSVGFileDC::DoDrawBitmap(const class wxBitmap
& bmp
, wxCoord x
, wxCoord y
, bool WXUNUSED(bTransparent
) /*=0*/ )
631 if (m_graphics_changed
) NewGraphics ();
633 wxString sTmp
, s
, sPNG
;
634 wxImage::AddHandler(new wxPNGHandler
);
636 // create suitable file name
637 sTmp
.Printf ( wxT("_image%d.png"), m_sub_images
);
638 sPNG
= m_filename
.BeforeLast(wxT('.')) + sTmp
;
639 while (wxFile::Exists(sPNG
) )
642 sTmp
.Printf ( wxT("_image%d.png"), m_sub_images
);
643 sPNG
= m_filename
.BeforeLast(wxT('.')) + sTmp
;
646 //create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
647 wxBitmap myBitmap
= bmp
;
649 bool bPNG_OK
= myBitmap
.SaveFile(sPNG
,wxBITMAP_TYPE_PNG
);
651 // refrence the bitmap from the SVG doc
652 int w
= myBitmap
.GetWidth();
653 int h
= myBitmap
.GetHeight();
654 sTmp
.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x
,y
,w
,h
);
656 sTmp
.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG
.c_str() );
657 s
= s
+ sTmp
+ wxT("<title>Image from wxSVG</title> </image>") + newline
;
663 m_OK
= m_outfile
->Ok () && bPNG_OK
;
664 wxASSERT_MSG(!wxSVG_DEBUG
, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
669 void wxSVGFileDC::write(const wxString
&s
)
671 const wxCharBuffer buf
= s
.utf8_str();
672 m_outfile
->Write(buf
, strlen((const char *)buf
));
673 m_OK
= m_outfile
->Ok();
676 // ---------------------------------------------------------------------------
677 // coordinates transformations
678 // ---------------------------------------------------------------------------
680 void wxSVGFileDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp
)
682 wxDCBase::SetAxisOrientation( xLeftRight
, yBottomUp
);
685 void wxSVGFileDC::SetMapMode(int mode
)
687 wxDCBase::SetMapMode(mode
);
690 void wxSVGFileDC::SetUserScale(double x
, double y
)
692 wxDCBase::SetUserScale(x
,y
);
695 void wxSVGFileDC::SetLogicalScale(double x
, double y
)
697 wxDCBase::SetLogicalScale(x
,y
);
700 void wxSVGFileDC::SetLogicalOrigin(wxCoord x
, wxCoord y
)
702 wxDCBase::SetLogicalOrigin(x
,y
);
705 void wxSVGFileDC::SetDeviceOrigin(wxCoord x
, wxCoord y
)
707 wxDCBase::SetDeviceOrigin(x
,y
);