diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-16 15:30:43 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-19 07:36:22 +0100 |
commit | 62275a93e3b13a20aa1de7945a32a0d25582c1ca (patch) | |
tree | ba0f5a3ef6533b4a279eac66b5135aeffe96f486 | |
parent | e9c74a075c3c0809b993c017c11d1505bd244dc8 (diff) |
move pixel color extracting from canvas to BitmapEx
part of making GetAlpha/GetMask an internal detail of vcl
Change-Id: I874a68f340cd3074cfbeb6303f52adeeb13e56a5
Reviewed-on: https://gerrit.libreoffice.org/51435
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | canvas/source/vcl/canvasbitmaphelper.cxx | 18 | ||||
-rw-r--r-- | include/vcl/bitmapex.hxx | 12 | ||||
-rw-r--r-- | vcl/source/gdi/bitmapex.cxx | 21 |
3 files changed, 35 insertions, 16 deletions
diff --git a/canvas/source/vcl/canvasbitmaphelper.cxx b/canvas/source/vcl/canvasbitmaphelper.cxx index c2003f6a67cf..eef6258dded3 100644 --- a/canvas/source/vcl/canvasbitmaphelper.cxx +++ b/canvas/source/vcl/canvasbitmaphelper.cxx @@ -194,28 +194,14 @@ namespace vclcanvas ENSURE_ARG_OR_THROW( pos.Y >= 0 && pos.Y < aBmpSize.Height(), "Y coordinate out of bounds" ); - Bitmap aBitmap( mpBackBuffer->getBitmapReference().GetBitmap() ); - Bitmap aAlpha( mpBackBuffer->getBitmapReference().GetAlpha().GetBitmap() ); - - Bitmap::ScopedReadAccess pReadAccess( aBitmap ); - Bitmap::ScopedReadAccess pAlphaReadAccess( aAlpha.IsEmpty() ? - nullptr : aAlpha.AcquireReadAccess(), - aAlpha ); - ENSURE_OR_THROW( pReadAccess.get() != nullptr, - "Could not acquire read access to bitmap" ); + ::Color aColor = mpBackBuffer->getBitmapReference().GetPixelColor(pos.X, pos.Y); uno::Sequence< sal_Int8 > aRes( 4 ); sal_Int8* pRes = aRes.getArray(); - - const BitmapColor aColor( pReadAccess->GetColor( pos.Y, pos.X ) ); pRes[ 0 ] = aColor.GetRed(); pRes[ 1 ] = aColor.GetGreen(); pRes[ 2 ] = aColor.GetBlue(); - - if( pAlphaReadAccess.get() != nullptr ) - pRes[ 3 ] = pAlphaReadAccess->GetPixel( pos.Y, pos.X ).GetIndex(); - else - pRes[ 3 ] = sal_uInt8(255); + pRes[ 3 ] = aColor.GetTransparency(); return aRes; } diff --git a/include/vcl/bitmapex.hxx b/include/vcl/bitmapex.hxx index d78f273b21ad..c61969869b33 100644 --- a/include/vcl/bitmapex.hxx +++ b/include/vcl/bitmapex.hxx @@ -378,6 +378,18 @@ public: sal_Int32 nX, sal_Int32 nY) const; + /** Get pixel color (including alpha) at given position + + @param nX + integer X-Position in Bitmap + + @param nY + integer Y-Position in Bitmap + */ + ::Color GetPixelColor( + sal_Int32 nX, + sal_Int32 nY) const; + /** Create transformed Bitmap @param fWidth diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index 14b3fa17efd6..dba603347679 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -769,6 +769,27 @@ sal_uInt8 BitmapEx::GetTransparency(sal_Int32 nX, sal_Int32 nY) const return nTransparency; } + +Color BitmapEx::GetPixelColor(sal_Int32 nX, sal_Int32 nY) const +{ + Bitmap aAlpha( GetAlpha().GetBitmap() ); + + Bitmap aTestBitmap(maBitmap); + Bitmap::ScopedReadAccess pReadAccess( aTestBitmap ); + assert( pReadAccess ); + + Color aColor = pReadAccess->GetColor( nY, nX ).GetColor(); + + if (!aAlpha.IsEmpty()) + { + Bitmap::ScopedReadAccess pAlphaReadAccess( aAlpha.AcquireReadAccess(), aAlpha ); + aColor.SetTransparency( pAlphaReadAccess->GetPixel( nY, nX ).GetIndex() ); + } + else + aColor.SetTransparency(255); + return aColor; +} + // Shift alpha transparent pixels between cppcanvas/ implementations // and vcl in a generally grotesque and under-performing fashion bool BitmapEx::Create( const css::uno::Reference< css::rendering::XBitmapCanvas > &xBitmapCanvas, |