[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - include/vcl vcl/inc vcl/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Mon Mar 23 12:31:40 UTC 2020


 include/vcl/graph.hxx                |    7 +------
 include/vcl/vectorgraphicdata.hxx    |    1 +
 vcl/inc/impgraph.hxx                 |    2 ++
 vcl/source/gdi/bitmapex.cxx          |    8 ++++----
 vcl/source/gdi/impgraph.cxx          |   27 +++++++++++----------------
 vcl/source/gdi/vectorgraphicdata.cxx |    6 ++++++
 6 files changed, 25 insertions(+), 26 deletions(-)

New commits:
commit 0b6100fd56691045d141075aad089683d59a76c2
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Mon May 20 19:08:19 2019 +0200
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Mon Mar 23 13:31:07 2020 +0100

    tdf#120837 File saving at least 5 times slower
    
    The problem here is that we never actually hit the maExportGraphics
    cache in SvXMLGraphicHelper, even though we are passing the same image
    down repeatedly.
    
    There are two bugs here:
    
    (1) BitmapEx::operator== does not return true if we instantiate 2
    Graphic objects from the same XGraphic, so change it to use the more
    expensive operator==. To mitigate the cost, move the expensive checks to
    the bottom of the method.
    
    (2) in order to use an object in std::unordered_map, the object must
    implement an equality function and a hash function. If two objects are
    equal THEY MUST have the same hash value. Using the Impl* as the hash
    value does not satisfy that condition, so rather use the checksum, which
    does.
    
    After these fixes, the save time drops to less than a second.
    
    Also make the checksum method look more like the operator== method,
    and add a checksum calculation method for SVG data that more accurately
    reflects the underlying SVG data.
    
    Reviewed-on: https://gerrit.libreoffice.org/72615
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
    (cherry picked from commit 319c57d2af5d26d3910db4b02dca145d8881af44)
    
    Change-Id: I4ca0c7bee60b2efa6fe42301e582c7b278022b46
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90843
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/include/vcl/graph.hxx b/include/vcl/graph.hxx
index 2ad98c871cae..c8bbccd4574f 100644
--- a/include/vcl/graph.hxx
+++ b/include/vcl/graph.hxx
@@ -199,11 +199,6 @@ public:
 
     BitmapChecksum  GetChecksum() const;
 
-    SAL_DLLPRIVATE std::size_t getHash() const
-    {
-        return reinterpret_cast<std::size_t>(ImplGetImpGraphic());
-    }
-
     OUString getOriginURL() const;
     void setOriginURL(OUString const & rOriginURL);
 
@@ -251,7 +246,7 @@ struct hash<Graphic>
 {
     std::size_t operator()(Graphic const & rGraphic) const
     {
-        return rGraphic.getHash();
+        return static_cast<std::size_t>(rGraphic.GetChecksum());
     }
 };
 
diff --git a/include/vcl/vectorgraphicdata.hxx b/include/vcl/vectorgraphicdata.hxx
index ea7615d2bdf6..159dc7afe286 100644
--- a/include/vcl/vectorgraphicdata.hxx
+++ b/include/vcl/vectorgraphicdata.hxx
@@ -103,6 +103,7 @@ public:
     const basegfx::B2DRange& getRange() const;
     const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& getPrimitive2DSequence() const;
     const BitmapEx& getReplacement() const;
+    BitmapChecksum GetChecksum() const;
 };
 
 typedef std::shared_ptr< VectorGraphicData > VectorGraphicDataPtr;
diff --git a/vcl/inc/impgraph.hxx b/vcl/inc/impgraph.hxx
index b61c5d24c901..10f144f4fc0c 100644
--- a/vcl/inc/impgraph.hxx
+++ b/vcl/inc/impgraph.hxx
@@ -83,6 +83,8 @@ private:
     bool                         mbSwapOut;
     bool                         mbDummyContext;
     VectorGraphicDataPtr         maVectorGraphicData;
+    // cache checksum computation
+    mutable BitmapChecksum       mnChecksum = 0;
 
     /// The PDF stream from which this Graphic is rendered,
     /// as converted (version downgraded) from the original,
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx
index ccf70a6c4dca..15a176924aec 100644
--- a/vcl/source/gdi/bitmapex.cxx
+++ b/vcl/source/gdi/bitmapex.cxx
@@ -181,9 +181,6 @@ bool BitmapEx::operator==( const BitmapEx& rBitmapEx ) const
     if (meTransparent != rBitmapEx.meTransparent)
         return false;
 
-    if (!maBitmap.ShallowEquals(rBitmapEx.maBitmap))
-        return false;
-
     if (GetSizePixel() != rBitmapEx.GetSizePixel())
         return false;
 
@@ -197,7 +194,10 @@ bool BitmapEx::operator==( const BitmapEx& rBitmapEx ) const
     if (mbAlpha != rBitmapEx.mbAlpha)
         return false;
 
-    return maMask.ShallowEquals(rBitmapEx.maMask);
+    if (maBitmap != rBitmapEx.maBitmap)
+        return false;
+
+    return maMask == rBitmapEx.maMask;
 }
 
 bool BitmapEx::IsEmpty() const
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index e9fc256e9508..c1b58b69acba 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -1682,6 +1682,9 @@ bool ImpGraphic::ImplIsLink() const
 
 BitmapChecksum ImpGraphic::ImplGetChecksum() const
 {
+    if (mnChecksum != 0)
+        return mnChecksum;
+
     BitmapChecksum nRet = 0;
 
     ensureAvailable();
@@ -1695,25 +1698,16 @@ BitmapChecksum ImpGraphic::ImplGetChecksum() const
 
             case GraphicType::Bitmap:
             {
-                if(maVectorGraphicData.get() && maEx.IsEmpty())
-                {
-                    // use maEx as local buffer for rendered svg
-                    const_cast< ImpGraphic* >(this)->maEx = maVectorGraphicData->getReplacement();
-                }
-
-                if( mpAnimation )
-                {
-                    nRet = mpAnimation->GetChecksum();
-                }
-                else
-                {
-                    nRet = maEx.GetChecksum();
-                }
-
-                if (mpPdfData && !mpPdfData->empty())
+                if (maVectorGraphicData)
+                    nRet = maVectorGraphicData->GetChecksum();
+                else if (mpPdfData && !mpPdfData->empty())
                     // Include the PDF data in the checksum, so a metafile with
                     // and without PDF data is considered to be different.
                     nRet = vcl_get_checksum(nRet, mpPdfData->data(), mpPdfData->size());
+                else if( mpAnimation )
+                    nRet = mpAnimation->GetChecksum();
+                else
+                    nRet = maEx.GetChecksum();
             }
             break;
 
@@ -1723,6 +1717,7 @@ BitmapChecksum ImpGraphic::ImplGetChecksum() const
         }
     }
 
+    mnChecksum = nRet;
     return nRet;
 }
 
diff --git a/vcl/source/gdi/vectorgraphicdata.cxx b/vcl/source/gdi/vectorgraphicdata.cxx
index 08aebe0a1b3d..892f2864a1ab 100644
--- a/vcl/source/gdi/vectorgraphicdata.cxx
+++ b/vcl/source/gdi/vectorgraphicdata.cxx
@@ -287,4 +287,10 @@ const BitmapEx& VectorGraphicData::getReplacement() const
     return maReplacement;
 }
 
+BitmapChecksum VectorGraphicData::GetChecksum() const
+{
+    BitmapChecksum nRet = 0;
+    return vcl_get_checksum(nRet, maVectorGraphicDataArray.getConstArray(), maVectorGraphicDataArray.getLength());
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list