diff --git a/include/wx/dcsvg.h b/include/wx/dcsvg.h index 0c4fdd575a..2a64f8882c 100644 --- a/include/wx/dcsvg.h +++ b/include/wx/dcsvg.h @@ -12,6 +12,7 @@ #define _WX_DCSVG_H_ #include "wx/string.h" +#include "wx/filename.h" #include "wx/dc.h" #if wxUSE_SVG @@ -40,13 +41,26 @@ public: }; // Predefined standard bitmap handler: creates a file, stores the bitmap in -// this file and uses the file URI in the generated SVG. +// this file and uses the file name in the generated SVG. class WXDLLIMPEXP_CORE wxSVGBitmapFileHandler : public wxSVGBitmapHandler { public: + wxSVGBitmapFileHandler() + : m_path() + { + } + + explicit wxSVGBitmapFileHandler(const wxFileName& path) + : m_path(path) + { + } + virtual bool ProcessBitmap(const wxBitmap& bitmap, wxCoord x, wxCoord y, wxOutputStream& stream) const wxOVERRIDE; + +private: + wxFileName m_path; // When set, name will be appended with _image#.png }; // Predefined handler which embeds the bitmap (base64-encoding it) inside the @@ -62,9 +76,9 @@ public: class WXDLLIMPEXP_CORE wxSVGFileDCImpl : public wxDCImpl { public: - wxSVGFileDCImpl( wxSVGFileDC *owner, const wxString &filename, - int width = 320, int height = 240, double dpi = 72.0, - const wxString &title = wxString() ); + wxSVGFileDCImpl(wxSVGFileDC *owner, const wxString &filename, + int width = 320, int height = 240, double dpi = 72.0, + const wxString &title = wxString()); virtual ~wxSVGFileDCImpl(); @@ -122,8 +136,8 @@ public: m_graphics_changed = true; } - virtual void SetBackground( const wxBrush &brush ) wxOVERRIDE; - virtual void SetBackgroundMode( int mode ) wxOVERRIDE; + virtual void SetBackground(const wxBrush &brush) wxOVERRIDE; + virtual void SetBackgroundMode(int mode) wxOVERRIDE; virtual void SetBrush(const wxBrush& brush) wxOVERRIDE; virtual void SetFont(const wxFont& font) wxOVERRIDE; virtual void SetPen(const wxPen& pen) wxOVERRIDE; @@ -133,125 +147,124 @@ public: void SetBitmapHandler(wxSVGBitmapHandler* handler); private: - virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const wxOVERRIDE - { - wxFAIL_MSG(wxT("wxSVGFILEDC::DoGetPixel Call not implemented")); - return true; - } + virtual bool DoGetPixel(wxCoord, wxCoord, wxColour *) const wxOVERRIDE + { + wxFAIL_MSG(wxT("wxSVGFILEDC::DoGetPixel Call not implemented")); + return true; + } - virtual bool DoBlit(wxCoord, wxCoord, wxCoord, wxCoord, wxDC *, - wxCoord, wxCoord, wxRasterOperationMode = wxCOPY, - bool = 0, int = -1, int = -1) wxOVERRIDE; + virtual bool DoBlit(wxCoord, wxCoord, wxCoord, wxCoord, wxDC *, + wxCoord, wxCoord, wxRasterOperationMode = wxCOPY, + bool = 0, int = -1, int = -1) wxOVERRIDE; - virtual void DoCrossHair(wxCoord, wxCoord) wxOVERRIDE - { - wxFAIL_MSG(wxT("wxSVGFILEDC::CrossHair Call not implemented")); - } + virtual void DoCrossHair(wxCoord, wxCoord) wxOVERRIDE + { + wxFAIL_MSG(wxT("wxSVGFILEDC::CrossHair Call not implemented")); + } - virtual void DoDrawArc(wxCoord, wxCoord, wxCoord, wxCoord, wxCoord, wxCoord) wxOVERRIDE; + virtual void DoDrawArc(wxCoord, wxCoord, wxCoord, wxCoord, wxCoord, wxCoord) wxOVERRIDE; - virtual void DoDrawBitmap(const wxBitmap &, wxCoord, wxCoord, bool = false) wxOVERRIDE; + virtual void DoDrawBitmap(const wxBitmap &, wxCoord, wxCoord, bool = false) wxOVERRIDE; - virtual void DoDrawCheckMark(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; - virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; - virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, - double sa, double ea) wxOVERRIDE; + virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea) wxOVERRIDE; - virtual void DoDrawIcon(const wxIcon &, wxCoord, wxCoord) wxOVERRIDE; + virtual void DoDrawIcon(const wxIcon &, wxCoord, wxCoord) wxOVERRIDE; - virtual void DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) wxOVERRIDE; + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) wxOVERRIDE; - virtual void DoDrawLines(int n, const wxPoint points[], - wxCoord xoffset = 0, wxCoord yoffset = 0) wxOVERRIDE; + virtual void DoDrawLines(int n, const wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0) wxOVERRIDE; - virtual void DoDrawPoint(wxCoord, wxCoord) wxOVERRIDE; + virtual void DoDrawPoint(wxCoord, wxCoord) wxOVERRIDE; - virtual void DoDrawPolygon(int n, const wxPoint points[], - wxCoord xoffset, wxCoord yoffset, - wxPolygonFillMode fillStyle) wxOVERRIDE; + virtual void DoDrawPolygon(int n, const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle) wxOVERRIDE; - virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], - wxCoord xoffset, wxCoord yoffset, - wxPolygonFillMode fillStyle) wxOVERRIDE; + virtual void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle) wxOVERRIDE; - virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h) wxOVERRIDE; - virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, - double angle) wxOVERRIDE; + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle) wxOVERRIDE; - virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, - wxCoord w, wxCoord h, - double radius = 20) wxOVERRIDE ; + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord w, wxCoord h, + double radius = 20) wxOVERRIDE; - virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) wxOVERRIDE; + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) wxOVERRIDE; - virtual bool DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), - const wxColour& WXUNUSED(col), - wxFloodFillStyle WXUNUSED(style) = wxFLOOD_SURFACE) wxOVERRIDE - { - wxFAIL_MSG(wxT("wxSVGFILEDC::DoFloodFill Call not implemented")); - return false; - } + virtual bool DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + const wxColour& WXUNUSED(col), + wxFloodFillStyle WXUNUSED(style) = wxFLOOD_SURFACE) wxOVERRIDE + { + wxFAIL_MSG(wxT("wxSVGFILEDC::DoFloodFill Call not implemented")); + return false; + } - virtual void DoGetSize(int * x, int *y) const wxOVERRIDE - { - if ( x ) - *x = m_width; - if ( y ) - *y = m_height; - } + virtual void DoGetSize(int * x, int *y) const wxOVERRIDE + { + if ( x ) + *x = m_width; + if ( y ) + *y = m_height; + } - virtual void DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, - wxCoord *descent = NULL, - wxCoord *externalLeading = NULL, - const wxFont *font = NULL) const wxOVERRIDE; + virtual void DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + const wxFont *font = NULL) const wxOVERRIDE; - virtual void DoSetDeviceClippingRegion(const wxRegion& region) wxOVERRIDE - { + virtual void DoSetDeviceClippingRegion(const wxRegion& region) wxOVERRIDE + { DoSetClippingRegion(region.GetBox().x, region.GetBox().y, region.GetBox().width, region.GetBox().height); - } + } - virtual void DoSetClippingRegion(int x, int y, int width, int height) wxOVERRIDE; + virtual void DoSetClippingRegion(int x, int y, int width, int height) wxOVERRIDE; - virtual void DoGetSizeMM( int *width, int *height ) const wxOVERRIDE; + virtual void DoGetSizeMM(int *width, int *height) const wxOVERRIDE; - virtual wxSize GetPPI() const wxOVERRIDE; + virtual wxSize GetPPI() const wxOVERRIDE; - void Init (const wxString &filename, int width, int height, + void Init(const wxString &filename, int width, int height, double dpi, const wxString &title); - void write( const wxString &s ); + void write(const wxString &s); private: - // If m_graphics_changed is true, close the current element and start a - // new one for the last pen/brush change. - void NewGraphicsIfNeeded(); + // If m_graphics_changed is true, close the current element and start a + // new one for the last pen/brush change. + void NewGraphicsIfNeeded(); - // Open a new graphics group setting up all the attributes according to - // their current values in wxDC. - void DoStartNewGraphics(); + // Open a new graphics group setting up all the attributes according to + // their current values in wxDC. + void DoStartNewGraphics(); - wxString m_filename; - int m_sub_images; // number of png format images we have - bool m_OK; - bool m_graphics_changed; // set by Set{Brush,Pen}() - int m_width, m_height; - double m_dpi; - wxScopedPtr m_outfile; - wxScopedPtr m_bmp_handler; // class to handle bitmaps + wxString m_filename; + bool m_OK; + bool m_graphics_changed; // set by Set{Brush,Pen}() + int m_width, m_height; + double m_dpi; + wxScopedPtr m_outfile; + wxScopedPtr m_bmp_handler; // class to handle bitmaps - // The clipping nesting level is incremented by every call to - // SetClippingRegion() and reset when DestroyClippingRegion() is called. - size_t m_clipNestingLevel; + // The clipping nesting level is incremented by every call to + // SetClippingRegion() and reset when DestroyClippingRegion() is called. + size_t m_clipNestingLevel; - // Unique ID for every clipping graphics group: this is simply always - // incremented in each SetClippingRegion() call. - size_t m_clipUniqueId; + // Unique ID for every clipping graphics group: this is simply always + // incremented in each SetClippingRegion() call. + size_t m_clipUniqueId; - wxDECLARE_ABSTRACT_CLASS(wxSVGFileDCImpl); + wxDECLARE_ABSTRACT_CLASS(wxSVGFileDCImpl); }; diff --git a/interface/wx/dcsvg.h b/interface/wx/dcsvg.h index 7ae2f84523..f4d55e22a1 100644 --- a/interface/wx/dcsvg.h +++ b/interface/wx/dcsvg.h @@ -28,8 +28,9 @@ as the SVG file, however it is possible to change this behaviour by replacing the built in bitmap handler using wxSVGFileDC::SetBitmapHandler(). - A more substantial SVG library (for reading and writing) is available at - the wxArt2D website . + More substantial SVG libraries (for reading and writing) are available at + wxArt2D and + wxSVG. @library{wxcore} @category{dc} @@ -39,28 +40,13 @@ class wxSVGFileDC : public wxDC { public: /** - Initializes a wxSVGFileDC with the given @a f filename with the given - @a Width and @a Height at @a dpi resolution, and an optional @a title. + Initializes a wxSVGFileDC with the given @a filename, @a width and + @a height at @a dpi resolution, and an optional @a title. The title provides a readable name for the SVG document. */ wxSVGFileDC(const wxString& filename, int width = 320, int height = 240, double dpi = 72, const wxString& title = wxString()); - /** - Destructor. - */ - virtual ~wxSVGFileDC(); - - /** - Does nothing. - */ - void EndDoc(); - - /** - Does nothing. - */ - void EndPage(); - /** Draws a rectangle the size of the SVG using the wxDC::SetBackground() brush. */ @@ -88,12 +74,6 @@ public: */ void SetBitmapHandler(wxSVGBitmapHandler* handler); - /** - Does the same as wxDC::SetLogicalFunction(), except that only wxCOPY is - available. Trying to set one of the other values will fail. - */ - void SetLogicalFunction(wxRasterOperationMode function); - /** Sets the clipping region for this device context to the intersection of the given region described by the parameters of this method and the previously @@ -105,24 +85,6 @@ public: void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); - /** - This is an overloaded member function, provided for convenience. It differs from the - above function only in what argument(s) it accepts. - */ - void SetClippingRegion(const wxPoint& pt, const wxSize& sz); - - /** - This is an overloaded member function, provided for convenience. It differs from the - above function only in what argument(s) it accepts. - */ - void SetClippingRegion(const wxRect& rect); - - /** - This function is not implemented in this DC class. - It could be implemented in future if a GetPoints() function were made available on wxRegion. - */ - void SetClippingRegion(const wxRegion& region); - /** Destroys the current clipping region so that none of the DC is clipped. Since intersections arising from sequential calls to SetClippingRegion are represented @@ -133,15 +95,20 @@ public: //@{ /** - Functions not implemented in this DC class. + Function not implemented in this DC class. */ void CrossHair(wxCoord x, wxCoord y); bool FloodFill(wxCoord x, wxCoord y, const wxColour& colour, wxFloodFillStyle style = wxFLOOD_SURFACE); - void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *width, wxCoord *height) const; bool GetPixel(wxCoord x, wxCoord y, wxColour* colour) const; void SetPalette(const wxPalette& palette); + int GetDepth() const; + void SetLogicalFunction(wxRasterOperationMode function); + wxRasterOperationMode GetLogicalFunction() const; bool StartDoc(const wxString& message); + void EndDoc(); + void StartPage(); + void EndPage(); //@} }; @@ -203,9 +170,17 @@ public: }; /** - Handler saving a bitmap to an external file and linking to it from the SVG. + Handler saving bitmaps to external PNG files and linking to it from the + SVG. - This handler is used by default by wxSVGFileDC. + This handler is used by default by wxSVGFileDC. PNG files are created in + the same folder as the SVG file and are named using the SVG filename + appended with ``_image#.png``. + + When using wxSVGFileDC::SetBitmapHandler() to set this handler with the + default constructor, the PNG files are created in the runtime location of + the application. The save location can be customized by using the + wxSVGBitmapFileHandler(const wxFileName&) constructor. @see wxSVGFileDC::SetBitmapHandler(). @@ -217,6 +192,17 @@ public: class wxSVGBitmapFileHandler : public wxSVGBitmapHandler { public: + /** + Create a wxSVGBitmapFileHandler and specify the location where the file + will be saved. + + @param path The path of the save location. If @a path contains a + filename, the autogenerated filename will be appended to this name. + + @since 3.1.3 + */ + wxSVGBitmapFileHandler(const wxFileName& path); + virtual bool ProcessBitmap(const wxBitmap& bitmap, wxCoord x, wxCoord y, wxOutputStream& stream) const; diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index ff212b8829..494f3a615c 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -74,7 +74,7 @@ wxString Col2SVG(wxColour c, float *opacity) wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) { float opacity; - wxString s = wxS("stroke:") + Col2SVG(c, &opacity) + wxS("; "); + wxString s = wxS("stroke:") + Col2SVG(c, &opacity) + wxS("; "); switch ( style ) { @@ -89,7 +89,7 @@ wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) case wxPENSTYLE_TRANSPARENT: s += wxS("stroke-opacity:0.0; "); break; - default : + default: wxASSERT_MSG(false, wxS("wxSVGFileDC::Requested Pen Style not available")); } @@ -99,7 +99,7 @@ wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) { float opacity; - wxString s = wxS("fill:") + Col2SVG(c, &opacity) + wxS("; "); + wxString s = wxS("fill:") + Col2SVG(c, &opacity) + wxS("; "); switch ( style ) { @@ -114,7 +114,7 @@ wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) case wxBRUSHSTYLE_TRANSPARENT: s += wxS("fill-opacity:0.0; "); break; - default : + default: wxASSERT_MSG(false, wxS("wxSVGFileDC::Requested Brush Style not available")); } @@ -335,28 +335,28 @@ wxSVGBitmapFileHandler::ProcessBitmap(const wxBitmap& bmp, wxImage::AddHandler(new wxPNGHandler); // find a suitable file name - wxString sPNG; + wxFileName sPNG = m_path; do { - sPNG = wxString::Format("image%d.png", sub_images++); + sPNG.SetFullName(wxString::Format("%s%simage%d.png", + sPNG.GetName(), + sPNG.GetName().IsEmpty() ? "" : "_", + sub_images++)); } - while (wxFile::Exists(sPNG)); + while ( sPNG.FileExists() ); - if ( !bmp.SaveFile(sPNG, wxBITMAP_TYPE_PNG) ) + if ( !bmp.SaveFile(sPNG.GetFullPath(), wxBITMAP_TYPE_PNG) ) return false; - // reference the bitmap from the SVG doc using only filename & ext - sPNG = sPNG.AfterLast(wxFileName::GetPathSeparator()); - // reference the bitmap from the SVG doc wxString s; s += wxString::Format(" \n", sPNG); + s += wxString::Format(" xlink:href=\"%s\"/>\n", sPNG.GetFullName()); // write to the SVG file const wxCharBuffer buf = s.utf8_str(); - stream.Write(buf, strlen((const char *)buf)); + stream.Write(buf, strlen((const char*)buf)); return stream.IsOk(); } @@ -403,13 +403,12 @@ void wxSVGFileDCImpl::Init(const wxString &filename, int Width, int Height, m_textForegroundColour = *wxBLACK; m_textBackgroundColour = *wxWHITE; - m_pen = *wxBLACK_PEN; - m_font = *wxNORMAL_FONT; + m_pen = *wxBLACK_PEN; + m_font = *wxNORMAL_FONT; m_brush = *wxWHITE_BRUSH; m_filename = filename; m_graphics_changed = true; - m_sub_images = 0; ////////////////////code here @@ -420,7 +419,7 @@ void wxSVGFileDCImpl::Init(const wxString &filename, int Width, int Height, s += wxS("\n"); s += wxS("\n\n"); s += wxS("\n"), NumStr(float(Width) / dpi*2.54), NumStr(float(Height) / dpi*2.54), Width, Height); + s += wxString::Format(wxS(" width=\"%scm\" height=\"%scm\" viewBox=\"0 0 %d %d\">\n"), NumStr(float(Width) / dpi * 2.54), NumStr(float(Height) / dpi * 2.54), Width, Height); s += wxString::Format(wxS("%s\n"), title); s += wxString(wxS("Picture generated by wxSVG ")) + wxSVGVersion + wxS("\n\n"); s += wxS("\n"); @@ -538,11 +537,11 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor // wxS("upper left") and wxS("upper right") CalcBoundingBox(x, y); - CalcBoundingBox((wxCoord)(x + w*cos(rad)), (wxCoord)(y - h*sin(rad))); + CalcBoundingBox((wxCoord)(x + w * cos(rad)), (wxCoord)(y - h * sin(rad))); // wxS("bottom left") and wxS("bottom right") - CalcBoundingBox((wxCoord)(x + h*sin(rad)), (wxCoord)(y + h*cos(rad))); - CalcBoundingBox((wxCoord)(x + h*sin(rad) + w*cos(rad)), (wxCoord)(y + h*cos(rad) - w*sin(rad))); + CalcBoundingBox((wxCoord)(x + h * sin(rad)), (wxCoord)(y + h * cos(rad))); + CalcBoundingBox((wxCoord)(x + h * sin(rad) + w * cos(rad)), (wxCoord)(y + h * cos(rad) - w * sin(rad))); if (m_backgroundMode == wxBRUSHSTYLE_SOLID) { @@ -575,7 +574,7 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor else s += wxS("style=\" "); - wxString fontweight = wxString::Format(wxS("%d"),m_font.GetWeight()); + wxString fontweight = wxString::Format(wxS("%d"), m_font.GetWeight()); s += wxS("font-weight:") + fontweight + wxS("; "); @@ -618,11 +617,11 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour); s += wxString::Format(wxS("stroke-width:0;\" transform=\"rotate(%s %d %d)\""), NumStr(-angle), xx, yy); s += wxS(" xml:space=\"preserve\">"); - #if wxUSE_MARKUP - s += wxMarkupParser::Quote(lines[lineNum]) + wxS("\n"); - #else - s += lines[lineNum] + wxS("\n"); - #endif +#if wxUSE_MARKUP + s += wxMarkupParser::Quote(lines[lineNum]) + wxS("\n"); +#else + s += lines[lineNum] + wxS("\n"); +#endif write(s); } @@ -746,11 +745,11 @@ void wxSVGFileDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, 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) ) ); + 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), wxS("wxSVGFileDC::DoDrawArc Error in getting radii of circle")); - if ( fabs ( r2-r1 ) > 3 ) //pixels + wxASSERT_MSG((fabs( r2 - r1 ) <= 3), wxS("wxSVGFileDC::DoDrawArc Error in getting radii of circle")); + if ( fabs( r2 - r1 ) > 3 ) //pixels { s = wxS("\n"); write(s); @@ -822,10 +821,10 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord // start and end coords double xs, ys, xe, ye; - xs = xc + rx * cos (wxDegToRad(sa)); - xe = xc + rx * cos (wxDegToRad(ea)); - ys = yc - ry * sin (wxDegToRad(sa)); - ye = yc - ry * sin (wxDegToRad(ea)); + xs = xc + rx * cos(wxDegToRad(sa)); + xe = xc + rx * cos(wxDegToRad(ea)); + ys = yc - ry * sin(wxDegToRad(sa)); + ye = yc - ry * sin(wxDegToRad(ea)); // svg arcs have 0 degrees at 12-o'clock instead of 3-o'clock double start = (sa - 90); @@ -1004,8 +1003,6 @@ void wxSVGFileDCImpl::SetBrush(const wxBrush& brush) void wxSVGFileDCImpl::SetPen(const wxPen& pen) { - // width, color, ends, joins : currently implemented - // dashes, stipple : not implemented m_pen = pen; m_graphics_changed = true; @@ -1028,40 +1025,40 @@ void wxSVGFileDCImpl::DoStartNewGraphics() wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast; sBrush = wxS(""), - m_pen.GetWidth(), - NumStr((m_deviceOriginX - m_logicalOriginX)* m_signX), - NumStr((m_deviceOriginY - m_logicalOriginY)* m_signY), - NumStr(m_scaleX * m_signX), - NumStr(m_scaleY * m_signY)); + m_pen.GetWidth(), + NumStr((m_deviceOriginX - m_logicalOriginX)* m_signX), + NumStr((m_deviceOriginY - m_logicalOriginY)* m_signY), + NumStr(m_scaleX * m_signX), + NumStr(m_scaleY * m_signY)); s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + wxS("\n"); write(s); @@ -1074,9 +1071,9 @@ void wxSVGFileDCImpl::SetFont(const wxFont& font) // 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, - wxRasterOperationMode logicalFunc /*= wxCOPY*/, bool useMask /*= false*/, - wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/) + wxDC* source, wxCoord xsrc, wxCoord ysrc, + wxRasterOperationMode logicalFunc /*= wxCOPY*/, bool useMask /*= false*/, + wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/) { if (logicalFunc != wxCOPY) { @@ -1107,13 +1104,13 @@ void wxSVGFileDCImpl::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord DoDrawBitmap(myBitmap, x, y); } -void wxSVGFileDCImpl::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*/) { NewGraphicsIfNeeded(); // If we don't have any bitmap handler yet, use the default one. if ( !m_bmp_handler ) - m_bmp_handler.reset(new wxSVGBitmapFileHandler()); + m_bmp_handler.reset(new wxSVGBitmapFileHandler(m_filename)); m_bmp_handler->ProcessBitmap(bmp, x, y, *m_outfile); }