drawinglayer/source/processor2d/vclpixelprocessor2d.cxx |   11 +++----
 include/vcl/alpha.hxx                                   |    1 
 vcl/source/gdi/alpha.cxx                                |   23 ++++++++++++++++
 3 files changed, 29 insertions(+), 6 deletions(-)

New commits:
commit 6806616023242aded27b1fae8637d32c9626d472
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu May 14 14:42:24 2020 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Fri May 29 06:23:50 2020 +0200

    Add AlphaMask::BlendWith method to blend 8-bit alpha masks
    
    Required for subsequent soft edge effect improvement
    
    Change-Id: I9351b827a83c5651100e73a6846c834f491b861d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95027
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/include/vcl/alpha.hxx b/include/vcl/alpha.hxx
index f87ac133970a..159c61243efa 100644
--- a/include/vcl/alpha.hxx
+++ b/include/vcl/alpha.hxx
@@ -56,6 +56,7 @@ public:
     void        Erase( sal_uInt8 cTransparency );
     void        Replace( const Bitmap& rMask, sal_uInt8 rReplaceTransparency );
     void        Replace( sal_uInt8 cSearchTransparency, sal_uInt8 
cReplaceTransparency );
+    void        BlendWith(const Bitmap& rOther);
 
     BitmapReadAccess*  AcquireAlphaReadAccess() { return 
Bitmap::AcquireReadAccess(); }
     BitmapWriteAccess* AcquireAlphaWriteAccess() { return 
Bitmap::AcquireWriteAccess(); }
diff --git a/vcl/source/gdi/alpha.cxx b/vcl/source/gdi/alpha.cxx
index fde0e94583a9..1385f803be8d 100644
--- a/vcl/source/gdi/alpha.cxx
+++ b/vcl/source/gdi/alpha.cxx
@@ -138,6 +138,29 @@ void AlphaMask::Replace( sal_uInt8 cSearchTransparency, 
sal_uInt8 cReplaceTransp
     }
 }
 
+void AlphaMask::BlendWith(const Bitmap& rOther)
+{
+    AlphaMask aOther(rOther); // to 8 bits
+    Bitmap::ScopedReadAccess pOtherAcc(aOther);
+    AlphaScopedWriteAccess pAcc(*this);
+    if (pOtherAcc && pAcc && pOtherAcc->GetBitCount() == 8 && 
pAcc->GetBitCount() == 8)
+    {
+        const long nHeight = std::min(pOtherAcc->Height(), pAcc->Height());
+        const long nWidth = std::min(pOtherAcc->Width(), pAcc->Width());
+        for (long x = 0; x < nWidth; ++x)
+        {
+            for (long y = 0; y < nHeight; ++y)
+            {
+                // Use sal_uInt16 for following multiplication
+                const sal_uInt16 nGrey1 = pOtherAcc->GetPixelIndex(y, x);
+                const sal_uInt16 nGrey2 = pAcc->GetPixelIndex(y, x);
+                const double fGrey = std::round(nGrey1 + nGrey2 - nGrey1 * 
nGrey2 / 255.0);
+                pAcc->SetPixelIndex(y, x, static_cast<sal_uInt8>(fGrey));
+            }
+        }
+    }
+}
+
 void AlphaMask::ReleaseAccess( BitmapReadAccess* pAccess )
 {
     if( pAccess )
commit 2cfe93da835eb500c9a170d22fce19fbd1de9473
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu May 28 12:48:28 2020 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Fri May 29 06:23:37 2020 +0200

    tdf#49247, tdf#101181: don't rely on automatic scaling of alpha mask
    
    Scale it back explicitly in ProcessAndBlurAlphaMask
    
    Change-Id: I8e8a58c117d8b59db40b416edadc559b47dc300a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95021
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
index 32afe33e6147..9e44ef292d34 100644
--- a/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
@@ -917,18 +917,17 @@ void 
VclPixelProcessor2D::processMetaFilePrimitive2D(const primitive2d::BasePrim
 
 namespace
 {
-/* Returns 8-bit alpha mask created from passed mask. The result may be scaled 
down; it's
-   expected that it will be automatically scaled up back when applied to the 
bitmap.
+/* Returns 8-bit alpha mask created from passed mask.
 
    Negative fErodeDilateRadius values mean erode, positive - dilate.
    nTransparency defines minimal transparency level.
 */
-AlphaMask ProcessAndBlurAlphaMask(const Bitmap& rBWMask, double 
fErodeDilateRadius,
+AlphaMask ProcessAndBlurAlphaMask(const Bitmap& rMask, double 
fErodeDilateRadius,
                                   double fBlurRadius, sal_uInt8 nTransparency)
 {
     // Only completely white pixels on the initial mask must be considered for 
transparency. Any
     // other color must be treated as black. This creates 1-bit B&W bitmap.
-    BitmapEx mask(rBWMask.CreateMask(COL_WHITE));
+    BitmapEx mask(rMask.CreateMask(COL_WHITE));
 
     // Scaling down increases performance without noticeable quality loss. 
Additionally,
     // current blur implementation can only handle blur radius between 2 and 
254.
@@ -963,6 +962,8 @@ AlphaMask ProcessAndBlurAlphaMask(const Bitmap& rBWMask, 
double fErodeDilateRadi
     // calculate blurry effect
     BitmapFilter::Filter(mask, BitmapFilterStackBlur(fBlurRadius));
 
+    mask.Scale(rMask.GetSizePixel());
+
     return AlphaMask(mask.GetBitmap());
 }
 }
@@ -1005,7 +1006,6 @@ void VclPixelProcessor2D::processGlowPrimitive2D(const 
primitive2d::GlowPrimitiv
         const basegfx::BColor aGlowColor(
             
maBColorModifierStack.getModifiedColor(rCandidate.getGlowColor().getBColor()));
         bitmap.Erase(Color(aGlowColor));
-        // alpha mask will be scaled up automatically to match bitmap
         BitmapEx result(bitmap, mask);
 
         // back to old OutDev
@@ -1053,7 +1053,6 @@ void VclPixelProcessor2D::processSoftEdgePrimitive2D(
         process(rCandidate);
         bitmap = mpOutputDevice->GetBitmap(aRect.TopLeft(), aRect.GetSize());
 
-        // alpha mask will be scaled up automatically to match bitmap
         BitmapEx result(bitmap, mask);
 
         // back to old OutDev
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to