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