include/vcl/graphicfilter.hxx | 1 + vcl/source/filter/graphicfilter.cxx | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-)
New commits: commit 29252e78627db79662d89919f77746824c6563c3 Author: offtkp <parisop...@gmail.com> AuthorDate: Sun Jun 19 00:42:44 2022 +0300 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed Jun 22 14:12:23 2022 +0200 Add support for exporting SVGZ in Writer When exporting a graphic through Writer, graphicfilters ExportGraphic is called, which didn't have SVGZ exporting functionality before this commit. With this commit a valid Z compressed SVG file is exported, using the functionality that already exists in ExportGraphic. Change-Id: I6c7476ca78a8cb3719488ac4d8a5942e0557ed36 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136094 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/include/vcl/graphicfilter.hxx b/include/vcl/graphicfilter.hxx index 27388da41c28..fb237bc780a4 100644 --- a/include/vcl/graphicfilter.hxx +++ b/include/vcl/graphicfilter.hxx @@ -101,6 +101,7 @@ namespace o3tl #define EXP_EMZ "SVEMZ" #define EXP_JPEG "SVEJPEG" #define EXP_SVG "SVESVG" +#define EXP_SVGZ "SVESVGZ" #define EXP_PDF "SVEPDF" #define EXP_PNG "SVEPNG" #define EXP_TIFF "SVTIFF" diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index bfe1d3b7d506..f7e3765f4e94 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1844,9 +1844,17 @@ ErrCode GraphicFilter::ExportGraphic( const Graphic& rGraphic, std::u16string_vi if( rOStm.GetError() ) nStatus = ERRCODE_GRFILTER_IOERROR; } - else if( aFilterName.equalsIgnoreAsciiCase( EXP_SVG ) ) + else if( aFilterName.equalsIgnoreAsciiCase( EXP_SVG ) || aFilterName.equalsIgnoreAsciiCase( EXP_SVGZ ) ) { bool bDone(false); + SvStream* rTempStm = &rOStm; + if (aFilterName.equalsIgnoreAsciiCase(EXP_SVGZ)) + { + // Write to a different stream so that we can compress to rOStm later + rCompressableStm.SetBufferSize(rOStm.GetBufferSize()); + rTempStm = &rCompressableStm; + bShouldCompress = true; + } // do we have a native Vector Graphic Data RenderGraphic, whose data can be written directly? auto const & rVectorGraphicDataPtr(rGraphic.getVectorGraphicData()); @@ -1856,9 +1864,9 @@ ErrCode GraphicFilter::ExportGraphic( const Graphic& rGraphic, std::u16string_vi && !rVectorGraphicDataPtr->getBinaryDataContainer().isEmpty()) { auto & aDataContainer = rVectorGraphicDataPtr->getBinaryDataContainer(); - rOStm.WriteBytes(aDataContainer.getData(), aDataContainer.getSize()); + rTempStm->WriteBytes(aDataContainer.getData(), aDataContainer.getSize()); - if( rOStm.GetError() ) + if( rTempStm->GetError() ) { nStatus = ERRCODE_GRFILTER_IOERROR; } @@ -1890,7 +1898,7 @@ ErrCode GraphicFilter::ExportGraphic( const Graphic& rGraphic, std::u16string_vi if( xActiveDataSource.is() ) { const css::uno::Reference< css::uno::XInterface > xStmIf( - static_cast< ::cppu::OWeakObject* >( new ImpFilterOutputStream( rOStm ) ) ); + static_cast< ::cppu::OWeakObject* >( new ImpFilterOutputStream( *rTempStm ) ) ); SvMemoryStream aMemStm( 65535, 65535 );