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

Mark Hung marklh9 at gmail.com
Sat Nov 12 03:19:48 UTC 2016


 svx/source/customshapes/EnhancedCustomShape2d.cxx |   50 ++++++++++++++++++++--
 1 file changed, 47 insertions(+), 3 deletions(-)

New commits:
commit a39a2d28acb7f6034379a3c7ad47974f9c703fb6
Author: Mark Hung <marklh9 at gmail.com>
Date:   Sun Nov 6 13:03:29 2016 +0800

    tdf#100733 svx: use RefR and RefAngle for polar handles.
    
    Shapes imports from ooxml use RefR and RefAngle that refers
    to adjustment to be updated. Though the properties exist
    but the functions weren't implemented before.
    
    Change-Id: Ib45c2e8b16c9a7b41387a3e8c356b803eaf74b77
    Reviewed-on: https://gerrit.libreoffice.org/30603
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Mark Hung <marklh9 at gmail.com>

diff --git a/svx/source/customshapes/EnhancedCustomShape2d.cxx b/svx/source/customshapes/EnhancedCustomShape2d.cxx
index 91bd8af..bfe5f52 100644
--- a/svx/source/customshapes/EnhancedCustomShape2d.cxx
+++ b/svx/source/customshapes/EnhancedCustomShape2d.cxx
@@ -1204,14 +1204,32 @@ bool EnhancedCustomShape2d::SetHandleControllerPosition( const sal_uInt32 nIndex
             fPos1 /= fXScale;
             fPos2 /= fYScale;
 
+            // Used for scaling the adjustment values based on handle positions
+            double fWidth;
+            double fHeight;
+
+            if ( nCoordWidth || nCoordHeight )
+            {
+                fWidth = nCoordWidth;
+                fHeight = nCoordHeight;
+            }
+            else
+            {
+                fWidth = aLogicRect.GetWidth();
+                fHeight = aLogicRect.GetHeight();
+            }
+
             if ( aHandle.nFlags & HandleFlags::SWITCHED )
             {
                 if ( aLogicRect.GetHeight() > aLogicRect.GetWidth() )
                 {
                     double fX = fPos1;
                     double fY = fPos2;
+                    double fTmp = fWidth;
                     fPos1 = fY;
                     fPos2 = fX;
+                    fHeight = fWidth;
+                    fWidth = fTmp;
                 }
             }
 
@@ -1222,11 +1240,22 @@ bool EnhancedCustomShape2d::SetHandleControllerPosition( const sal_uInt32 nIndex
             if ( aHandle.aPosition.Second.Type == EnhancedCustomShapeParameterType::ADJUSTMENT )
                 aHandle.aPosition.Second.Value>>= nSecondAdjustmentValue;
 
-            if ( aHandle.nFlags & HandleFlags::POLAR )
+
+            // DrawingML polar handles set REFR or REFANGLE instead of POLAR
+            if ( aHandle.nFlags & ( HandleFlags::POLAR | HandleFlags::REFR | HandleFlags::REFANGLE ) )
             {
                 double fXRef, fYRef, fAngle;
-                GetParameter( fXRef, aHandle.aPolar.First, false, false );
-                GetParameter( fYRef, aHandle.aPolar.Second, false, false );
+                if ( aHandle.nFlags & HandleFlags::POLAR )
+                {
+                    GetParameter( fXRef, aHandle.aPolar.First, false, false );
+                    GetParameter( fYRef, aHandle.aPolar.Second, false, false );
+                }
+                else
+                {
+                    // DrawingML polar handles don't have reference center.
+                    fXRef = fWidth / 2;
+                    fYRef = fHeight / 2;
+                }
                 const double fDX = fPos1 - fXRef;
                 fAngle = -( atan2( -fPos2 + fYRef, ( ( fDX == 0.0L ) ? 0.000000001 : fDX ) ) / F_PI180 );
                 double fX = ( fPos1 - fXRef );
@@ -1246,6 +1275,21 @@ bool EnhancedCustomShape2d::SetHandleControllerPosition( const sal_uInt32 nIndex
                     if ( fRadius > fMax )
                         fRadius = fMax;
                 }
+                if (aHandle.nFlags & HandleFlags::REFR)
+                {
+                    fRadius *= 100000.0;
+                    fRadius /= sqrt( fWidth * fWidth + fHeight * fHeight );
+                    nFirstAdjustmentValue = aHandle.nRefR;
+                }
+                if (aHandle.nFlags & HandleFlags::REFANGLE)
+                {
+                    if ( fAngle < 0 )
+                        fAngle += 360.0;
+                    // Adjustment value referred by nRefAngle needs to be in 60000th a degree
+                    // from 0 to 21600000.
+                    fAngle *= 60000.0;
+                    nSecondAdjustmentValue = aHandle.nRefAngle;
+                }
                 if ( nFirstAdjustmentValue >= 0 )
                     SetAdjustValueAsDouble( fRadius, nFirstAdjustmentValue );
                 if ( nSecondAdjustmentValue >= 0 )


More information about the Libreoffice-commits mailing list