From 917d59a84124d1022bd1912874e7a53c674784f1 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Sat, 12 Dec 2015 10:15:34 +0100 Subject: tdf#94851 check SalBitmap & convert in all drawBitmap methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I040dd62737237ad7e016201a798ee42e27853556 Reviewed-on: https://gerrit.libreoffice.org/20656 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl --- vcl/win/gdi/salgdi2.cxx | 50 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/vcl/win/gdi/salgdi2.cxx b/vcl/win/gdi/salgdi2.cxx index aa08d9145568..91b97db8b05f 100644 --- a/vcl/win/gdi/salgdi2.cxx +++ b/vcl/win/gdi/salgdi2.cxx @@ -71,17 +71,15 @@ void WinSalGraphics::copyArea( long nDestX, long nDestY, nSrcWidth, nSrcHeight, nFlags ); } -void WinSalGraphics::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap) +namespace { - 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); +void convertToWinSalBitmap(SalBitmap& rSalBitmap, WinSalBitmap& rWinSalBitmap) +{ + BitmapBuffer* pRead = rSalBitmap.AcquireBuffer(BITMAP_READ_ACCESS); + + rWinSalBitmap.Create(rSalBitmap.GetSize(), rSalBitmap.GetBitCount(), BitmapPalette()); + BitmapBuffer* pWrite = rWinSalBitmap.AcquireBuffer(BITMAP_WRITE_ACCESS); sal_uInt8* pSource(pRead->mpBits); sal_uInt8* pDestination(pWrite->mpBits); @@ -92,10 +90,21 @@ void WinSalGraphics::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSal pSource += pRead->mnScanlineSize; pDestination += pWrite->mnScanlineSize; } - pWinSalBitmap->ReleaseBuffer(pWrite, BITMAP_WRITE_ACCESS); + rWinSalBitmap.ReleaseBuffer(pWrite, BITMAP_WRITE_ACCESS); + + rSalBitmap.ReleaseBuffer(pRead, BITMAP_READ_ACCESS); +} - rConstBitmap.ReleaseBuffer(pRead, BITMAP_READ_ACCESS); +} // end anonymous namespace +void WinSalGraphics::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap) +{ + if (dynamic_cast(mpImpl.get()) == nullptr && + dynamic_cast(&rSalBitmap) == nullptr) + { + std::unique_ptr pWinSalBitmap(new WinSalBitmap()); + SalBitmap& rConstBitmap = const_cast(rSalBitmap); + convertToWinSalBitmap(rConstBitmap, *pWinSalBitmap); mpImpl->drawBitmap(rPosAry, *pWinSalBitmap.get()); } else @@ -108,7 +117,24 @@ void WinSalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSSalBitmap, const SalBitmap& rSTransparentBitmap ) { - mpImpl->drawBitmap( rPosAry, rSSalBitmap, rSTransparentBitmap ); + if (dynamic_cast(mpImpl.get()) == nullptr && + dynamic_cast(&rSSalBitmap) == nullptr) + { + std::unique_ptr pWinSalBitmap(new WinSalBitmap()); + SalBitmap& rConstBitmap = const_cast(rSSalBitmap); + convertToWinSalBitmap(rConstBitmap, *pWinSalBitmap); + + + std::unique_ptr pWinTransparentSalBitmap(new WinSalBitmap()); + SalBitmap& rConstTransparentBitmap = const_cast(rSTransparentBitmap); + convertToWinSalBitmap(rConstTransparentBitmap, *pWinTransparentSalBitmap); + + mpImpl->drawBitmap(rPosAry, *pWinSalBitmap, *pWinTransparentSalBitmap); + } + else + { + mpImpl->drawBitmap(rPosAry, rSSalBitmap, rSTransparentBitmap); + } } bool WinSalGraphics::drawAlphaRect( long nX, long nY, long nWidth, -- cgit v1.2.3