include/vcl/BitmapTools.hxx | 3 vcl/source/bitmap/BitmapArithmeticBlendFilter.cxx | 71 ++++++--------------- vcl/source/bitmap/BitmapDarkenBlendFilter.cxx | 73 ++++++---------------- vcl/source/bitmap/BitmapLightenBlendFilter.cxx | 73 ++++++---------------- vcl/source/bitmap/BitmapMultiplyBlendFilter.cxx | 73 ++++++---------------- vcl/source/bitmap/BitmapNormalBlendFilter.cxx | 69 ++++++-------------- vcl/source/bitmap/BitmapScreenBlendFilter.cxx | 69 ++++++-------------- vcl/source/bitmap/BitmapTools.cxx | 14 ++++ 8 files changed, 138 insertions(+), 307 deletions(-)
New commits: commit 9c079eec689c9df295d8eb1770e90cca2060b98b Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Wed Apr 24 13:23:11 2024 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Wed Apr 24 15:28:45 2024 +0200 vcl: Factor out common code and simplify Change-Id: I836c8f85474dc564efa3ca781f47a25e1d8c55fb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166582 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Tested-by: Jenkins diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx index d321d2be79a3..4582f7305ee9 100644 --- a/include/vcl/BitmapTools.hxx +++ b/include/vcl/BitmapTools.hxx @@ -97,6 +97,9 @@ VCL_DLLPUBLIC bool convertBitmap32To24Plus8(BitmapEx const & rInput, BitmapEx & VCL_DLLPUBLIC Bitmap GetDownsampledBitmap(Size const& rDstSizeTwip, Point const& rSrcPt, Size const& rSrcSz, Bitmap const& rBmp, tools::Long nMaxBmpDPIX, tools::Long nMaxBmpDPIY); +BitmapColor premultiply(const BitmapColor c); +BitmapColor unpremultiply(const BitmapColor c); + } // end vcl::bitmap #endif // INCLUDED_VCL_BITMAP_TOOLS_HXX diff --git a/vcl/source/bitmap/BitmapArithmeticBlendFilter.cxx b/vcl/source/bitmap/BitmapArithmeticBlendFilter.cxx index da52a436b6f6..d46b7bc9bd74 100644 --- a/vcl/source/bitmap/BitmapArithmeticBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapArithmeticBlendFilter.cxx @@ -32,20 +32,6 @@ static sal_uInt8 lcl_calculate(sal_uInt8 aColor, sal_uInt8 aColor2, double aK1, return std::clamp(result, 0.0, 1.0) * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapArithmeticBlendFilter::execute(double aK1, double aK2, double aK3, double aK4) { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -56,49 +42,34 @@ BitmapEx BitmapArithmeticBlendFilter::execute(double aK1, double aK2, double aK3 sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) - { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r(lcl_calculate(i1.GetRed(), i2.GetRed(), aK1, aK2, aK3, aK4)); - sal_uInt8 g(lcl_calculate(i1.GetGreen(), i2.GetGreen(), aK1, aK2, aK3, aK4)); - sal_uInt8 b(lcl_calculate(i1.GetBlue(), i2.GetBlue(), aK1, aK2, aK3, aK4)); - sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i2.GetAlpha(), aK1, aK2, aK3, aK4)); - - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapScreenBlendFilter: could not access bitmap"); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i2.GetRed(), aK1, aK2, aK3, aK4)); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i2.GetGreen(), aK1, aK2, aK3, aK4)); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i2.GetBlue(), aK1, aK2, aK3, aK4)); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i2.GetAlpha(), aK1, aK2, aK3, aK4)); + + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } diff --git a/vcl/source/bitmap/BitmapDarkenBlendFilter.cxx b/vcl/source/bitmap/BitmapDarkenBlendFilter.cxx index 1aa912a43ec4..708829dc7c76 100644 --- a/vcl/source/bitmap/BitmapDarkenBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapDarkenBlendFilter.cxx @@ -33,20 +33,6 @@ static sal_uInt8 lcl_calculate(const sal_uInt8 aColor, const sal_uInt8 aAlpha, return result * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapDarkenBlendFilter::execute() { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -57,53 +43,34 @@ BitmapEx BitmapDarkenBlendFilter::execute() sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. - - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r( - lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); - sal_uInt8 g( - lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); - sal_uInt8 b( - lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); - sal_uInt8 a( - lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else - { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapDarkenBlendFilter: could not access bitmap"); + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/bitmap/BitmapLightenBlendFilter.cxx b/vcl/source/bitmap/BitmapLightenBlendFilter.cxx index 3d2fe07a2357..b683034c1f4c 100644 --- a/vcl/source/bitmap/BitmapLightenBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapLightenBlendFilter.cxx @@ -33,20 +33,6 @@ static sal_uInt8 lcl_calculate(const sal_uInt8 aColor, const sal_uInt8 aAlpha, return result * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapLightenBlendFilter::execute() { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -57,53 +43,34 @@ BitmapEx BitmapLightenBlendFilter::execute() sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. - - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r( - lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); - sal_uInt8 g( - lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); - sal_uInt8 b( - lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); - sal_uInt8 a( - lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else - { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapLightenBlendFilter: could not access bitmap"); + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/bitmap/BitmapMultiplyBlendFilter.cxx b/vcl/source/bitmap/BitmapMultiplyBlendFilter.cxx index e5d3a185ae15..168e6c3ecdfc 100644 --- a/vcl/source/bitmap/BitmapMultiplyBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapMultiplyBlendFilter.cxx @@ -33,20 +33,6 @@ static sal_uInt8 lcl_calculate(const sal_uInt8 aColor, const sal_uInt8 aAlpha, return result * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapMultiplyBlendFilter::execute() { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -57,53 +43,34 @@ BitmapEx BitmapMultiplyBlendFilter::execute() sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. - - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r( - lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); - sal_uInt8 g( - lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); - sal_uInt8 b( - lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); - sal_uInt8 a( - lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed(), i2.GetAlpha())); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen(), i2.GetAlpha())); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue(), i2.GetAlpha())); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha(), i2.GetAlpha())); - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else - { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapMultiplyBlendFilter: could not access bitmap"); + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/bitmap/BitmapNormalBlendFilter.cxx b/vcl/source/bitmap/BitmapNormalBlendFilter.cxx index 5f207d37a756..922680fea2b1 100644 --- a/vcl/source/bitmap/BitmapNormalBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapNormalBlendFilter.cxx @@ -32,20 +32,6 @@ static sal_uInt8 lcl_calculate(const sal_uInt8 aColor, const sal_uInt8 aAlpha, return result * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapNormalBlendFilter::execute() { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -56,49 +42,34 @@ BitmapEx BitmapNormalBlendFilter::execute() sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. - - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r(lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed())); - sal_uInt8 g(lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen())); - sal_uInt8 b(lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue())); - sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha())); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i1.GetAlpha(), i2.GetRed())); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i1.GetAlpha(), i2.GetGreen())); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i1.GetAlpha(), i2.GetBlue())); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i1.GetAlpha(), i2.GetAlpha())); - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else - { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapNormalBlendFilter: could not access bitmap"); + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/bitmap/BitmapScreenBlendFilter.cxx b/vcl/source/bitmap/BitmapScreenBlendFilter.cxx index 0964c519571d..e954fce7c364 100644 --- a/vcl/source/bitmap/BitmapScreenBlendFilter.cxx +++ b/vcl/source/bitmap/BitmapScreenBlendFilter.cxx @@ -30,20 +30,6 @@ static sal_uInt8 lcl_calculate(const sal_uInt8 aColor, const sal_uInt8 aColor2) return result * 255.0; } -static BitmapColor premultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::premultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - -static BitmapColor unpremultiply(const BitmapColor c) -{ - return BitmapColor(ColorAlpha, vcl::bitmap::unpremultiply(c.GetRed(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetGreen(), c.GetAlpha()), - vcl::bitmap::unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); -} - BitmapEx BitmapScreenBlendFilter::execute() { if (maBitmapEx.IsEmpty() || maBitmapEx2.IsEmpty()) @@ -54,49 +40,34 @@ BitmapEx BitmapScreenBlendFilter::execute() sal_Int32 nHeight = std::min(aSize.getHeight(), aSize2.getHeight()); sal_Int32 nWidth = std::min(aSize.getWidth(), aSize2.getWidth()); - BitmapScopedReadAccess pReadAccess(maBitmapEx.GetBitmap()); - Bitmap aDstBitmap(Size(nWidth, nHeight), maBitmapEx.GetBitmap().getPixelFormat(), - &pReadAccess->GetPalette()); + Bitmap aDstBitmap(Size(nWidth, nHeight), vcl::PixelFormat::N24_BPP); Bitmap aDstAlpha(AlphaMask(Size(nWidth, nHeight)).GetBitmap()); - { - // just to be on the safe side: let the - // ScopedAccessors get destructed before - // copy-constructing the resulting bitmap. This will - // rule out the possibility that cached accessor data - // is not yet written back. - - BitmapScopedWriteAccess pWriteAccess(aDstBitmap); - BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); + BitmapScopedWriteAccess pWriteAccess(aDstBitmap); + BitmapScopedWriteAccess pAlphaWriteAccess(aDstAlpha); - if (pWriteAccess.get() != nullptr && pAlphaWriteAccess.get() != nullptr) + for (tools::Long y(0); y < nHeight; ++y) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); + for (tools::Long x(0); x < nWidth; ++x) { - for (tools::Long y(0); y < nHeight; ++y) - { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pAlphaWriteAccess->GetScanline(y); - for (tools::Long x(0); x < nWidth; ++x) - { - BitmapColor i1 = premultiply(maBitmapEx.GetPixelColor(x, y)); - BitmapColor i2 = premultiply(maBitmapEx2.GetPixelColor(x, y)); - sal_uInt8 r(lcl_calculate(i1.GetRed(), i2.GetRed())); - sal_uInt8 g(lcl_calculate(i1.GetGreen(), i2.GetGreen())); - sal_uInt8 b(lcl_calculate(i1.GetBlue(), i2.GetBlue())); - sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i2.GetAlpha())); + BitmapColor i1 = vcl::bitmap::premultiply(maBitmapEx.GetPixelColor(x, y)); + BitmapColor i2 = vcl::bitmap::premultiply(maBitmapEx2.GetPixelColor(x, y)); + sal_uInt8 r(lcl_calculate(i1.GetRed(), i2.GetRed())); + sal_uInt8 g(lcl_calculate(i1.GetGreen(), i2.GetGreen())); + sal_uInt8 b(lcl_calculate(i1.GetBlue(), i2.GetBlue())); + sal_uInt8 a(lcl_calculate(i1.GetAlpha(), i2.GetAlpha())); - pWriteAccess->SetPixelOnData( - pScanline, x, unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); - pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); - } - } - } - else - { - // TODO(E2): Error handling! - ENSURE_OR_THROW(false, "BitmapScreenBlendFilter: could not access bitmap"); + pWriteAccess->SetPixelOnData( + pScanline, x, vcl::bitmap::unpremultiply(BitmapColor(ColorAlpha, r, g, b, a))); + pAlphaWriteAccess->SetPixelOnData(pScanAlpha, x, BitmapColor(a)); } } + pWriteAccess.reset(); + pAlphaWriteAccess.reset(); + return BitmapEx(aDstBitmap, AlphaMask(aDstAlpha)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index cb094c0831c7..060f391f3e18 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -1295,6 +1295,20 @@ Bitmap GetDownsampledBitmap(Size const& rDstSizeTwip, Point const& rSrcPt, Size return aBmp; } +BitmapColor premultiply(const BitmapColor c) +{ + return BitmapColor(ColorAlpha, premultiply(c.GetRed(), c.GetAlpha()), + premultiply(c.GetGreen(), c.GetAlpha()), + premultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); +} + +BitmapColor unpremultiply(const BitmapColor c) +{ + return BitmapColor(ColorAlpha, unpremultiply(c.GetRed(), c.GetAlpha()), + unpremultiply(c.GetGreen(), c.GetAlpha()), + unpremultiply(c.GetBlue(), c.GetAlpha()), c.GetAlpha()); +} + } // end vcl::bitmap /* vim:set shiftwidth=4 softtabstop=4 expandtab: */