svx/source/sdr/overlay/overlaymanagerbuffered.cxx |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

New commits:
commit 6064d732dc9baf06e2d778b0167f149ed212def9
Author:     Armin Le Grand (Collabora) <armin.le.gr...@me.com>
AuthorDate: Tue May 20 15:17:21 2025 +0200
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Wed May 21 10:49:10 2025 +0200

    tdf#166520 make OverlayManagerBuffered more aware of MapModes
    
    need to also use MapModeLastCompleteRedraw for the invalidates
    which are at OverlayManagerBuffered::invalidateRange. Calc is
    just completely unstable using MapModes at any Window. The one
    remembered at full repaint has to be the DrawingLayer one, so
    overlay works in DrawingLayer coordinates/MapMode(s)
    
    Change-Id: I6be133078ab27903592cdf75bd3d1d2bb77f189a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185563
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx 
b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
index f32b87b2898e..90ab5662190b 100644
--- a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
+++ b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
@@ -425,10 +425,24 @@ namespace sdr::overlay
             if(rRange.isEmpty())
                 return;
 
+            if (maMapModeLastCompleteRedraw == MapMode())
+                // there was no CompleteRedraw yet, done
+                return;
+
             // buffered output, do not invalidate but use the timer
             // to trigger a timer event for refresh
             maBufferIdle.Start();
 
+            // tdf#166520 need to also use MapModeLastCompleteRedraw for
+            // the invalidates -> Calc is just completely unstable using
+            // MapModes at any Window. The one remembered at full
+            // repaint has to be the DrawingLayer one - overlay works
+            // in DrawingLayer coordinates/MapMode(s)
+            const MapMode aPrevMapMode(getOutputDevice().GetMapMode());
+            const bool bPatchMapMode(aPrevMapMode != 
maMapModeLastCompleteRedraw);
+            if (bPatchMapMode)
+                getOutputDevice().SetMapMode(maMapModeLastCompleteRedraw);
+
             // add the discrete range to the remembered region
             // #i75163# use double precision and floor/ceil rounding to get 
overlapped pixel region, even
             // when the given logic region has a width/height of 0.0. This 
does NOT work with LogicToPixel
@@ -460,6 +474,11 @@ namespace sdr::overlay
                 maBufferRememberedRangePixel.expand(aTopLeft);
                 maBufferRememberedRangePixel.expand(aBottomRight);
             }
+
+            // restore evtl. temporarily patched MapMode (see explanation
+            // above)
+            if (bPatchMapMode)
+                getOutputDevice().SetMapMode(aPrevMapMode);
         }
 } // end of namespace
 

Reply via email to