diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-11-07 21:26:26 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2012-11-08 12:03:41 +0000 |
commit | 67f899e1d2db0dccde4b9587a52b7157fe1fb0be (patch) | |
tree | 5ed42096fec40fb321feff74e58b1a6902b59772 | |
parent | 6a0ba09f19f2be35ce33a4aef197b0d3e1915388 (diff) |
Resolves: fdo#56460 don't crash on close of files with custom shapes
Change-Id: Ib9e7cdae3c7facb59c4630ca21c252698170379e
-rw-r--r-- | svx/inc/svx/svdoashp.hxx | 4 | ||||
-rw-r--r-- | svx/source/svdraw/svdoashp.cxx | 40 |
2 files changed, 14 insertions, 30 deletions
diff --git a/svx/inc/svx/svdoashp.hxx b/svx/inc/svx/svdoashp.hxx index 8b91894485c5..efbfac201292 100644 --- a/svx/inc/svx/svdoashp.hxx +++ b/svx/inc/svx/svdoashp.hxx @@ -101,10 +101,12 @@ public: com::sun::star::uno::Reference< com::sun::star::drawing::XShape > mXRenderedCustomShape; + mutable com::sun::star::uno::Reference< com::sun::star::drawing::XCustomShapeEngine > mxCustomShapeEngine; + // #i37011# render geometry shadow SdrObject* mpLastShadowGeometry; - static com::sun::star::uno::Reference< com::sun::star::drawing::XCustomShapeEngine > GetCustomShapeEngine( const SdrObjCustomShape* pCustomShape ); + com::sun::star::uno::Reference< com::sun::star::drawing::XCustomShapeEngine > GetCustomShapeEngine() const; // SVX_DLLPRIVATE com::sun::star::uno::Sequence< com::sun::star::uno::Reference< com::sun::star::drawing::XCustomShapeHandle > > // SdrObjCustomShape::GetInteraction( const SdrObjCustomShape* pCustomShape ) const; diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx index e3b69ad60200..0a07979b83bd 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -96,13 +96,6 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::drawing; - -// A simple one item cache really helps here ... -namespace { - static const SdrObjCustomShape *g_pLastCacheShape; - static Reference< XCustomShapeEngine > g_xLastCacheShapeEngine; -} - static void lcl_ShapeSegmentFromBinary( EnhancedCustomShapeSegment& rSegInfo, sal_uInt16 nSDat ) { switch( nSDat >> 8 ) @@ -405,21 +398,18 @@ SdrObject* ImpCreateShadowObjectClone(const SdrObject& rOriginal, const SfxItemS //////////////////////////////////////////////////////////////////////////////////////////////////// -Reference< XCustomShapeEngine > SdrObjCustomShape::GetCustomShapeEngine( const SdrObjCustomShape* pCustomShape ) +Reference< XCustomShapeEngine > SdrObjCustomShape::GetCustomShapeEngine() const { - Reference< XCustomShapeEngine > xCustomShapeEngine; - - // We get dozens of back-to-back calls for the same shape - if( pCustomShape == g_pLastCacheShape ) - return g_xLastCacheShapeEngine; + if (mxCustomShapeEngine.is()) + return mxCustomShapeEngine; - String aEngine(((SdrCustomShapeEngineItem&)pCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_ENGINE )).GetValue()); + String aEngine(((SdrCustomShapeEngineItem&)GetMergedItem( SDRATTR_CUSTOMSHAPE_ENGINE )).GetValue()); if ( !aEngine.Len() ) aEngine = String( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.drawing.EnhancedCustomShapeEngine" ) ); Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); - Reference< XShape > aXShape = GetXShapeForSdrObject( (SdrObjCustomShape*)pCustomShape ); + Reference< XShape > aXShape = GetXShapeForSdrObject(const_cast<SdrObjCustomShape*>(this)); if ( aXShape.is() ) { if ( aEngine.Len() && xFactory.is() ) @@ -431,21 +421,18 @@ Reference< XCustomShapeEngine > SdrObjCustomShape::GetCustomShapeEngine( const S aArgument[ 0 ] <<= aPropValues; Reference< XInterface > xInterface( xFactory->createInstanceWithArguments( aEngine, aArgument ) ); if ( xInterface.is() ) - xCustomShapeEngine = Reference< XCustomShapeEngine >( xInterface, UNO_QUERY ); + mxCustomShapeEngine = Reference< XCustomShapeEngine >( xInterface, UNO_QUERY ); } } - g_pLastCacheShape = pCustomShape; - g_xLastCacheShapeEngine = xCustomShapeEngine; - - return xCustomShapeEngine; + return mxCustomShapeEngine; } const SdrObject* SdrObjCustomShape::GetSdrObjectFromCustomShape() const { if ( !mXRenderedCustomShape.is() ) { - Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine( this ) ); + Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine() ); if ( xCustomShapeEngine.is() ) ((SdrObjCustomShape*)this)->mXRenderedCustomShape = xCustomShapeEngine->render(); } @@ -577,7 +564,7 @@ sal_Bool SdrObjCustomShape::GetTextBounds( Rectangle& rTextBound ) const { sal_Bool bRet = sal_False; - Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine( this ) ); + Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine() ); if ( xCustomShapeEngine.is() ) { awt::Rectangle aR( xCustomShapeEngine->getTextBounds() ); @@ -592,7 +579,7 @@ sal_Bool SdrObjCustomShape::GetTextBounds( Rectangle& rTextBound ) const basegfx::B2DPolyPolygon SdrObjCustomShape::GetLineGeometry( const SdrObjCustomShape* pCustomShape, const sal_Bool bBezierAllowed ) { basegfx::B2DPolyPolygon aRetval; - Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine( pCustomShape ) ); + Reference< XCustomShapeEngine > xCustomShapeEngine( pCustomShape->GetCustomShapeEngine() ); if ( xCustomShapeEngine.is() ) { com::sun::star::drawing::PolyPolygonBezierCoords aBezierCoords = xCustomShapeEngine->getLineGeometry(); @@ -616,7 +603,7 @@ std::vector< SdrCustomShapeInteraction > SdrObjCustomShape::GetInteractionHandle std::vector< SdrCustomShapeInteraction > xRet; try { - Reference< XCustomShapeEngine > xCustomShapeEngine( GetCustomShapeEngine( pCustomShape ) ); + Reference< XCustomShapeEngine > xCustomShapeEngine( pCustomShape->GetCustomShapeEngine() ); if ( xCustomShapeEngine.is() ) { int i; @@ -865,11 +852,6 @@ SdrObjCustomShape::SdrObjCustomShape() : SdrObjCustomShape::~SdrObjCustomShape() { - if (this == g_pLastCacheShape) - { - g_pLastCacheShape = NULL; - g_xLastCacheShapeEngine.clear(); - } // delete buffered display geometry InvalidateRenderGeometry(); } |