desktop/source/lib/init.cxx                                  |    9 
 filter/Configuration_filter.mk                               |    2 
 filter/source/config/fragments/filters/writer_svg_Export.xcu |   30 +
 filter/source/svg/svgexport.cxx                              |  245 +++++++----
 filter/source/svg/svgfilter.cxx                              |   82 +++
 filter/source/svg/svgfilter.hxx                              |   42 +
 6 files changed, 312 insertions(+), 98 deletions(-)

New commits:
commit b052974a6574e4074794ffa590fe60f7c1726768
Author:     Tamás Zolnai <[email protected]>
AuthorDate: Fri Dec 14 17:50:18 2018 +0100
Commit:     Tamás Zolnai <[email protected]>
CommitDate: Fri Dec 14 19:52:48 2018 +0100

    lok: Implement SVG export for Writer (SelectionOnly mode)
    
    Separate generic code from Impress / Draw specific code
    and implement shape selection handling in case of Writer.
    This is an internal filter, so it can be called only from
    the code.
    
    Change-Id: I807e04a0949530d6029037bb964c10c80197ff33
    Reviewed-on: https://gerrit.libreoffice.org/65174
    Tested-by: Jenkins
    Reviewed-by: Tamás Zolnai <[email protected]>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 90994a92c257..65ccfdf4a411 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -2618,7 +2618,14 @@ static size_t 
doc_renderShapeSelection(LibreOfficeKitDocument* pThis, char** pOu
         uno::Reference<io::XOutputStream> xOut = new 
utl::OOutputStreamWrapper(aOutStream);
 
         utl::MediaDescriptor aMediaDescriptor;
-        aMediaDescriptor["FilterName"] <<= OUString("impress_svg_Export");
+        if (doc_getDocumentType(pThis) == LOK_DOCTYPE_PRESENTATION)
+        {
+            aMediaDescriptor["FilterName"] <<= OUString("impress_svg_Export");
+        }
+        else if(doc_getDocumentType(pThis) == LOK_DOCTYPE_TEXT)
+        {
+            aMediaDescriptor["FilterName"] <<= OUString("writer_svg_Export");
+        }
         aMediaDescriptor["SelectionOnly"] <<= true;
         aMediaDescriptor["OutputStream"] <<= xOut;
 
diff --git a/filter/Configuration_filter.mk b/filter/Configuration_filter.mk
index d7a6322e5564..b56e0ae39bc8 100644
--- a/filter/Configuration_filter.mk
+++ b/filter/Configuration_filter.mk
@@ -790,11 +790,13 @@ $(eval $(call 
filter_Configuration_add_filters,fcfg_langpack,fcfg_impressgraphic
 $(eval $(call 
filter_Configuration_add_types,fcfg_langpack,fcfg_writergraphics_types.xcu,filter/source/config/fragments/types,\
        jpg_JPEG \
        png_Portable_Network_Graphic \
+       svg_Scalable_Vector_Graphics \
 ))
 
 $(eval $(call 
filter_Configuration_add_filters,fcfg_langpack,fcfg_writergraphics_filters.xcu,filter/source/config/fragments/filters,\
        writer_jpg_Export \
        writer_png_Export \
+       writer_svg_Export \
 ))
 
 # fcfg_calcgraphics
diff --git a/filter/source/config/fragments/filters/writer_svg_Export.xcu 
b/filter/source/config/fragments/filters/writer_svg_Export.xcu
new file mode 100644
index 000000000000..c08576cdd69b
--- /dev/null
+++ b/filter/source/config/fragments/filters/writer_svg_Export.xcu
@@ -0,0 +1,30 @@
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+-->
+    <node oor:name="writer_svg_Export" oor:op="replace">
+        <prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER INTERNAL 
NOTINFILEDIALOG</value></prop>
+        <prop oor:name="UIComponent"/>
+        <prop 
oor:name="FilterService"><value>com.sun.star.comp.Draw.SVGFilter</value></prop>
+        <prop oor:name="UserData"><value></value></prop>
+        <prop oor:name="UIName">
+            <value xml:lang="en-US">SVG - Scalable Vector Graphics</value>
+        </prop>
+        <prop oor:name="FileFormatVersion"><value>0</value></prop>
+        <prop 
oor:name="Type"><value>svg_Scalable_Vector_Graphics</value></prop>
+        <prop oor:name="TemplateName"/>
+        <prop 
oor:name="DocumentService"><value>com.sun.star.text.TextDocument</value></prop>
+    </node>
diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index babf682a024f..729fd2e29c2c 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -504,12 +504,10 @@ bool EqualityBitmap::operator()( const 
ObjectRepresentation& rObjRep1,
 
 bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor )
 {
-    Reference< XComponentContext >        xContext( 
::comphelper::getProcessComponentContext() ) ;
     Reference< XOutputStream >            xOStm;
     std::unique_ptr<SvStream>             pOStm;
     sal_Int32                             nLength = rDescriptor.getLength();
     const PropertyValue*                  pValue = rDescriptor.getConstArray();
-    bool                                  bRet = false;
 
     maFilterData.realloc( 0 );
 
@@ -533,11 +531,22 @@ bool SVGFilter::implExport( const Sequence< PropertyValue 
>& rDescriptor )
         }
     }
 
-    if( xOStm.is() )
+    if(mbWriterFilter)
+       return implExportWriter(xOStm);
+
+    return implExportImpressDraw(xOStm);
+}
+
+bool SVGFilter::implExportImpressDraw( const Reference< XOutputStream >& 
rxOStm)
+{
+    Reference< XComponentContext >        xContext( 
::comphelper::getProcessComponentContext() ) ;
+    bool                                  bRet = false;
+
+    if( rxOStm.is() )
     {
         if( !mSelectedPages.empty() && !mMasterPageTargets.empty() )
         {
-            Reference< XDocumentHandler > xDocHandler( 
implCreateExportDocumentHandler( xOStm ), UNO_QUERY );
+            Reference< XDocumentHandler > xDocHandler( 
implCreateExportDocumentHandler( rxOStm ), UNO_QUERY );
 
             if( xDocHandler.is() )
             {
@@ -616,7 +625,51 @@ bool SVGFilter::implExport( const Sequence< PropertyValue 
>& rDescriptor )
             }
         }
     }
+    return bRet;
+}
+
+
+bool SVGFilter::implExportWriter( const Reference< XOutputStream >& rxOStm )
+{
+    Reference< XComponentContext >        xContext( 
::comphelper::getProcessComponentContext() ) ;
+    bool                                  bRet = false;
+
+    if( rxOStm.is() )
+    {
+        Reference< XDocumentHandler > xDocHandler( 
implCreateExportDocumentHandler( rxOStm ), UNO_QUERY );
+
+        if( xDocHandler.is() )
+        {
+            mpObjects = new ObjectMap;
+
+            // mpSVGExport = new SVGExport( xDocHandler );
+            mpSVGExport = new SVGExport( xContext, xDocHandler, maFilterData );
+
+            // xSVGExport is set up only to manage the life-time of the object 
pointed by mpSVGExport,
+            // and in order to prevent that it is destroyed when passed to 
AnimationExporter.
+            Reference< XInterface > xSVGExport = static_cast< 
css::document::XFilter* >( mpSVGExport );
 
+            try
+            {
+                mxDefaultPage = mSelectedPages[0];
+                bRet = implExportDocument();
+            }
+            catch( ... )
+            {
+                delete mpSVGDoc;
+                mpSVGDoc = nullptr;
+                OSL_FAIL( "Exception caught" );
+            }
+
+            delete mpSVGWriter;
+            mpSVGWriter = nullptr;
+            mpSVGExport = nullptr; // pointed object is released by xSVGExport 
dtor at the end of this scope
+            delete mpSVGFontExport;
+            mpSVGFontExport = nullptr;
+            delete mpObjects;
+            mpObjects = nullptr;
+        }
+    }
     return bRet;
 }
 
@@ -639,6 +692,11 @@ bool SVGFilter::implLookForFirstVisiblePage()
 {
     sal_Int32 nCurPage = 0, nLastPage = mSelectedPages.size() - 1;
 
+    if(!mbPresentation || mbSinglePage)
+    {
+        mnVisiblePage = nCurPage;
+    }
+
     while( ( nCurPage <= nLastPage ) && ( -1 == mnVisiblePage ) )
     {
         const Reference< css::drawing::XDrawPage > & xDrawPage = 
mSelectedPages[nCurPage];
@@ -651,8 +709,7 @@ bool SVGFilter::implLookForFirstVisiblePage()
             {
                 bool bVisible = false;
 
-                if( !mbPresentation || mbSinglePage ||
-                    ( ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible ) 
&& bVisible ) )
+                if( ( xPropSet->getPropertyValue( "Visible" ) >>= bVisible ) 
&& bVisible )
                 {
                     mnVisiblePage = nCurPage;
                 }
@@ -667,17 +724,15 @@ bool SVGFilter::implLookForFirstVisiblePage()
 
 bool SVGFilter::implExportDocument()
 {
-    OUString         aAttr;
     sal_Int32        nDocX = 0, nDocY = 0; // #i124608#
     sal_Int32        nDocWidth = 0, nDocHeight = 0;
-    bool         bRet = false;
+    bool             bRet = false;
     sal_Int32        nLastPage = mSelectedPages.size() - 1;
 
     mbSinglePage = (nLastPage == 0);
     mnVisiblePage = -1;
 
     const Reference< XPropertySet >             xDefaultPagePropertySet( 
mxDefaultPage, UNO_QUERY );
-    const Reference< XExtendedDocumentHandler > xExtDocHandler( 
mpSVGExport->GetDocHandler(), UNO_QUERY );
 
     // #i124608#
     mbExportShapeSelection = mbSinglePage && maShapeSelection.is() && 
maShapeSelection->getCount();
@@ -693,33 +748,18 @@ bool SVGFilter::implExportDocument()
         // #i124608# create BoundRange and set nDocX, nDocY, nDocWidth and 
nDocHeight
         basegfx::B2DRange aShapeRange;
 
-        uno::Reference< XPrimitiveFactory2D > xPrimitiveFactory = 
PrimitiveFactory2D::create( mxContext );
-
-        // use XPrimitiveFactory2D and go the way over getting the primitives; 
this
-        // will give better precision (doubles) and be based on the true object
-        // geometry. If needed aViewInformation may be expanded to carry a view
-        // resolution for which to prepare the geometry.
-        if(xPrimitiveFactory.is())
+        for(sal_Int32 a(0); a < maShapeSelection->getCount(); a++)
         {
             Reference< css::drawing::XShape > xShapeCandidate;
-            const Sequence< PropertyValue > aViewInformation;
-            const Sequence< PropertyValue > aParams;
-
-            for(sal_Int32 a(0); a < maShapeSelection->getCount(); a++)
+            if((maShapeSelection->getByIndex(a) >>= xShapeCandidate) && 
xShapeCandidate.is())
             {
-                if((maShapeSelection->getByIndex(a) >>= xShapeCandidate) && 
xShapeCandidate.is())
+                Reference< XPropertySet > xShapePropSet( xShapeCandidate, 
UNO_QUERY );
+                css::awt::Rectangle aBoundRect;
+                if( xShapePropSet.is() && ( xShapePropSet->getPropertyValue( 
"BoundRect" ) >>= aBoundRect ))
                 {
-                    const Sequence< Reference< XPrimitive2D > > 
aPrimitiveSequence(
-                        xPrimitiveFactory->createPrimitivesFromXShape( 
xShapeCandidate, aParams ));
-                    const sal_Int32 nCount(aPrimitiveSequence.getLength());
-
-                    for(sal_Int32 nIndex = 0; nIndex < nCount; nIndex++)
-                    {
-                        const RealRectangle2D 
aRect(aPrimitiveSequence[nIndex]->getRange(aViewInformation));
-
-                        aShapeRange.expand(basegfx::B2DTuple(aRect.X1, 
aRect.Y1));
-                        aShapeRange.expand(basegfx::B2DTuple(aRect.X2, 
aRect.Y2));
-                    }
+                    aShapeRange.expand(basegfx::B2DTuple(aBoundRect.X, 
aBoundRect.Y));
+                    aShapeRange.expand(basegfx::B2DTuple(aBoundRect.X + 
aBoundRect.Width,
+                                                         aBoundRect.Y + 
aBoundRect.Height));
                 }
             }
         }
@@ -733,6 +773,72 @@ bool SVGFilter::implExportDocument()
         }
     }
 
+    if(mbWriterFilter)
+        implExportDocumentHeaderWriter(nDocX, nDocY, nDocWidth, nDocHeight);
+    else
+        implExportDocumentHeaderImpressDraw(nDocX, nDocY, nDocWidth, 
nDocHeight);
+
+
+    if( implLookForFirstVisiblePage() )  // OK! We found at least one visible 
page.
+    {
+        if( mbPresentation && !mbExportShapeSelection )
+        {
+            implGenerateMetaData();
+            implExportAnimations();
+        }
+        else
+        {
+            implGetPagePropSet( mSelectedPages[0] );
+        }
+
+        // Create the (Shape, GDIMetaFile) map
+        if( implCreateObjects() )
+        {
+            ::std::vector< ObjectRepresentation >    aObjects( 
mpObjects->size() );
+            sal_uInt32                               nPos = 0;
+
+            for (auto const& elem : *mpObjects)
+            {
+                aObjects[ nPos++ ] = elem.second;
+            }
+
+            mpSVGFontExport = new SVGFontExport( *mpSVGExport, aObjects );
+            mpSVGWriter = new SVGActionWriter( *mpSVGExport, *mpSVGFontExport 
);
+
+            if( mpSVGExport->IsEmbedFonts() )
+            {
+                mpSVGFontExport->EmbedFonts();
+            }
+            if( !mpSVGExport->IsUsePositionedCharacters() )
+            {
+                implExportTextShapeIndex();
+                implEmbedBulletGlyphs();
+                implExportTextEmbeddedBitmaps();
+            }
+
+            // #i124608# export a given object selection, so no MasterPage 
export at all
+            if (!mbExportShapeSelection)
+                implExportMasterPages( mMasterPageTargets, 0, 
mMasterPageTargets.size() - 1 );
+            implExportDrawPages( mSelectedPages, 0, nLastPage );
+
+            if( mbPresentation && !mbExportShapeSelection )
+            {
+                implGenerateScript();
+            }
+
+            delete mpSVGDoc;
+            mpSVGDoc = nullptr;
+            bRet = true;
+        }
+    }
+
+    return bRet;
+}
+
+void SVGFilter::implExportDocumentHeaderImpressDraw(sal_Int32 nDocX, sal_Int32 
nDocY,
+                                                    sal_Int32 nDocWidth, 
sal_Int32 nDocHeight)
+{
+    const Reference< XExtendedDocumentHandler > xExtDocHandler( 
mpSVGExport->GetDocHandler(), UNO_QUERY );
     if( xExtDocHandler.is() && !mpSVGExport->IsUseTinyProfile() )
     {
         xExtDocHandler->unknown( SVG_DTD_STRING );
@@ -746,6 +852,7 @@ bool SVGFilter::implExportDocument()
     // The following if block means that the slide size is not adapted
     // to the size of the browser window, moreover the slide is top left 
aligned
     // instead of centered:
+    OUString aAttr;
     if( !mbPresentation )
     {
         aAttr = OUString::number( nDocWidth * 0.01 ) + "mm";
@@ -819,64 +926,40 @@ bool SVGFilter::implExportDocument()
             }
         }
     }
+}
 
