summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--canvas/source/vcl/canvasbitmaphelper.cxx18
-rw-r--r--include/vcl/bitmapex.hxx12
-rw-r--r--vcl/source/gdi/bitmapex.cxx21
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,