From 1cc30679765ce996a009865e6bad3e5b74b96b41 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Thu, 10 Dec 2015 13:44:05 +0100 Subject: tdf#94851 can't use OpenGLSalBitmap with WinSalGraphics Printing is done with the WinSalGraphics and not with WinOpenGLSalGraphics on Windows even when OpenGL is enabled, but the SalBitmap is still using the OpenGLSalBitmap which can't be used with WinSalGraphics. So detect when the implementation of SalGraphic is "wrong" and convert. Change-Id: I99cd6b6403e9bd42d6f5b7d7cb07f48588c17ab8 --- vcl/win/gdi/salgdi2.cxx | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'vcl/win') diff --git a/vcl/win/gdi/salgdi2.cxx b/vcl/win/gdi/salgdi2.cxx index 64516c248569..aa08d9145568 100644 --- a/vcl/win/gdi/salgdi2.cxx +++ b/vcl/win/gdi/salgdi2.cxx @@ -34,6 +34,8 @@ #include "vcl/bmpacc.hxx" #include "outdata.hxx" #include "salgdiimpl.hxx" +#include "opengl/win/gdiimpl.hxx" + bool WinSalGraphics::supportsOperation( OutDevSupportType eType ) const { @@ -71,7 +73,35 @@ void WinSalGraphics::copyArea( long nDestX, long nDestY, void WinSalGraphics::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap) { - mpImpl->drawBitmap( rPosAry, rSalBitmap ); + if (dynamic_cast(mpImpl.get()) == nullptr && + dynamic_cast(&rSalBitmap) == nullptr) + { + SalBitmap& rConstBitmap = const_cast(rSalBitmap); + BitmapBuffer* pRead = rConstBitmap.AcquireBuffer(BITMAP_READ_ACCESS); + + std::unique_ptr pWinSalBitmap(new WinSalBitmap()); + pWinSalBitmap->Create(rConstBitmap.GetSize(), rConstBitmap.GetBitCount(), BitmapPalette()); + BitmapBuffer* pWrite = pWinSalBitmap->AcquireBuffer(BITMAP_WRITE_ACCESS); + + sal_uInt8* pSource(pRead->mpBits); + sal_uInt8* pDestination(pWrite->mpBits); + + for (long y = 0; y < pRead->mnHeight; y++) + { + memcpy(pDestination, pSource, pRead->mnScanlineSize); + pSource += pRead->mnScanlineSize; + pDestination += pWrite->mnScanlineSize; + } + pWinSalBitmap->ReleaseBuffer(pWrite, BITMAP_WRITE_ACCESS); + + rConstBitmap.ReleaseBuffer(pRead, BITMAP_READ_ACCESS); + + mpImpl->drawBitmap(rPosAry, *pWinSalBitmap.get()); + } + else + { + mpImpl->drawBitmap(rPosAry, rSalBitmap); + } } void WinSalGraphics::drawBitmap( const SalTwoRect& rPosAry, -- cgit v1.2.3