Author: alg Date: Tue Jul 1 11:55:03 2014 New Revision: 1607057 URL: http://svn.apache.org/r1607057 Log: i125187 more precision at ppt import where the BLIP graphic is located
Modified: openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx Modified: openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx?rev=1607057&r1=1607056&r2=1607057&view=diff ============================================================================== --- openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx (original) +++ openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx Tue Jul 1 11:55:03 2014 @@ -6054,25 +6054,46 @@ void SvxMSDffManager::GetDrawingGroupCon nLenFBSE = nLength; // ist FBSE gross genug fuer unsere Daten sal_Bool bOk = ( nSkipBLIPLen + 4 + nSkipBLIPPos + 4 <= nLenFBSE ); + bool bBLIPIsDirectlyEmbedded(false); - if( bOk ) - { - rSt.SeekRel( nSkipBLIPLen ); - rSt >> nBLIPLen; - rSt.SeekRel( nSkipBLIPPos ); - rSt >> nBLIPPos; - bOk = rSt.GetError() == 0; + if(bOk) + { + rSt.SeekRel(nSkipBLIPLen); + rSt >> nBLIPLen; - nLength -= nSkipBLIPLen+ 4 + nSkipBLIPPos + 4; - } + // #125187# 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 >> nBLIPPos; + + if(0 == nBLIPPos) + { + bBLIPIsDirectlyEmbedded = true; + } + + rSt >> nBLIPPos; + bOk = rSt.GetError() == 0; + + nLength -= nSkipBLIPLen + 4 + nSkipBLIPPos + 4; + } if( bOk ) { - // Besonderheit: - // Falls nBLIPLen kleiner ist als nLenFBSE UND nBLIPPos Null ist, - // nehmen wir an, dass das Bild IM FBSE drin steht! - if( (!nBLIPPos) && (nBLIPLen < nLenFBSE) ) - nBLIPPos = rSt.Tell() + 4; + // #125187# 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; + } // Das hat ja fein geklappt! // Wir merken uns, dass wir einen FBSE mehr im Pointer Array haben.