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

Grzegorz Araminowicz g.araminowicz at gmail.com
Mon Jul 24 13:44:15 UTC 2017


 oox/source/drawingml/diagram/diagramlayoutatoms.cxx |   49 +++++++-------------
 1 file changed, 18 insertions(+), 31 deletions(-)

New commits:
commit 64cd173f346d35c28909b4ac8f9c2d2a939049b7
Author: Grzegorz Araminowicz <g.araminowicz at gmail.com>
Date:   Sat Jul 22 19:03:03 2017 +0200

    SmartArt: cycle layout algorithm
    
    Change-Id: Ia6863ed6ee8f8bc3240f0ab16a58e59141b2a2d1
    Reviewed-on: https://gerrit.libreoffice.org/40314
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
index d1c172862541..a9ebdff157e0 100644
--- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
+++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
@@ -167,39 +167,26 @@ void AlgAtom::layoutShape( const ShapePtr& rShape,
             if (rShape->getChildren().empty())
                 break;
 
-            const sal_Int32 nStartAngle=maMap.count(XML_stAng) ? maMap.find(XML_stAng)->second : 0;
-            const sal_Int32 nSpanAngle=maMap.count(XML_spanAng) ? maMap.find(XML_spanAng)->second : 360;
-
-            std::vector<ShapePtr>::const_iterator aCurrShape=rShape->getChildren().begin();
-            const std::vector<ShapePtr>::const_iterator aLastShape=rShape->getChildren().end();
-            const sal_Int32 nShapes=aLastShape-aCurrShape;
-
-            // find biggest shape
-            awt::Size aMaxSize;
-            while( aCurrShape != aLastShape )
-            {
-                const awt::Size& sz=(*aCurrShape)->getSize();
-
-                aMaxSize.Width = std::max(
-                    aMaxSize.Width,
-                    sz.Width);
-                aMaxSize.Height = std::max(
-                    aMaxSize.Height,
-                    sz.Height);
-
-                ++aCurrShape;
-            }
-
-            // layout shapes
-            const sal_Int32 nMaxDim=std::max(aMaxSize.Width,aMaxSize.Height);
-            aCurrShape=rShape->getChildren().begin();
-            for( sal_Int32 i=0; i<nShapes; ++i, ++aCurrShape )
+            const sal_Int32 nStartAngle = maMap.count(XML_stAng) ? maMap.find(XML_stAng)->second : 0;
+            const sal_Int32 nSpanAngle = maMap.count(XML_spanAng) ? maMap.find(XML_spanAng)->second : 360;
+            const sal_Int32 nShapes = rShape->getChildren().size();
+            const awt::Size aCenter(rShape->getSize().Width / 2, rShape->getSize().Height / 2);
+            const awt::Size aChildSize(rShape->getSize().Width / 5, rShape->getSize().Height / 5);
+            const sal_Int32 r = std::min(
+                (rShape->getSize().Width - aChildSize.Width) / 2,
+                (rShape->getSize().Height - aChildSize.Height) / 2);
+
+            sal_Int32 idx = 0;
+            for (auto & aCurrShape : rShape->getChildren())
             {
-                const double r=nShapes*nMaxDim/F_2PI * 360.0/nSpanAngle;
                 const awt::Point aCurrPos(
-                    r + r*sin( (double(i)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ),
-                    r - r*cos( (double(i)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ) );
-                (*aCurrShape)->setPosition(aCurrPos);
+                    aCenter.Width + r*sin( (double(idx)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ) - aChildSize.Width/2,
+                    aCenter.Height - r*cos( (double(idx)*nSpanAngle/nShapes + nStartAngle)*F_PI180 ) - aChildSize.Height/2);
+
+                aCurrShape->setPosition(aCurrPos);
+                aCurrShape->setSize(aChildSize);
+                aCurrShape->setChildSize(aChildSize);
+                idx++;
             }
             break;
         }


More information about the Libreoffice-commits mailing list