summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/inc/salbmp.hxx1
-rw-r--r--vcl/source/gdi/gdimtf.cxx33
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;
}
}