diff -rup vcl-orig/inc/vcl/gdimtf.hxx vcl/inc/vcl/gdimtf.hxx
--- vcl-orig/inc/vcl/gdimtf.hxx	2007-11-09 16:53:41.000000000 +0100
+++ vcl/inc/vcl/gdimtf.hxx	2007-11-07 18:06:27.000000000 +0100
@@ -156,6 +156,7 @@ private:
                                                       const OutputDevice&   rMapDev,
                                                       const PolyPolygon&    rPolyPoly,
                                                       const Gradient&	  	rGrad 		);
+	SAL_DLLPRIVATE bool			   ImplPlayWithRenderer( OutputDevice* pOut, const Point& rPos, Size rDestSize );
 
 //#endif // __PRIVATE
 
diff -rup vcl-orig/source/gdi/gdimtf.cxx vcl/source/gdi/gdimtf.cxx
--- vcl-orig/source/gdi/gdimtf.cxx	2007-11-09 16:53:43.000000000 +0100
+++ vcl/source/gdi/gdimtf.cxx	2007-11-09 17:09:31.000000000 +0100
@@ -66,8 +66,47 @@
 #ifndef _SV_VIRDEV_HXX
 #include <vcl/virdev.hxx>
 #endif
+#ifndef _SV_SALBMP_HXX
+#include <vcl/salbmp.hxx>
+#endif
+#ifndef _SV_SVAPP_HXX
+#include <vcl/svapp.hxx>
+#endif
+#ifndef _SV_SVDATA_HXX
+#include <vcl/svdata.hxx>
+#endif
+#ifndef _SV_SALINST_HXX
+#include <vcl/salinst.hxx>
+#endif
+#ifndef _SV_GDIMTF_HXX
 #include <vcl/gdimtf.hxx>
+#endif
+#ifndef _SV_GRAPHICTOOLS_HXX
 #include <vcl/graphictools.hxx>
+#endif
+#ifndef _SV_CANVASTOOLS_HXX
+#include <vcl/canvastools.hxx>
+#endif
+#ifndef _SV_UNOHELP_HXX
+#include <vcl/unohelp.hxx>
+#endif
+#ifndef _COM_SUN_STAR_BEANS_XFASTPROPERTYSET_HPP_
+#include <com/sun/star/beans/XFastPropertySet.hpp>
+#endif
+#ifndef _COM_SUN_STAR_RENDERING_XCANVAS_HPP_
+#include <com/sun/star/rendering/XCanvas.hpp>
+#endif
+#ifndef _COM_SUN_STAR_RENDERING_MTFRENDERER_HPP_
+#include <com/sun/star/rendering/MtfRenderer.hpp>
+#endif
+#ifndef _COMPHELPER_PROCESSFACTORY_HXX_
+#include <comphelper/processfactory.hxx>
+#endif
+#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#endif
+
+using namespace com::sun::star;
 
 // -----------
 // - Defines -