-    if( implLookForFirstVisiblePage() )  // OK! We found at least one visible 
page.
-    {
-        if( mbPresentation && !mbExportShapeSelection )
-        {
-            implGenerateMetaData();
-            implExportAnimations();
-        }
-        else
-        {
-            implGetPagePropSet( mSelectedPages[0] );
-        }
-
-        // Create the (Shape, GDIMetaFile) map
-        if( implCreateObjects() )
-        {
-            ::std::vector< ObjectRepresentation >    aObjects( 
mpObjects->size() );
-            sal_uInt32                               nPos = 0;
-
-            for (auto const& elem : *mpObjects)
-            {
-                aObjects[ nPos++ ] = elem.second;
-            }
+void SVGFilter::implExportDocumentHeaderWriter(sal_Int32 nDocX, sal_Int32 
nDocY,
+                                               sal_Int32 nDocWidth, sal_Int32 
nDocHeight)
+{
+    OUString aAttr;
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "version", "1.2" );
 
-            mpSVGFontExport = new SVGFontExport( *mpSVGExport, aObjects );
-            mpSVGWriter = new SVGActionWriter( *mpSVGExport, *mpSVGFontExport 
);
+    aAttr = OUString::number( nDocWidth * 0.01 ) + "mm";
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "width", aAttr );
 
-            if( mpSVGExport->IsEmbedFonts() )
-            {
-                mpSVGFontExport->EmbedFonts();
-            }
-            if( !mpSVGExport->IsUsePositionedCharacters() )
-            {
-                implExportTextShapeIndex();
-                implEmbedBulletGlyphs();
-                implExportTextEmbeddedBitmaps();
-            }
+    aAttr = OUString::number( nDocHeight * 0.01 ) + "mm";
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "height", aAttr );
 
