canvas/source/vcl/canvashelper.cxx |   42 ++++++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 7 deletions(-)

New commits:
commit 4cf636fab338ad759e1a23bb8570cc9351ded0d0
Author:     Patrick Luby <plub...@neooffice.org>
AuthorDate: Tue Oct 24 18:52:08 2023 -0400
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Oct 25 07:51:13 2023 +0200

    tdf#157790 invert alpha mask
    
    Due to commit 81994cb2b8b32453a92bcb011830fcb884f22ff3,
    the alpha mask needs to be inverted.
    
    Change-Id: I4771c5f6f3a08fb210b62a0533df895a4a476058
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158410
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/canvas/source/vcl/canvashelper.cxx 
b/canvas/source/vcl/canvashelper.cxx
index cbbd18a376d9..0e4dfdbf633f 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -731,13 +731,25 @@ namespace vclcanvas
                 mpOutDevProvider->getOutDev().DrawTransformedBitmapEx( 
aMatrix, aBmpEx, fAlpha );
                 if( mp2ndOutDevProvider )
                 {
-                    // HACK. Normally, CanvasHelper does not care about
-                    // actually what mp2ndOutDev is...  well, here we do &
-                    // assume a 1bpp target - everything beyond 97%
-                    // transparency is fully transparent
-                    if( aBmpEx.IsAlpha() && !SkiaHelper::isVCLSkiaEnabled())
+                    if( aBmpEx.IsAlpha() )
                     {
-                        BitmapFilter::Filter(aBmpEx, 
BitmapAlphaClampFilter(253));
+                        // tdf#157790 invert alpha mask
+                        // Due to commit 
81994cb2b8b32453a92bcb011830fcb884f22ff3,
+                        // the alpha mask needs to be inverted. Note: when
+                        // testing tdf#157790, this code only gets executed
+                        // when Skia is enabled.
+                        AlphaMask aAlpha( aBmpEx.GetAlphaMask() );
+                        aAlpha.Invert();
+                        aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aAlpha );
+
+                        // HACK. Normally, CanvasHelper does not care about
+                        // actually what mp2ndOutDev is...  well, here we do &
+                        // assume a 1bpp target - everything beyond 97%
+                        // transparency is fully transparent
+                        if( !SkiaHelper::isVCLSkiaEnabled())
+                        {
+                            BitmapFilter::Filter(aBmpEx, 
BitmapAlphaClampFilter(253));
+                        }
                     }
 
                     mp2ndOutDevProvider->getOutDev().DrawTransformedBitmapEx( 
aMatrix, aBmpEx );
@@ -839,10 +851,26 @@ namespace vclcanvas
                               &aGrfAttr);
 
                 if( mp2ndOutDevProvider )
-                    pGrfObj->Draw(mp2ndOutDevProvider->getOutDev(),
+                {
+                    GraphicObjectSharedPtr p2ndGrfObj = pGrfObj;
+                    if( aBmpEx.IsAlpha() )
+                    {
+                        // tdf#157790 invert alpha mask
+                        // Due to commit 
81994cb2b8b32453a92bcb011830fcb884f22ff3,
+                        // the alpha mask needs to be inverted. Note: when
+                        // testing tdf#157790, this code only gets executed
+                        // when Skia is disabled.
+                        AlphaMask aAlpha( aBmpEx.GetAlphaMask() );
+                        aAlpha.Invert();
+                        BitmapEx a2ndBmpEx( aBmpEx.GetBitmap(), aAlpha );
+                        p2ndGrfObj = std::make_shared<GraphicObject>( 
a2ndBmpEx );
+                    }
+
+                    p2ndGrfObj->Draw(mp2ndOutDevProvider->getOutDev(),
                                   aPt,
                                   aSz,
                                   &aGrfAttr);
+                }
 
                 // created GraphicObject, which possibly cached
                 // display bitmap - return cache object, to retain

Reply via email to