summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-11-07 21:26:26 +0000
committerMichael Meeks <michael.meeks@suse.com>2012-11-08 12:03:41 +0000
commit67f899e1d2db0dccde4b9587a52b7157fe1fb0be (patch)
tree5ed42096fec40fb321feff74e58b1a6902b59772
parent6a0ba09f19f2be35ce33a4aef197b0d3e1915388 (diff)
Resolves: fdo#56460 don't crash on close of files with custom shapes
Change-Id: Ib9e7cdae3c7facb59c4630ca21c252698170379e
-rw-r--r--svx/inc/svx/svdoashp.hxx4
-rw-r--r--svx/source/svdraw/svdoashp.cxx40
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();
}