-            // #i124608# export a given object selection, so no MasterPage 
export at all
-            if (!mbExportShapeSelection)
-                implExportMasterPages( mMasterPageTargets, 0, 
mMasterPageTargets.size() - 1 );
-            implExportDrawPages( mSelectedPages, 0, nLastPage );
+    aAttr = OUString::number(nDocX) + " " + OUString::number(nDocY) + " ";
+    aAttr += OUString::number(nDocWidth) + " " + OUString::number(nDocHeight);
 
-            if( mbPresentation && !mbExportShapeSelection )
-            {
-                implGenerateScript();
-            }
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "viewBox", aAttr );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "preserveAspectRatio", 
"xMidYMid" );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "fill-rule", "evenodd" );
 
-            delete mpSVGDoc;
-            mpSVGDoc = nullptr;
-            bRet = true;
-        }
-    }
+    // standard line width is based on 1 pixel on a 90 DPI device (0.28222mmm)
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "stroke-width", 
OUString::number( 28.222 ) );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "stroke-linejoin", "round" 
);
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns", constSvgNamespace 
);
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:ooo", 
"http://xml.openoffice.org/svg/export"; );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:xlink", 
"http://www.w3.org/1999/xlink"; );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:office", 
"urn:oasis:names:tc:opendocument:xmlns:office:1.0" );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xmlns:smil", 
"urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" );
+    mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "xml:space", "preserve" );
 
