summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2021-09-07 13:02:14 +0200
committerLuboš Luňák <l.lunak@collabora.com>2021-09-08 10:31:17 +0200
commit0f699173519176b9bd21761d553c34156c1ebd7d (patch)
tree31192f552a99668e1bc15d464ccfe65becb62bc6 /sd
parentb9c2207e1b5247b4d3184b137be9a75a4b8c6c37 (diff)
patch SdrPageWindow in SdXImpressDocument::paintTile()
This is based on commit 424312aa99307da9f0ee60ea6e3213b2b3dc26b4 amd I don't quite understand everything that happens, because the drawing layer classes have all kinds of comments except those that would explain the purpose or usage of the classes. My understanding is that drawing layer keeps all kinds of state in Sdr* classes and when drawing it tries to find those based on the OutputDevice. But since tiled drawing uses its own VirtualDevice for the drawing, the search fails and a temporary state is used that's always setup up and cleared again. Which is wasteful, and not having the state around also means that e.g. when clicking a checkbox for impress master background, with idle painting disabled there's nothing to react to the event and cause a tile repaint. Change-Id: Ic9036680c628d67615a82dcc4f585ab827b91525 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121780 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'sd')
-rw-r--r--sd/source/ui/unoidl/unomodel.cxx24
1 files changed, 24 insertions, 0 deletions
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 54827450a64d..6c4f83244c74 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -57,6 +57,8 @@
#include <svx/svdundo.hxx>
#include <svx/unoapi.hxx>
#include <svx/unofill.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/sdrpaintwindow.hxx>
#include <editeng/fontitem.hxx>
#include <toolkit/awt/vclxdevice.hxx>
#include <svx/svdpool.hxx>
@@ -2208,6 +2210,25 @@ void SdXImpressDocument::paintTile( VirtualDevice& rDevice,
if (!pViewSh)
return;
+ // Setup drawing layer to work properly. Since we use a custom VirtualDevice
+ // for the drawing, SdrPaintView::BeginCompleteRedraw() will call FindPaintWindow()
+ // unsuccessfully and use a temporary window that doesn't keep state. So patch
+ // the existing SdrPageWindow to use a temporary, and this way the state will be kept.
+ // Well, at least that's how I understand it based on Writer's RenderContextGuard,
+ // as the drawing layer classes lack documentation.
+ SdrPageWindow* patchedPageWindow = nullptr;
+ SdrPaintWindow* previousPaintWindow = nullptr;
+ std::unique_ptr<SdrPaintWindow> temporaryPaintWindow;
+ if(SdrView* pDrawView = pViewSh->GetDrawView())
+ {
+ if(SdrPageView* pSdrPageView = pDrawView->GetSdrPageView())
+ {
+ patchedPageWindow = pSdrPageView->FindPageWindow(*getDocWindow()->GetOutDev());
+ temporaryPaintWindow.reset(new SdrPaintWindow(*pDrawView, rDevice));
+ previousPaintWindow = patchedPageWindow->patchPaintWindow(*temporaryPaintWindow);
+ }
+ }
+
// Scaling. Must convert from pixels to twips. We know
// that VirtualDevices use a DPI of 96.
// We specifically calculate these scales first as we're still
@@ -2244,6 +2265,9 @@ void SdXImpressDocument::paintTile( VirtualDevice& rDevice,
LokChartHelper::PaintAllChartsOnTile(rDevice, nOutputWidth, nOutputHeight,
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
+
+ if(patchedPageWindow != nullptr)
+ patchedPageWindow->unpatchPaintWindow(previousPaintWindow);
}
void SdXImpressDocument::selectPart(int nPart, int nSelect)