1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

redraw only top window for better performance

This commit is contained in:
FunkyFr3sh 2021-11-07 23:22:46 +01:00
parent 6a241ca0ae
commit 8c6b2814a9
3 changed files with 52 additions and 54 deletions

View File

@ -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

View File

@ -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)
{

View File

@ -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;
}