You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2014/04/10 17:02:31 UTC

svn commit: r1586325 - in /openoffice/trunk/main/filter/source/svg: svgexport.cxx svgfilter.cxx svgfilter.hxx

Author: alg
Date: Thu Apr 10 15:02:30 2014
New Revision: 1586325

URL: http://svn.apache.org/r1586325
Log:
i124608 when exporting selection, use selection boundrect as svg canvas

Modified:
    openoffice/trunk/main/filter/source/svg/svgexport.cxx
    openoffice/trunk/main/filter/source/svg/svgfilter.cxx
    openoffice/trunk/main/filter/source/svg/svgfilter.hxx

Modified: openoffice/trunk/main/filter/source/svg/svgexport.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/filter/source/svg/svgexport.cxx?rev=1586325&r1=1586324&r2=1586325&view=diff
==============================================================================
--- openoffice/trunk/main/filter/source/svg/svgexport.cxx (original)
+++ openoffice/trunk/main/filter/source/svg/svgexport.cxx Thu Apr 10 15:02:30 2014
@@ -31,6 +31,8 @@
 #include "svgfilter.hxx"
 #include "impsvgdialog.hxx"
 
+#include <com/sun/star/graphic/XPrimitiveFactory2D.hpp>
+
 #include <svx/unopage.hxx>
 #include <svx/unoshape.hxx>
 #include <svx/svdpage.hxx>
@@ -39,6 +41,8 @@
 #include <editeng/flditem.hxx>
 #include <editeng/numitem.hxx>
 
+using namespace ::com::sun::star::graphic;
+using namespace ::com::sun::star::geometry;
 using ::rtl::OUString;
 
 // -------------
@@ -398,6 +402,7 @@ sal_Bool SVGFilter::implExportDocument( 
 				"SVGFilter::implExportDocument: invalid parameter" );
 
 	OUString		aAttr;
+	sal_Int32		nDocX = 0, nDocY = 0; // #124608#
 	sal_Int32		nDocWidth = 0, nDocHeight = 0;
 	sal_Int32		nVisible = -1, nVisibleMaster = -1;
 	sal_Bool 		bRet = sal_False;
@@ -407,12 +412,63 @@ sal_Bool SVGFilter::implExportDocument( 
 
 	const Reference< XPropertySet >             xDefaultPagePropertySet( mxDefaultPage, UNO_QUERY );
     const Reference< XExtendedDocumentHandler > xExtDocHandler( mpSVGExport->GetDocHandler(), UNO_QUERY );
- 	
-    if( xDefaultPagePropertySet.is() )
-	{
-		xDefaultPagePropertySet->getPropertyValue( B2UCONST( "Width" ) ) >>= nDocWidth;
-		xDefaultPagePropertySet->getPropertyValue( B2UCONST( "Height" ) ) >>= nDocHeight;
-	}
+
+    // #124608#
+    mbExportSelection = maShapeSelection.is() && maShapeSelection->getCount();
+
+    if(xDefaultPagePropertySet.is())
+    {
+        xDefaultPagePropertySet->getPropertyValue(B2UCONST("Width")) >>= nDocWidth;
+        xDefaultPagePropertySet->getPropertyValue(B2UCONST("Height")) >>= nDocHeight;
+    }
+
+    if(mbExportSelection)
+    {
+        // #124608# create BoundRange and set nDocX, nDocY, nDocWidth and nDocHeight
+        basegfx::B2DRange aShapeRange;
+
+        Reference< XPrimitiveFactory2D > xPrimitiveFactory(
+            mxMSF->createInstance(
+                String(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.graphic.PrimitiveFactory2D"))),
+                UNO_QUERY);
+
+        // 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())
+        {
+            Reference< 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())
+                {
+                    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));
+                    }
+                }
+            }
+        }
+
+        if(!aShapeRange.isEmpty())
+        {
+            nDocX = basegfx::fround(aShapeRange.getMinX());
+            nDocY = basegfx::fround(aShapeRange.getMinY());
+            nDocWidth  = basegfx::fround(aShapeRange.getWidth());
+            nDocHeight = basegfx::fround(aShapeRange.getHeight());
+        }
+    }
       
     if( xExtDocHandler.is() && !mpSVGExport->IsUseTinyProfile() )
     {
@@ -434,11 +490,23 @@ sal_Bool SVGFilter::implExportDocument( 
 	mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "height", aAttr );
 #endif
 
-    aAttr = B2UCONST( "0 0 " );
+    // #124608# set viewBox explicitely to the exported content
+    if(mbExportSelection)
+    {
+        aAttr = OUString::valueOf( nDocX );
+        aAttr += B2UCONST( " " );
+        aAttr += OUString::valueOf( nDocY );
+        aAttr += B2UCONST( " " );
+    }
+    else
+    {
+        aAttr = B2UCONST( "0 0 " );
+    }
+
     aAttr += OUString::valueOf( nDocWidth );
     aAttr += B2UCONST( " " );
     aAttr += OUString::valueOf( nDocHeight );
-	mpSVGExport->SetViewBox( Rectangle( Point(), Size( nDocWidth, nDocHeight ) ) );
+	mpSVGExport->SetViewBox( Rectangle( Point(nDocX, nDocY), Size( nDocWidth, nDocHeight ) ) );
     mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "viewBox", aAttr );
 	mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "preserveAspectRatio", B2UCONST( "xMidYMid" ) );
 	mpSVGExport->AddAttribute( XML_NAMESPACE_NONE, "fill-rule", B2UCONST( "evenodd" ) );
