include/vcl/bitmapex.hxx | 20 +++++++++++++++ svtools/source/graphic/transformer.cxx | 43 ++++++--------------------------- vcl/source/gdi/bitmapex.cxx | 28 +++++++++++++++++++++ 3 files changed, 57 insertions(+), 34 deletions(-)
New commits: commit 5531e6338bc9d7d5676a5c52059d5ccb2fcccb0c Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Wed Feb 7 15:09:12 2018 +0200 move setAlphaFrom from GraphicTransformer to BitmapEx Change-Id: I69329c61e81791db3806fabe3256571fa937deb6 Reviewed-on: https://gerrit.libreoffice.org/49360 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/vcl/bitmapex.hxx b/include/vcl/bitmapex.hxx index 31b008a081b2..9faf3c8eb41c 100644 --- a/include/vcl/bitmapex.hxx +++ b/include/vcl/bitmapex.hxx @@ -265,6 +265,24 @@ public: const Color& rSearchColor, const Color& rReplaceColor ); + /** Replace all pixel having the search color with the specified color + + @param rSearchColor + Color specifying which pixel should be replaced + + @param rReplaceColor + Color to be placed in all changed pixel + + @param nTolerance + Tolerance value. Specifies the maximal difference between + rSearchColor and the individual pixel values, such that the + corresponding pixel is still regarded a match. + */ + void Replace( + const Color& rSearchColor, + const Color& rReplaceColor, + sal_uInt8 nTolerance ); + /** Replace all pixel having one the search colors with the corresponding replace color @param pSearchColors @@ -421,6 +439,8 @@ public: bool Create( const css::uno::Reference< css::rendering::XBitmapCanvas > &xBitmapCanvas, const Size &rSize ); + + void setAlphaFrom( sal_uInt8 cIndexFrom, sal_Int8 nAlphaTo ); public: SAL_DLLPRIVATE std::shared_ptr<ImpBitmap> const & ImplGetBitmapImpBitmap() const { return aBitmap.ImplGetImpBitmap(); } diff --git a/svtools/source/graphic/transformer.cxx b/svtools/source/graphic/transformer.cxx index 17fb3a3f87c6..12bc40f3babc 100644 --- a/svtools/source/graphic/transformer.cxx +++ b/svtools/source/graphic/transformer.cxx @@ -46,28 +46,6 @@ GraphicTransformer::~GraphicTransformer() } -void setAlpha( Bitmap& rBitmap, AlphaMask& rAlpha, sal_uInt8 cIndexFrom, sal_Int8 nAlphaTo ) -{ - BitmapWriteAccess* pWriteAccess = rAlpha.AcquireWriteAccess(); - BitmapReadAccess* pReadAccess = rBitmap.AcquireReadAccess(); - if ( pReadAccess && pWriteAccess ) - { - for ( long nY = 0; nY < pReadAccess->Height(); nY++ ) - { - Scanline pScanline = pWriteAccess->GetScanline( nY ); - Scanline pScanlineRead = pReadAccess->GetScanline( nY ); - for ( long nX = 0; nX < pReadAccess->Width(); nX++ ) - { - const sal_uInt8 cIndex = pReadAccess->GetIndexFromData( pScanlineRead, nX ); - if ( cIndex == cIndexFrom ) - pWriteAccess->SetPixelOnData( pScanline, nX, BitmapColor(nAlphaTo) ); - } - } - } - Bitmap::ReleaseAccess( pReadAccess ); - rAlpha.ReleaseAccess( pWriteAccess ); -} - // XGraphicTransformer uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange( const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nColorFrom, sal_Int8 nTolerance, sal_Int32 nColorTo, sal_Int8 nAlphaTo ) @@ -90,10 +68,9 @@ uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange( if (aBitmapEx.IsAlpha()) { - AlphaMask aAlphaMask(aBitmapEx.GetAlpha()); - setAlpha(aBitmap, aAlphaMask, cIndexFrom, nAlphaTo); - aBitmap.Replace(aColorFrom, aColorTo, nTolerance); - aGraphic = ::Graphic(BitmapEx(aBitmap, aAlphaMask)); + aBitmapEx.setAlphaFrom( cIndexFrom, nAlphaTo ); + aBitmapEx.Replace(aColorFrom, aColorTo, nTolerance); + aGraphic = ::Graphic(aBitmapEx); } else if (aBitmapEx.IsTransparent()) { @@ -107,10 +84,9 @@ uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange( } else { - AlphaMask aAlphaMask(aBitmapEx.GetMask()); - setAlpha(aBitmap, aAlphaMask, cIndexFrom, 0xff - nAlphaTo); - aBitmap.Replace(aColorFrom, aColorTo, nTolerance); - aGraphic = ::Graphic(BitmapEx(aBitmap, aAlphaMask)); + aBitmapEx.setAlphaFrom(cIndexFrom, 0xff - nAlphaTo); + aBitmapEx.Replace(aColorFrom, aColorTo, nTolerance); + aGraphic = ::Graphic(aBitmapEx); } } else @@ -123,10 +99,9 @@ uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange( } else { - AlphaMask aAlphaMask(aBitmapEx.GetSizePixel()); - setAlpha(aBitmap, aAlphaMask, cIndexFrom, nAlphaTo); - aBitmap.Replace(aColorFrom, aColorTo, nTolerance); - aGraphic = ::Graphic(BitmapEx(aBitmap, aAlphaMask)); + aBitmapEx.setAlphaFrom(cIndexFrom, nAlphaTo); + aBitmapEx.Replace(aColorFrom, aColorTo, nTolerance); + aGraphic = ::Graphic(aBitmapEx); } } } diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index bf3a57b2ad75..3acb0a36f26a 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -1294,4 +1294,32 @@ BitmapEx createBlendFrame( return pBlendFrameCache->m_aLastResult; } +void BitmapEx::Replace(const Color& rSearchColor, + const Color& rReplaceColor, + sal_uInt8 nTolerance) +{ + aBitmap.Replace(rSearchColor, rReplaceColor, nTolerance); +} + +void BitmapEx::setAlphaFrom( sal_uInt8 cIndexFrom, sal_Int8 nAlphaTo ) +{ + AlphaMask aAlphaMask(GetAlpha()); + Bitmap::ScopedWriteAccess pWriteAccess(aAlphaMask); + Bitmap::ScopedReadAccess pReadAccess(aBitmap); + assert( pReadAccess.get() && pWriteAccess.get() ); + if ( pReadAccess.get() && pWriteAccess.get() ) + { + for ( long nY = 0; nY < pReadAccess->Height(); nY++ ) + { + Scanline pScanline = pWriteAccess->GetScanline( nY ); + Scanline pScanlineRead = pReadAccess->GetScanline( nY ); + for ( long nX = 0; nX < pReadAccess->Width(); nX++ ) + { + const sal_uInt8 cIndex = pReadAccess->GetIndexFromData( pScanlineRead, nX ); + if ( cIndex == cIndexFrom ) + pWriteAccess->SetPixelOnData( pScanline, nX, BitmapColor(nAlphaTo) ); + } + } + } +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits