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: */

Reply via email to