Author: alg
Date: Tue Nov 20 14:38:15 2012
New Revision: 1411685

URL: http://svn.apache.org/viewvc?rev=1411685&view=rev
Log:
When TRSetBaseGeometry at SdrObjCustomShape gives negative scales (mirrorings) 
use these to actually apply mirroring as intended to the shapes. This is always 
valid and a preparation for aw080 where the mirroring will be part of the 
objects transformstion

Modified:
    incubator/ooo/trunk/main/svx/inc/svx/svdoashp.hxx
    incubator/ooo/trunk/main/svx/source/svdraw/svdoashp.cxx
    incubator/ooo/trunk/main/svx/source/unodraw/unoshap2.cxx

Modified: incubator/ooo/trunk/main/svx/inc/svx/svdoashp.hxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/inc/svx/svdoashp.hxx?rev=1411685&r1=1411684&r2=1411685&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/inc/svx/svdoashp.hxx (original)
+++ incubator/ooo/trunk/main/svx/inc/svx/svdoashp.hxx Tue Nov 20 14:38:15 2012
@@ -135,6 +135,8 @@ protected:
        String          aName;
 
 public:
+    bool bPurposeFlipX;
+    bool bPurposeFlipY;
 
        sal_Bool UseNoFillStyle() const;
 

Modified: incubator/ooo/trunk/main/svx/source/svdraw/svdoashp.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/svdraw/svdoashp.cxx?rev=1411685&r1=1411684&r2=1411685&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/svdraw/svdoashp.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/svdraw/svdoashp.cxx Tue Nov 20 14:38:15 
2012
@@ -3273,12 +3273,41 @@ void SdrObjCustomShape::TRSetBaseGeometr
 
        // #i75086# Old DrawingLayer (GeoStat and geometry) does not support 
holding negative scalings
        // in X and Y which equal a 180 degree rotation. Recognize it and react 
accordingly
-       if(basegfx::fTools::less(aScale.getX(), 0.0) && 
basegfx::fTools::less(aScale.getY(), 0.0))
+    const bool bMirrorX(basegfx::fTools::less(aScale.getX(), 0.0));
+    const bool bMirrorY(basegfx::fTools::less(aScale.getY(), 0.0));
+
+       if(bMirrorX && bMirrorY)
        {
                aScale.setX(fabs(aScale.getX()));
                aScale.setY(fabs(aScale.getY()));
                fRotate = fmod(fRotate + F_PI, F_2PI);
        }
+    else if(bMirrorX || bMirrorY)
+    {
+        basegfx::B2DHomMatrix aNew;
+
+        // create pre-multiplied matrix without mirroring
+        aNew.translate(-0.5, -0.5);
+        aNew.scale(bMirrorX ? -1.0 : 1.0, bMirrorY ? -1.0 : 1.0);
+        aNew.translate(0.5, 0.5);
+        aNew = rMatrix * aNew;
+
+        // decompose to get corrected, mirror-free values
+        aNew.decompose(aScale, aTranslate, fRotate, fShearX);
+
+        // apply mirroring to CustomShapeGeometry
+        if((bool)IsMirroredX() != bMirrorX)
+        {
+            SetMirroredX(bMirrorX);
+            bPurposeFlipX = !bPurposeFlipX;
+        }
+
+        if((bool)IsMirroredY() != bMirrorY)
+        {
+            SetMirroredY(bMirrorY);
+            bPurposeFlipY = !bPurposeFlipY;
+        }
+    }
 
        // reset object shear and rotations
        aGeo.nDrehWink = 0;

Modified: incubator/ooo/trunk/main/svx/source/unodraw/unoshap2.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/unodraw/unoshap2.cxx?rev=1411685&r1=1411684&r2=1411685&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/unodraw/unoshap2.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/unodraw/unoshap2.cxx Tue Nov 20 
14:38:15 2012
@@ -2098,6 +2098,7 @@ void SAL_CALL SvxCustomShape::setPropert
        {
                bMirroredX = ( ((SdrObjCustomShape*)pObject)->IsMirroredX() );
                bMirroredY = ( ((SdrObjCustomShape*)pObject)->IsMirroredY() );
+        ((SdrObjCustomShape*)pObject)->bPurposeFlipX = 
((SdrObjCustomShape*)pObject)->bPurposeFlipY = false;
        }
 
        SvxShape::setPropertyValue( aPropertyName, aValue );
@@ -2126,7 +2127,8 @@ void SAL_CALL SvxCustomShape::setPropert
                        pObject->NbcMirror( aTop, aBottom );
                        // NbcMirroring is flipping the current mirror state,
                        // so we have to set the correct state again
-                       ((SdrObjCustomShape*)pObject)->SetMirroredX( bMirroredX 
? sal_False : sal_True );
+            if(((SdrObjCustomShape*)pObject)->bPurposeFlipX)
+                       ((SdrObjCustomShape*)pObject)->SetMirroredX( bMirroredX 
? sal_False : sal_True );
                }
                if ( bNeedsMirrorY )
                {
@@ -2135,7 +2137,8 @@ void SAL_CALL SvxCustomShape::setPropert
                        pObject->NbcMirror( aLeft, aRight );
                        // NbcMirroring is flipping the current mirror state,
                        // so we have to set the correct state again
-                       ((SdrObjCustomShape*)pObject)->SetMirroredY( bMirroredY 
? sal_False : sal_True );
+            if(((SdrObjCustomShape*)pObject)->bPurposeFlipY)
+                       ((SdrObjCustomShape*)pObject)->SetMirroredY( bMirroredY 
? sal_False : sal_True );
                }
 
                if( pListCopy )


Reply via email to