From b6c90b82c389941e7c458739945d3df392d6c2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Wed, 7 Nov 2012 21:26:26 +0000 Subject: [PATCH] Resolves: fdo#56460 don't crash on close of files with custom shapes Change-Id: Ib9e7cdae3c7facb59c4630ca21c252698170379e --- svx/inc/svx/svdoashp.hxx | 4 +++- 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 8b91894..efbfac2 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 e3b69ad..0a07979 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(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(); } -- 1.7.11.7