From b0282d868b418b4ecdb19cbb633c9399ac84161b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Mon, 14 Jul 2014 12:13:21 +0100 Subject: [PATCH 019/137] Related: fdo#52226 ensure graphics are swapped in on DrawingML::WriteImage I imagine it would be best that the Graphics were delivered pre-swapped in by higher levels in case there are second level caches or more complex caching systemed wrapped around it, so warn about it in debug mode but give it a last-ditch shot anyway. i.e. while the .docx problem should be fixed there is a report of a very similar .xlsx problem Change-Id: Ie40ee10fe5cba8ff9c321f47b83e33ee2c1425fd (cherry picked from commit 6e580f3f53ae2de086a08c8ba1958b67874eb9c5) Reviewed-on: https://gerrit.libreoffice.org/10300 Reviewed-by: David Tardon Tested-by: David Tardon --- oox/source/export/drawingml.cxx | 34 ++++++++++++++++++++++++++-------- vcl/source/gdi/cvtgrf.cxx | 2 ++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index dd6605b..847d21c 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -495,14 +495,32 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic ) break; default: { GraphicType aType = rGraphic.GetType(); - if ( aType == GRAPHIC_BITMAP ) { - GraphicConverter::Export( aStream, rGraphic, CVT_PNG ); - sMediaType = "image/png"; - pExtension = ".png"; - } else if ( aType == GRAPHIC_GDIMETAFILE ) { - GraphicConverter::Export( aStream, rGraphic, CVT_EMF ); - sMediaType = "image/x-emf"; - pExtension = ".emf"; + if ( aType == GRAPHIC_BITMAP || aType == GRAPHIC_GDIMETAFILE) { + bool bSwapped = rGraphic.IsSwapOut(); + + //Warn rather than just happily swap in because of the comments + //in the sw export filters about needing to go through the + //hairy SwGrfNode::SwapIn which we would subvert by swapping in + //without it knowing about it, so while those ones are fixed we + //probably have to assume that we should ideally be presented + //here with already swapped in graphics. + SAL_WARN_IF(bSwapped, "oox", "attempted to output swapped out graphic"); + + if (bSwapped) + const_cast(rGraphic).SwapIn(); + + if ( aType == GRAPHIC_BITMAP ) { + GraphicConverter::Export( aStream, rGraphic, CVT_PNG ); + sMediaType = "image/png"; + pExtension = ".png"; + } else { + GraphicConverter::Export( aStream, rGraphic, CVT_EMF ); + sMediaType = "image/x-emf"; + pExtension = ".emf"; + } + + if (bSwapped) + const_cast(rGraphic).SwapOut(); } else { OSL_TRACE( "unhandled graphic type" ); break; diff --git a/vcl/source/gdi/cvtgrf.cxx b/vcl/source/gdi/cvtgrf.cxx index 02ca288..d395670 100644 --- a/vcl/source/gdi/cvtgrf.cxx +++ b/vcl/source/gdi/cvtgrf.cxx @@ -57,6 +57,8 @@ sal_uLong GraphicConverter::Import( SvStream& rIStm, Graphic& rGraphic, sal_uLon sal_uLong GraphicConverter::Export( SvStream& rOStm, const Graphic& rGraphic, sal_uLong nFormat ) { + SAL_WARN_IF(rGraphic.IsSwapOut(), "vcl.filter", "exporting a swapped out graphic!"); + GraphicConverter* pCvt = ImplGetSVData()->maGDIData.mpGrfConverter; sal_uLong nRet = ERRCODE_IO_GENERAL; -- 1.9.3