[Libreoffice-commits] core.git: vcl/qa vcl/source

Luboš Luňák (via logerrit) logerrit at kemper.freedesktop.org
Fri Jul 3 06:53:32 UTC 2020


 vcl/qa/cppunit/svm/svmtest.cxx |    6 ++--
 vcl/source/bitmap/salbmp.cxx   |   51 +++++++++++++++++++++++++++++++++++++----
 2 files changed, 50 insertions(+), 7 deletions(-)

New commits:
commit 645d5113965942ee9cba2670fc897b9f8f56a1fb
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Jul 2 14:40:15 2020 +0200
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Fri Jul 3 08:52:58 2020 +0200

    compute bitmap checksum for proper amount of bytes and bits
    
    Change-Id: Ifee6fae39dd13a36c72674550cd48dc35fdd71ac
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97761
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/vcl/qa/cppunit/svm/svmtest.cxx b/vcl/qa/cppunit/svm/svmtest.cxx
index 9deed5e13c10..f318aa718c4d 100644
--- a/vcl/qa/cppunit/svm/svmtest.cxx
+++ b/vcl/qa/cppunit/svm/svmtest.cxx
@@ -997,7 +997,7 @@ void SvmTest::checkBitmapExs(const GDIMetaFile& rMetaFile)
             "281fc589",
             "b8dee5da",
             "4df0e464",
-            "7d3a8da3",
+            "4322ee3a",
             "1426653b",
             "4fd547df",
             "71efc447",
@@ -1012,8 +1012,8 @@ void SvmTest::checkBitmapExs(const GDIMetaFile& rMetaFile)
             "281fc589",
             "5e01ddcc",
             "4df0e464",
-            "6c1263f9",
-            "747e8dfb",
+            "4322ee3a",
+            "794c92a9",
             "3c80d829",
             "71efc447",
         });
diff --git a/vcl/source/bitmap/salbmp.cxx b/vcl/source/bitmap/salbmp.cxx
index 6d955b6aa4d3..eae8aadc5d0e 100644
--- a/vcl/source/bitmap/salbmp.cxx
+++ b/vcl/source/bitmap/salbmp.cxx
@@ -19,6 +19,18 @@
 
 #include <salbmp.hxx>
 
+static BitmapChecksum scanlineChecksum(BitmapChecksum nCrc, const sal_uInt8* bits, int lineBitsCount, sal_uInt8 extraBitsMask)
+{
+    if( lineBitsCount / 8 > 0 )
+        nCrc = vcl_get_checksum( nCrc, bits, lineBitsCount / 8 );
+    if( extraBitsMask != 0 )
+    {
+        sal_uInt8 extraByte = bits[ lineBitsCount / 8 ] & extraBitsMask;
+        nCrc = vcl_get_checksum( nCrc, &extraByte, 1 );
+    }
+    return nCrc;
+}
+
 void SalBitmap::updateChecksum() const
 {
     if (mbChecksumValid)
@@ -30,19 +42,50 @@ void SalBitmap::updateChecksum() const
     if (pBuf)
     {
         nCrc = pBuf->maPalette.GetChecksum();
-        const int bytesPerPixel = ( pBuf->mnBitCount + 7 ) / 8;
+        const int lineBitsCount = pBuf->mnWidth * pBuf->mnBitCount;
+        // With 1bpp/4bpp format we need to check only used bits in the last byte.
+        sal_uInt8 extraBitsMask = 0;
+        if( lineBitsCount % 8 != 0 )
+        {
+            const int extraBitsCount = lineBitsCount % 8;
+            switch( RemoveScanline( pBuf->mnFormat ))
+            {
+                case ScanlineFormat::N1BitMsbPal:
+                {
+                    static const sal_uInt8 mask1Bit[] = { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
+                    extraBitsMask = mask1Bit[ extraBitsCount ];
+                    break;
+                }
+                case ScanlineFormat::N1BitLsbPal:
+                {
+                    static const sal_uInt8 mask1Bit[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
+                    extraBitsMask = mask1Bit[ extraBitsCount ];
+                    break;
+                }
+                case ScanlineFormat::N4BitMsnPal:
+                    assert(extraBitsCount == 4);
+                    extraBitsMask = 0xf0;
+                    break;
+                case ScanlineFormat::N4BitLsnPal:
+                    assert(extraBitsCount == 4);
+                    extraBitsMask = 0x0f;
+                    break;
+                default:
+                    break;
+            }
+        }
         if( pBuf->mnFormat & ScanlineFormat::TopDown )
         {
-            if( pBuf->mnScanlineSize == pBuf->mnWidth * bytesPerPixel )
+            if( pBuf->mnScanlineSize == lineBitsCount / 8 )
                 nCrc = vcl_get_checksum(nCrc, pBuf->mpBits, pBuf->mnScanlineSize * pBuf->mnHeight);
             else // Do not include padding with undefined content in the checksum.
                 for( long y = 0; y < pBuf->mnHeight; ++y )
-                    nCrc = vcl_get_checksum(nCrc, pBuf->mpBits + y * pBuf->mnScanlineSize, pBuf->mnWidth * bytesPerPixel);
+                    nCrc = scanlineChecksum(nCrc, pBuf->mpBits + y * pBuf->mnScanlineSize, lineBitsCount, extraBitsMask);
         }
         else // Compute checksum in the order of scanlines, to make it consistent between different bitmap implementations.
         {
             for( long y = pBuf->mnHeight - 1; y >= 0; --y )
-                nCrc = vcl_get_checksum(nCrc, pBuf->mpBits + y * pBuf->mnScanlineSize, pBuf->mnWidth * bytesPerPixel);
+                nCrc = scanlineChecksum(nCrc, pBuf->mpBits + y * pBuf->mnScanlineSize, lineBitsCount, extraBitsMask);
         }
         pThis->ReleaseBuffer(pBuf, BitmapAccessMode::Read);
         pThis->mnChecksum = nCrc;


More information about the Libreoffice-commits mailing list