From 1d3b613318654ceb2d34996ef8ca653cfe32a8ea Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 1 Oct 2015 14:17:21 +0200 Subject: desktop, vcl: support transparency in VirtualDevices with user-provided memory Change-Id: I65c31995c02a644aa436aecd065255fab38045e4 --- desktop/source/lib/init.cxx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'desktop') diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 509983c1c8ac..e902df0c71ba 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -755,10 +755,21 @@ void doc_paintTile (LibreOfficeKitDocument* pThis, InitSvpForLibreOfficeKit(); ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), (sal_uInt16)32) ; + + // Set background to transparent by default. + memset(pBuffer, 0, nCanvasWidth * nCanvasHeight * 4); + pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT))); + boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() ); + + // Allocate a separate buffer for the alpha device. + std::vector aAlpha(nCanvasWidth * nCanvasHeight); + memset(aAlpha.data(), 0, nCanvasWidth * nCanvasHeight); + boost::shared_array aAlphaBuffer(aAlpha.data(), NoDelete()); + pDevice->SetOutputSizePixelScaleOffsetAndBuffer( Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(), - aBuffer, true ); + aBuffer, aAlphaBuffer, true ); pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight); @@ -772,6 +783,17 @@ void doc_paintTile (LibreOfficeKitDocument* pThis, nTilePosX, nTilePosY, nTileWidth, nTileHeight); #endif + // Overwrite pBuffer's alpha channel with the separate alpha buffer. + for (int nRow = 0; nRow < nCanvasHeight; ++nRow) + { + for (int nCol = 0; nCol < nCanvasWidth; ++nCol) + { + const int nOffset = (nCanvasHeight * nRow) + nCol; + // VCL's transparent is 0, RGBA's transparent is 0xff. + pBuffer[nOffset * 4 +3] = 0xff - aAlpha[nOffset]; + } + } + static bool bDebug = getenv("LOK_DEBUG") != 0; if (bDebug) { -- cgit