filter/source/msfilter/msdffimp.cxx | 180 ++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 98 deletions(-)
New commits: commit 95f0811c093680e6258f3bc973a3f7a3731a28f4 Author: Kohei Yoshida <[email protected]> Date: Tue Aug 12 14:00:03 2014 -0400 Revert "Resolves: #i125187# more precision where the BLIP graphic is located" This reverts commit 3ea17073114cae99d7c323f051a4a2ba074f043c. That change from AOO single-handedly broke all image import from xls binary files. Change-Id: I384ae8f286ccc9d39e64de9da5ef6458af0a0972 diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index d3ba8ca..2bf8a09 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -5823,46 +5823,25 @@ void SvxMSDffManager::GetDrawingGroupContainerData( SvStream& rSt, sal_uLong nLe nLenFBSE = nLength; // is FBSE big enough for our data bool bOk = ( nSkipBLIPLen + 4 + nSkipBLIPPos + 4 <= nLenFBSE ); - bool bBLIPIsDirectlyEmbedded(false); - if(bOk) + if( bOk ) { - rSt.SeekRel(nSkipBLIPLen); + rSt.SeekRel( nSkipBLIPLen ); rSt.ReadUInt32( nBLIPLen ); - - // #i125187# do not simply skip these four bytes, but read them. This value - // is zero when the BLIP is embedded to the FBSE directly following in the - // stream, else 1. Use this as hint to be more reliable (see below) - rSt.ReadUInt32( nBLIPPos ); - - if (0 == nBLIPPos) - { - bBLIPIsDirectlyEmbedded = true; - } - + rSt.SeekRel( nSkipBLIPPos ); rSt.ReadUInt32( nBLIPPos ); bOk = rSt.GetError() == 0; - nLength -= nSkipBLIPLen + 4 + nSkipBLIPPos + 4; + nLength -= nSkipBLIPLen+ 4 + nSkipBLIPPos + 4; } if( bOk ) { - // #i125187# the original check to test if the BLIP is following embeded in the FBSE was - // was (!nBLIPPos && nBLIPLen < nLenFBSE), but there are ppt documents - // where this is not sufficient (what means that for BLIPs in the picture - // stream the same conditions can be true sometimes). I experimented with various - // ppt files and detected that the four bytes before reading the nBLIPPos - // contain a flag which describes that embedding more reliable, thus I will - // use it here now in the form of the bBLIPIsDirectlyEmbedded variable (see above). - // This modification works with all ppt files I found which use directly embedded - // BLIPs and with the file which showed the error. More work may be needed when - // exceptions to this more strict schema may show up, though. - if (0 == nBLIPPos && nBLIPLen < nLenFBSE && bBLIPIsDirectlyEmbedded) - { - // get BLIP file position as directly following embedded + // specialty: + // If nBLIPLen is less than nLenFBSE AND nBLIPPos is NULL, + // then we assume, that the image is in FBSE! + if( (!nBLIPPos) && (nBLIPLen < nLenFBSE) ) nBLIPPos = rSt.Tell() + 4; - } // That worked great! // We store, that we do have one FBSE more in the pointer array. commit 5fe1a59cb7408e9f6ce0e554f01c89fc44ab3041 Author: Kohei Yoshida <[email protected]> Date: Tue Aug 12 13:33:42 2014 -0400 Scope reduction in GetBLIP() & remove non-ASCII character (degree symbol). Change-Id: I306a22b087aceed5dbb6cb2e8b67e2501589ee61 diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index 867c8e2..d3ba8ca 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -4288,8 +4288,9 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r if ( IsHardAttribute( DFF_Prop_gtextFBold ) ) aSet.Put( SvxWeightItem( ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x0020 ) != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) ); - // SJ TODO: Vertical Writing is not correct, instead this should be - // replaced through "CharacterRotation" by 90°, therefore a new Item has to be + // SJ TODO: Vertical Writing is not correct, instead + // this should be replaced through "CharacterRotation" + // by 90 degrees, therefore a new Item has to be // supported by svx core, api and xml file format ((SdrObjCustomShape*)pRet)->SetVerticalWriting( ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x2000 ) != 0 ); @@ -6184,81 +6185,85 @@ bool SvxMSDffManager::GetShape(sal_uLong nId, SdrObject*& rpShape, ******************************************************************************/ bool SvxMSDffManager::GetBLIP( sal_uLong nIdx_, Graphic& rData, Rectangle* pVisArea ) { + if (!pStData) + return false; + bool bOk = false; // initialize result variable - if ( pStData ) + + // check if a graphic for this blipId is already imported + if ( nIdx_) { - // check if a graphic for this blipId is already imported - if ( nIdx_) - { - std::map<sal_uInt32,OString>::iterator iter = aEscherBlipCache.find(nIdx_); + std::map<sal_uInt32,OString>::iterator iter = aEscherBlipCache.find(nIdx_); - if (iter != aEscherBlipCache.end()) - { - /* if this entry is available, then it should be possible - to get the Graphic via GraphicObject */ - GraphicObject aGraphicObject( iter->second ); - rData = aGraphicObject.GetGraphic(); - if ( rData.GetType() != GRAPHIC_NONE ) - bOk = true; - else - aEscherBlipCache.erase(iter); - } + if (iter != aEscherBlipCache.end()) + { + /* if this entry is available, then it should be possible + to get the Graphic via GraphicObject */ + GraphicObject aGraphicObject( iter->second ); + rData = aGraphicObject.GetGraphic(); + if ( rData.GetType() != GRAPHIC_NONE ) + bOk = true; + else + aEscherBlipCache.erase(iter); } - if ( !bOk ) - { - sal_uInt16 nIdx = sal_uInt16( nIdx_ ); - if( !nIdx || (pBLIPInfos->size() < nIdx) ) return false; - - // possibly delete old error flag(s) - if( rStCtrl.GetError() ) - rStCtrl.ResetError(); - if( ( &rStCtrl != pStData ) - && pStData->GetError() ) - pStData->ResetError(); - - // remember FilePos of the stream(s) - sal_uLong nOldPosCtrl = rStCtrl.Tell(); - sal_uLong nOldPosData = pStData ? pStData->Tell() : nOldPosCtrl; - - // fetch matching info struct out of the pointer array - SvxMSDffBLIPInfo& rInfo = (*pBLIPInfos)[ nIdx-1 ]; - // jump to the BLIP atom in the data stream - pStData->Seek( rInfo.nFilePos ); - // possibly reset error status - if( pStData->GetError() ) - pStData->ResetError(); + } + + if ( !bOk ) + { + sal_uInt16 nIdx = sal_uInt16( nIdx_ ); + if( !nIdx || (pBLIPInfos->size() < nIdx) ) + return false; + + // possibly delete old error flag(s) + if( rStCtrl.GetError() ) + rStCtrl.ResetError(); + if( ( &rStCtrl != pStData ) + && pStData->GetError() ) + pStData->ResetError(); + + // remember FilePos of the stream(s) + sal_uLong nOldPosCtrl = rStCtrl.Tell(); + sal_uLong nOldPosData = pStData ? pStData->Tell() : nOldPosCtrl; + + // fetch matching info struct out of the pointer array + SvxMSDffBLIPInfo& rInfo = (*pBLIPInfos)[ nIdx-1 ]; + // jump to the BLIP atom in the data stream + pStData->Seek( rInfo.nFilePos ); + // possibly reset error status + if( pStData->GetError() ) + pStData->ResetError(); + else + bOk = GetBLIPDirect( *pStData, rData, pVisArea ); + if( pStData2 && !bOk ) + { + // Error, but the is a second chance: There is a second + // data stream in which the graphic could be stored! + if( pStData2->GetError() ) + pStData2->ResetError(); + sal_uLong nOldPosData2 = pStData2->Tell(); + // jump to the BLIP atom in the second data stream + pStData2->Seek( rInfo.nFilePos ); + // reset error status if necessary + if( pStData2->GetError() ) + pStData2->ResetError(); else - bOk = GetBLIPDirect( *pStData, rData, pVisArea ); - if( pStData2 && !bOk ) - { - // Error, but the is a second chance: There is a second - // data stream in which the graphic could be stored! - if( pStData2->GetError() ) - pStData2->ResetError(); - sal_uLong nOldPosData2 = pStData2->Tell(); - // jump to the BLIP atom in the second data stream - pStData2->Seek( rInfo.nFilePos ); - // reset error status if necessary - if( pStData2->GetError() ) - pStData2->ResetError(); - else - bOk = GetBLIPDirect( *pStData2, rData, pVisArea ); - // restore olf FilePos of the second data stream - pStData2->Seek( nOldPosData2 ); - } - // restore old FilePos of the stream(s) - rStCtrl.Seek( nOldPosCtrl ); - if( &rStCtrl != pStData ) - pStData->Seek( nOldPosData ); + bOk = GetBLIPDirect( *pStData2, rData, pVisArea ); + // restore olf FilePos of the second data stream + pStData2->Seek( nOldPosData2 ); + } + // restore old FilePos of the stream(s) + rStCtrl.Seek( nOldPosCtrl ); + if( &rStCtrl != pStData ) + pStData->Seek( nOldPosData ); - if ( bOk ) - { - // create new BlipCacheEntry for this graphic - GraphicObject aGraphicObject( rData ); - aEscherBlipCache.insert(std::make_pair(nIdx_,aGraphicObject.GetUniqueID())); - } + if ( bOk ) + { + // create new BlipCacheEntry for this graphic + GraphicObject aGraphicObject( rData ); + aEscherBlipCache.insert(std::make_pair(nIdx_,aGraphicObject.GetUniqueID())); } } + return bOk; }
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
