From 7372afd775b98d7ba652c2eab8fdf11949111ebf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 May 2021 20:43:27 +0200 Subject: [PATCH] force redraw on ReleaseDC --- inc/ddsurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 4 ++-- src/ddsurface.c | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index 9e41441..7b16f9f 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -22,6 +22,7 @@ HRESULT dds_GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDDSCaps); HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper); HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD flags, LPDDCOLORKEY colorKey); HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC); +HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC); HRESULT dds_GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette); HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat); HRESULT dds_Lock(IDirectDrawSurfaceImpl* This, LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index f317175..e270f9d 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -294,10 +294,10 @@ HRESULT __stdcall IDirectDrawSurface__Lock(IDirectDrawSurfaceImpl *This, LPRECT return ret; } -HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl *This, HDC a) +HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl *This, HDC hDC) { dprintfex("-> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DD_OK; + HRESULT ret = dds_ReleaseDC(This, hDC); dprintfex("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 6d97500..2bcccd9 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -834,6 +834,22 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC) return DD_OK; } +HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) +{ + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) + { + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + + DWORD time = timeGetTime(); + + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || + (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) + { + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + } + } +} + HRESULT dds_GetPalette(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWPALETTE FAR *lplpDDPalette) { if (!lplpDDPalette)