include/svx/sdr/contact/viewcontact.hxx |    5 +++++
 svx/source/sdr/contact/viewcontact.cxx  |   14 +++++++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

New commits:
commit 829510594b394d00ca2b4acb0ed64c6bda0f311c
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Dec 8 11:14:47 2021 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Dec 8 11:46:42 2021 +0100

    tdf#146108 Calc slow to change cell focus..
    
    in a document with a big background image
    
    Revert "tdf#136058: remove some caching"
    This reverts commit 57c40329a2b469813a1f357de355a37c8e3077ae.
    
    And add some comments for future would-be optimisers.
    
    Change-Id: Ie8686edc38dcdbe7d9e78599c1a259aab68278a1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126527
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/include/svx/sdr/contact/viewcontact.hxx 
b/include/svx/sdr/contact/viewcontact.hxx
index 238d188d6e5b..ffdc6d055008 100644
--- a/include/svx/sdr/contact/viewcontact.hxx
+++ b/include/svx/sdr/contact/viewcontact.hxx
@@ -46,6 +46,11 @@ private:
     // Registering and de-registering is done in the VOC 
constructors/destructors.
     std::vector<ViewObjectContact*> maViewObjectContactVector;
 
+    // Primitive2DContainer of the ViewContact. This contains all necessary 
information
+    // for the graphical visualisation and needs to be supported by all VCs 
which
+    // can be visualized.
+    drawinglayer::primitive2d::Primitive2DContainer 
mxViewIndependentPrimitive2DSequence;
+
     // A new ViewObjectContact was created and shall be remembered.
     void AddViewObjectContact(ViewObjectContact& rVOContact);
 
diff --git a/svx/source/sdr/contact/viewcontact.cxx 
b/svx/source/sdr/contact/viewcontact.cxx
index 3c1c875acba3..3f13933b742d 100644
--- a/svx/source/sdr/contact/viewcontact.cxx
+++ b/svx/source/sdr/contact/viewcontact.cxx
@@ -101,7 +101,9 @@ void 
ViewContact::RemoveViewObjectContact(ViewObjectContact& rVOContact)
         maViewObjectContactVector.begin(), maViewObjectContactVector.end(), 
&rVOContact);
 
     if (aFindResult != maViewObjectContactVector.end())
+    {
         maViewObjectContactVector.erase(aFindResult);
+    }
 }
 
 // Test if this ViewContact has ViewObjectContacts at all. This can
@@ -223,6 +225,9 @@ void ViewContact::createViewIndependentPrimitive2DSequence(
 void ViewContact::getViewIndependentPrimitive2DContainer(
     drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const
 {
+    /* Local up-to-date checks. Create new list and compare.
+        We cannot just always use the new data because the old data has cached 
bitmaps in it e.g. see the document in tdf#146108.
+    */
     drawinglayer::primitive2d::Primitive2DContainer xNew;
     createViewIndependentPrimitive2DSequence(xNew);
 
@@ -232,7 +237,14 @@ void ViewContact::getViewIndependentPrimitive2DContainer(
         xNew = embedToObjectSpecificInformation(std::move(xNew));
     }
 
-    rVisitor.visit(xNew);
+    if (mxViewIndependentPrimitive2DSequence != xNew)
+    {
+        // has changed, copy content
+        const_cast<ViewContact*>(this)->mxViewIndependentPrimitive2DSequence = 
std::move(xNew);
+    }
+
+    // return current Primitive2DContainer
+    rVisitor.visit(mxViewIndependentPrimitive2DSequence);
 }
 
 // add Gluepoints (if available)

Reply via email to