Resolves: #i55394# solve mirror problem for CustomShapes

Patch by: Regina
Review by: alg

(cherry picked from commit 79fe1227e77fa66cbfd9c4d1ca106b596966bd18)

Conflicts:
	svx/source/svdraw/svdoashp.cxx

Change-Id: I0e8c15b3dd3b6b930dffa862c349270c27966704
diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx
index babab98..91e46be 100644
--- a/svx/source/svdraw/svdoashp.cxx
+++ b/svx/source/svdraw/svdoashp.cxx
@@ -1644,62 +1644,48 @@ void SdrObjCustomShape::NbcRotate( const Point& rRef, long nWink, double sn, dou

void SdrObjCustomShape::NbcMirror( const Point& rRef1, const Point& rRef2 )
{
    // TTTT: Fix for old mirroring, can be removed again in aw080
    // storing horizontal and vertical flipping without modifying the rotate angle
    sal_Bool bHorz = sal_False;
    sal_Bool bVert = sal_False;
    if ( rRef1.X() == rRef2.X() )
        bHorz = sal_True;
    if ( rRef1.Y() == rRef2.Y() )
        bVert = sal_True;
    if ( !bHorz && !bVert )
        bHorz = bVert = sal_True;
    // decompose other flipping to rotation and MirrorX.
    long ndx = rRef2.X()-rRef1.X();
    long ndy = rRef2.Y()-rRef1.Y();

    if ( bHorz || bVert )
    if(!ndx) // MirroredX
    {
        SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) );

        // "MirroredX" //
        if ( bHorz )
        {
            const OUString sMirroredX( "MirroredX" );
            com::sun::star::uno::Any* pAny = aGeometryItem.GetPropertyValueByName( sMirroredX );
            if ( pAny )
            {
                sal_Bool bFlip = sal_Bool();
                if ( *pAny >>= bFlip )
                {
                    if ( bFlip )
                        bHorz = sal_False;
                }
            }
            PropertyValue aPropVal;
            aPropVal.Name = sMirroredX;
            aPropVal.Value <<= bHorz;
            aGeometryItem.SetPropertyValue( aPropVal );
        }

        // "MirroredY" //
        if ( bVert )
        {
            const OUString sMirroredY( "MirroredY" );
            com::sun::star::uno::Any* pAny = aGeometryItem.GetPropertyValueByName( sMirroredY );
            if ( pAny )
            {
                sal_Bool bFlip = sal_Bool();
                if ( *pAny >>= bFlip )
                {
                    if ( bFlip )
                        bVert = sal_False;
                }
            }
            PropertyValue aPropVal;
            aPropVal.Name = sMirroredY;
            aPropVal.Value <<= bVert;
            aGeometryItem.SetPropertyValue( aPropVal );
        }
        SetMergedItem( aGeometryItem );
         SetMirroredX(!IsMirroredX());
         SdrTextObj::NbcMirror( rRef1, rRef2 );
    }
    SdrTextObj::NbcMirror( rRef1, rRef2 );
    else
    {
        if(!ndy)  // MirroredY
        {
            SetMirroredY(!IsMirroredY());
            SdrTextObj::NbcMirror( rRef1, rRef2 );
        }
        else // neither horizontal nor vertical
        {
            SetMirroredX(!IsMirroredX());

            // call parent
            SdrTextObj::NbcMirror( rRef1, rRef2 );

            // update fObjectRotation
            long nTextObjRotation = aGeo.nDrehWink;
            double fWink = nTextObjRotation;

            fWink /= 100.0;

            bool bSingleFlip = (IsMirroredX()!= IsMirroredY());

            fObjectRotation = fmod( bSingleFlip ? -fWink : fWink, 360.0 );

            if ( fObjectRotation < 0 )
            {
                fObjectRotation = 360.0 + fObjectRotation;
            }
         }
    }

    InvalidateRenderGeometry();
}

@@ -1710,20 +1696,24 @@ void SdrObjCustomShape::Shear( const Point& rRef, long nWink, double tn, bool bV
}
void SdrObjCustomShape::NbcShear( const Point& rRef, long nWink, double tn, bool bVShear )
{
    long nDrehWink = aGeo.nDrehWink;
    if ( nDrehWink )
    {
        aGeo.nDrehWink = -nDrehWink;
        aGeo.RecalcSinCos();
        NbcRotate( rRef, aGeo.nDrehWink, aGeo.nSin, aGeo.nCos );
    }
    // TTTT: Fix for old mirroring, can be removed again in aw080
    SdrTextObj::NbcShear(rRef,nWink,tn,bVShear);
    if ( nDrehWink )

    // updating fObjectRotation
    long nTextObjRotation = aGeo.nDrehWink;
    double fWink = nTextObjRotation;

    fWink /= 100.0;

    bool bSingleFlip = (IsMirroredX()!= IsMirroredY());

    fObjectRotation = fmod( bSingleFlip ? -fWink : fWink, 360.0 );

    if ( fObjectRotation < 0 )
    {
        aGeo.nDrehWink = nDrehWink;
        aGeo.RecalcSinCos();
        Rotate( rRef, aGeo.nDrehWink, aGeo.nSin, aGeo.nCos );
        fObjectRotation = 360.0 + fObjectRotation;
    }

    InvalidateRenderGeometry();
}