diff options
-rw-r--r-- | vcl/inc/salbmp.hxx | 1 | ||||
-rw-r--r-- | vcl/source/gdi/gdimtf.cxx | 33 |
2 files changed, 29 insertions, 5 deletions
diff --git a/vcl/inc/salbmp.hxx b/vcl/inc/salbmp.hxx index be181f9e5e68..09b40d9b74f4 100644 --- a/vcl/inc/salbmp.hxx +++ b/vcl/inc/salbmp.hxx @@ -48,7 +48,6 @@ public: Size& rSize, bool bMask = false ) = 0; virtual bool HasAlpha() const { return false; } - virtual void SetHasAlpha( bool ) { } virtual void Destroy() = 0; virtual Size GetSize() const = 0; virtual sal_uInt16 GetBitCount() const = 0; diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index 5fdcba0447fd..7ca07e136a5c 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -47,6 +47,10 @@ #include <com/sun/star/graphic/XGraphic.hpp> #include <com/sun/star/graphic/XGraphicRenderer.hpp> +#ifdef UNX +#include <unx/salbmp.h> +#endif + using namespace com::sun::star; #define GAMMA( _def_cVal, _def_InvGamma ) ((sal_uInt8)MinMax(FRound(pow( _def_cVal/255.0,_def_InvGamma)*255.0),0L,255L)) @@ -442,18 +446,39 @@ bool GDIMetaFile::ImplPlayWithRenderer( OutputDevice* pOut, const Point& rPos, S } SalBitmap* pSalBmp = ImplGetSVData()->mpDefInst->CreateSalBitmap(); - pSalBmp->SetHasAlpha( true ); - - if( pSalBmp->Create( xBitmapCanvas, aSize ) ) + // I don't quite understand this, but the old code didn't work properly on X11 when alpha was used, + // and the commit that changed to the new code relied on alpha support in bitmap + // (which that commit implemented only in X11SalBitmap) and so it didn't work on Windows. + // So keep both. +#ifdef UNX + X11SalBitmap* X11Bmp = static_cast< X11SalBitmap* >( pSalBmp ); + X11Bmp->SetHasAlpha( true ); + if( X11Bmp->Create( xBitmapCanvas, aSize ) ) { - Bitmap aBitmap( pSalBmp ); + Bitmap aBitmap( X11Bmp ); if ( pOut->GetMapMode() == MAP_PIXEL ) pOut->DrawBitmap( rPos, aBitmap ); else pOut->DrawBitmap( rPos, rLogicDestSize, aBitmap ); return true; } +#else + SalBitmap* pSalMask = ImplGetSVData()->mpDefInst->CreateSalBitmap(); + if( pSalBmp->Create( xBitmapCanvas, aSize ) && pSalMask->Create( xBitmapCanvas, aSize, true ) ) + { + Bitmap aBitmap( pSalBmp ); + Bitmap aMask( pSalMask ); + AlphaMask aAlphaMask( aMask ); + BitmapEx aBitmapEx( aBitmap, aAlphaMask ); + if ( pOut->GetMapMode() == MAP_PIXEL ) + pOut->DrawBitmapEx( rPos, aBitmapEx ); + else + pOut->DrawBitmapEx( rPos, rLogicDestSize, aBitmapEx ); + return true; + } + delete pSalMask; +#endif delete pSalBmp; } } |