[Libreoffice-commits] core.git: filter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sat Dec 15 00:35:14 UTC 2018


 filter/source/svg/svgexport.cxx |   65 ++++++++++++++++++++++++++++++++++++++--
 filter/source/svg/svgfilter.cxx |   38 ++++++++++++++++++-----
 filter/source/svg/svgfilter.hxx |    8 ++++
 3 files changed, 99 insertions(+), 12 deletions(-)

New commits:
commit d856ba77faa8db9300c99f7dcaa9101bdeca849b
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Fri Dec 14 16:56:18 2018 +0100
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Sat Dec 15 01:34:48 2018 +0100

    lok: Implement SVG export of selected Writer image
    
    A Writer image does not behave similar to other
    shapes, so we need to generate a shape to get the
    export code working.
    
    Change-Id: Icfb25ceb40f73f1018d379863b836d8303e539f3
    Reviewed-on: https://gerrit.libreoffice.org/65176
    Tested-by: Jenkins
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>

diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx
index 2dd294fba105..d74746f7cb38 100644
--- a/filter/source/svg/svgexport.cxx
+++ b/filter/source/svg/svgexport.cxx
@@ -31,6 +31,8 @@
 #include <com/sun/star/text/textfield/Type.hpp>
 #include <com/sun/star/util/MeasureUnit.hpp>
 #include <com/sun/star/xml/sax/Writer.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/drawing/ShapeCollection.hpp>
 
 #include <rtl/bootstrap.hxx>
 #include <svtools/miscopt.hxx>
@@ -51,6 +53,8 @@
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/xmltoken.hxx>
 #include <xmloff/animationexport.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdpage.hxx>
 
 #include <memory>
 
@@ -531,7 +535,7 @@ bool SVGFilter::implExport( const Sequence< PropertyValue >& rDescriptor )
         }
     }
 
-    if(mbWriterOrCalcFilter)
+    if(mbWriterFilter || mbCalcFilter)
        return implExportWriterOrCalc(xOStm);
 
     return implExportImpressOrDraw(xOStm);
@@ -673,6 +677,45 @@ bool SVGFilter::implExportWriterOrCalc( const Reference< XOutputStream >& rxOStm
     return bRet;
 }
 
+bool SVGFilter::implExportWriterTextGraphic( const Reference< view::XSelectionSupplier >& xSelectionSupplier )
+{
+    Any selection = xSelectionSupplier->getSelection();
+    uno::Reference<lang::XServiceInfo> xSelection;
+    selection >>= xSelection;
+    if (xSelection.is() && xSelection->supportsService("com.sun.star.text.TextGraphicObject"))
+    {
+        uno::Reference<beans::XPropertySet> xPropertySet(xSelection, uno::UNO_QUERY);
+        uno::Reference<graphic::XGraphic> xGraphic;
+        xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
+
+        if (!xGraphic.is())
+            return false;
+
+        const Graphic aGraphic(xGraphic);
+
+        // Calculate size from Graphic
+        Point aPos( OutputDevice::LogicToLogic(aGraphic.GetPrefMapMode().GetOrigin(), aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)) );
+        Size  aSize( OutputDevice::LogicToLogic(aGraphic.GetPrefSize(), aGraphic.GetPrefMapMode(), MapMode(MapUnit::Map100thMM)) );
+
+        assert(mSelectedPages.size() == 1);
+        SvxDrawPage* pSvxDrawPage(SvxDrawPage::getImplementation(mSelectedPages[0]));
+        if(pSvxDrawPage == nullptr || pSvxDrawPage->GetSdrPage() == nullptr)
+            return false;
+
+        SdrGrafObj* pGraphicObj = new SdrGrafObj(pSvxDrawPage->GetSdrPage()->getSdrModelFromSdrPage(), aGraphic, tools::Rectangle( aPos, aSize ));
+        uno::Reference< drawing::XShape > xShape = GetXShapeForSdrObject(pGraphicObj);
+        uno::Reference< XPropertySet > xShapePropSet(xShape, uno::UNO_QUERY);
+        css::awt::Rectangle aBoundRect (aPos.X(), aPos.Y(), aSize.Width(), aSize.Height());
+        xShapePropSet->setPropertyValue("BoundRect", uno::Any(aBoundRect));
+        xShapePropSet->setPropertyValue("Graphic", uno::Any(xGraphic));
+
+        maShapeSelection = drawing::ShapeCollection::create(comphelper::getProcessComponentContext());
+        maShapeSelection->add(xShape);
+    }
+
+    return true;
+}
+
 
 Reference< XWriter > SVGFilter::implCreateExportDocumentHandler( const Reference< XOutputStream >& rxOStm )
 {
@@ -773,7 +816,7 @@ bool SVGFilter::implExportDocument()
         }
     }
 
-    if(mbWriterOrCalcFilter)
+    if(mbWriterFilter || mbCalcFilter)
         implExportDocumentHeaderWriterOrCalc(nDocX, nDocY, nDocWidth, nDocHeight);
     else
         implExportDocumentHeaderImpressOrDraw(nDocX, nDocY, nDocWidth, nDocHeight);
