diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-02-13 16:14:57 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-02-14 07:29:33 +0100 |
commit | d03c6ee8d0e2f5637038cf80b890e97630b60b9e (patch) | |
tree | 38f94ba03eeea169e543dd687830da3f60452a92 /vcl | |
parent | e7ed95234244b9f3a2c5c3810984627f05e73384 (diff) |
move transparency adjust code to BitmapEx
part of making Bitmap an internal implementation detail of vcl/
Change-Id: I6978d84c86c3d55b3ebbeacda60fd94b160daa29
Reviewed-on: https://gerrit.libreoffice.org/49667
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/gdi/bitmapex.cxx | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index 797319164de4..962f75cc03f4 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -1322,4 +1322,59 @@ void BitmapEx::setAlphaFrom( sal_uInt8 cIndexFrom, sal_Int8 nAlphaTo ) } } } + +void BitmapEx::AdjustTransparency(sal_uInt8 cTrans) +{ + AlphaMask aAlpha; + + if( !IsTransparent() ) + aAlpha = AlphaMask( GetSizePixel(), &cTrans ); + else if( !IsAlpha() ) + { + aAlpha = GetMask(); + aAlpha.Replace( 0, cTrans ); + } + else + { + aAlpha = GetAlpha(); + Bitmap::ScopedWriteAccess pA(aAlpha); + assert(pA); + + if( !pA ) + return; + + sal_uLong nTrans = cTrans, nNewTrans; + const long nWidth = pA->Width(), nHeight = pA->Height(); + + if( pA->GetScanlineFormat() == ScanlineFormat::N8BitPal ) + { + for( long nY = 0; nY < nHeight; nY++ ) + { + Scanline pAScan = pA->GetScanline( nY ); + + for( long nX = 0; nX < nWidth; nX++ ) + { + nNewTrans = nTrans + *pAScan; + *pAScan++ = static_cast<sal_uInt8>( ( nNewTrans & 0xffffff00 ) ? 255 : nNewTrans ); + } + } + } + else + { + BitmapColor aAlphaValue( 0 ); + + for( long nY = 0; nY < nHeight; nY++ ) + { + Scanline pScanline = pA->GetScanline( nY ); + for( long nX = 0; nX < nWidth; nX++ ) + { + nNewTrans = nTrans + pA->GetIndexFromData( pScanline, nX ); + aAlphaValue.SetIndex( static_cast<sal_uInt8>( ( nNewTrans & 0xffffff00 ) ? 255 : nNewTrans ) ); + pA->SetPixelOnData( pScanline, nX, aAlphaValue ); + } + } + } + } + *this = BitmapEx( GetBitmap(), aAlpha ); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |