filter/inc/filter/msfilter/msdffimp.hxx | 2 +- filter/source/msfilter/msdffimp.cxx | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-)
New commits: commit e76d30177a1ff5fd8b08b8f5bb21441004a21141 Author: Don Lewis <truck...@apache.org> AuthorDate: Fri Aug 17 22:04:50 2018 +0000 Commit: Don Lewis <truck...@apache.org> CommitDate: Fri Aug 17 22:04:50 2018 +0000 Ignore the SP_FGROUP flag on shape records. Instead assume that the first shape in a shape group is the group shape. Add a new flag parameter to SvxMSDffManager::ImportShape() to indicate the whether or not this is a group shape based on the calling context. Call SvxMSDffManager::ImportShape() directly from SvxMSDffManager::ImportGroup() instead of indirectly via SvxMSDffManager::ImportObj() to facilitate passing the context information. Don't call SvxMSDffManager::ProcessObj() from SvxMSDffManager::ImportShape() when processing a group shape. SvxMSDffManager::ImportObj() expects SvxMSDffManager::ImportShape() to return a pointer to an SdrObjGroup object in this case, and SvxMSDffManager::ProcessObj() may replace the SdrObjGroup object with some other type of shape object. Change some C-style SdrObjGroup* casts to dynamic_cast so that incorrect casts will create a NULL pointer and fail quickly rather than executing methods on an object of the wrong type and doing something possibly undefined. diff --git a/filter/inc/filter/msfilter/msdffimp.hxx b/filter/inc/filter/msfilter/msdffimp.hxx index 02b58f0fdbf5..6ee04092c1a7 100644 --- a/filter/inc/filter/msfilter/msdffimp.hxx +++ b/filter/inc/filter/msfilter/msdffimp.hxx @@ -658,7 +658,7 @@ public: Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL ); SdrObject* ImportShape( const DffRecordHeader& rHd, SvStream& rSt, void* pData, - Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL); + Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL, sal_Bool bShapeGroup = sal_False); Rectangle GetGlobalChildAnchor( const DffRecordHeader& rHd, SvStream& rSt, Rectangle& aClientRect ); void GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt, diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index 3377b645d7fc..1665df6192f1 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -4174,7 +4174,7 @@ SdrObject* SvxMSDffManager::ImportObj( SvStream& rSt, void* pClientData, } else if ( aObjHd.nRecType == DFF_msofbtSpContainer ) { - pRet = ImportShape( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId ); + pRet = ImportShape( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId, sal_False ); } aObjHd.SeekToBegOfRecord( rSt ); // FilePos restaurieren return pRet; @@ -4197,8 +4197,7 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r sal_Int32 nGroupRotateAngle = 0; sal_Int32 nSpFlags = 0; mnFix16Angle = 0; - aRecHd.SeekToBegOfRecord( rSt ); - pRet = ImportObj( rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup + 1, pShapeId ); + pRet = ImportShape( aRecHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup + 1, pShapeId, sal_True ); if ( pRet ) { nSpFlags = nGroupShapeFlags; @@ -4239,7 +4238,7 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r SdrObject* pTmp = ImportGroup( aRecHd2, rSt, pClientData, aGroupClientAnchor, aGroupChildAnchor, nCalledByGroup + 1, &nShapeId ); if ( pTmp ) { - ((SdrObjGroup*)pRet)->GetSubList()->NbcInsertObject( pTmp ); + (dynamic_cast<SdrObjGroup*>(pRet))->GetSubList()->NbcInsertObject( pTmp ); if( nShapeId ) insertShapeId( nShapeId, pTmp ); } @@ -4248,10 +4247,10 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r { aRecHd2.SeekToBegOfRecord( rSt ); sal_Int32 nShapeId; - SdrObject* pTmp = ImportShape( aRecHd2, rSt, pClientData, aClientRect, aGlobalChildRect, nCalledByGroup + 1, &nShapeId ); + SdrObject* pTmp = ImportShape( aRecHd2, rSt, pClientData, aClientRect, aGlobalChildRect, nCalledByGroup + 1, &nShapeId, sal_False ); if ( pTmp ) { - ((SdrObjGroup*)pRet)->GetSubList()->NbcInsertObject( pTmp ); + (dynamic_cast<SdrObjGroup*>(pRet))->GetSubList()->NbcInsertObject( pTmp ); if( nShapeId ) insertShapeId( nShapeId, pTmp ); } @@ -4284,7 +4283,7 @@ SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& r SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& rSt, void* pClientData, Rectangle& rClientRect, const Rectangle& rGlobalChildRect, - int nCalledByGroup, sal_Int32* pShapeId ) + int nCalledByGroup, sal_Int32* pShapeId, sal_Bool bShapeGroup ) { SdrObject* pRet = NULL; @@ -4324,11 +4323,15 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r rSt >> aObjData.nShapeId >> aObjData.nSpFlags; aObjData.eShapeType = (MSO_SPT)maShapeRecords.Current()->nRecInstance; + if (bShapeGroup) + aObjData.nSpFlags |= SP_FGROUP; + else + aObjData.nSpFlags &= ~SP_FGROUP; } else { aObjData.nShapeId = 0; - aObjData.nSpFlags = 0; + aObjData.nSpFlags = bShapeGroup ? SP_FGROUP : 0; aObjData.eShapeType = mso_sptNil; } @@ -4935,8 +4938,8 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r pRet->SetName( aObjName ); } - pRet = - ProcessObj( rSt, aObjData, pClientData, aTextRect, pRet); + if (!bShapeGroup) + pRet = ProcessObj( rSt, aObjData, pClientData, aTextRect, pRet); if ( pRet ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits