diff -rup ../src680-m224/vcl/inc/vcl/salbmp.hxx vcl/inc/vcl/salbmp.hxx
--- ../src680-m224/vcl/inc/vcl/salbmp.hxx	2007-04-11 20:05:11.000000000 +0200
+++ vcl/inc/vcl/salbmp.hxx	2007-10-10 15:46:55.000000000 +0200
@@ -44,6 +44,8 @@
 #include <vcl/dllapi.h>
 #endif
 
+#include <com/sun/star/rendering/XBitmapCanvas.hpp>
+
 struct BitmapBuffer;
 class SalGraphics;
 class BitmapPalette;
@@ -63,6 +65,9 @@ public:
                                     SalGraphics* pGraphics ) = 0;
 	virtual bool			Create( const SalBitmap& rSalBmp,
                                     USHORT nNewBitCount ) = 0;
+	virtual bool			Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas,
+                                    Size& rSize,
+                                    bool bMask = false ) = 0;
 	virtual void			Destroy() = 0;
 	virtual Size			GetSize() const = 0;
 	virtual USHORT			GetBitCount() const = 0;
diff -rup ../src680-m224/vcl/unx/headless/svpbmp.cxx vcl/unx/headless/svpbmp.cxx
--- ../src680-m224/vcl/unx/headless/svpbmp.cxx	2007-07-24 12:25:56.000000000 +0200
+++ vcl/unx/headless/svpbmp.cxx	2007-10-10 15:56:29.000000000 +0200
@@ -124,6 +124,11 @@ bool SvpSalBitmap::Create( const SalBitm
     return false;
 }
 
+bool SvpSalBitmap::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > /*xBitmapCanvas*/, Size& /*rSize*/, bool /*bMask*/ )
+{
+    return false;
+}
+
 void SvpSalBitmap::Destroy()
 {
     m_aBitmap.reset();
diff -rup ../src680-m224/vcl/unx/headless/svpbmp.hxx vcl/unx/headless/svpbmp.hxx
--- ../src680-m224/vcl/unx/headless/svpbmp.hxx	2007-07-24 12:26:10.000000000 +0200
+++ vcl/unx/headless/svpbmp.hxx	2007-10-10 15:55:45.000000000 +0200
@@ -61,6 +61,9 @@ public:
                                     SalGraphics* pGraphics );
 	virtual bool			Create( const SalBitmap& rSalBmp,
                                     USHORT nNewBitCount );
+    virtual bool            Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas,
+                                    Size& rSize,
+                                    bool bMask = false );
 	virtual void			Destroy();
 	virtual Size			GetSize() const;
 	virtual USHORT			GetBitCount() const;
diff -rup ../src680-m224/vcl/unx/inc/salbmp.h vcl/unx/inc/salbmp.h
--- ../src680-m224/vcl/unx/inc/salbmp.h	2007-06-27 22:40:18.000000000 +0200
+++ vcl/unx/inc/salbmp.h	2007-10-10 15:47:30.000000000 +0200
@@ -127,6 +127,9 @@ public:					
                                     SalGraphics* pGraphics );
 	virtual bool			Create( const SalBitmap& rSalBmp,
                                     USHORT nNewBitCount );
+    virtual bool			Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas,
+                                    Size& rSize,
+                                    bool bMask = false );
 						
 	virtual void			Destroy();
 						
diff -rup ../src680-m224/vcl/unx/source/gdi/salbmp.cxx vcl/unx/source/gdi/salbmp.cxx
--- ../src680-m224/vcl/unx/source/gdi/salbmp.cxx	2007-06-27 22:49:34.000000000 +0200
+++ vcl/unx/source/gdi/salbmp.cxx	2007-10-23 18:29:07.000000000 +0200
@@ -72,6 +72,7 @@
 #ifndef _SV_BITMAP_HXX
 #include <vcl/bitmap.hxx>
 #endif
+#include <com/sun/star/beans/XFastPropertySet.hpp>

 // -----------
 // - Defines -