-    return bRet;
+    mpSVGDoc = new SvXMLElementExport( *mpSVGExport, XML_NAMESPACE_NONE, 
"svg", true, true );
 }
 
-
 /// Append aField to aFieldSet if it is not already present in the set and 
create the field id sFieldId
 template< typename TextFieldType >
 static OUString implGenerateFieldId( std::vector< TextField* > & aFieldSet,
diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx
index ebcc522fbbca..539891c8b5ae 100644
--- a/filter/source/svg/svgfilter.cxx
+++ b/filter/source/svg/svgfilter.cxx
@@ -24,6 +24,7 @@
 #include <comphelper/lok.hxx>
 #include <comphelper/servicedecl.hxx>
 #include <uno/environment.h>
+#include <com/sun/star/text/XTextDocument.hpp>
 #include <com/sun/star/drawing/XDrawPage.hpp>
 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
 #include <com/sun/star/drawing/XDrawView.hpp>
@@ -78,17 +79,19 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& 
rxCtx ) :
     mpSVGExport( nullptr ),
     mpSVGFontExport( nullptr ),
     mpSVGWriter( nullptr ),
-    mpDefaultSdrPage( nullptr ),
-    mbPresentation( false ),
     mbSinglePage( false ),
     mnVisiblePage( -1 ),
     mpObjects( nullptr ),
     mxSrcDoc(),
     mxDstDoc(),
