From 87c51f306f4aabe6b384bc786af3045be3e2bb90 Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Sat, 26 Nov 2011 19:48:06 +1100 Subject: Defer dropping the render target until after painting has finished to avoid accessing a released render target. --- win32/ScintillaWin.cxx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'win32') diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 73e8736fd..35f2044fc 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -204,6 +204,7 @@ class ScintillaWin : #if defined(USE_D2D) ID2D1HwndRenderTarget *pRenderTarget; + bool renderTargetValid; #endif ScintillaWin(HWND hwnd); @@ -362,6 +363,7 @@ ScintillaWin::ScintillaWin(HWND hwnd) { #if defined(USE_D2D) pRenderTarget = 0; + renderTargetValid = true; #endif keysAlwaysUnicode = false; @@ -407,6 +409,10 @@ void ScintillaWin::Finalise() { void ScintillaWin::EnsureRenderTarget() { #if defined(USE_D2D) + if (!renderTargetValid) { + DropRenderTarget(); + renderTargetValid = true; + } if (pD2DFactory && !pRenderTarget) { RECT rc; HWND hw = MainHWND(); @@ -745,7 +751,13 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam break; case WM_SIZE: { - DropRenderTarget(); +#if defined(USE_D2D) + if (paintState == notPainting) { + DropRenderTarget(); + } else { + renderTargetValid = false; + } +#endif //Platform::DebugPrintf("Scintilla WM_SIZE %d %d\n", LoWord(lParam), HiWord(lParam)); ChangeSize(); } -- cgit v1.2.3