Kaydet (Commit) 1cc30679 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

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
üst 8a498fad
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include "vcl/bmpacc.hxx" #include "vcl/bmpacc.hxx"
#include "outdata.hxx" #include "outdata.hxx"
#include "salgdiimpl.hxx" #include "salgdiimpl.hxx"
#include "opengl/win/gdiimpl.hxx"
bool WinSalGraphics::supportsOperation( OutDevSupportType eType ) const bool WinSalGraphics::supportsOperation( OutDevSupportType eType ) const
{ {
...@@ -71,7 +73,35 @@ void WinSalGraphics::copyArea( long nDestX, long nDestY, ...@@ -71,7 +73,35 @@ void WinSalGraphics::copyArea( long nDestX, long nDestY,
void WinSalGraphics::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap) 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, void WinSalGraphics::drawBitmap( const SalTwoRect& rPosAry,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment