You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2014/07/01 13:55:03 UTC
svn commit: r1607057 -
/openoffice/trunk/main/filter/source/msfilter/msdffimp.cxx
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.