-    mxDefaultPage(),
-    maFilterData(),
     maShapeSelection(),
     mbExportShapeSelection(false),
+    maFilterData(),
+    mxDefaultPage(),
+    mbWriterFilter(false),
+    mpDefaultSdrPage( nullptr ),
+    mpSdrModel( nullptr ),
+    mbPresentation( false ),
     maOldFieldHdl()
 {
 }
@@ -104,6 +107,34 @@ SVGFilter::~SVGFilter()
 
 sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& 
rDescriptor )
 {
+    mbWriterFilter = false;
+
+    if(mxDstDoc.is()) // Import works for Impress / draw only
+        return filterImpressDraw(rDescriptor);
+
+    if(mxSrcDoc.is())
+    {
+        for (sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++)
+        {
+            if (rDescriptor[nInd].Name == "FilterName")
+            {
+                OUString sFilterName;
+                rDescriptor[nInd].Value >>= sFilterName;
+                if(sFilterName == "writer_svg_Export")
+                {
+                    mbWriterFilter = true;
+                    return filterWriter(rDescriptor);
+                }
+                break;
+            }
+        }
+        return filterImpressDraw(rDescriptor);
+    }
+    return false;
+}
+
+bool SVGFilter::filterImpressDraw( const Sequence< PropertyValue >& 
rDescriptor )
+{
     SolarMutexGuard aGuard;
     vcl::Window* pFocusWindow(Application::GetFocusWindow());
     bool bRet(false);
@@ -505,6 +536,49 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< 
PropertyValue >& rDescripto
     return bRet;
 }
 
+bool SVGFilter::filterWriter( const Sequence< PropertyValue >& rDescriptor )
+{
+    bool bSelectionOnly = false;
+
+    for (sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++)
+    {
+        if (rDescriptor[nInd].Name == "SelectionOnly")
+        {
+            rDescriptor[nInd].Value >>= bSelectionOnly;
+            break;
+        }
+    }
+
+    if(!bSelectionOnly) // For Writer onéy the selection-only mode is supported
+        return false;
+
+    uno::Reference<frame::XDesktop2> 
xDesktop(frame::Desktop::create(mxContext));
+    uno::Reference<frame::XController > xController;
+    if (xDesktop->getCurrentFrame().is())
+    {
+        uno::Reference<frame::XFrame> xFrame(xDesktop->getCurrentFrame(), 
uno::UNO_QUERY_THROW);
+        xController.set(xFrame->getController(), uno::UNO_QUERY_THROW);
+    }
+
+    Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY);
+    if (!xSelection.is())
+        return false;
+
+    xSelection->getSelection() >>= maShapeSelection;
+
+    if (!maShapeSelection)
+        return false;
+
+    // Select only one draw page
+    uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( 
mxSrcDoc, uno::UNO_QUERY );
+    uno::Reference<drawing::XDrawPages> xDrawPages = 
xDrawPagesSupplier->getDrawPages();
+    uno::Reference< drawing::XDrawPage > xDrawPage( xDrawPages->getByIndex(0), 
uno::UNO_QUERY );
+    mSelectedPages.resize( 1 );
+    mSelectedPages[0] = xDrawPage;
+
+    return implExport( rDescriptor );
+}
+
 void SAL_CALL SVGFilter::cancel( )
 {
 }
diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx
index 1b5254e25469..5a70c3c63679 100644
--- a/filter/source/svg/svgfilter.hxx
+++ b/filter/source/svg/svgfilter.hxx
@@ -192,31 +192,40 @@ public:
 
 private:
 
+    /// Generally use members
+
     Reference< XComponentContext >      mxContext;
     SvXMLElementExport*                 mpSVGDoc;
     SVGExport*                          mpSVGExport;
     SVGFontExport*                      mpSVGFontExport;
     SVGActionWriter*                    mpSVGWriter;
