vcl/source/app/salvtables.cxx | 28 ++++++++++++++++++++++++++-- vcl/unx/gtk3/gtkinst.cxx | 26 ++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-)
New commits: commit 39a6ea1fea4c0a624d19b4a5f0bcfd0e4cad0a20 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Sep 28 12:10:33 2021 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Wed Sep 29 12:21:54 2021 +0200 tdf#144139 don't crash when OutputDevice is a printer Change-Id: Ia3843966949b8164b01cecd762ea2b5c5bf0339b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122777 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> (cherry picked from commit a0f6d3865dd113f38fd3aa673075e9fecd06f3cd) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122791 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index a66e95158aa4..ad46c0035e95 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -1285,7 +1285,19 @@ void SalInstanceWidget::DoRecursivePaint(vcl::Window* pWindow, const Point& rRen Size aTempLogicSize(xOutput->PixelToLogic(aChildSizePixel)); Size aRenderLogicSize(rOutput.PixelToLogic(aChildSizePixel)); - xOutput->DrawOutDev(Point(), aTempLogicSize, rRenderLogicPos, aRenderLogicSize, rOutput); + switch (rOutput.GetOutDevType()) + { + case OUTDEV_WINDOW: + case OUTDEV_VIRDEV: + xOutput->DrawOutDev(Point(), aTempLogicSize, rRenderLogicPos, aRenderLogicSize, + rOutput); + break; + case OUTDEV_PRINTER: + case OUTDEV_PDF: + xOutput->SetBackground(rOutput.GetBackground()); + xOutput->Erase(); + break; + } //set ReallyVisible to match Visible, we restore the original state after Paint WindowImpl* pImpl = pWindow->ImplGetWindowImpl(); @@ -1297,7 +1309,19 @@ void SalInstanceWidget::DoRecursivePaint(vcl::Window* pWindow, const Point& rRen pImpl->mbReallyVisible = bRVisible; - rOutput.DrawOutDev(rRenderLogicPos, aRenderLogicSize, Point(), aTempLogicSize, *xOutput); + switch (rOutput.GetOutDevType()) + { + case OUTDEV_WINDOW: + case OUTDEV_VIRDEV: + rOutput.DrawOutDev(rRenderLogicPos, aRenderLogicSize, Point(), aTempLogicSize, + *xOutput); + break; + case OUTDEV_PRINTER: + case OUTDEV_PDF: + rOutput.DrawBitmapEx(rRenderLogicPos, aRenderLogicSize, + xOutput->GetBitmapEx(Point(), aTempLogicSize)); + break; + } xOutput.disposeAndClear(); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 38205154be22..213ccfb8624c 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -4210,7 +4210,19 @@ public: VclPtr<VirtualDevice> xOutput(VclPtr<VirtualDevice>::Create(DeviceFormat::DEFAULT)); xOutput->SetOutputSizePixel(aSize); - xOutput->DrawOutDev(Point(), aSize, rPos, aSize, rOutput); + + switch (rOutput.GetOutDevType()) + { + case OUTDEV_WINDOW: + case OUTDEV_VIRDEV: + xOutput->DrawOutDev(Point(), aSize, rPos, aSize, rOutput); + break; + case OUTDEV_PRINTER: + case OUTDEV_PDF: + xOutput->SetBackground(rOutput.GetBackground()); + xOutput->Erase(); + break; + } cairo_surface_t* pSurface = get_underlying_cairo_surface(*xOutput); cairo_t* cr = cairo_create(pSurface); @@ -4228,7 +4240,17 @@ public: gtk_widget_size_allocate(m_pWidget, &aOrigAllocation, 0); #endif - rOutput.DrawOutDev(rPos, aSize, Point(), aSize, *xOutput); + switch (rOutput.GetOutDevType()) + { + case OUTDEV_WINDOW: + case OUTDEV_VIRDEV: + rOutput.DrawOutDev(rPos, aSize, Point(), aSize, *xOutput); + break; + case OUTDEV_PRINTER: + case OUTDEV_PDF: + rOutput.DrawBitmapEx(rPos, xOutput->GetBitmapEx(Point(), aSize)); + break; + } if (bAnimations) g_object_set(pSettings, "gtk-enable-animations", true, nullptr);