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

panoskorovesis (via logerrit) logerrit at kemper.freedesktop.org
Tue Aug 17 02:43:12 UTC 2021


 filter/source/svg/svgwriter.cxx     |    3 
 include/vcl/filter/SvmWriter.hxx    |    1 
 include/vcl/gdimtf.hxx              |    1 
 vcl/source/filter/svm/SvmWriter.cxx |  347 ++++++++++++++++++++++++++++++++++++
 vcl/source/gdi/gdimtf.cxx           |  343 -----------------------------------
 vcl/source/gdi/impgraph.cxx         |    2 
 6 files changed, 351 insertions(+), 346 deletions(-)

New commits:
commit 9bd336d6566897a6d2238bf38f927a20ae981da9
Author:     panoskorovesis <panoskorovesis at outlook.com>
AuthorDate: Tue Aug 10 14:30:10 2021 +0300
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Tue Aug 17 04:42:31 2021 +0200

    Move GDIMetaFile::GetChecksum to SvmWriter::GetChecksum
    
    Move the method and update all the method calls from
    GDIMetaFile::GetChecksum -> SvmWriter::GetChecksum
    Remove the method from gdimtf
    
    Change-Id: I68e2b3cf99178947ac4f1474810dd5568f07e122
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120414
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/filter/source/svg/svgwriter.cxx b/filter/source/svg/svgwriter.cxx
index 17401fdd2370..d7bcf77d95be 100644
--- a/filter/source/svg/svgwriter.cxx
+++ b/filter/source/svg/svgwriter.cxx
@@ -30,6 +30,7 @@
 #include <vcl/outdev.hxx>
 #include <vcl/settings.hxx>
 #include <vcl/filter/SvmReader.hxx>
+#include <vcl/filter/SvmWriter.hxx>
 #include <tools/fract.hxx>
 #include <tools/helpers.hxx>
 #include <tools/stream.hxx>
@@ -1943,7 +1944,7 @@ BitmapChecksum SVGActionWriter::GetChecksum( const MetaAction* pAction )
     GDIMetaFile aMtf;
     MetaAction* pA = const_cast<MetaAction*>(pAction);
     aMtf.AddAction( pA );
-    return aMtf.GetChecksum();
+    return SvmWriter::GetChecksum( aMtf );
 }
 
 void SVGActionWriter::SetEmbeddedBitmapRefs( const MetaBitmapActionMap* pEmbeddedBitmapsMap )
diff --git a/include/vcl/filter/SvmWriter.hxx b/include/vcl/filter/SvmWriter.hxx
index 9bd3989a1b9a..9237f62b2884 100644
--- a/include/vcl/filter/SvmWriter.hxx
+++ b/include/vcl/filter/SvmWriter.hxx
@@ -37,6 +37,7 @@ public:
     SvmWriter(SvStream& rIStm);
 
     SvStream& Write(const GDIMetaFile& rMetaFile);
+    static BitmapChecksum GetChecksum(const GDIMetaFile& rMetaFile);
     void MetaActionHandler(MetaAction* pAction, ImplMetaWriteData* pData);
     void ActionHandler(MetaAction* pAction);
     void PixelHandler(MetaPixelAction* pAction);
diff --git a/include/vcl/gdimtf.hxx b/include/vcl/gdimtf.hxx
index 8ce95ed11029..007f59521cdd 100644
--- a/include/vcl/gdimtf.hxx
+++ b/include/vcl/gdimtf.hxx
@@ -179,7 +179,6 @@ public:
     void            SetPrefMapMode( const MapMode& rMapMode ) { m_aPrefMapMode = rMapMode; }
 
 
-    BitmapChecksum  GetChecksum() const;
     sal_uLong       GetSizeBytes() const;
 
     /// Creates an antialiased thumbnail
diff --git a/vcl/source/filter/svm/SvmWriter.cxx b/vcl/source/filter/svm/SvmWriter.cxx
index 189f6a8e69ac..ddc47a892547 100644
--- a/vcl/source/filter/svm/SvmWriter.cxx
+++ b/vcl/source/filter/svm/SvmWriter.cxx
@@ -69,6 +69,353 @@ SvStream& SvmWriter::Write(const GDIMetaFile& rMetaFile)
     return mrStream;
 }
 
