diff options
Diffstat (limited to 'vcl/win')
-rw-r--r-- | vcl/win/source/gdi/salgdi2.cxx | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/vcl/win/source/gdi/salgdi2.cxx b/vcl/win/source/gdi/salgdi2.cxx index 64516c248569..aa08d9145568 100644 --- a/vcl/win/source/gdi/salgdi2.cxx +++ b/vcl/win/source/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<WinOpenGLSalGraphicsImpl*>(mpImpl.get()) == nullptr && + dynamic_cast<const WinSalBitmap*>(&rSalBitmap) == nullptr) + { + SalBitmap& rConstBitmap = const_cast<SalBitmap&>(rSalBitmap); + BitmapBuffer* pRead = rConstBitmap.AcquireBuffer(BITMAP_READ_ACCESS); + + std::unique_ptr<WinSalBitmap> 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, |