@@ -502,6 +541,75 @@ void GDIMetaFile::Play( OutputDevice* pO
 
 // ------------------------------------------------------------------------
 
+bool GDIMetaFile::ImplPlayWithRenderer( OutputDevice* pOut, const Point& rPos, Size rDestSize )
+{
+    const Window* win = dynamic_cast <Window*> ( pOut );
+
+    if (!win)
+        win = Application::GetActiveTopWindow();
+    if (!win)
+        win = Application::GetFirstTopLevelWindow();
+
+    if (win) {
+        const uno::Reference<rendering::XCanvas>& xCanvas = win->GetCanvas ();
+        const uno::Reference<rendering::XBitmap>& xBitmap = xCanvas->getDevice ()->createCompatibleAlphaBitmap (vcl::unotools::integerSize2DFromSize( rDestSize));
+        uno::Reference< lang::XMultiServiceFactory > xFactory = vcl::unohelper::GetMultiServiceFactory();
+        if( xFactory.is() && xBitmap.is () ) {
+            uno::Reference< rendering::XMtfRenderer > xMtfRenderer;
+            uno::Sequence< uno::Any > args (1);
+            uno::Reference< rendering::XBitmapCanvas > xBitmapCanvas( xBitmap->queryBitmapCanvas() );
+            if( xBitmapCanvas.is() ) {
+                args[0] = uno::Any( xBitmapCanvas );
+                xMtfRenderer.set( xFactory->createInstanceWithArguments( ::rtl::OUString::createFromAscii( "com.sun.star.rendering.MtfRenderer" ),
+                                                                         args ), uno::UNO_QUERY );
+                
+                if( xMtfRenderer.is() ) {
+                    xBitmapCanvas->clear();
+                    uno::Reference< beans::XFastPropertySet > xMtfFastPropertySet( xMtfRenderer, uno::UNO_QUERY );
+                    if( xMtfFastPropertySet.is() )
+                        // set this metafile to the renderer to
+                        // speedup things (instead of copying data to
+                        // sequence of bytes passed to renderer)
+                        xMtfFastPropertySet->setFastPropertyValue( 0, uno::Any( reinterpret_cast<sal_Int64>( this ) ) );
+
+                    xMtfRenderer->draw( rDestSize.Width(), rDestSize.Height() );
+
+                    uno::Reference< beans::XFastPropertySet > xFastPropertySet( xBitmapCanvas, uno::UNO_QUERY );
+                    if( xFastPropertySet.get() ) {
+                        // 0 means get BitmapEx
+                        uno::Any aAny = xFastPropertySet->getFastPropertyValue( 0 );
+                        BitmapEx* pBitmapEx = (BitmapEx*) *reinterpret_cast<const sal_Int64*>(aAny.getValue()); 
+                        if( pBitmapEx ) {
+                            pOut->DrawBitmapEx( rPos, *pBitmapEx );
+                            delete pBitmapEx;
+                            return true;
+                        }
+                    }
+                    
+                    SalBitmap* pSalBmp = ImplGetSVData()->mpDefInst->CreateSalBitmap();
+                    SalBitmap* pSalMask = ImplGetSVData()->mpDefInst->CreateSalBitmap();
+
+                    if( pSalBmp->Create( xBitmapCanvas, rDestSize ) && pSalMask->Create( xBitmapCanvas, rDestSize, true ) ) {
+                        Bitmap aBitmap( pSalBmp );
+                        Bitmap aMask( pSalMask );
+                        AlphaMask aAlphaMask( aMask );
+                        BitmapEx aBitmapEx( aBitmap, aAlphaMask );
+                        pOut->DrawBitmapEx( rPos, aBitmapEx );
+                        return true;
+                    }
+
+                    delete pSalBmp;
+                    delete pSalMask;
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
+// ------------------------------------------------------------------------
+
 void GDIMetaFile::Play( OutputDevice* pOut, const Point& rPos,
 						const Size& rSize, ULONG nPos )
 {
@@ -511,8 +619,12 @@ void GDIMetaFile::Play( OutputDevice* pO
 
 	if( aDestSize.Width() && aDestSize.Height() )
 	{
-		Size			aTmpPrefSize( pOut->LogicToPixel( GetPrefSize(), aDrawMap ) );
-		GDIMetaFile*	pMtf = pOut->GetConnectMetaFile();
+        GDIMetaFile*	pMtf = pOut->GetConnectMetaFile();
+
+        if( !pMtf && ImplPlayWithRenderer( pOut, rPos, aDestSize ) )
+            return;
+
+        Size aTmpPrefSize( pOut->LogicToPixel( GetPrefSize(), aDrawMap ) );
 
 		if( !aTmpPrefSize.Width() )
 			aTmpPrefSize.Width() = aDestSize.Width();
diff -rup vcl-orig/source/gdi/makefile.mk vcl/source/gdi/makefile.mk
--- vcl-orig/source/gdi/makefile.mk	2007-11-09 16:53:43.000000000 +0100
+++ vcl/source/gdi/makefile.mk	2007-11-07 11:06:41.000000000 +0100
@@ -125,6 +126,7 @@ SLOFILES=	$(SLO)$/salmisc.obj 	\
 
 EXCEPTIONSFILES=	$(SLO)$/outdev.obj		\
 					$(SLO)$/outdev3.obj 	\
+					$(SLO)$/gdimtf.obj 	\
 					$(SLO)$/gfxlink.obj		\
 					$(SLO)$/print.obj		\
                     $(SLO)$/print2.obj		\
diff -rup vcl-orig/source/gdi/metaact.cxx vcl/source/gdi/metaact.cxx
--- vcl-orig/source/gdi/metaact.cxx	2007-11-09 16:53:43.000000000 +0100
+++ vcl/source/gdi/metaact.cxx	2007-11-10 13:44:40.000000000 +0100
@@ -4041,8 +4047,34 @@ void MetaCommentAction::Scale( double fX
 				}
 				delete[] mpData;
 				ImplInitDynamicData( static_cast<const BYTE*>( aDest.GetData() ), aDest.Tell() );
-			}
-		}
+            } else if( maComment.Equals( "EMF_PLUS_HEADER_INFO" ) ) {
+				SvMemoryStream	aMemStm( (void*)mpData, mnDataSize, STREAM_READ );
+				SvMemoryStream	aDest;
+
+                sal_Int32 nLeft, nRight, nTop, nBottom;
+                sal_Int32 nPixX, nPixY, nMillX, nMillY;
+                float m11, m12, m21, m22, mdx, mdy;
+
+                // read data
+                aMemStm >> nLeft >> nTop >> nRight >> nBottom;
+                aMemStm >> nPixX >> nPixY >> nMillX >> nMillY;
+                aMemStm >> m11 >> m12 >> m21 >> m22 >> mdx >> mdy;
+
+                // add scale to the transformation
+                m11 *= fXScale;
+                m12 *= fXScale;
+                m22 *= fYScale;
+                m21 *= fYScale;
+
+                // prepare new data
+                aDest << nLeft << nTop << nRight << nBottom;
+                aDest << nPixX << nPixY << nMillX << nMillY;
+                aDest << m11 << m12 << m21 << m22 << mdx << mdy;
+
+                // save them
+				ImplInitDynamicData( static_cast<const BYTE*>( aDest.GetData() ), aDest.Tell() );
+            }
+        }
 	}
 }
 