-    SdrPage*                            mpDefaultSdrPage;
-    bool                            mbPresentation;
-    bool                            mbSinglePage;
+    bool                                mbSinglePage;
     sal_Int32                           mnVisiblePage;
-    PagePropertySet                     mVisiblePagePropSet;
-    OUString                     msClipPathId;
-    UCharSetMapMap                      mTextFieldCharSets;
-    Reference< XInterface >             mCreateOjectsCurrentMasterPage;
-    UOStringMap                         mTextShapeIdListMap;
-    MetaBitmapActionSet                 mEmbeddedBitmapActionSet;
-    ObjectMap                           mEmbeddedBitmapActionMap;
     ObjectMap*                          mpObjects;
     Reference< XComponent >             mxSrcDoc;
     Reference< XComponent >             mxDstDoc;
-    Reference< css::drawing::XDrawPage > mxDefaultPage;
-    Sequence< PropertyValue >           maFilterData;
     // #i124608# explicit ShapeSelection for export when export of the 
selection is wanted
     Reference< css::drawing::XShapes >  maShapeSelection;
     bool                                mbExportShapeSelection;
+    Sequence< PropertyValue >           maFilterData;
+    Reference< css::drawing::XDrawPage > mxDefaultPage;
     std::vector< Reference< css::drawing::XDrawPage > > mSelectedPages;
+
+    bool                                mbWriterFilter;
+
+
+    /// Impress / draw only members
+
+    SdrPage*                            mpDefaultSdrPage;
+    SdrModel*                           mpSdrModel;
+    bool                                mbPresentation;
+    PagePropertySet                     mVisiblePagePropSet;
+    OUString                            msClipPathId;
+    UCharSetMapMap                      mTextFieldCharSets;
+    Reference< XInterface >             mCreateOjectsCurrentMasterPage;
+    UOStringMap                         mTextShapeIdListMap;
+    MetaBitmapActionSet                 mEmbeddedBitmapActionSet;
+    ObjectMap                           mEmbeddedBitmapActionMap;
     std::vector< Reference< css::drawing::XDrawPage > > mMasterPageTargets;
 
     Link<EditFieldInfo*,void>           maOldFieldHdl;
@@ -224,6 +233,8 @@ private:
 
     /// @throws css::uno::RuntimeException
     bool                            implExport( const Sequence< PropertyValue 
>& rDescriptor );
+    bool                            implExportImpressDraw( const Reference< 
XOutputStream >& rxOStm );
+    bool                            implExportWriter( const Reference< 
XOutputStream >& rxOStm );
     static Reference< XWriter >     implCreateExportDocumentHandler( const 
Reference< XOutputStream >& rxOStm );
 
     void                            implGetPagePropSet( const Reference< 
css::drawing::XDrawPage > & rxPage );
@@ -235,6 +246,10 @@ private:
     void                            implGenerateScript();
 
     bool                            implExportDocument();
+    void                            
implExportDocumentHeaderImpressDraw(sal_Int32 nDocX, sal_Int32 nDocY,
+                                                                        
sal_Int32 nDocWidth, sal_Int32 nDocHeight);
+    void                            implExportDocumentHeaderWriter(sal_Int32 
nDocX, sal_Int32 nDocY,
+                                                                   sal_Int32 
nDocWidth, sal_Int32 nDocHeight);
     void                            implExportAnimations();
 
     bool                            implExportMasterPages( const std::vector< 
Reference< css::drawing::XDrawPage > >& rxPages,
@@ -266,6 +281,9 @@ private:
                                                                 const 
Reference< XPropertySetInfo > & rxPropSetInfo );
     DECL_LINK( CalcFieldHdl, EditFieldInfo*, void );
 
+    bool filterImpressDraw( const Sequence< PropertyValue >& rDescriptor );
+    bool filterWriter( const Sequence< PropertyValue >& rDescriptor );
+
 protected:
 
     // XFilter
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to