|
 |
f325b2 |
From 4678c8d368c3accd85c57745cf58218f5ea1b907 Mon Sep 17 00:00:00 2001
|
|
 |
f325b2 |
From: Miklos Vajna <vmiklos@collabora.co.uk>
|
|
 |
f325b2 |
Date: Thu, 1 Oct 2015 14:17:21 +0200
|
|
 |
f325b2 |
Subject: [PATCH 168/398] desktop, vcl: support transparency in VirtualDevices
|
|
 |
f325b2 |
with user-provided memory
|
|
 |
f325b2 |
|
|
 |
f325b2 |
Change-Id: I65c31995c02a644aa436aecd065255fab38045e4
|
|
 |
f325b2 |
(cherry picked from commit 1d3b613318654ceb2d34996ef8ca653cfe32a8ea)
|
|
 |
f325b2 |
---
|
|
 |
f325b2 |
desktop/source/lib/init.cxx | 24 +++++++++++++++++++++++-
|
|
 |
f325b2 |
include/vcl/virdev.hxx | 2 ++
|
|
 |
f325b2 |
vcl/source/gdi/virdev.cxx | 12 ++++++++----
|
|
 |
f325b2 |
3 files changed, 33 insertions(+), 5 deletions(-)
|
|
 |
f325b2 |
|
|
 |
f325b2 |
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
|
|
 |
f325b2 |
index 4432ec8ea889..1f87146bacf8 100644
|
|
 |
f325b2 |
--- a/desktop/source/lib/init.cxx
|
|
 |
f325b2 |
+++ b/desktop/source/lib/init.cxx
|
|
 |
f325b2 |
@@ -754,10 +754,21 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
|
|
 |
f325b2 |
InitSvpForLibreOfficeKit();
|
|
 |
f325b2 |
|
|
 |
f325b2 |
ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), (sal_uInt16)32) ;
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ // Set background to transparent by default.
|
|
 |
f325b2 |
+ memset(pBuffer, 0, nCanvasWidth * nCanvasHeight * 4);
|
|
 |
f325b2 |
+ pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
+ // Allocate a separate buffer for the alpha device.
|
|
 |
f325b2 |
+ std::vector<sal_uInt8> aAlpha(nCanvasWidth * nCanvasHeight);
|
|
 |
f325b2 |
+ memset(aAlpha.data(), 0, nCanvasWidth * nCanvasHeight);
|
|
 |
f325b2 |
+ boost::shared_array<sal_uInt8> aAlphaBuffer(aAlpha.data(), NoDelete<sal_uInt8>());
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
pDevice->SetOutputSizePixelScaleOffsetAndBuffer(
|
|
 |
f325b2 |
Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),
|
|
 |
f325b2 |
- aBuffer, true );
|
|
 |
f325b2 |
+ aBuffer, aAlphaBuffer, true );
|
|
 |
f325b2 |
|
|
 |
f325b2 |
pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight,
|
|
 |
f325b2 |
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
|
|
 |
f325b2 |
@@ -771,6 +782,17 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
|
|
 |
f325b2 |
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
|
|
 |
f325b2 |
#endif
|
|
 |
f325b2 |
|
|
 |
f325b2 |
+ // Overwrite pBuffer's alpha channel with the separate alpha buffer.
|
|
 |
f325b2 |
+ for (int nRow = 0; nRow < nCanvasHeight; ++nRow)
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ for (int nCol = 0; nCol < nCanvasWidth; ++nCol)
|
|
 |
f325b2 |
+ {
|
|
 |
f325b2 |
+ const int nOffset = (nCanvasHeight * nRow) + nCol;
|
|
 |
f325b2 |
+ // VCL's transparent is 0, RGBA's transparent is 0xff.
|
|
 |
f325b2 |
+ pBuffer[nOffset * 4 +3] = 0xff - aAlpha[nOffset];
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+ }
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
static bool bDebug = getenv("LOK_DEBUG") != 0;
|
|
 |
f325b2 |
if (bDebug)
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
|
|
 |
f325b2 |
index 3720a19c98f3..85e0afd78131 100644
|
|
 |
f325b2 |
--- a/include/vcl/virdev.hxx
|
|
 |
f325b2 |
+++ b/include/vcl/virdev.hxx
|
|
 |
f325b2 |
@@ -48,6 +48,7 @@ private:
|
|
 |
f325b2 |
const bool bTopDown );
|
|
 |
f325b2 |
SAL_DLLPRIVATE bool ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
|
|
 |
f325b2 |
const basebmp::RawMemorySharedArray &pBuffer,
|
|
 |
f325b2 |
+ const basebmp::RawMemorySharedArray &pAlphaBuffer,
|
|
 |
f325b2 |
const bool bTopDown );
|
|
 |
f325b2 |
|
|
 |
