Kaydet (Commit) 3ea17073 authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i125187# more precision where the BLIP graphic is located

(cherry picked from commit 2be700ef)

Conflicts:
	filter/source/msfilter/msdffimp.cxx

Change-Id: I3926d5f47469049662a292063f9810826c575154
üst 38baed1e
......@@ -5821,25 +5821,46 @@ 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 );
rSt.SeekRel( nSkipBLIPPos );
// #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.ReadUInt32( nBLIPPos );
bOk = rSt.GetError() == 0;
nLength -= nSkipBLIPLen+ 4 + nSkipBLIPPos + 4;
nLength -= nSkipBLIPLen + 4 + nSkipBLIPPos + 4;
}
if( bOk )
{
// specialty:
// If nBLIPLen is less than nLenFBSE AND nBLIPPos is NULL,
// then we assume, that the image is in FBSE!
if( (!nBLIPPos) && (nBLIPLen < nLenFBSE) )
// #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
nBLIPPos = rSt.Tell() + 4;
}
// That worked great!
// We store, that we do have one FBSE more in the pointer array.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment