summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-08-10 16:44:03 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-08-10 16:23:59 +0000
commitcd064472ce4ff9d1dd6720c32fde22f36eb232f4 (patch)
tree1d3648abc42b827f7c2facda26e61fef8bfc100f
parent0f4b3cb7d3d68906de316a64dcec281da2a641bd (diff)
tdf#93325 ImplAnimView rendercontext: stop painting animgifs directly
Change-Id: I34fb235a2e44eb510a630fb8dbcc2ec68cf96b79 Reviewed-on: https://gerrit.libreoffice.org/17624 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--vcl/source/gdi/impanmvw.cxx23
1 files changed, 23 insertions, 0 deletions
diff --git a/vcl/source/gdi/impanmvw.cxx b/vcl/source/gdi/impanmvw.cxx
index 4794cd47b0ea..2b28b3cc97ff 100644
--- a/vcl/source/gdi/impanmvw.cxx
+++ b/vcl/source/gdi/impanmvw.cxx
@@ -18,6 +18,7 @@
*/
#include "impanmvw.hxx"
+#include <window.h>
#include <vcl/virdev.hxx>
#include <vcl/window.hxx>
#include <tools/helpers.hxx>
@@ -154,6 +155,15 @@ void ImplAnimView::getPosSize( const AnimationBitmap& rAnm, Point& rPosPix, Size
void ImplAnimView::drawToPos( sal_uLong nPos )
{
VclPtr<vcl::RenderContext> pRenderContext = mpOut;
+
+ std::unique_ptr<PaintBufferGuard> pGuard;
+ if (mpOut->GetOutDevType() == OUTDEV_WINDOW)
+ {
+ vcl::Window* pWindow = static_cast<vcl::Window*>(mpOut.get());
+ pGuard.reset(new PaintBufferGuard(pWindow->ImplGetWindowImpl()->mpFrameData, pWindow));
+ pRenderContext = pGuard->GetRenderContext();
+ }
+
ScopedVclPtrInstance<VirtualDevice> aVDev;
std::unique_ptr<vcl::Region> xOldClip(!maClip.IsNull() ? new vcl::Region( pRenderContext->GetClipRegion() ) : NULL);
@@ -167,6 +177,8 @@ void ImplAnimView::drawToPos( sal_uLong nPos )
pRenderContext->SetClipRegion( maClip );
pRenderContext->DrawOutDev( maDispPt, maDispSz, Point(), maSzPix, *aVDev.get() );
+ if (pGuard)
+ pGuard->SetPaintRect(Rectangle(maDispPt, maDispSz));
if (xOldClip)
pRenderContext->SetClipRegion(*xOldClip);
@@ -175,6 +187,15 @@ void ImplAnimView::drawToPos( sal_uLong nPos )
void ImplAnimView::draw( sal_uLong nPos, VirtualDevice* pVDev )
{
VclPtr<vcl::RenderContext> pRenderContext = mpOut;
+
+ std::unique_ptr<PaintBufferGuard> pGuard;
+ if (!pVDev && mpOut->GetOutDevType() == OUTDEV_WINDOW)
+ {
+ vcl::Window* pWindow = static_cast<vcl::Window*>(mpOut.get());
+ pGuard.reset(new PaintBufferGuard(pWindow->ImplGetWindowImpl()->mpFrameData, pWindow));
+ pRenderContext = pGuard->GetRenderContext();
+ }
+
Rectangle aOutRect( pRenderContext->PixelToLogic( Point() ), pRenderContext->GetOutputSize() );
// check, if output lies out of display
@@ -268,6 +289,8 @@ void ImplAnimView::draw( sal_uLong nPos, VirtualDevice* pVDev )
pRenderContext->SetClipRegion( maClip );
pRenderContext->DrawOutDev( maDispPt, maDispSz, Point(), maSzPix, *pDev );
+ if (pGuard)
+ pGuard->SetPaintRect(Rectangle(maDispPt, maDispSz));
if( xOldClip)
{