diff options
-rw-r--r-- | filter/source/msfilter/msdffimp.cxx | 9 | ||||
-rw-r--r-- | filter/source/msfilter/svdfppt.cxx | 19 | ||||
-rw-r--r-- | include/filter/msfilter/msdffimp.hxx | 2 | ||||
-rw-r--r-- | include/filter/msfilter/svdfppt.hxx | 1 |
4 files changed, 29 insertions, 2 deletions
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index 76f67d63f3b6..ec6311454449 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -4116,7 +4116,7 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r insertShapeId(nShapeId, pTmp); } else - SdrObject::Free(pTmp); + FreeObj(pClientData, pTmp); } } else if ( aRecHd2.nRecType == DFF_msofbtSpContainer ) @@ -4135,7 +4135,7 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r insertShapeId(nShapeId, pTmp); } else - SdrObject::Free(pTmp); + FreeObj(pClientData, pTmp); } } if (!aRecHd2.SeekToEndOfRecord(rSt)) @@ -5035,6 +5035,11 @@ void SvxMSDffManager::GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt } } +void SvxMSDffManager::FreeObj(void* /*pData*/, SdrObject* pObj) +{ + SdrObject::Free(pObj); +} + SdrObject* SvxMSDffManager::ProcessObj(SvStream& rSt, DffObjData& rObjData, void* pData, diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 09bc2aacdbb7..92380143e9ab 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -715,6 +715,25 @@ sal_uLong DffPropSet::SanitizeEndPos(SvStream &rIn, sal_uLong nEndRecPos) return nEndRecPos; } +void SdrEscherImport::FreeObj(void* pData, SdrObject* pObj) +{ + ProcessData& rData = *static_cast<ProcessData*>(pData); + PptSlidePersistEntry& rPersistEntry = rData.rPersistEntry; + if (rPersistEntry.xSolverContainer) + { + for (auto & pPtr : rPersistEntry.xSolverContainer->aCList) + { + if (pPtr->pAObj == pObj) + pPtr->pAObj = nullptr; + if (pPtr->pBObj == pObj) + pPtr->pBObj = nullptr; + if (pPtr->pCObj == pObj) + pPtr->pCObj = nullptr; + } + } + SvxMSDffManager::FreeObj(pData, pObj); +} + /* ProcessObject is called from ImplSdPPTImport::ProcessObj to handle all application specific things, such as the import of text, animation effects, header footer and placeholder. diff --git a/include/filter/msfilter/msdffimp.hxx b/include/filter/msfilter/msdffimp.hxx index 0b64394794ce..0600f7dbdfde 100644 --- a/include/filter/msfilter/msdffimp.hxx +++ b/include/filter/msfilter/msdffimp.hxx @@ -498,6 +498,8 @@ protected: void* pData, tools::Rectangle& rTextRect, SdrObject* pObj); + virtual void FreeObj(void* pData, SdrObject* pObj); + /** Object finalization, used by the Excel filter to correctly compute the object anchoring after nested objects have been imported. diff --git a/include/filter/msfilter/svdfppt.hxx b/include/filter/msfilter/svdfppt.hxx index a4b058b581fa..3c18ec37f607 100644 --- a/include/filter/msfilter/svdfppt.hxx +++ b/include/filter/msfilter/svdfppt.hxx @@ -483,6 +483,7 @@ public: void RecolorGraphic( SvStream& rSt, sal_uInt32 nRecLen, Graphic& rGraph ); virtual SdrObject* ReadObjText( PPTTextObj* pTextObj, SdrObject* pObj, SdPageCapsule pPage ) const; virtual SdrObject* ProcessObj( SvStream& rSt, DffObjData& rData, void* pData, tools::Rectangle& rTextRect, SdrObject* pObj ) override; + virtual void FreeObj(void* pData, SdrObject* pObj) override; virtual void ProcessClientAnchor2( SvStream& rSt, DffRecordHeader& rHd, void* pData, DffObjData& rObj ) override; void ImportHeaderFooterContainer( DffRecordHeader const & rHeader, HeaderFooterEntry& rEntry ); }; |