f325b2 |
VirtualDevice (const VirtualDevice &) SAL_DELETED_FUNCTION;
|
|
 |
f325b2 |
@@ -127,6 +128,7 @@ public:
|
|
 |
f325b2 |
const Fraction& rScale,
|
|
 |
f325b2 |
const Point& rNewOffset,
|
|
 |
f325b2 |
const basebmp::RawMemorySharedArray &pBuffer,
|
|
 |
f325b2 |
+ const basebmp::RawMemorySharedArray &pAlphaBuffer,
|
|
 |
f325b2 |
const bool bTopDown = false );
|
|
 |
f325b2 |
bool SetOutputSize( const Size& rNewSize, bool bErase = true )
|
|
 |
f325b2 |
{ return SetOutputSizePixel( LogicToPixel( rNewSize ), bErase ); }
|
|
 |
f325b2 |
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
|
|
 |
f325b2 |
index b24378de4b25..ee44d30267e8 100644
|
|
 |
f325b2 |
--- a/vcl/source/gdi/virdev.cxx
|
|
 |
f325b2 |
+++ b/vcl/source/gdi/virdev.cxx
|
|
 |
f325b2 |
@@ -393,6 +393,7 @@ void VirtualDevice::ImplFillOpaqueRectangle( const Rectangle& rRect )
|
|
 |
f325b2 |
|
|
 |
f325b2 |
bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
|
|
 |
f325b2 |
const basebmp::RawMemorySharedArray &pBuffer,
|
|
 |
f325b2 |
+ const basebmp::RawMemorySharedArray &pAlphaBuffer,
|
|
 |
f325b2 |
const bool bTopDown )
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
if( InnerImplSetOutputSizePixel(rNewSize, bErase, pBuffer, bTopDown) )
|
|
 |
f325b2 |
@@ -409,7 +410,7 @@ bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
mpAlphaVDev = VclPtr<VirtualDevice>::Create( *this, mnAlphaDepth );
|
|
 |
f325b2 |
mpAlphaVDev->InnerImplSetOutputSizePixel(rNewSize, bErase,
|
|
 |
f325b2 |
- basebmp::RawMemorySharedArray(),
|
|
 |
f325b2 |
+ pAlphaBuffer,
|
|
 |
f325b2 |
bTopDown );
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
|
|
 |
f325b2 |
@@ -443,13 +444,16 @@ void VirtualDevice::EnableRTL( bool bEnable )
|
|
 |
f325b2 |
|
|
 |
f325b2 |
bool VirtualDevice::SetOutputSizePixel( const Size& rNewSize, bool bErase )
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
- return ImplSetOutputSizePixel( rNewSize, bErase, basebmp::RawMemorySharedArray(), false );
|
|
 |
f325b2 |
+ return ImplSetOutputSizePixel( rNewSize, bErase, basebmp::RawMemorySharedArray(), basebmp::RawMemorySharedArray(), false );
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
|
|
 |
f325b2 |
bool VirtualDevice::SetOutputSizePixelScaleOffsetAndBuffer(
|
|
 |
f325b2 |
const Size& rNewSize, const Fraction& rScale, const Point& rNewOffset,
|
|
 |
f325b2 |
- const basebmp::RawMemorySharedArray &pBuffer, const bool bTopDown )
|
|
 |
f325b2 |
+ const basebmp::RawMemorySharedArray &pBuffer, const basebmp::RawMemorySharedArray &pAlphaBuffer, const bool bTopDown )
|
|
 |
f325b2 |
{
|
|
 |
f325b2 |
+ if (pAlphaBuffer)
|
|
 |
f325b2 |
+ mnAlphaDepth = 8;
|
|
 |
f325b2 |
+
|
|
 |
f325b2 |
if (pBuffer) {
|
|
 |
f325b2 |
MapMode mm = GetMapMode();
|
|
 |
f325b2 |
mm.SetOrigin( rNewOffset );
|
|
 |
f325b2 |
@@ -457,7 +461,7 @@ bool VirtualDevice::SetOutputSizePixelScaleOffsetAndBuffer(
|
|
 |
f325b2 |
mm.SetScaleY( rScale );
|
|
 |
f325b2 |
SetMapMode( mm );
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
- return ImplSetOutputSizePixel( rNewSize, true, pBuffer, bTopDown );
|
|
 |
f325b2 |
+ return ImplSetOutputSizePixel( rNewSize, true, pBuffer, pAlphaBuffer, bTopDown );
|
|
 |
f325b2 |
}
|
|
 |
f325b2 |
|
|
 |
f325b2 |
void VirtualDevice::SetReferenceDevice( RefDevMode i_eRefDevMode )
|
|
 |
f325b2 |
--
|
|
 |
f325b2 |
2.12.0
|
|
 |
f325b2 |
|