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>
This commit is contained in:
Noel Grandin 2018-03-16 15:30:43 +02:00
parent e9c74a075c
commit 62275a93e3
3 changed files with 35 additions and 16 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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,