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.