@@ -740,6 +743,31 @@ bool X11SalBitmap::Create( const SalBitm
 
 // -----------------------------------------------------------------------------
 
+bool X11SalBitmap::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas, Size& rSize, bool bMask )
+{
+    ::com::sun::star::uno::Reference< ::com::sun::star::beans::XFastPropertySet > xFastPropertySet( xBitmapCanvas, ::com::sun::star::uno::UNO_QUERY );
+    if( xFastPropertySet.get() ) {
+        long pixmapHandle;
+        sal_Int32 depth;
+        ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > args;
+
+        if( xFastPropertySet->getFastPropertyValue(bMask ? 2 : 1) >>= args ) {
+            if( ( args[1] >>= pixmapHandle ) && ( args[2] >>= depth ) ) {
+                bool bSuccess = ImplCreateFromDrawable( pixmapHandle, 0, depth, 0, 0, (long) rSize.Width(), (long) rSize.Height() );
+                bool bFreePixmap;
+                if( bSuccess && (args[0] >>= bFreePixmap) && bFreePixmap )
+                    XFreePixmap( GetX11SalData()->GetDisplay()->GetDisplay(), pixmapHandle );
+
+                return bSuccess;
+            }
+        }
+    }
+
+    return false;
+}
+
+// -----------------------------------------------------------------------------
+
 void X11SalBitmap::Destroy()
 {
        if( mpDIB )
diff -rup ../src680-m224/vcl/aqua/inc/salbmp.h vcl/aqua/inc/salbmp.h
--- ../src680-m224/vcl/aqua/inc/salbmp.h	2007-07-05 17:58:54.000000000 +0200
+++ vcl/aqua/inc/salbmp.h	2007-10-31 16:02:15.000000000 +0100
@@ -117,6 +117,9 @@ public:
     bool            Create( const SalBitmap& rSalBmp );
     bool            Create( const SalBitmap& rSalBmp, SalGraphics* pGraphics );
     bool            Create( const SalBitmap& rSalBmp, USHORT nNewBitCount );
+    virtual bool    Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas,
+                            Size& rSize,
+                            bool bMask = false );
     
     void            Destroy();
     
diff -rup ../src680-m224/vcl/aqua/source/gdi/salbmp.cxx vcl/aqua/source/gdi/salbmp.cxx
--- ../src680-m224/vcl/aqua/source/gdi/salbmp.cxx	2007-07-05 12:13:21.000000000 +0200
+++ vcl/aqua/source/gdi/salbmp.cxx	2007-10-31 16:03:49.000000000 +0100
@@ -218,6 +218,13 @@ bool AquaSalBitmap::Create( const SalBit
 
 // ------------------------------------------------------------------
 
+bool AquaSalBitmap::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > /*xBitmapCanvas*/, Size& /*rSize*/, bool /*bMask*/ )
+{
+    return false;
+}
+
+// ------------------------------------------------------------------
+
 void AquaSalBitmap::Destroy()
 {
 	DestroyContext();
diff -rup ../src680-m224/vcl/win/inc/salbmp.h vcl/win/inc/salbmp.h
--- ../src680-m224/vcl/win/inc/salbmp.h	2007-06-27 22:52:50.000000000 +0200
+++ vcl/win/inc/salbmp.h	2007-10-31 16:01:37.000000000 +0100
@@ -93,6 +93,9 @@ public:
 	virtual bool                Create( const SalBitmap& rSalBmpImpl );
 	virtual bool                Create( const SalBitmap& rSalBmpImpl, SalGraphics* pGraphics );
 	virtual bool                Create( const SalBitmap& rSalBmpImpl, USHORT nNewBitCount );
+	virtual bool                Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > xBitmapCanvas,
+                                           Size& rSize,
+                                           bool bMask = false );
 
 	virtual void                Destroy();
 
diff -rup ../src680-m224/vcl/win/source/gdi/salbmp.cxx vcl/win/source/gdi/salbmp.cxx
--- ../src680-m224/vcl/win/source/gdi/salbmp.cxx	2007-06-27 22:57:18.000000000 +0200
+++ vcl/win/source/gdi/salbmp.cxx	2007-10-31 16:04:27.000000000 +0100
@@ -288,6 +288,13 @@ bool WinSalBitmap::Create( const SalBitm
 
 // ------------------------------------------------------------------
 
+bool WinSalBitmap::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > /*xBitmapCanvas*/, Size& /*rSize*/, bool /*bMask*/ )
+{
+    return false;
+}
+
+// ------------------------------------------------------------------
+
 void WinSalBitmap::Destroy()
 {
 	if( mhDIB )