@@ -514,7 +582,7 @@ sal_Bool SVGFilter::implExportDocument( 
 	{
         if(bSinglePage)
         {
-            if(maShapeSelection.is() && maShapeSelection->getCount())
+            if(mbExportSelection)
             {
                 // #124608# export a given object selection, so no MasterPage export at all
             }
@@ -639,7 +707,7 @@ sal_Bool SVGFilter::implExportPages( con
 		{
             Reference< XShapes > xShapes;
 
-            if(maShapeSelection.is() && maShapeSelection->getCount())
+            if(mbExportSelection)
             {
                 // #124608# export a given object selection
                 xShapes = maShapeSelection;
@@ -924,7 +992,7 @@ sal_Bool SVGFilter::implCreateObjects( c
         DBG_ASSERT( nPageToExport >= 0 && nPageToExport < rxDrawPages->getCount(),
                     "SVGFilter::implCreateObjects: invalid page number to export" );
 
-        if(maShapeSelection.is() && maShapeSelection->getCount())
+        if(mbExportSelection)
         {
             // #124608# export a given object selection
             implCreateObjectsFromShapes(maShapeSelection);

Modified: openoffice/trunk/main/filter/source/svg/svgfilter.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/filter/source/svg/svgfilter.cxx?rev=1586325&r1=1586324&r2=1586325&view=diff
==============================================================================
--- openoffice/trunk/main/filter/source/svg/svgfilter.cxx (original)
+++ openoffice/trunk/main/filter/source/svg/svgfilter.cxx Thu Apr 10 15:02:30 2014
@@ -52,7 +52,22 @@ SVGFilter::SVGFilter( const Reference< X
 	mpSVGWriter( NULL ),
 	mpDefaultSdrPage( NULL ),
 	mpSdrModel( NULL ),
-    mbPresentation( sal_False )
+    mbPresentation( sal_False ),
+    mpObjects( NULL ),
+    mxSrcDoc(),
+#ifdef SOLAR_JAVA
+    mxDstDoc(),
+#endif
+    mxDefaultPage(),
+    maFilterData(),
+    maShapeSelection(),
+    mbExportSelection(false),
+    maUniqueIdVector(),
+    mnMasterSlideId(0),
+    mnSlideId(0),
+    mnDrawingGroupId(0),
+    mnDrawingId(0),
+    maOldFieldHdl()
 {
 }
 

Modified: openoffice/trunk/main/filter/source/svg/svgfilter.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/filter/source/svg/svgfilter.hxx?rev=1586325&r1=1586324&r2=1586325&view=diff
==============================================================================
--- openoffice/trunk/main/filter/source/svg/svgfilter.hxx (original)
+++ openoffice/trunk/main/filter/source/svg/svgfilter.hxx Thu Apr 10 15:02:30 2014
@@ -249,6 +249,7 @@ private:
 
     // #124608# explicit ShapeSelection for export when export of the selection is wanted
     Reference< XShapes >                maShapeSelection;
+    bool                                mbExportSelection;
 
     UniqueIdVector                      maUniqueIdVector;
     sal_Int32                           mnMasterSlideId;