Author: alg Date: Tue Dec 11 14:43:12 2012 New Revision: 1420199 URL: http://svn.apache.org/viewvc?rev=1420199&view=rev Log: #55394# Applied patch from Regina to solve mirror problem for CustomShapes Patch by: Regina Review by: alg
Modified: openoffice/trunk/main/svx/source/svdraw/svdoashp.cxx Modified: openoffice/trunk/main/svx/source/svdraw/svdoashp.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svx/source/svdraw/svdoashp.cxx?rev=1420199&r1=1420198&r2=1420199&view=diff ============================================================================== --- openoffice/trunk/main/svx/source/svdraw/svdoashp.cxx (original) +++ openoffice/trunk/main/svx/source/svdraw/svdoashp.cxx Tue Dec 11 14:43:12 2012 @@ -1921,68 +1921,49 @@ void SdrObjCustomShape::NbcRotate( const void SdrObjCustomShape::NbcMirror( const Point& rRef1, const Point& rRef2 ) { - // storing horizontal and vertical flipping without modifying the rotate angle + // TTTT: Fix for old mirroring, can be removed again in aw080 + // storing horizontal and vertical flipping without modifying the rotate angle + // decompose other flipping to rotation and MirrorX. + long ndx = rRef2.X()-rRef1.X(); + long ndy = rRef2.Y()-rRef1.Y(); - 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; - - if ( bHorz || bVert ) - { - SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); - - ///////////////// - // "MirroredX" // - ///////////////// - if ( bHorz ) - { - const rtl::OUString sMirroredX( RTL_CONSTASCII_USTRINGPARAM ( "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 rtl::OUString sMirroredY( RTL_CONSTASCII_USTRINGPARAM ( "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 ); - } - SdrTextObj::NbcMirror( rRef1, rRef2 ); - InvalidateRenderGeometry(); + if(!ndx) // MirroredX + { + SetMirroredX(!IsMirroredX()); + 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(); } void SdrObjCustomShape::Shear( const Point& rRef, long nWink, double tn, FASTBOOL bVShear ) @@ -1992,21 +1973,25 @@ void SdrObjCustomShape::Shear( const Poi } void SdrObjCustomShape::NbcShear( const Point& rRef, long nWink, double tn, FASTBOOL bVShear ) { - long nDrehWink = aGeo.nDrehWink; - if ( nDrehWink ) - { - aGeo.nDrehWink = -nDrehWink; - aGeo.RecalcSinCos(); - NbcRotate( rRef, aGeo.nDrehWink, aGeo.nSin, aGeo.nCos ); - } - SdrTextObj::NbcShear(rRef,nWink,tn,bVShear); - if ( nDrehWink ) - { - aGeo.nDrehWink = nDrehWink; - aGeo.RecalcSinCos(); - Rotate( rRef, aGeo.nDrehWink, aGeo.nSin, aGeo.nCos ); - } - InvalidateRenderGeometry(); + // TTTT: Fix for old mirroring, can be removed again in aw080 + SdrTextObj::NbcShear(rRef,nWink,tn,bVShear); + + // 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 ) + { + fObjectRotation = 360.0 + fObjectRotation; + } + + InvalidateRenderGeometry(); } ////////////////////////////////////////////////////////////////////////////////////////////////////