diff options
-rw-r--r-- | vcl/inc/opengl/win/gdiimpl.hxx | 1 | ||||
-rw-r--r-- | vcl/opengl/gdiimpl.cxx | 9 | ||||
-rw-r--r-- | vcl/opengl/win/gdiimpl.cxx | 19 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLContext.cxx | 3 | ||||
-rw-r--r-- | vcl/source/window/paint.cxx | 8 | ||||
-rw-r--r-- | vcl/win/source/window/salframe.cxx | 4 |
6 files changed, 39 insertions, 5 deletions
diff --git a/vcl/inc/opengl/win/gdiimpl.hxx b/vcl/inc/opengl/win/gdiimpl.hxx index 04bb15194de6..5c91727f3800 100644 --- a/vcl/inc/opengl/win/gdiimpl.hxx +++ b/vcl/inc/opengl/win/gdiimpl.hxx @@ -34,6 +34,7 @@ protected: virtual bool UseContext( const rtl::Reference<OpenGLContext> &pContext ) SAL_OVERRIDE; public: + virtual void Init() SAL_OVERRIDE; virtual void copyBits( const SalTwoRect& rPosAry, SalGraphics* pSrcGraphics ) SAL_OVERRIDE; diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index 85c3a3a1ab13..37b21f36edc1 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -115,7 +115,8 @@ void OpenGLSalGraphicsImpl::Init() // check if we can simply re-use the same context if( mpContext.is() ) { - if( !UseContext( mpContext ) ) + if( !mpContext->isInitialized() || + !UseContext( mpContext ) ) ReleaseContext(); } @@ -124,8 +125,12 @@ void OpenGLSalGraphicsImpl::Init() maOffscreenTex.GetWidth() != GetWidth() || maOffscreenTex.GetHeight() != GetHeight() ) { - if( mpContext.is() ) // valid context + if( maOffscreenTex && // don't work to release empty textures + mpContext.is() ) // valid context + { + mpContext->makeCurrent(); mpContext->ReleaseFramebuffer( maOffscreenTex ); + } maOffscreenTex = OpenGLTexture(); } } diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx index 30088a9deb88..517cff1b853f 100644 --- a/vcl/opengl/win/gdiimpl.cxx +++ b/vcl/opengl/win/gdiimpl.cxx @@ -43,7 +43,24 @@ bool WinOpenGLSalGraphicsImpl::UseContext( const rtl::Reference<OpenGLContext> & return false; if( IsOffscreen() ) return true; - return pContext->getOpenGLWindow().hWnd == mrParent.mhWnd; + return pContext->getOpenGLWindow().hWnd == mrParent.mhWnd && + pContext->getOpenGLWindow().hDC == mrParent.mhLocalDC; +} + +void WinOpenGLSalGraphicsImpl::Init() +{ + if ( !IsOffscreen() && mpContext.is() && mpContext->isInitialized() && + ( mpContext->getOpenGLWindow().hWnd != mrParent.mhWnd || + mpContext->getOpenGLWindow().hDC == mrParent.mhLocalDC ) ) + { + // This can legitimiately happen, SalFrame keeps 2x + // SalGraphics which share the same hWnd and hDC. + // The shape 'Area' dialog does reparenting to trigger this. + SAL_WARN("vcl.opengl", "Unusual: Windows handle / DC changed without DeInit"); + DeInit(); + } + + OpenGLSalGraphicsImpl::Init(); } namespace diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index ea9664e43e1f..2502a830a4e4 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1690,6 +1690,9 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture ) { OpenGLZone aZone; + if (!rTexture) // no texture to release. + return; + OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer; while( pFramebuffer ) diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx index 80de1a403d8c..ae846ae59a54 100644 --- a/vcl/source/window/paint.cxx +++ b/vcl/source/window/paint.cxx @@ -651,6 +651,8 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandlePaintHdl, Idle *, void) return; } + BeginPaint(); + // save paint events until resizing or initial sizing done if (!ImplDoTiledRendering() && mpWindowImpl->mbFrame && (mpWindowImpl->mpFrameData->maResizeIdle.IsActive() || @@ -662,12 +664,16 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandlePaintHdl, Idle *, void) { ImplCallOverlapPaint(); } + + EndPaint(); } IMPL_LINK_NOARG_TYPED(Window, ImplHandleResizeTimerHdl, Idle *, void) { if( mpWindowImpl->mbReallyVisible ) { + BeginPaint(); + ImplCallResize(); if( ImplDoTiledRendering() ) { @@ -678,6 +684,8 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandleResizeTimerHdl, Idle *, void) mpWindowImpl->mpFrameData->maPaintIdle.Stop(); mpWindowImpl->mpFrameData->maPaintIdle.GetIdleHdl().Call( NULL ); } + + EndPaint(); } } diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx index f8e0b69623e6..0a6fb73a8f50 100644 --- a/vcl/win/source/window/salframe.cxx +++ b/vcl/win/source/window/salframe.cxx @@ -1048,7 +1048,7 @@ void WinSalFrame::ReleaseGraphics( SalGraphics* pGraphics ) SalData* pSalData = GetSalData(); if ( mpGraphics2->getDefPal() ) SelectPalette( mpGraphics2->getHDC(), mpGraphics2->getDefPal(), TRUE ); - mpGraphics2->InitGraphics(); + mpGraphics2->DeInitGraphics(); SendMessageW( pSalData->mpFirstInstance->mhComWnd, SAL_MSG_RELEASEDC, (WPARAM)mhWnd, @@ -1498,7 +1498,7 @@ static void ImplSetParentFrame( WinSalFrame* pThis, HWND hNewParentWnd, bool bAs { if ( pThis->mpGraphics->getDefPal() ) SelectPalette( pThis->mpGraphics->getHDC(), pThis->mpGraphics->getDefPal(), TRUE ); - pThis->mpGraphics->InitGraphics(); + pThis->mpGraphics->DeInitGraphics(); ReleaseDC( pThis->mhWnd, pThis->mpGraphics->getHDC() ); } |