[Libreoffice-commits] core.git: oox/source vcl/source

Caolán McNamara caolanm at redhat.com
Mon Jul 14 07:18:37 PDT 2014


 oox/source/export/drawingml.cxx |   34 ++++++++++++++++++++++++++--------
 vcl/source/gdi/cvtgrf.cxx       |    2 ++
 2 files changed, 28 insertions(+), 8 deletions(-)

New commits:
commit 6e580f3f53ae2de086a08c8ba1958b67874eb9c5
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Jul 14 12:13:21 2014 +0100

    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

diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 6cad974..1b35cac 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -809,14 +809,32 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic , bool bRelPathToMedia )
             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 && 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<Graphic&>(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<Graphic&>(rGraphic).SwapOut();
             } else {
                 OSL_TRACE( "unhandled graphic type" );
                 /*Earlier, even in case of unhandled graphic types we were
diff --git a/vcl/source/gdi/cvtgrf.cxx b/vcl/source/gdi/cvtgrf.cxx
index 65cc919..68e4e07 100644
--- a/vcl/source/gdi/cvtgrf.cxx
+++ b/vcl/source/gdi/cvtgrf.cxx
@@ -56,6 +56,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;
 


More information about the Libreoffice-commits mailing list