diff --git a/include/wx/dcsvg.h b/include/wx/dcsvg.h index d34965c255..df6d925966 100644 --- a/include/wx/dcsvg.h +++ b/include/wx/dcsvg.h @@ -40,13 +40,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 wxString& path) + : m_path(path) + { + } + virtual bool ProcessBitmap(const wxBitmap& bitmap, wxCoord x, wxCoord y, wxOutputStream& stream) const wxOVERRIDE; + +private: + wxString m_path; // When set, will be appended with _image#.png }; // Predefined handler which embeds the bitmap (base64-encoding it) inside the diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index 19a419f393..a148f9ef42 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -335,24 +335,24 @@ wxSVGBitmapFileHandler::ProcessBitmap(const wxBitmap& bmp, wxImage::AddHandler(new wxPNGHandler); // find a suitable file name - wxString sPNG; + wxFileName sPNG = wxFileName(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(); @@ -1111,7 +1111,7 @@ void wxSVGFileDCImpl::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoor // 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); }