summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-11-25 16:43:19 +0000
committerAshod Nakashian <ashod.nakashian@collabora.co.uk>2016-07-12 22:06:29 -0400
commit4113f2c083873d606d90e687c57d9270ea7fb3bb (patch)
treecf3661843f3385a7a8b2febc8bd21575f051b923 /vcl
parent6954a9e0abc6ec8bf64f2491c8940a466d274726 (diff)
gtk3: of course we have a different 1 bit mask format as well
Change-Id: I02763bc1dfeec4a04f40fa0246cdc93eab6d6d33 (cherry picked from commit 4fee13c30eb7b67fd1c97466955742536265687c)
Diffstat (limited to 'vcl')
-rw-r--r--vcl/headless/svpgdi.cxx33
1 files changed, 26 insertions, 7 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index c471fb48ada3..dcac77ade9d7 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -136,6 +136,17 @@ bool SvpSalGraphics::blendAlphaBitmap( const SalTwoRect&, const SalBitmap&, cons
return false;
}
+namespace
+{
+ unsigned char reverseAndInvert(unsigned char b)
+ {
+ b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
+ b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
+ b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
+ return ~b;
+ }
+}
+
bool SvpSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rSourceBitmap, const SalBitmap& rAlphaBitmap )
{
bool bRet = false;
@@ -203,13 +214,10 @@ bool SvpSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rS
memcpy(pAlphaBits, pSrcBits, nImageSize);
// TODO: make upper layers use standard alpha
- long* pLDst = reinterpret_cast<long*>(pAlphaBits);
- for( int i = nImageSize/sizeof(long); --i >= 0; ++pLDst )
+ sal_uInt32* pLDst = reinterpret_cast<sal_uInt32*>(pAlphaBits);
+ for( int i = nImageSize/sizeof(sal_uInt32); --i >= 0; ++pLDst )
*pLDst = ~*pLDst;
-
- char* pCDst = reinterpret_cast<char*>(pLDst);
- for( int i = nImageSize & (sizeof(long)-1); --i >= 0; ++pCDst )
- *pCDst = ~*pCDst;
+ assert(reinterpret_cast<unsigned char*>(pLDst) == pAlphaBits+nImageSize);
mask = cairo_image_surface_create_for_data(pAlphaBits,
CAIRO_FORMAT_A8,
@@ -218,7 +226,18 @@ bool SvpSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rS
}
else
{
- mask = cairo_image_surface_create_for_data(data.get(),
+ // the alpha values need to be inverted *and* reordered for Cairo
+ // so big stupid copy and reverse + invert here
+ const int nImageSize = size.getY() * nStride;
+ const unsigned char* pSrcBits = data.get();
+ pAlphaBits = new unsigned char[nImageSize];
+ memcpy(pAlphaBits, pSrcBits, nImageSize);
+
+ unsigned char* pDst = pAlphaBits;
+ for (int i = nImageSize; --i >= 0; ++pDst)
+ *pDst = reverseAndInvert(*pDst);
+
+ mask = cairo_image_surface_create_for_data(pAlphaBits,
CAIRO_FORMAT_A1,
size.getX(), size.getY(),
nStride);