@@ -2039,7 +2082,23 @@ bool SVGFilter::implCreateObjectsFromShape( const Reference< css::drawing::XDraw
 
         if( pObj )
         {
-            const Graphic aGraphic(SdrExchangeView::GetObjGraphic(*pObj));
+            Graphic aGraphic(SdrExchangeView::GetObjGraphic(*pObj));
+
+            // Writer graphic shapes are handled differently
+            if( mbWriterFilter && aGraphic.GetType() == GraphicType::NONE )
+            {
+                if (rxShape->getShapeType() == "com.sun.star.drawing.GraphicObjectShape")
+                {
+                    uno::Reference<beans::XPropertySet> xPropertySet(rxShape, uno::UNO_QUERY);
+                    uno::Reference<graphic::XGraphic> xGraphic;
+                    xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
+
+                    if (!xGraphic.is())
+                        return false;
+
+                    aGraphic = Graphic(xGraphic);
+                }
+            }
 
             if( aGraphic.GetType() != GraphicType::NONE )
             {
diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx
index 3f3b0d2b8e00..b1385a2c9a50 100644
--- a/filter/source/svg/svgfilter.cxx
+++ b/filter/source/svg/svgfilter.cxx
@@ -88,7 +88,9 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& rxCtx ) :
     mbExportShapeSelection(false),
     maFilterData(),
     mxDefaultPage(),
-    mbWriterOrCalcFilter(false),
+    mbWriterFilter(false),
+    mbCalcFilter(false),
+    mbImpressFilter(false),
     mpDefaultSdrPage( nullptr ),
     mpSdrModel( nullptr ),
     mbPresentation( false ),
@@ -107,7 +109,9 @@ SVGFilter::~SVGFilter()
 
 sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescriptor )
 {
-    mbWriterOrCalcFilter = false;
+    mbWriterFilter = false;
+    mbCalcFilter = false;
+    mbImpressFilter = false;
 
     if(mxDstDoc.is()) // Import works for Impress / draw only
         return filterImpressOrDraw(rDescriptor);
@@ -120,9 +124,19 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto
             {
                 OUString sFilterName;
                 rDescriptor[nInd].Value >>= sFilterName;
-                if(sFilterName != "impress_svg_Export")
+                if(sFilterName == "impress_svg_Export")
                 {
-                    mbWriterOrCalcFilter = true;
+                    mbImpressFilter = true;
+                    return filterImpressOrDraw(rDescriptor);
+                }
+                else if(sFilterName == "writer_svg_Export")
+                {
+                    mbWriterFilter = true;
+                    return filterWriterOrCalc(rDescriptor);
+                }
+                else if(sFilterName == "calc_svg_Export")
+                {
+                    mbCalcFilter = true;
                     return filterWriterOrCalc(rDescriptor);
                 }
                 break;
@@ -549,7 +563,7 @@ bool SVGFilter::filterWriterOrCalc( const Sequence< PropertyValue >& rDescriptor
         }
     }
 
-    if(!bSelectionOnly) // For Writer onéy the selection-only mode is supported
+    if(!bSelectionOnly) // For Writer only the selection-only mode is supported
         return false;
 
     uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext));
@@ -564,10 +578,18 @@ bool SVGFilter::filterWriterOrCalc( const Sequence< PropertyValue >& rDescriptor
     if (!xSelection.is())
         return false;
 
-    xSelection->getSelection() >>= maShapeSelection;
+    bool bGotSelection = xSelection->getSelection() >>= maShapeSelection;
 
-    if (!maShapeSelection)
-        return false;
+    if (!bGotSelection)
+    {
+        if (mbWriterFilter)
+        {
+            // For Writer we might have a non-shape graphic
+            bGotSelection = implExportWriterTextGraphic(xSelection);
+        }
+        if (!bGotSelection)
+            return false;
+    }
 
     // Select only one draw page
     uno::Reference< drawing::XDrawPagesSupplier > xDrawPagesSupplier( mxSrcDoc, uno::UNO_QUERY );
diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx
index baaea0519537..0ac6c26fc25b 100644
--- a/filter/source/svg/svgfilter.hxx
+++ b/filter/source/svg/svgfilter.hxx
@@ -30,6 +30,7 @@
 #include <com/sun/star/lang/XComponent.hpp>
 #include <cppuhelper/implbase.hxx>
 #include <com/sun/star/xml/sax/XWriter.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
 
 #include <osl/diagnose.h>
 #include <sal/log.hxx>
@@ -57,6 +58,7 @@ using namespace ::com::sun::star::document;
 using namespace ::com::sun::star::io;
 using namespace ::com::sun::star::lang;
 using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
 using namespace ::com::sun::star::xml::sax;
 
 #define SVG_EXPORT_ALLPAGES ((sal_Int32)-1)
@@ -211,7 +213,9 @@ private:
     Reference< css::drawing::XDrawPage > mxDefaultPage;
     std::vector< Reference< css::drawing::XDrawPage > > mSelectedPages;
 
-    bool                                mbWriterOrCalcFilter;
+    bool                                mbWriterFilter;
+    bool                                mbCalcFilter;
+    bool                                mbImpressFilter;
 
 
     /// Impress / draw only members
@@ -235,6 +239,8 @@ private:
     bool                            implExport( const Sequence< PropertyValue >& rDescriptor );
     bool                            implExportImpressOrDraw( const Reference< XOutputStream >& rxOStm );
     bool                            implExportWriterOrCalc( const Reference< XOutputStream >& rxOStm );
+    bool                            implExportWriterTextGraphic( const Reference< view::XSelectionSupplier >& xSelectionSupplier );
+
     static Reference< XWriter >     implCreateExportDocumentHandler( const Reference< XOutputStream >& rxOStm );
 
     void                            implGetPagePropSet( const Reference< css::drawing::XDrawPage > & rxPage );


More information about the Libreoffice-commits mailing list