+BitmapChecksum SvmWriter::GetChecksum(const GDIMetaFile& rMetaFile)
+{
+    SvMemoryStream aMemStm(65535, 65535);
+    ImplMetaWriteData aWriteData;
+    SVBT16 aBT16;
+    SVBT32 aBT32;
+    BitmapChecksumOctetArray aBCOA;
+    BitmapChecksum nCrc = 0;
+
+    aWriteData.meActualCharSet = aMemStm.GetStreamCharSet();
+
+    for (size_t i = 0, nObjCount = rMetaFile.GetActionSize(); i < nObjCount; i++)
+    {
+        MetaAction* pAction = rMetaFile.GetAction(i);
+
+        switch (pAction->GetType())
+        {
+            case MetaActionType::BMP:
+            {
+                MetaBmpAction* pAct = static_cast<MetaBmpAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::BMPSCALE:
+            {
+                MetaBmpScaleAction* pAct = static_cast<MetaBmpScaleAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::BMPSCALEPART:
+            {
+                MetaBmpScalePartAction* pAct = static_cast<MetaBmpScalePartAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetDestPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::BMPEX:
+            {
+                MetaBmpExAction* pAct = static_cast<MetaBmpExAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmapEx().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::BMPEXSCALE:
+            {
+                MetaBmpExScaleAction* pAct = static_cast<MetaBmpExScaleAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmapEx().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::BMPEXSCALEPART:
+            {
+                MetaBmpExScalePartAction* pAct = static_cast<MetaBmpExScalePartAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmapEx().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                Int32ToSVBT32(pAct->GetDestPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::MASK:
+            {
+                MetaMaskAction* pAct = static_cast<MetaMaskAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                UInt32ToSVBT32(sal_uInt32(pAct->GetColor()), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::MASKSCALE:
+            {
+                MetaMaskScaleAction* pAct = static_cast<MetaMaskScaleAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                UInt32ToSVBT32(sal_uInt32(pAct->GetColor()), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::MASKSCALEPART:
+            {
+                MetaMaskScalePartAction* pAct = static_cast<MetaMaskScalePartAction*>(pAction);
+
+                ShortToSVBT16(static_cast<sal_uInt16>(pAct->GetType()), aBT16);
+                nCrc = vcl_get_checksum(nCrc, aBT16, 2);
+
+                BCToBCOA(pAct->GetBitmap().GetChecksum(), aBCOA);
+                nCrc = vcl_get_checksum(nCrc, aBCOA, BITMAP_CHECKSUM_SIZE);
+
+                UInt32ToSVBT32(sal_uInt32(pAct->GetColor()), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetDestSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().X(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcPoint().Y(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Width(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+
+                Int32ToSVBT32(pAct->GetSrcSize().Height(), aBT32);
+                nCrc = vcl_get_checksum(nCrc, aBT32, 4);
+            }
+            break;
+
+            case MetaActionType::EPS:
+            {
+                MetaEPSAction* pAct = static_cast<MetaEPSAction*>(pAction);
+                nCrc = vcl_get_checksum(nCrc, pAct->GetLink().GetData(),
+                                        pAct->GetLink().GetDataSize());
+            }
+            break;
+
+            case MetaActionType::CLIPREGION:
+            {
+                MetaClipRegionAction& rAct = static_cast<MetaClipRegionAction&>(*pAction);
+                const vcl::Region& rRegion = rAct.GetRegion();
+
+                if (rRegion.HasPolyPolygonOrB2DPolyPolygon())
+                {
+                    // It has shown that this is a possible bottleneck for checksum calculation.
+                    // In worst case a very expensive RegionHandle representation gets created.
+                    // In this case it's cheaper to use the PolyPolygon
+                    const basegfx::B2DPolyPolygon aPolyPolygon(rRegion.GetAsB2DPolyPolygon());
+                    SVBT64 aSVBT64;
+
+                    for (auto const& rPolygon : aPolyPolygon)
+                    {
+                        const sal_uInt32 nPointCount(rPolygon.count());
+                        const bool bControl(rPolygon.areControlPointsUsed());
+
+                        for (sal_uInt32 b(0); b < nPointCount; b++)
+                        {
+                            const basegfx::B2DPoint aPoint(rPolygon.getB2DPoint(b));
+
+                            DoubleToSVBT64(aPoint.getX(), aSVBT64);
+                            nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+                            DoubleToSVBT64(aPoint.getY(), aSVBT64);
+                            nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+
+                            if (bControl)
+                            {
+                                if (rPolygon.isPrevControlPointUsed(b))
+                                {
+                                    const basegfx::B2DPoint aCtrl(rPolygon.getPrevControlPoint(b));
+
+                                    DoubleToSVBT64(aCtrl.getX(), aSVBT64);
+                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+                                    DoubleToSVBT64(aCtrl.getY(), aSVBT64);
+                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+                                }
+
+                                if (rPolygon.isNextControlPointUsed(b))
+                                {
+                                    const basegfx::B2DPoint aCtrl(rPolygon.getNextControlPoint(b));
+
+                                    DoubleToSVBT64(aCtrl.getX(), aSVBT64);
+                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+                                    DoubleToSVBT64(aCtrl.getY(), aSVBT64);
+                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
+                                }
+                            }
+                        }
+                    }
+
+                    sal_uInt8 tmp = static_cast<sal_uInt8>(rAct.IsClipping());
+                    nCrc = vcl_get_checksum(nCrc, &tmp, 1);
+                }
+                else
+                {
+                    SvmWriter aWriter(aMemStm);
+                    aWriter.MetaActionHandler(pAction, &aWriteData);
+                    nCrc = vcl_get_checksum(nCrc, aMemStm.GetData(), aMemStm.Tell());
+                    aMemStm.Seek(0);
+                }
+            }
+            break;
+
+            default:
+            {
+                SvmWriter aWriter(aMemStm);
+                aWriter.MetaActionHandler(pAction, &aWriteData);
+                nCrc = vcl_get_checksum(nCrc, aMemStm.GetData(), aMemStm.Tell());
+                aMemStm.Seek(0);
+            }
+            break;
+        }
+    }
+
+    return nCrc;
+}
+
 void SvmWriter::MetaActionHandler(MetaAction* pAction, ImplMetaWriteData* pData)
 {
     MetaActionType nType = pAction->GetType();
diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx
index 60e3ec0f293d..cfeaf1d0a4b3 100644
--- a/vcl/source/gdi/gdimtf.cxx
+++ b/vcl/source/gdi/gdimtf.cxx
@@ -2212,349 +2212,6 @@ GDIMetaFile GDIMetaFile::GetMonochromeMtf( const Color& rColor ) const
     return aRet;
 }
 
-BitmapChecksum GDIMetaFile::GetChecksum() const
-{
-    SvMemoryStream              aMemStm( 65535, 65535 );
-    ImplMetaWriteData           aWriteData;
-    SVBT16                      aBT16;
-    SVBT32                      aBT32;
-    BitmapChecksumOctetArray    aBCOA;
-    BitmapChecksum              nCrc = 0;
-
-    aWriteData.meActualCharSet = aMemStm.GetStreamCharSet();
-    for( size_t i = 0, nObjCount = GetActionSize(); i < nObjCount; i++ )
-    {
-        MetaAction* pAction = GetAction( i );
-
-        switch( pAction->GetType() )
-        {
-            case MetaActionType::BMP:
-            {
-                MetaBmpAction* pAct = static_cast<MetaBmpAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::BMPSCALE:
-            {
-                MetaBmpScaleAction* pAct = static_cast<MetaBmpScaleAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::BMPSCALEPART:
-            {
-                MetaBmpScalePartAction* pAct = static_cast<MetaBmpScalePartAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetDestPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::BMPEX:
-            {
-                MetaBmpExAction* pAct = static_cast<MetaBmpExAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmapEx().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::BMPEXSCALE:
-            {
-                MetaBmpExScaleAction* pAct = static_cast<MetaBmpExScaleAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmapEx().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::BMPEXSCALEPART:
-            {
-                MetaBmpExScalePartAction* pAct = static_cast<MetaBmpExScalePartAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmapEx().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                Int32ToSVBT32( pAct->GetDestPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::MASK:
-            {
-                MetaMaskAction* pAct = static_cast<MetaMaskAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                UInt32ToSVBT32( sal_uInt32(pAct->GetColor()), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::MASKSCALE:
-            {
-                MetaMaskScaleAction* pAct = static_cast<MetaMaskScaleAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                UInt32ToSVBT32( sal_uInt32(pAct->GetColor()), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::MASKSCALEPART:
-            {
-                MetaMaskScalePartAction* pAct = static_cast<MetaMaskScalePartAction*>(pAction);
-
-                ShortToSVBT16( static_cast<sal_uInt16>(pAct->GetType()), aBT16 );
-                nCrc = vcl_get_checksum( nCrc, aBT16, 2 );
-
-                BCToBCOA( pAct->GetBitmap().GetChecksum(), aBCOA );
-                nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
-
-                UInt32ToSVBT32( sal_uInt32(pAct->GetColor()), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetDestSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().X(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcPoint().Y(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Width(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-
-                Int32ToSVBT32( pAct->GetSrcSize().Height(), aBT32 );
-                nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
-            }
-            break;
-
-            case MetaActionType::EPS :
-            {
-                MetaEPSAction* pAct = static_cast<MetaEPSAction*>(pAction);
-                nCrc = vcl_get_checksum( nCrc, pAct->GetLink().GetData(), pAct->GetLink().GetDataSize() );
-            }
-            break;
-
-            case MetaActionType::CLIPREGION :
-            {
-                MetaClipRegionAction& rAct = static_cast<MetaClipRegionAction&>(*pAction);
-                const vcl::Region& rRegion = rAct.GetRegion();
-
-                if(rRegion.HasPolyPolygonOrB2DPolyPolygon())
-                {
-                    // It has shown that this is a possible bottleneck for checksum calculation.
-                    // In worst case a very expensive RegionHandle representation gets created.
-                    // In this case it's cheaper to use the PolyPolygon
-                    const basegfx::B2DPolyPolygon aPolyPolygon(rRegion.GetAsB2DPolyPolygon());
-                    SVBT64 aSVBT64;
-
-                    for(auto const& rPolygon : aPolyPolygon)
-                    {
-                        const sal_uInt32 nPointCount(rPolygon.count());
-                        const bool bControl(rPolygon.areControlPointsUsed());
-
-                        for(sal_uInt32 b(0); b < nPointCount; b++)
-                        {
-                            const basegfx::B2DPoint aPoint(rPolygon.getB2DPoint(b));
-
-                            DoubleToSVBT64(aPoint.getX(), aSVBT64);
-                            nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-                            DoubleToSVBT64(aPoint.getY(), aSVBT64);
-                            nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-
-                            if(bControl)
-                            {
-                                if(rPolygon.isPrevControlPointUsed(b))
-                                {
-                                    const basegfx::B2DPoint aCtrl(rPolygon.getPrevControlPoint(b));
-
-                                    DoubleToSVBT64(aCtrl.getX(), aSVBT64);
-                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-                                    DoubleToSVBT64(aCtrl.getY(), aSVBT64);
-                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-                                }
-
-                                if(rPolygon.isNextControlPointUsed(b))
-                                {
-                                    const basegfx::B2DPoint aCtrl(rPolygon.getNextControlPoint(b));
-
-                                    DoubleToSVBT64(aCtrl.getX(), aSVBT64);
-                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-                                    DoubleToSVBT64(aCtrl.getY(), aSVBT64);
-                                    nCrc = vcl_get_checksum(nCrc, aSVBT64, 8);
-                                }
-                            }
-                        }
-                    }
-
-                    sal_uInt8 tmp = static_cast<sal_uInt8>(rAct.IsClipping());
-                    nCrc = vcl_get_checksum(nCrc, &tmp, 1);
-                }
-                else
-                {
-                    pAction->Write( aMemStm, &aWriteData );
-                    nCrc = vcl_get_checksum( nCrc, aMemStm.GetData(), aMemStm.Tell() );
-                    aMemStm.Seek( 0 );
-                }
-            }
-            break;
-
-            default:
-            {
-                pAction->Write( aMemStm, &aWriteData );
-                nCrc = vcl_get_checksum( nCrc, aMemStm.GetData(), aMemStm.Tell() );
-                aMemStm.Seek( 0 );
-            }
-            break;
-        }
-    }
-
-    return nCrc;
-}
-
 sal_uLong GDIMetaFile::GetSizeBytes() const
 {
     sal_uLong nSizeBytes = 0;
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index 6e4416935100..ae3f2209a8a8 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -1742,7 +1742,7 @@ BitmapChecksum ImpGraphic::getChecksum() const
 
         case GraphicType::GdiMetafile:
         {
-            mnChecksum = maMetaFile.GetChecksum();
+            mnChecksum = SvmWriter::GetChecksum(maMetaFile);
         }
         break;
     }


More information about the Libreoffice-commits mailing list