cppcanvas/source/inc/implrenderer.hxx | 2 +- cppcanvas/source/mtfrenderer/emfplus.cxx | 18 ++++++++++++------ svtools/source/filter/wmf/winwmf.cxx | 8 ++++++-- 3 files changed, 19 insertions(+), 9 deletions(-)
New commits: commit 0d396171b6345e6077dd85dc7ff6d9f9fdcd523d Author: Radek Doulik <r...@novell.com> Date: Wed Mar 7 16:58:37 2012 +0100 workaround for buggy metafile images diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index c93c83c..d41d504 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -271,7 +271,7 @@ static float GetSwapFloat( SvStream& rSt ) ActionVector::const_iterator& o_rRangeBegin, ActionVector::const_iterator& o_rRangeEnd ) const; - void processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags); + void processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags, sal_Bool bUseWholeStream = sal_False); void processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ); void EMFPPlusFillPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, bool isColor, sal_uInt32 brushIndexOrColor); diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 8ccb75b..953a0c8 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -717,7 +717,7 @@ namespace cppcanvas Graphic graphic; - void Read (SvMemoryStream &s) + void Read (SvMemoryStream &s, sal_Bool bUseWholeStream) { sal_uInt32 header, unknown; @@ -742,13 +742,19 @@ namespace cppcanvas EMFP_DEBUG (printf ("EMF+\tmetafile type: %d dataSize: %d\n", mfType, mfSize)); GraphicFilter filter; - SvMemoryStream mfStream (((char *)s.GetData()) + s.Tell(), mfSize, STREAM_READ); + // workaround buggy metafiles, which have wrong mfSize set (n#705956 for example) + SvMemoryStream mfStream (((char *)s.GetData()) + s.Tell(), bUseWholeStream ? s.remainingSize() : mfSize, STREAM_READ); filter.ImportGraphic (graphic, String (), mfStream); // debug code - write the stream to debug file /tmp/emf-stream.emf EMFP_DEBUG(mfStream.Seek(0); - SvFileStream file( UniString::CreateFromAscii( "/tmp/emf-embedded-stream.emf" ), STREAM_WRITE | STREAM_TRUNC ); + static int emfp_debug_stream_numnber = 0; + UniString emfp_debug_filename = UniString::CreateFromAscii( "/tmp/emf-embedded-stream" ); + emfp_debug_filename.Append( UniString::CreateFromInt32( emfp_debug_stream_numnber++ )); + emfp_debug_filename.Append( UniString::CreateFromAscii( ".emf" )); + + SvFileStream file( emfp_debug_filename, STREAM_WRITE | STREAM_TRUNC ); mfStream >> file; file.Flush(); @@ -1087,7 +1093,7 @@ namespace cppcanvas } } - void ImplRenderer::processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags) + void ImplRenderer::processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags, sal_Bool bUseWholeStream) { sal_uInt32 index; @@ -1142,7 +1148,7 @@ namespace cppcanvas { EMFPImage *image; aObjects [index] = image = new EMFPImage (); - image->Read (rObjectStream); + image->Read (rObjectStream, bUseWholeStream); break; } @@ -1193,7 +1199,7 @@ namespace cppcanvas if (mbMultipart) { EMFP_DEBUG (printf ("EMF+ multipart record flags: %04hx\n", mMFlags)); mMStream.Seek (0); - processObjectRecord (mMStream, mMFlags); + processObjectRecord (mMStream, mMFlags, sal_True); } mbMultipart = false; } commit d86d122a986292d76fe0a57c6285667356ee5170 Author: Radek Doulik <r...@novell.com> Date: Wed Mar 7 16:52:22 2012 +0100 allow wmf header to be placed on position aligned to 4 bytes - because there are such buggy emf files flying around (n#705956) diff --git a/svtools/source/filter/wmf/winwmf.cxx b/svtools/source/filter/wmf/winwmf.cxx index 43cf34b..13f8fee 100644 --- a/svtools/source/filter/wmf/winwmf.cxx +++ b/svtools/source/filter/wmf/winwmf.cxx @@ -1099,8 +1099,12 @@ sal_Bool WMFReader::ReadHeader() return false; if (nMetaKey != 0x00090001) { - pWMF->SetError( SVSTREAM_FILEFORMAT_ERROR ); - return false; + sal_uInt16 aNextWord; + *pWMF >> aNextWord; + if (aNextWord != 0x09) { + pWMF->SetError( SVSTREAM_FILEFORMAT_ERROR ); + return false; + } } pWMF->SeekRel( 2 ); // Version (von Windows) _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits