From 8c6b2814a90cbbc5ff9840a4408c70e902e1c1f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 7 Nov 2021 23:22:46 +0100 Subject: [PATCH] redraw only top window for better performance --- inc/ddsurface.h | 3 +- src/ddsurface.c | 101 +++++++++++++++++++++++------------------------- src/wndproc.c | 2 +- 3 files changed, 52 insertions(+), 54 deletions(-) diff --git a/inc/ddsurface.h b/inc/ddsurface.h index b069885..eae85f7 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -33,6 +33,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); -void dds_RedrawBnet(IDirectDrawSurfaceImpl* This); +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack); +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This); #endif diff --git a/src/ddsurface.c b/src/ddsurface.c index bb75231..3237122 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1190,39 +1190,66 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD return DD_OK; } -void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack) { /* Hack for Warcraft II BNE and Diablo */ HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; if (hwnd) { + if (obs_hack) + { + /* hack for windows 8/10 fullscreen exclusive mode */ + + if (g_ddraw->primary->palette) + { + SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); + } + + EnterCriticalSection(&g_ddraw->cs); + + RECT rc; + if (fake_GetWindowRect(hwnd, &rc)) + { + HDC dc = GetDC(hwnd); + + BitBlt( + g_ddraw->primary->bnet_dc, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top, + dc, + 0, + 0, + SRCCOPY); + + ReleaseDC(hwnd, dc); + } + + LeaveCriticalSection(&g_ddraw->cs); + + if (g_ddraw->render.run) + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + + return; + } + HDC primary_dc; dds_GetDC(This, &primary_dc); - if (g_ddraw->primary->palette) - { - SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); - } - /* GdiTransparentBlt idea taken from Aqrit's war2 ddraw */ RGBQUAD quad; GetDIBColorTable(primary_dc, 0xFE, 1, &quad); COLORREF color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue); BOOL erase = FALSE; - HWND hwnd_bnet[20]; - int i = 0; - - memset(&hwnd_bnet[0], 0, sizeof(hwnd_bnet)); do { RECT rc; if (fake_GetWindowRect(hwnd, &rc)) { - hwnd_bnet[i++] = hwnd; - if (rc.bottom - rc.top == 479) erase = TRUE; @@ -1247,36 +1274,6 @@ void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) } while ((hwnd = FindWindowEx(HWND_DESKTOP, hwnd, "SDlgDialog", NULL))); - /* hack for windows 8/10 fullscreen exclusive mode */ - EnterCriticalSection(&g_ddraw->cs); - - for (i = sizeof(hwnd_bnet) / sizeof(hwnd_bnet[0]); i--; ) - { - if (hwnd_bnet[i]) - { - RECT rc; - if (fake_GetWindowRect(hwnd_bnet[i], &rc)) - { - HDC dc = GetDC(hwnd_bnet[i]); - - BitBlt( - g_ddraw->primary->bnet_dc, - rc.left, - rc.top, - rc.right - rc.left, - rc.bottom - rc.top, - dc, - 0, - 0, - SRCCOPY); - - ReleaseDC(hwnd_bnet[i], dc); - } - } - } - - LeaveCriticalSection(&g_ddraw->cs); - if (erase) { BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; @@ -1286,23 +1283,15 @@ void dds_RedrawBnet(IDirectDrawSurfaceImpl* This) g_ddraw->ticks_limiter.use_blt_or_flip = x; } - - if (g_ddraw->render.run) - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } } -HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE)) - { - dds_RedrawBnet(This); - } - /* Hack for Star Trek Armada */ HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; - if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (hwnd) { HDC primary_dc; dds_GetDC(This, &primary_dc); @@ -1336,7 +1325,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) g_ddraw->ticks_limiter.use_blt_or_flip = x; } +} +HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +{ + if ((This->caps & DDSCAPS_PRIMARYSURFACE)) + { + dds_RedrawBnet(This, FALSE); + dds_RedrawArmada(This); + } if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { diff --git a/src/wndproc.c b/src/wndproc.c index d69cbb5..d38deff 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -166,7 +166,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case IDT_TIMER_REDRAW_BNET: { if (g_ddraw->primary) - dds_RedrawBnet(g_ddraw->primary); + dds_RedrawBnet(g_ddraw->primary, TRUE); return 0; }