[Libreoffice-commits] core.git: Branch 'libreoffice-7-0' - vcl/source

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Fri Jun 26 05:57:04 UTC 2020


 vcl/source/gdi/alpha.cxx |   15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

New commits:
commit bdd9c9ab3ec20db4ce83cebbfc2e90bf73e2e7ec
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed Jun 24 10:39:35 2020 +0200
Commit:     Adolfo Jayme Barrientos <fitojb at ubuntu.com>
CommitDate: Fri Jun 26 07:56:30 2020 +0200

    optimize AlphaMask::BlendWith()
    
    It shows up in profiling in some cases (e.g. tdf#134160).
    - If it's 8-bit, simply work on scanlines instead of pixel by pixel.
    - The extra precision from using floats doesn't matter and the round()
      costs something (at least with MSVC).
    
    Change-Id: I37bbe31fae03d61946a7382de1fb79cfe2d2ec30
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97010
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
    Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
    (cherry picked from commit a3ef92cfb512ce70c7dc48f7957b40f9f78f5628)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97005
    Reviewed-by: Adolfo Jayme Barrientos <fitojb at ubuntu.com>

diff --git a/vcl/source/gdi/alpha.cxx b/vcl/source/gdi/alpha.cxx
index 1385f803be8d..bc1d54f36c22 100644
--- a/vcl/source/gdi/alpha.cxx
+++ b/vcl/source/gdi/alpha.cxx
@@ -147,15 +147,18 @@ void AlphaMask::BlendWith(const Bitmap& rOther)
     {
         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)
         {
-            for (long y = 0; y < nHeight; ++y)
+            Scanline scanline = pAcc->GetScanline( y );
+            ConstScanline otherScanline = pOtherAcc->GetScanline( y );
+            for (long x = 0; x < nWidth; ++x)
             {
                 // 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));
+                const sal_uInt16 nGrey1 = *scanline;
+                const sal_uInt16 nGrey2 = *otherScanline;
+                *scanline = static_cast<sal_uInt8>(nGrey1 + nGrey2 - nGrey1 * nGrey2 / 255);
+                ++scanline;
+                ++otherScanline;
             }
         }
     }


More information about the Libreoffice-commits mailing list