mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-25 01:57:47 +01:00
don't allocate ddraw struct
This commit is contained in:
parent
d69a56c0d0
commit
36a87419e3
4
inc/dd.h
4
inc/dd.h
@ -56,11 +56,11 @@ typedef struct SPEEDLIMITER
|
|||||||
|
|
||||||
struct IDirectDrawSurfaceImpl;
|
struct IDirectDrawSurfaceImpl;
|
||||||
|
|
||||||
extern struct CNCDDRAW* g_ddraw;
|
extern struct CNCDDRAW g_ddraw;
|
||||||
|
|
||||||
typedef struct CNCDDRAW
|
typedef struct CNCDDRAW
|
||||||
{
|
{
|
||||||
ULONG ref;
|
LONG ref;
|
||||||
|
|
||||||
DWORD width;
|
DWORD width;
|
||||||
DWORD height;
|
DWORD height;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#define VERSION_MAJOR 6
|
#define VERSION_MAJOR 6
|
||||||
#define VERSION_MINOR 3
|
#define VERSION_MINOR 3
|
||||||
#define VERSION_BUILD 0
|
#define VERSION_BUILD 0
|
||||||
#define VERSION_REVISION 3
|
#define VERSION_REVISION 4
|
||||||
|
|
||||||
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
||||||
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
||||||
|
@ -131,20 +131,20 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
|
|||||||
{
|
{
|
||||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||||
|
|
||||||
if (!g_ddraw->real_dll)
|
if (!g_ddraw.real_dll)
|
||||||
g_ddraw->real_dll = real_LoadLibraryA("system32\\ddraw.dll");
|
g_ddraw.real_dll = real_LoadLibraryA("system32\\ddraw.dll");
|
||||||
|
|
||||||
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
|
if (g_ddraw.real_dll && !g_ddraw.DirectDrawCreate)
|
||||||
g_ddraw->DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
|
g_ddraw.DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw.real_dll, "DirectDrawCreate");
|
||||||
|
|
||||||
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
|
if (g_ddraw.DirectDrawCreate == DirectDrawCreate)
|
||||||
g_ddraw->DirectDrawCreate = NULL;
|
g_ddraw.DirectDrawCreate = NULL;
|
||||||
|
|
||||||
if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate)
|
if (!g_ddraw.real_dd && g_ddraw.DirectDrawCreate)
|
||||||
g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL);
|
g_ddraw.DirectDrawCreate(NULL, &g_ddraw.real_dd, NULL);
|
||||||
|
|
||||||
if (g_ddraw->real_dd)
|
if (g_ddraw.real_dd)
|
||||||
ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj);
|
ret = IDirectDraw_QueryInterface(g_ddraw.real_dd, riid, ppvObj);
|
||||||
else
|
else
|
||||||
ret = E_NOINTERFACE;
|
ret = E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
@ -355,7 +355,7 @@ HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAW
|
|||||||
{
|
{
|
||||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||||
HRESULT ret = DD_OK;
|
HRESULT ret = DD_OK;
|
||||||
*lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary;
|
*lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary;
|
||||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,8 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This)
|
|||||||
{
|
{
|
||||||
TRACE(" Released (%p)\n", This);
|
TRACE(" Released (%p)\n", This);
|
||||||
|
|
||||||
if (g_ddraw)
|
if (g_ddraw.ref)
|
||||||
g_ddraw->last_freed_palette = This;
|
g_ddraw.last_freed_palette = This;
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
@ -82,11 +82,11 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
|||||||
{
|
{
|
||||||
TRACE(" Released (%p)\n", This);
|
TRACE(" Released (%p)\n", This);
|
||||||
|
|
||||||
if (g_ddraw && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
if (g_ddraw.ref && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
g_ddraw->primary = NULL;
|
g_ddraw.primary = NULL;
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (This->bitmap)
|
if (This->bitmap)
|
||||||
@ -111,7 +111,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
|||||||
if (This->mapping)
|
if (This->mapping)
|
||||||
CloseHandle(This->mapping);
|
CloseHandle(This->mapping);
|
||||||
|
|
||||||
if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface))
|
if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface))
|
||||||
{
|
{
|
||||||
IDirectDrawSurface_Release(This->backbuffer);
|
IDirectDrawSurface_Release(This->backbuffer);
|
||||||
}
|
}
|
||||||
@ -119,15 +119,15 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
|||||||
if (This->clipper)
|
if (This->clipper)
|
||||||
IDirectDrawClipper_Release(This->clipper);
|
IDirectDrawClipper_Release(This->clipper);
|
||||||
|
|
||||||
if (This->palette && (!g_ddraw || (void*)This->palette != g_ddraw->last_freed_palette))
|
if (This->palette && (!g_ddraw.ref || (void*)This->palette != g_ddraw.last_freed_palette))
|
||||||
{
|
{
|
||||||
IDirectDrawPalette_Release(This->palette);
|
IDirectDrawPalette_Release(This->palette);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteCriticalSection(&This->cs);
|
DeleteCriticalSection(&This->cs);
|
||||||
|
|
||||||
if (g_ddraw)
|
if (g_ddraw.ref)
|
||||||
g_ddraw->last_freed_surface = This;
|
g_ddraw.last_freed_surface = This;
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
@ -57,10 +57,10 @@ HRESULT ddp_SetEntries(
|
|||||||
This->data_rgb[255].rgbReserved = 0;
|
This->data_rgb[255].rgbReserved = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run)
|
if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
|
112
src/ddsurface.c
112
src/ddsurface.c
@ -48,8 +48,8 @@ HRESULT dds_Blt(
|
|||||||
dbg_dump_dds_blt_flags(dwFlags);
|
dbg_dump_dds_blt_flags(dwFlags);
|
||||||
dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0);
|
dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0);
|
||||||
|
|
||||||
if (g_ddraw &&
|
if (g_ddraw.ref &&
|
||||||
g_ddraw->iskkndx &&
|
g_ddraw.iskkndx &&
|
||||||
(dwFlags & DDBLT_COLORFILL) &&
|
(dwFlags & DDBLT_COLORFILL) &&
|
||||||
lpDestRect &&
|
lpDestRect &&
|
||||||
lpDestRect->right == 640 &&
|
lpDestRect->right == 640 &&
|
||||||
@ -261,7 +261,7 @@ HRESULT dds_Blt(
|
|||||||
{
|
{
|
||||||
RGBQUAD* quad =
|
RGBQUAD* quad =
|
||||||
src_surface->palette ? src_surface->palette->data_rgb :
|
src_surface->palette ? src_surface->palette->data_rgb :
|
||||||
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
|
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
|
||||||
NULL;
|
NULL;
|
||||||
|
|
||||||
if (quad)
|
if (quad)
|
||||||
@ -404,20 +404,20 @@ HRESULT dds_Blt(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
|
|
||||||
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
|
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
|
||||||
{
|
{
|
||||||
This->last_blt_tick = timeGetTime();
|
This->last_blt_tick = timeGetTime();
|
||||||
|
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
SwitchToThread();
|
SwitchToThread();
|
||||||
|
|
||||||
if (g_ddraw->ticks_limiter.tick_length > 0)
|
if (g_ddraw.ticks_limiter.tick_length > 0)
|
||||||
{
|
{
|
||||||
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
|
g_ddraw.ticks_limiter.use_blt_or_flip = TRUE;
|
||||||
util_limit_game_ticks();
|
util_limit_game_ticks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -557,7 +557,7 @@ HRESULT dds_BltFast(
|
|||||||
{
|
{
|
||||||
RGBQUAD* quad =
|
RGBQUAD* quad =
|
||||||
src_surface->palette ? src_surface->palette->data_rgb :
|
src_surface->palette ? src_surface->palette->data_rgb :
|
||||||
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
|
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
|
||||||
NULL;
|
NULL;
|
||||||
|
|
||||||
if (quad)
|
if (quad)
|
||||||
@ -637,20 +637,20 @@ HRESULT dds_BltFast(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
|
|
||||||
DWORD time = timeGetTime();
|
DWORD time = timeGetTime();
|
||||||
|
|
||||||
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
||||||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
||||||
{
|
{
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
|
|
||||||
if (g_config.limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0)
|
if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0)
|
||||||
{
|
{
|
||||||
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
|
g_ddraw.ticks_limiter.use_blt_or_flip = TRUE;
|
||||||
util_limit_game_ticks();
|
util_limit_game_ticks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -749,7 +749,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
|
|||||||
|
|
||||||
if (This->backbuffer && !This->skip_flip)
|
if (This->backbuffer && !This->skip_flip)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer;
|
IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer;
|
||||||
|
|
||||||
void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface);
|
void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface);
|
||||||
@ -767,7 +767,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
|
|||||||
blt_clear(buf, 0, backbuffer->size);
|
blt_clear(buf, 0, backbuffer->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer)
|
if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer)
|
||||||
{
|
{
|
||||||
@ -777,12 +777,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
|
|||||||
|
|
||||||
This->skip_flip = FALSE;
|
This->skip_flip = FALSE;
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
This->last_flip_tick = timeGetTime();
|
This->last_flip_tick = timeGetTime();
|
||||||
|
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
SwitchToThread();
|
SwitchToThread();
|
||||||
|
|
||||||
if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2)
|
if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2)
|
||||||
@ -790,9 +790,9 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
|
|||||||
dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL);
|
dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->ticks_limiter.tick_length > 0)
|
if (g_ddraw.ticks_limiter.tick_length > 0)
|
||||||
{
|
{
|
||||||
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
|
g_ddraw.ticks_limiter.use_blt_or_flip = TRUE;
|
||||||
util_limit_game_ticks();
|
util_limit_game_ticks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -877,7 +877,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC)
|
|||||||
|
|
||||||
RGBQUAD* data =
|
RGBQUAD* data =
|
||||||
This->palette ? This->palette->data_rgb :
|
This->palette ? This->palette->data_rgb :
|
||||||
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
|
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
|
||||||
NULL;
|
NULL;
|
||||||
|
|
||||||
HDC dc = This->hdc;
|
HDC dc = This->hdc;
|
||||||
@ -957,10 +957,10 @@ HRESULT dds_Lock(
|
|||||||
|
|
||||||
dbg_dump_dds_lock_flags(dwFlags);
|
dbg_dump_dds_lock_flags(dwFlags);
|
||||||
|
|
||||||
if (g_ddraw && g_config.fixnotresponding && !g_config.is_wine)
|
if (g_ddraw.ref && g_config.fixnotresponding && !g_config.is_wine)
|
||||||
{
|
{
|
||||||
MSG msg; /* workaround for "Not Responding" window problem */
|
MSG msg; /* workaround for "Not Responding" window problem */
|
||||||
real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE);
|
real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc);
|
HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc);
|
||||||
@ -988,16 +988,16 @@ HRESULT dds_Lock(
|
|||||||
|
|
||||||
HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC)
|
HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC)
|
||||||
{
|
{
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
|
|
||||||
DWORD time = timeGetTime();
|
DWORD time = timeGetTime();
|
||||||
|
|
||||||
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
||||||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
||||||
{
|
{
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1061,16 +1061,16 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
|
|||||||
if (This->palette)
|
if (This->palette)
|
||||||
IDirectDrawPalette_Release(This->palette);
|
IDirectDrawPalette_Release(This->palette);
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
This->palette = lpDDPalette;
|
This->palette = lpDDPalette;
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->render.run)
|
if (g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1084,7 +1084,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
|
|||||||
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
||||||
{
|
{
|
||||||
/* Hack for Warcraft II BNE and Diablo */
|
/* Hack for Warcraft II BNE and Diablo */
|
||||||
HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
|
HWND hwnd = g_ddraw.ref && g_ddraw.bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
|
||||||
|
|
||||||
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||||
{
|
{
|
||||||
@ -1129,17 +1129,17 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
|||||||
|
|
||||||
if (erase)
|
if (erase)
|
||||||
{
|
{
|
||||||
BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip;
|
BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip;
|
||||||
|
|
||||||
DDBLTFX fx = { .dwFillColor = 0xFE };
|
DDBLTFX fx = { .dwFillColor = 0xFE };
|
||||||
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
|
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
|
||||||
|
|
||||||
g_ddraw->ticks_limiter.use_blt_or_flip = x;
|
g_ddraw.ticks_limiter.use_blt_or_flip = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hack for Star Trek Armada */
|
/* Hack for Star Trek Armada */
|
||||||
hwnd = g_ddraw && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
|
hwnd = g_ddraw.ref && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
|
||||||
|
|
||||||
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||||
{
|
{
|
||||||
@ -1168,27 +1168,27 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
|||||||
ReleaseDC(hwnd, hdc);
|
ReleaseDC(hwnd, hdc);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip;
|
BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip;
|
||||||
|
|
||||||
DDBLTFX fx = { .dwFillColor = 0 };
|
DDBLTFX fx = { .dwFillColor = 0 };
|
||||||
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
|
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
|
||||||
|
|
||||||
g_ddraw->ticks_limiter.use_blt_or_flip = x;
|
g_ddraw.ticks_limiter.use_blt_or_flip = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
|
|
||||||
DWORD time = timeGetTime();
|
DWORD time = timeGetTime();
|
||||||
|
|
||||||
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
|
||||||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
|
||||||
{
|
{
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
|
|
||||||
if (g_ddraw->ticks_limiter.tick_length > 0 && !g_ddraw->ticks_limiter.use_blt_or_flip)
|
if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip)
|
||||||
util_limit_game_ticks();
|
util_limit_game_ticks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1315,15 +1315,15 @@ HRESULT dd_CreateSurface(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
|
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
|
||||||
g_ddraw->primary &&
|
g_ddraw.primary &&
|
||||||
g_ddraw->primary->width == g_ddraw->width &&
|
g_ddraw.primary->width == g_ddraw.width &&
|
||||||
g_ddraw->primary->height == g_ddraw->height &&
|
g_ddraw.primary->height == g_ddraw.height &&
|
||||||
g_ddraw->primary->bpp == g_ddraw->bpp)
|
g_ddraw.primary->bpp == g_ddraw.bpp)
|
||||||
{
|
{
|
||||||
g_ddraw->primary->skip_flip = TRUE;
|
g_ddraw.primary->skip_flip = TRUE;
|
||||||
|
|
||||||
*lpDDSurface = g_ddraw->primary;
|
*lpDDSurface = g_ddraw.primary;
|
||||||
IDirectDrawSurface_AddRef(g_ddraw->primary);
|
IDirectDrawSurface_AddRef(g_ddraw.primary);
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
@ -1337,7 +1337,7 @@ HRESULT dd_CreateSurface(
|
|||||||
|
|
||||||
InitializeCriticalSection(&dst_surface->cs);
|
InitializeCriticalSection(&dst_surface->cs);
|
||||||
|
|
||||||
dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp;
|
dst_surface->bpp = g_ddraw.bpp == 0 ? 16 : g_ddraw.bpp;
|
||||||
dst_surface->flags = lpDDSurfaceDesc->dwFlags;
|
dst_surface->flags = lpDDSurfaceDesc->dwFlags;
|
||||||
dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
|
dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
|
||||||
dst_surface->ddraw = This;
|
dst_surface->ddraw = This;
|
||||||
@ -1378,8 +1378,8 @@ HRESULT dd_CreateSurface(
|
|||||||
dst_surface->caps |= DDSCAPS_FRONTBUFFER;
|
dst_surface->caps |= DDSCAPS_FRONTBUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_surface->width = g_ddraw->width;
|
dst_surface->width = g_ddraw.width;
|
||||||
dst_surface->height = g_ddraw->height;
|
dst_surface->height = g_ddraw.height;
|
||||||
|
|
||||||
dst_surface->caps |= DDSCAPS_VIDEOMEMORY;
|
dst_surface->caps |= DDSCAPS_VIDEOMEMORY;
|
||||||
}
|
}
|
||||||
@ -1462,10 +1462,10 @@ HRESULT dd_CreateSurface(
|
|||||||
|
|
||||||
/* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */
|
/* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */
|
||||||
if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 ||
|
if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 ||
|
||||||
(dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) ||
|
(dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) ||
|
||||||
(dst_surface->width == 128 && dst_surface->height == 128))
|
(dst_surface->width == 128 && dst_surface->height == 128))
|
||||||
{
|
{
|
||||||
dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
|
dst_surface->hdc = CreateCompatibleDC(g_ddraw.render.hdc);
|
||||||
|
|
||||||
if (dst_surface->hdc)
|
if (dst_surface->hdc)
|
||||||
InterlockedIncrement(&g_dds_gdi_handles);
|
InterlockedIncrement(&g_dds_gdi_handles);
|
||||||
@ -1524,7 +1524,7 @@ HRESULT dd_CreateSurface(
|
|||||||
|
|
||||||
if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
|
if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
|
||||||
{
|
{
|
||||||
g_ddraw->primary = dst_surface;
|
g_ddraw.primary = dst_surface;
|
||||||
FakePrimarySurface = dst_surface->surface;
|
FakePrimarySurface = dst_surface->surface;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,12 +252,12 @@ void dbg_draw_frame_info_start()
|
|||||||
static DWORD tick_fps = 0;
|
static DWORD tick_fps = 0;
|
||||||
static char debug_text[512] = { 0 };
|
static char debug_text[512] = { 0 };
|
||||||
|
|
||||||
RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
RECT debugrc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||||
|
|
||||||
if (g_ddraw->primary)
|
if (g_ddraw.primary)
|
||||||
{
|
{
|
||||||
HDC primary_dc;
|
HDC primary_dc;
|
||||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||||
|
|
||||||
DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP);
|
DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP);
|
||||||
}
|
}
|
||||||
|
@ -45,14 +45,14 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW
|
|||||||
{
|
{
|
||||||
TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags);
|
TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags);
|
||||||
|
|
||||||
if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE))
|
if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE))
|
||||||
{
|
{
|
||||||
if (g_mouse_locked || g_config.devmode)
|
if (g_mouse_locked || g_config.devmode)
|
||||||
{
|
{
|
||||||
while (real_ShowCursor(FALSE) >= 0);
|
while (real_ShowCursor(FALSE) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1);
|
InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
|
return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
|
||||||
|
@ -14,8 +14,8 @@ void fpsl_init()
|
|||||||
g_fpsl.tick_length_ns = 0;
|
g_fpsl.tick_length_ns = 0;
|
||||||
g_fpsl.tick_length = 0;
|
g_fpsl.tick_length = 0;
|
||||||
|
|
||||||
if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)))
|
if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)))
|
||||||
max_fps = g_ddraw->mode.dmDisplayFrequency;
|
max_fps = g_ddraw.mode.dmDisplayFrequency;
|
||||||
|
|
||||||
if (max_fps > 1000)
|
if (max_fps > 1000)
|
||||||
max_fps = 0;
|
max_fps = 0;
|
||||||
@ -88,13 +88,13 @@ BOOL fpsl_wait_for_vblank()
|
|||||||
{
|
{
|
||||||
if (g_fpsl.initialized)
|
if (g_fpsl.initialized)
|
||||||
{
|
{
|
||||||
if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc)
|
if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw.render.hdc)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_fpsl.cs);
|
EnterCriticalSection(&g_fpsl.cs);
|
||||||
|
|
||||||
if (!g_fpsl.got_adapter)
|
if (!g_fpsl.got_adapter)
|
||||||
{
|
{
|
||||||
g_fpsl.adapter.hDc = g_ddraw->render.hdc;
|
g_fpsl.adapter.hDc = g_ddraw.render.hdc;
|
||||||
|
|
||||||
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0)
|
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0)
|
||||||
{
|
{
|
||||||
@ -151,7 +151,7 @@ void fpsl_frame_start()
|
|||||||
void fpsl_frame_end()
|
void fpsl_frame_end()
|
||||||
{
|
{
|
||||||
if (g_config.maxfps < 0 ||
|
if (g_config.maxfps < 0 ||
|
||||||
(g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)))
|
(g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)))
|
||||||
{
|
{
|
||||||
if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
|
if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
|
||||||
return;
|
return;
|
||||||
@ -161,7 +161,7 @@ void fpsl_frame_end()
|
|||||||
{
|
{
|
||||||
if (g_fpsl.htimer)
|
if (g_fpsl.htimer)
|
||||||
{
|
{
|
||||||
if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))
|
if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))
|
||||||
{
|
{
|
||||||
WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2);
|
WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2);
|
||||||
LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns };
|
LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns };
|
||||||
|
44
src/mouse.c
44
src/mouse.c
@ -13,12 +13,12 @@ HOOKPROC g_mouse_proc;
|
|||||||
|
|
||||||
void mouse_lock()
|
void mouse_lock()
|
||||||
{
|
{
|
||||||
if (g_config.devmode || g_ddraw->bnet_active || !g_ddraw->hwnd)
|
if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw->hwnd))
|
if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd))
|
||||||
{
|
{
|
||||||
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
|
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw.show_cursor_count, 0);
|
||||||
int cur_count = real_ShowCursor(TRUE) - 1;
|
int cur_count = real_ShowCursor(TRUE) - 1;
|
||||||
real_ShowCursor(FALSE);
|
real_ShowCursor(FALSE);
|
||||||
|
|
||||||
@ -31,22 +31,22 @@ void mouse_lock()
|
|||||||
while (real_ShowCursor(TRUE) < game_count);
|
while (real_ShowCursor(TRUE) < game_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0));
|
real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw.old_cursor, 0));
|
||||||
|
|
||||||
RECT rc = { 0 };
|
RECT rc = { 0 };
|
||||||
real_GetClientRect(g_ddraw->hwnd, &rc);
|
real_GetClientRect(g_ddraw.hwnd, &rc);
|
||||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||||
OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y);
|
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
||||||
|
|
||||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
|
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
||||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
|
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
||||||
|
|
||||||
real_SetCursorPos(
|
real_SetCursorPos(
|
||||||
g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)) : rc.left + cur_x,
|
g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x,
|
||||||
g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)) : rc.top + cur_y);
|
g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y);
|
||||||
|
|
||||||
CopyRect(&rc, &g_ddraw->mouse.rc);
|
CopyRect(&rc, &g_ddraw.mouse.rc);
|
||||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||||
real_ClipCursor(&rc);
|
real_ClipCursor(&rc);
|
||||||
|
|
||||||
g_mouse_locked = TRUE;
|
g_mouse_locked = TRUE;
|
||||||
@ -55,7 +55,7 @@ void mouse_lock()
|
|||||||
|
|
||||||
void mouse_unlock()
|
void mouse_unlock()
|
||||||
{
|
{
|
||||||
if (g_config.devmode || !g_hook_active || !g_ddraw->hwnd)
|
if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_mouse_locked)
|
if (g_mouse_locked)
|
||||||
@ -66,16 +66,16 @@ void mouse_unlock()
|
|||||||
//ReleaseCapture();
|
//ReleaseCapture();
|
||||||
|
|
||||||
RECT rc = { 0 };
|
RECT rc = { 0 };
|
||||||
real_GetClientRect(g_ddraw->hwnd, &rc);
|
real_GetClientRect(g_ddraw.hwnd, &rc);
|
||||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||||
OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y);
|
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
||||||
|
|
||||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
|
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
||||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
|
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
||||||
|
|
||||||
real_SetCursorPos(
|
real_SetCursorPos(
|
||||||
(int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)),
|
(int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)),
|
||||||
(int)(rc.top + (cur_y * g_ddraw->mouse.scale_y)));
|
(int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)));
|
||||||
|
|
||||||
real_SetCursor(LoadCursor(NULL, IDC_ARROW));
|
real_SetCursor(LoadCursor(NULL, IDC_ARROW));
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ void mouse_unlock()
|
|||||||
|
|
||||||
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (!g_ddraw)
|
if (!g_ddraw.ref)
|
||||||
return g_mouse_proc(Code, wParam, lParam);
|
return g_mouse_proc(Code, wParam, lParam);
|
||||||
|
|
||||||
if (Code < 0 || (!g_config.devmode && !g_mouse_locked))
|
if (Code < 0 || (!g_config.devmode && !g_mouse_locked))
|
||||||
|
@ -55,7 +55,7 @@ BOOL d3d9_is_available()
|
|||||||
|
|
||||||
BOOL d3d9_create()
|
BOOL d3d9_create()
|
||||||
{
|
{
|
||||||
if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed))
|
if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed))
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -122,18 +122,18 @@ BOOL d3d9_create()
|
|||||||
TRACE("+------------------------------------------------\n");
|
TRACE("+------------------------------------------------\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
g_d3d9.hwnd = g_ddraw->hwnd;
|
g_d3d9.hwnd = g_ddraw.hwnd;
|
||||||
|
|
||||||
memset(&g_d3d9.params, 0, sizeof(g_d3d9.params));
|
memset(&g_d3d9.params, 0, sizeof(g_d3d9.params));
|
||||||
|
|
||||||
g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive;
|
g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive;
|
||||||
g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||||
g_d3d9.params.hDeviceWindow = g_ddraw->hwnd;
|
g_d3d9.params.hDeviceWindow = g_ddraw.hwnd;
|
||||||
g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
|
g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
|
||||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width;
|
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width;
|
||||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height;
|
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height;
|
||||||
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
||||||
g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||||
g_d3d9.params.BackBufferCount = 1;
|
g_d3d9.params.BackBufferCount = 1;
|
||||||
|
|
||||||
DWORD behavior_flags[] = {
|
DWORD behavior_flags[] = {
|
||||||
@ -151,7 +151,7 @@ BOOL d3d9_create()
|
|||||||
g_d3d9.instance,
|
g_d3d9.instance,
|
||||||
D3DADAPTER_DEFAULT,
|
D3DADAPTER_DEFAULT,
|
||||||
D3DDEVTYPE_HAL,
|
D3DDEVTYPE_HAL,
|
||||||
g_ddraw->hwnd,
|
g_ddraw.hwnd,
|
||||||
behavior_flags[i],
|
behavior_flags[i],
|
||||||
&g_d3d9.params,
|
&g_d3d9.params,
|
||||||
&g_d3d9.device)))
|
&g_d3d9.device)))
|
||||||
@ -176,10 +176,10 @@ BOOL d3d9_on_device_lost()
|
|||||||
BOOL d3d9_reset(BOOL windowed)
|
BOOL d3d9_reset(BOOL windowed)
|
||||||
{
|
{
|
||||||
g_d3d9.params.Windowed = windowed || g_config.nonexclusive;
|
g_d3d9.params.Windowed = windowed || g_config.nonexclusive;
|
||||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width;
|
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width;
|
||||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height;
|
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height;
|
||||||
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
||||||
g_d3d9.params.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||||
|
|
||||||
if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
|
if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
|
||||||
{
|
{
|
||||||
@ -187,9 +187,9 @@ BOOL d3d9_reset(BOOL windowed)
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
|
||||||
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
|
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -264,8 +264,8 @@ static BOOL d3d9_create_resources()
|
|||||||
|
|
||||||
BOOL err = FALSE;
|
BOOL err = FALSE;
|
||||||
|
|
||||||
int width = g_ddraw->width;
|
int width = g_ddraw.width;
|
||||||
int height = g_ddraw->height;
|
int height = g_ddraw.height;
|
||||||
|
|
||||||
g_d3d9.tex_width =
|
g_d3d9.tex_width =
|
||||||
width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width;
|
width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width;
|
||||||
@ -287,11 +287,11 @@ static BOOL d3d9_create_resources()
|
|||||||
&g_d3d9.vertex_buf,
|
&g_d3d9.vertex_buf,
|
||||||
NULL));
|
NULL));
|
||||||
|
|
||||||
err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0), TRUE);
|
err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0), TRUE);
|
||||||
|
|
||||||
for (int i = 0; i < D3D9_TEXTURE_COUNT; i++)
|
for (int i = 0; i < D3D9_TEXTURE_COUNT; i++)
|
||||||
{
|
{
|
||||||
if (g_ddraw->bpp == 16 && g_config.rgb555)
|
if (g_ddraw.bpp == 16 && g_config.rgb555)
|
||||||
{
|
{
|
||||||
BOOL error = FAILED(
|
BOOL error = FAILED(
|
||||||
IDirect3DDevice9_CreateTexture(
|
IDirect3DDevice9_CreateTexture(
|
||||||
@ -320,7 +320,7 @@ static BOOL d3d9_create_resources()
|
|||||||
0));
|
0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 32)
|
else if (g_ddraw.bpp == 32)
|
||||||
{
|
{
|
||||||
BOOL error = FAILED(
|
BOOL error = FAILED(
|
||||||
IDirect3DDevice9_CreateTexture(
|
IDirect3DDevice9_CreateTexture(
|
||||||
@ -358,7 +358,7 @@ static BOOL d3d9_create_resources()
|
|||||||
g_d3d9.tex_height,
|
g_d3d9.tex_height,
|
||||||
1,
|
1,
|
||||||
0,
|
0,
|
||||||
g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8,
|
g_ddraw.bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8,
|
||||||
D3DPOOL_MANAGED,
|
D3DPOOL_MANAGED,
|
||||||
&g_d3d9.surface_tex[i],
|
&g_d3d9.surface_tex[i],
|
||||||
0));
|
0));
|
||||||
@ -366,7 +366,7 @@ static BOOL d3d9_create_resources()
|
|||||||
|
|
||||||
err = err || !g_d3d9.surface_tex[i];
|
err = err || !g_d3d9.surface_tex[i];
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
BOOL error = FAILED(
|
BOOL error = FAILED(
|
||||||
IDirect3DDevice9_CreateTexture(
|
IDirect3DDevice9_CreateTexture(
|
||||||
@ -399,7 +399,7 @@ static BOOL d3d9_create_resources()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
err = err || FAILED(
|
err = err || FAILED(
|
||||||
IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader));
|
IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader));
|
||||||
@ -434,7 +434,7 @@ static BOOL d3d9_create_resources()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err;
|
return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL d3d9_set_states()
|
static BOOL d3d9_set_states()
|
||||||
@ -445,14 +445,14 @@ static BOOL d3d9_set_states()
|
|||||||
err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
|
err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
|
||||||
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));
|
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));
|
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));
|
||||||
|
|
||||||
BOOL bilinear =
|
BOOL bilinear =
|
||||||
g_config.d3d9_filter &&
|
g_config.d3d9_filter &&
|
||||||
g_d3d9.pixel_shader_upscale &&
|
g_d3d9.pixel_shader_upscale &&
|
||||||
(g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height);
|
(g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height);
|
||||||
|
|
||||||
err = err || FAILED(
|
err = err || FAILED(
|
||||||
IDirect3DDevice9_SetPixelShader(
|
IDirect3DDevice9_SetPixelShader(
|
||||||
@ -471,8 +471,8 @@ static BOOL d3d9_set_states()
|
|||||||
{
|
{
|
||||||
if (g_config.d3d9_filter == FILTER_LANCZOS &&
|
if (g_config.d3d9_filter == FILTER_LANCZOS &&
|
||||||
g_d3d9.pixel_shader_upscale &&
|
g_d3d9.pixel_shader_upscale &&
|
||||||
(g_ddraw->render.viewport.width != g_ddraw->width ||
|
(g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||||
g_ddraw->render.viewport.height != g_ddraw->height) &&
|
g_ddraw.render.viewport.height != g_ddraw.height) &&
|
||||||
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
||||||
{
|
{
|
||||||
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
||||||
@ -483,8 +483,8 @@ static BOOL d3d9_set_states()
|
|||||||
SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) &&
|
SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) &&
|
||||||
g_config.d3d9_filter == FILTER_CUBIC &&
|
g_config.d3d9_filter == FILTER_CUBIC &&
|
||||||
g_d3d9.pixel_shader_upscale &&
|
g_d3d9.pixel_shader_upscale &&
|
||||||
(g_ddraw->render.viewport.width != g_ddraw->width ||
|
(g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||||
g_ddraw->render.viewport.height != g_ddraw->height) &&
|
g_ddraw.render.viewport.height != g_ddraw.height) &&
|
||||||
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
||||||
{
|
{
|
||||||
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
||||||
@ -495,10 +495,10 @@ static BOOL d3d9_set_states()
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
D3DVIEWPORT9 view_data = {
|
D3DVIEWPORT9 view_data = {
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y,
|
g_ddraw.render.viewport.y,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height,
|
g_ddraw.render.viewport.height,
|
||||||
0.0f,
|
0.0f,
|
||||||
1.0f };
|
1.0f };
|
||||||
|
|
||||||
@ -509,14 +509,14 @@ static BOOL d3d9_set_states()
|
|||||||
|
|
||||||
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
||||||
{
|
{
|
||||||
float vp_x = stretch ? (float)g_ddraw->render.viewport.x : 0.0f;
|
float vp_x = stretch ? (float)g_ddraw.render.viewport.x : 0.0f;
|
||||||
float vp_y = stretch ? (float)g_ddraw->render.viewport.y : 0.0f;
|
float vp_y = stretch ? (float)g_ddraw.render.viewport.y : 0.0f;
|
||||||
|
|
||||||
float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width;
|
float vp_w = stretch ? (float)(g_ddraw.render.viewport.width + g_ddraw.render.viewport.x) : (float)g_ddraw.width;
|
||||||
float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height;
|
float vp_h = stretch ? (float)(g_ddraw.render.viewport.height + g_ddraw.render.viewport.y) : (float)g_ddraw.height;
|
||||||
|
|
||||||
float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h;
|
float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw.upscale_hack_height / g_ddraw.height) : g_d3d9.scale_h;
|
||||||
float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w;
|
float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw.upscale_hack_width / g_ddraw.width) : g_d3d9.scale_w;
|
||||||
|
|
||||||
CUSTOMVERTEX vertices[] =
|
CUSTOMVERTEX vertices[] =
|
||||||
{
|
{
|
||||||
@ -546,10 +546,10 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
|
|
||||||
BOOL needs_update = FALSE;
|
BOOL needs_update = FALSE;
|
||||||
|
|
||||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE;
|
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||||
|
|
||||||
while (g_ddraw->render.run &&
|
while (g_ddraw.render.run &&
|
||||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
|
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED))
|
||||||
{
|
{
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_start();
|
dbg_draw_frame_info_start();
|
||||||
@ -559,39 +559,39 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
|
|
||||||
fpsl_frame_start();
|
fpsl_frame_start();
|
||||||
|
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->primary &&
|
if (g_ddraw.primary &&
|
||||||
g_ddraw->primary->bpp == g_ddraw->bpp &&
|
g_ddraw.primary->bpp == g_ddraw.bpp &&
|
||||||
g_ddraw->primary->width == g_ddraw->width &&
|
g_ddraw.primary->width == g_ddraw.width &&
|
||||||
g_ddraw->primary->height == g_ddraw->height &&
|
g_ddraw.primary->height == g_ddraw.height &&
|
||||||
(g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette))
|
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
EnterCriticalSection(&g_ddraw->primary->cs);
|
EnterCriticalSection(&g_ddraw.primary->cs);
|
||||||
|
|
||||||
if (g_config.vhack)
|
if (g_config.vhack)
|
||||||
{
|
{
|
||||||
if (util_detect_low_res_screen())
|
if (util_detect_low_res_screen())
|
||||||
{
|
{
|
||||||
if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE))
|
if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE))
|
||||||
d3d9_update_vertices(TRUE, TRUE);
|
d3d9_update_vertices(TRUE, TRUE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE))
|
if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE))
|
||||||
d3d9_update_vertices(FALSE, TRUE);
|
d3d9_update_vertices(FALSE, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
D3DLOCKED_RECT lock_rc;
|
D3DLOCKED_RECT lock_rc;
|
||||||
|
|
||||||
if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2)
|
if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2)
|
||||||
{
|
{
|
||||||
if (++tex_index >= D3D9_TEXTURE_COUNT)
|
if (++tex_index >= D3D9_TEXTURE_COUNT)
|
||||||
tex_index = 0;
|
tex_index = 0;
|
||||||
|
|
||||||
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||||
|
|
||||||
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
|
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
|
||||||
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
|
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
|
||||||
@ -600,21 +600,21 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
lock_rc.pBits,
|
lock_rc.pBits,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->primary->width,
|
g_ddraw.primary->width,
|
||||||
g_ddraw->primary->height,
|
g_ddraw.primary->height,
|
||||||
lock_rc.Pitch,
|
lock_rc.Pitch,
|
||||||
g_ddraw->primary->surface,
|
g_ddraw.primary->surface,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->primary->pitch,
|
g_ddraw.primary->pitch,
|
||||||
g_ddraw->primary->bpp);
|
g_ddraw.primary->bpp);
|
||||||
|
|
||||||
IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0);
|
IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8 &&
|
if (g_ddraw.bpp == 8 &&
|
||||||
(InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2))
|
(InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2))
|
||||||
{
|
{
|
||||||
if (++pal_index >= D3D9_TEXTURE_COUNT)
|
if (++pal_index >= D3D9_TEXTURE_COUNT)
|
||||||
pal_index = 0;
|
pal_index = 0;
|
||||||
@ -624,7 +624,7 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
|
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
|
||||||
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
|
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
|
||||||
{
|
{
|
||||||
memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
|
memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));
|
||||||
|
|
||||||
IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0);
|
IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0);
|
||||||
}
|
}
|
||||||
@ -632,13 +632,13 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
|
|
||||||
if (g_config.fixchilds)
|
if (g_config.fixchilds)
|
||||||
{
|
{
|
||||||
g_ddraw->child_window_exists = FALSE;
|
g_ddraw.child_window_exists = FALSE;
|
||||||
InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL);
|
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
|
||||||
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
|
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
|
||||||
|
|
||||||
if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
|
if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)
|
||||||
{
|
{
|
||||||
if (g_ddraw->child_window_exists)
|
if (g_ddraw.child_window_exists)
|
||||||
{
|
{
|
||||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||||
|
|
||||||
@ -654,12 +654,12 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
LeaveCriticalSection(&g_ddraw->primary->cs);
|
LeaveCriticalSection(&g_ddraw.primary->cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
|
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
|
||||||
{
|
{
|
||||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||||
}
|
}
|
||||||
@ -668,7 +668,7 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
|
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
|
||||||
IDirect3DDevice9_EndScene(g_d3d9.device);
|
IDirect3DDevice9_EndScene(g_d3d9.device);
|
||||||
|
|
||||||
if (g_ddraw->bnet_active)
|
if (g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||||
}
|
}
|
||||||
@ -676,9 +676,9 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL)))
|
if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL)))
|
||||||
{
|
{
|
||||||
DWORD_PTR result;
|
DWORD_PTR result;
|
||||||
SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result);
|
SendMessageTimeout(g_ddraw.hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result);
|
||||||
|
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
Sleep(50);
|
Sleep(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -690,7 +690,7 @@ DWORD WINAPI d3d9_render_main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.vhack)
|
if (g_config.vhack)
|
||||||
InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE);
|
InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
112
src/render_gdi.c
112
src/render_gdi.c
@ -16,16 +16,16 @@ DWORD WINAPI gdi_render_main(void)
|
|||||||
static DWORD warning_end_tick = 0;
|
static DWORD warning_end_tick = 0;
|
||||||
static char warning_text[512] = { 0 };
|
static char warning_text[512] = { 0 };
|
||||||
|
|
||||||
if (g_ddraw->show_driver_warning)
|
if (g_ddraw.show_driver_warning)
|
||||||
{
|
{
|
||||||
g_ddraw->show_driver_warning = FALSE;
|
g_ddraw.show_driver_warning = FALSE;
|
||||||
|
|
||||||
TRACE(" Switched to GDI renderer\n");
|
TRACE(" Switched to GDI renderer\n");
|
||||||
|
|
||||||
warning_end_tick = timeGetTime() + (15 * 1000);
|
warning_end_tick = timeGetTime() + (15 * 1000);
|
||||||
|
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0);
|
PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0);
|
||||||
|
|
||||||
_snprintf(
|
_snprintf(
|
||||||
warning_text,
|
warning_text,
|
||||||
@ -38,10 +38,10 @@ DWORD WINAPI gdi_render_main(void)
|
|||||||
|
|
||||||
fpsl_init();
|
fpsl_init();
|
||||||
|
|
||||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE;
|
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||||
|
|
||||||
while (g_ddraw->render.run &&
|
while (g_ddraw.render.run &&
|
||||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
|
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED))
|
||||||
{
|
{
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_start();
|
dbg_draw_frame_info_start();
|
||||||
@ -49,25 +49,25 @@ DWORD WINAPI gdi_render_main(void)
|
|||||||
|
|
||||||
fpsl_frame_start();
|
fpsl_frame_start();
|
||||||
|
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->primary &&
|
if (g_ddraw.primary &&
|
||||||
g_ddraw->primary->bpp == g_ddraw->bpp &&
|
g_ddraw.primary->bpp == g_ddraw.bpp &&
|
||||||
g_ddraw->primary->width == g_ddraw->width &&
|
g_ddraw.primary->width == g_ddraw.width &&
|
||||||
g_ddraw->primary->height == g_ddraw->height &&
|
g_ddraw.primary->height == g_ddraw.height &&
|
||||||
(g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette))
|
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
EnterCriticalSection(&g_ddraw->primary->cs);
|
EnterCriticalSection(&g_ddraw.primary->cs);
|
||||||
|
|
||||||
if (warning_end_tick)
|
if (warning_end_tick)
|
||||||
{
|
{
|
||||||
if (timeGetTime() < warning_end_tick)
|
if (timeGetTime() < warning_end_tick)
|
||||||
{
|
{
|
||||||
HDC primary_dc;
|
HDC primary_dc;
|
||||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||||
|
|
||||||
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||||
DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
|
DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -79,88 +79,88 @@ DWORD WINAPI gdi_render_main(void)
|
|||||||
BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen();
|
BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen();
|
||||||
|
|
||||||
if (g_config.vhack)
|
if (g_config.vhack)
|
||||||
InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack);
|
InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack);
|
||||||
|
|
||||||
if (g_config.fixchilds)
|
if (g_config.fixchilds)
|
||||||
{
|
{
|
||||||
g_ddraw->child_window_exists = FALSE;
|
g_ddraw.child_window_exists = FALSE;
|
||||||
InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL);
|
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
|
||||||
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
|
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8 && g_ddraw->primary->palette)
|
if (g_ddraw.bpp == 8 && g_ddraw.primary->palette)
|
||||||
{
|
{
|
||||||
memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
|
memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
|
if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE))
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
|
||||||
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bnet_active)
|
if (g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
|
||||||
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||||
}
|
}
|
||||||
else if (upscale_hack)
|
else if (upscale_hack)
|
||||||
{
|
{
|
||||||
real_StretchDIBits(
|
real_StretchDIBits(
|
||||||
g_ddraw->render.hdc,
|
g_ddraw.render.hdc,
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y,
|
g_ddraw.render.viewport.y,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height,
|
g_ddraw.render.viewport.height,
|
||||||
0,
|
0,
|
||||||
g_ddraw->height - g_ddraw->upscale_hack_height,
|
g_ddraw.height - g_ddraw.upscale_hack_height,
|
||||||
g_ddraw->upscale_hack_width,
|
g_ddraw.upscale_hack_width,
|
||||||
g_ddraw->upscale_hack_height,
|
g_ddraw.upscale_hack_height,
|
||||||
g_ddraw->primary->surface,
|
g_ddraw.primary->surface,
|
||||||
g_ddraw->primary->bmi,
|
g_ddraw.primary->bmi,
|
||||||
DIB_RGB_COLORS,
|
DIB_RGB_COLORS,
|
||||||
SRCCOPY);
|
SRCCOPY);
|
||||||
}
|
}
|
||||||
else if (!g_ddraw->child_window_exists &&
|
else if (!g_ddraw.child_window_exists &&
|
||||||
(g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height))
|
(g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height))
|
||||||
{
|
{
|
||||||
real_StretchDIBits(
|
real_StretchDIBits(
|
||||||
g_ddraw->render.hdc,
|
g_ddraw.render.hdc,
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y,
|
g_ddraw.render.viewport.y,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height,
|
g_ddraw.render.viewport.height,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->width,
|
g_ddraw.width,
|
||||||
g_ddraw->height,
|
g_ddraw.height,
|
||||||
g_ddraw->primary->surface,
|
g_ddraw.primary->surface,
|
||||||
g_ddraw->primary->bmi,
|
g_ddraw.primary->bmi,
|
||||||
DIB_RGB_COLORS,
|
DIB_RGB_COLORS,
|
||||||
SRCCOPY);
|
SRCCOPY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
real_SetDIBitsToDevice(
|
real_SetDIBitsToDevice(
|
||||||
g_ddraw->render.hdc,
|
g_ddraw.render.hdc,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->width,
|
g_ddraw.width,
|
||||||
g_ddraw->height,
|
g_ddraw.height,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->height,
|
g_ddraw.height,
|
||||||
g_ddraw->primary->surface,
|
g_ddraw.primary->surface,
|
||||||
g_ddraw->primary->bmi,
|
g_ddraw.primary->bmi,
|
||||||
DIB_RGB_COLORS);
|
DIB_RGB_COLORS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
LeaveCriticalSection(&g_ddraw->primary->cs);
|
LeaveCriticalSection(&g_ddraw.primary->cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_end();
|
dbg_draw_frame_info_end();
|
||||||
|
172
src/render_ogl.c
172
src/render_ogl.c
@ -30,7 +30,7 @@ DWORD WINAPI ogl_render_main(void)
|
|||||||
Sleep(250);
|
Sleep(250);
|
||||||
g_ogl.got_error = g_ogl.use_opengl = FALSE;
|
g_ogl.got_error = g_ogl.use_opengl = FALSE;
|
||||||
|
|
||||||
g_ogl.context = ogl_create_context(g_ddraw->render.hdc);
|
g_ogl.context = ogl_create_context(g_ddraw.render.hdc);
|
||||||
if (g_ogl.context)
|
if (g_ogl.context)
|
||||||
{
|
{
|
||||||
oglu_init();
|
oglu_init();
|
||||||
@ -42,21 +42,21 @@ DWORD WINAPI ogl_render_main(void)
|
|||||||
TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
TRACE("+------------------------------------------------\n");
|
TRACE("+------------------------------------------------\n");
|
||||||
|
|
||||||
g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc);
|
g_ogl.context = ogl_create_core_context(g_ddraw.render.hdc);
|
||||||
|
|
||||||
if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT)
|
if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw.render.hdc) && wglSwapIntervalEXT)
|
||||||
wglSwapIntervalEXT(g_config.vsync ? 1 : 0);
|
wglSwapIntervalEXT(g_config.vsync ? 1 : 0);
|
||||||
|
|
||||||
fpsl_init();
|
fpsl_init();
|
||||||
ogl_build_programs();
|
ogl_build_programs();
|
||||||
ogl_create_textures(g_ddraw->width, g_ddraw->height);
|
ogl_create_textures(g_ddraw.width, g_ddraw.height);
|
||||||
ogl_init_main_program();
|
ogl_init_main_program();
|
||||||
ogl_init_scale_program();
|
ogl_init_scale_program();
|
||||||
|
|
||||||
g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test();
|
g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test();
|
||||||
g_ogl.got_error = g_ogl.got_error || !ogl_shader_test();
|
g_ogl.got_error = g_ogl.got_error || !ogl_shader_test();
|
||||||
g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR;
|
g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR;
|
||||||
g_ogl.use_opengl = (g_ogl.main_program || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !g_ogl.got_error;
|
g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error;
|
||||||
|
|
||||||
ogl_render();
|
ogl_render();
|
||||||
|
|
||||||
@ -65,8 +65,8 @@ DWORD WINAPI ogl_render_main(void)
|
|||||||
|
|
||||||
if (!g_ogl.use_opengl)
|
if (!g_ogl.use_opengl)
|
||||||
{
|
{
|
||||||
g_ddraw->show_driver_warning = TRUE;
|
g_ddraw.show_driver_warning = TRUE;
|
||||||
g_ddraw->renderer = gdi_render_main;
|
g_ddraw.renderer = gdi_render_main;
|
||||||
gdi_render_main();
|
gdi_render_main();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,15 +137,15 @@ static void ogl_build_programs()
|
|||||||
|
|
||||||
if (g_oglu_got_version3)
|
if (g_oglu_got_version3)
|
||||||
{
|
{
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile);
|
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile);
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16 && g_config.rgb555)
|
else if (g_ddraw.bpp == 16 && g_config.rgb555)
|
||||||
{
|
{
|
||||||
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile);
|
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile);
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32)
|
else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32)
|
||||||
{
|
{
|
||||||
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile);
|
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile);
|
||||||
}
|
}
|
||||||
@ -172,14 +172,14 @@ static void ogl_build_programs()
|
|||||||
strstr(g_config.shader, "xbrz-freescale.glsl") != NULL;
|
strstr(g_config.shader, "xbrz-freescale.glsl") != NULL;
|
||||||
|
|
||||||
if (!is_upscaler ||
|
if (!is_upscaler ||
|
||||||
g_ddraw->render.viewport.width != g_ddraw->width ||
|
g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||||
g_ddraw->render.viewport.height != g_ddraw->height)
|
g_ddraw.render.viewport.height != g_ddraw.height)
|
||||||
{
|
{
|
||||||
g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile);
|
g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile);
|
||||||
|
|
||||||
if (!g_ogl.scale_program &&
|
if (!g_ogl.scale_program &&
|
||||||
(g_ddraw->render.viewport.width != g_ddraw->width ||
|
(g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||||
g_ddraw->render.viewport.height != g_ddraw->height))
|
g_ddraw.render.viewport.height != g_ddraw.height))
|
||||||
{
|
{
|
||||||
g_ogl.scale_program =
|
g_ogl.scale_program =
|
||||||
oglu_build_program(
|
oglu_build_program(
|
||||||
@ -209,11 +209,11 @@ static void ogl_build_programs()
|
|||||||
|
|
||||||
if (g_oglu_got_version2 && !g_ogl.main_program)
|
if (g_oglu_got_version2 && !g_ogl.main_program)
|
||||||
{
|
{
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE);
|
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE);
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32)
|
else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32)
|
||||||
{
|
{
|
||||||
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE);
|
g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE);
|
||||||
}
|
}
|
||||||
@ -246,7 +246,7 @@ static void ogl_create_textures(int width, int height)
|
|||||||
|
|
||||||
while (glGetError() != GL_NO_ERROR);
|
while (glGetError() != GL_NO_ERROR);
|
||||||
|
|
||||||
if (g_ddraw->bpp == 32)
|
if (g_ddraw.bpp == 32)
|
||||||
{
|
{
|
||||||
glTexImage2D(
|
glTexImage2D(
|
||||||
GL_TEXTURE_2D,
|
GL_TEXTURE_2D,
|
||||||
@ -259,7 +259,7 @@ static void ogl_create_textures(int width, int height)
|
|||||||
g_ogl.surface_type = GL_UNSIGNED_BYTE,
|
g_ogl.surface_type = GL_UNSIGNED_BYTE,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16 && g_config.rgb555)
|
else if (g_ddraw.bpp == 16 && g_config.rgb555)
|
||||||
{
|
{
|
||||||
if (g_oglu_got_version3)
|
if (g_oglu_got_version3)
|
||||||
{
|
{
|
||||||
@ -288,7 +288,7 @@ static void ogl_create_textures(int width, int height)
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16)
|
else if (g_ddraw.bpp == 16)
|
||||||
{
|
{
|
||||||
glTexImage2D(
|
glTexImage2D(
|
||||||
GL_TEXTURE_2D,
|
GL_TEXTURE_2D,
|
||||||
@ -316,7 +316,7 @@ static void ogl_create_textures(int width, int height)
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 8)
|
else if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
glTexImage2D(
|
glTexImage2D(
|
||||||
GL_TEXTURE_2D,
|
GL_TEXTURE_2D,
|
||||||
@ -360,7 +360,7 @@ static void ogl_create_textures(int width, int height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
glGenTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids);
|
glGenTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids);
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ static void ogl_init_main_program()
|
|||||||
|
|
||||||
glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0);
|
glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0);
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1);
|
glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1);
|
||||||
|
|
||||||
if (g_oglu_got_version3)
|
if (g_oglu_got_version3)
|
||||||
@ -532,12 +532,12 @@ static void ogl_init_scale_program()
|
|||||||
|
|
||||||
float input_size[2], output_size[2], texture_size[2];
|
float input_size[2], output_size[2], texture_size[2];
|
||||||
|
|
||||||
input_size[0] = (float)g_ddraw->width;
|
input_size[0] = (float)g_ddraw.width;
|
||||||
input_size[1] = (float)g_ddraw->height;
|
input_size[1] = (float)g_ddraw.height;
|
||||||
texture_size[0] = (float)g_ogl.surface_tex_width;
|
texture_size[0] = (float)g_ogl.surface_tex_width;
|
||||||
texture_size[1] = (float)g_ogl.surface_tex_height;
|
texture_size[1] = (float)g_ogl.surface_tex_height;
|
||||||
output_size[0] = (float)g_ddraw->render.viewport.width;
|
output_size[0] = (float)g_ddraw.render.viewport.width;
|
||||||
output_size[1] = (float)g_ddraw->render.viewport.height;
|
output_size[1] = (float)g_ddraw.render.viewport.height;
|
||||||
|
|
||||||
GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize");
|
GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize");
|
||||||
if (loc != -1)
|
if (loc != -1)
|
||||||
@ -648,31 +648,31 @@ static void ogl_render()
|
|||||||
BOOL needs_update = FALSE;
|
BOOL needs_update = FALSE;
|
||||||
|
|
||||||
glViewport(
|
glViewport(
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align,
|
g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height);
|
g_ddraw.render.viewport.height);
|
||||||
|
|
||||||
if (g_ogl.main_program)
|
if (g_ogl.main_program)
|
||||||
{
|
{
|
||||||
glUseProgram(g_ogl.main_program);
|
glUseProgram(g_ogl.main_program);
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32)
|
else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32)
|
||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE;
|
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||||
|
|
||||||
while (g_ogl.use_opengl && g_ddraw->render.run &&
|
while (g_ogl.use_opengl && g_ddraw.render.run &&
|
||||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
|
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED))
|
||||||
{
|
{
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_start();
|
dbg_draw_frame_info_start();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g_ogl.scale_w = (float)g_ddraw->width / g_ogl.surface_tex_width;
|
g_ogl.scale_w = (float)g_ddraw.width / g_ogl.surface_tex_width;
|
||||||
g_ogl.scale_h = (float)g_ddraw->height / g_ogl.surface_tex_height;
|
g_ogl.scale_h = (float)g_ddraw.height / g_ogl.surface_tex_height;
|
||||||
|
|
||||||
static int tex_index = 0, pal_index = 0;
|
static int tex_index = 0, pal_index = 0;
|
||||||
|
|
||||||
@ -680,36 +680,36 @@ static void ogl_render()
|
|||||||
|
|
||||||
fpsl_frame_start();
|
fpsl_frame_start();
|
||||||
|
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->primary &&
|
if (g_ddraw.primary &&
|
||||||
g_ddraw->primary->bpp == g_ddraw->bpp &&
|
g_ddraw.primary->bpp == g_ddraw.bpp &&
|
||||||
g_ddraw->primary->width == g_ddraw->width &&
|
g_ddraw.primary->width == g_ddraw.width &&
|
||||||
g_ddraw->primary->height == g_ddraw->height &&
|
g_ddraw.primary->height == g_ddraw.height &&
|
||||||
(g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette))
|
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
EnterCriticalSection(&g_ddraw->primary->cs);
|
EnterCriticalSection(&g_ddraw.primary->cs);
|
||||||
|
|
||||||
if (g_config.vhack)
|
if (g_config.vhack)
|
||||||
{
|
{
|
||||||
if (util_detect_low_res_screen())
|
if (util_detect_low_res_screen())
|
||||||
{
|
{
|
||||||
g_ogl.scale_w *= (float)g_ddraw->upscale_hack_width / g_ddraw->width;
|
g_ogl.scale_w *= (float)g_ddraw.upscale_hack_width / g_ddraw.width;
|
||||||
g_ogl.scale_h *= (float)g_ddraw->upscale_hack_height / g_ddraw->height;
|
g_ogl.scale_h *= (float)g_ddraw.upscale_hack_height / g_ddraw.height;
|
||||||
|
|
||||||
if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE))
|
if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE))
|
||||||
scale_changed = TRUE;
|
scale_changed = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE))
|
if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE))
|
||||||
scale_changed = TRUE;
|
scale_changed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8 &&
|
if (g_ddraw.bpp == 8 &&
|
||||||
(InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2))
|
(InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2))
|
||||||
{
|
{
|
||||||
if (++pal_index >= TEXTURE_COUNT)
|
if (++pal_index >= TEXTURE_COUNT)
|
||||||
pal_index = 0;
|
pal_index = 0;
|
||||||
@ -725,19 +725,19 @@ static void ogl_render()
|
|||||||
1,
|
1,
|
||||||
GL_RGBA,
|
GL_RGBA,
|
||||||
GL_UNSIGNED_BYTE,
|
GL_UNSIGNED_BYTE,
|
||||||
g_ddraw->primary->palette->data_bgr);
|
g_ddraw.primary->palette->data_bgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2)
|
if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2)
|
||||||
{
|
{
|
||||||
if (++tex_index >= TEXTURE_COUNT)
|
if (++tex_index >= TEXTURE_COUNT)
|
||||||
tex_index = 0;
|
tex_index = 0;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
|
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
|
||||||
|
|
||||||
DWORD row_len = g_ddraw->primary->pitch ? g_ddraw->primary->pitch / g_ddraw->primary->bytes_pp : 0;
|
DWORD row_len = g_ddraw.primary->pitch ? g_ddraw.primary->pitch / g_ddraw.primary->bytes_pp : 0;
|
||||||
|
|
||||||
if (row_len != g_ddraw->primary->width)
|
if (row_len != g_ddraw.primary->width)
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len);
|
||||||
|
|
||||||
glTexSubImage2D(
|
glTexSubImage2D(
|
||||||
@ -745,13 +745,13 @@ static void ogl_render()
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->width,
|
g_ddraw.width,
|
||||||
g_ddraw->height,
|
g_ddraw.height,
|
||||||
g_ogl.surface_format,
|
g_ogl.surface_format,
|
||||||
g_ogl.surface_type,
|
g_ogl.surface_type,
|
||||||
g_ddraw->primary->surface);
|
g_ddraw.primary->surface);
|
||||||
|
|
||||||
if (row_len != g_ddraw->primary->width)
|
if (row_len != g_ddraw.primary->width)
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,29 +769,29 @@ static void ogl_render()
|
|||||||
|
|
||||||
if (g_config.fixchilds)
|
if (g_config.fixchilds)
|
||||||
{
|
{
|
||||||
g_ddraw->child_window_exists = FALSE;
|
g_ddraw.child_window_exists = FALSE;
|
||||||
InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, NULL);
|
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
|
||||||
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
|
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
|
||||||
|
|
||||||
if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
|
if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)
|
||||||
{
|
{
|
||||||
if (g_ddraw->child_window_exists)
|
if (g_ddraw.child_window_exists)
|
||||||
{
|
{
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
if (!needs_update)
|
if (!needs_update)
|
||||||
{
|
{
|
||||||
glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height);
|
glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height);
|
||||||
needs_update = TRUE;
|
needs_update = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (needs_update)
|
else if (needs_update)
|
||||||
{
|
{
|
||||||
glViewport(
|
glViewport(
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align,
|
g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height);
|
g_ddraw.render.viewport.height);
|
||||||
|
|
||||||
needs_update = FALSE;
|
needs_update = FALSE;
|
||||||
}
|
}
|
||||||
@ -799,12 +799,12 @@ static void ogl_render()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.lock_surfaces)
|
if (g_config.lock_surfaces)
|
||||||
LeaveCriticalSection(&g_ddraw->primary->cs);
|
LeaveCriticalSection(&g_ddraw.primary->cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
|
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
|
||||||
{
|
{
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
@ -848,7 +848,7 @@ static void ogl_render()
|
|||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
|
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, g_ogl.palette_tex_ids[pal_index]);
|
glBindTexture(GL_TEXTURE_2D, g_ogl.palette_tex_ids[pal_index]);
|
||||||
@ -861,7 +861,7 @@ static void ogl_render()
|
|||||||
/* draw surface into framebuffer */
|
/* draw surface into framebuffer */
|
||||||
glUseProgram(g_ogl.main_program);
|
glUseProgram(g_ogl.main_program);
|
||||||
|
|
||||||
glViewport(0, 0, g_ddraw->width, g_ddraw->height);
|
glViewport(0, 0, g_ddraw.width, g_ddraw.height);
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id);
|
glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id);
|
||||||
|
|
||||||
@ -874,17 +874,17 @@ static void ogl_render()
|
|||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
if (g_ddraw->child_window_exists)
|
if (g_ddraw.child_window_exists)
|
||||||
{
|
{
|
||||||
glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height);
|
glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glViewport(
|
glViewport(
|
||||||
g_ddraw->render.viewport.x,
|
g_ddraw.render.viewport.x,
|
||||||
g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align,
|
g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align,
|
||||||
g_ddraw->render.viewport.width,
|
g_ddraw.render.viewport.width,
|
||||||
g_ddraw->render.viewport.height);
|
g_ddraw.render.viewport.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* apply filter */
|
/* apply filter */
|
||||||
@ -917,10 +917,10 @@ static void ogl_render()
|
|||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bnet_active)
|
if (g_ddraw.bnet_active)
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
SwapBuffers(g_ddraw->render.hdc);
|
SwapBuffers(g_ddraw.render.hdc);
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
dbg_draw_frame_info_end();
|
dbg_draw_frame_info_end();
|
||||||
@ -930,7 +930,7 @@ static void ogl_render()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.vhack)
|
if (g_config.vhack)
|
||||||
InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE);
|
InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ogl_delete_context(HGLRC context)
|
static void ogl_delete_context(HGLRC context)
|
||||||
@ -940,7 +940,7 @@ static void ogl_delete_context(HGLRC context)
|
|||||||
|
|
||||||
glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids);
|
glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids);
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
glDeleteTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids);
|
glDeleteTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids);
|
||||||
|
|
||||||
if (glUseProgram)
|
if (glUseProgram)
|
||||||
@ -1004,8 +1004,8 @@ static BOOL ogl_texture_upload_test()
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->width,
|
g_ddraw.width,
|
||||||
g_ddraw->height,
|
g_ddraw.height,
|
||||||
g_ogl.surface_format,
|
g_ogl.surface_format,
|
||||||
g_ogl.surface_type,
|
g_ogl.surface_type,
|
||||||
g_ogl.surface_tex);
|
g_ogl.surface_tex);
|
||||||
@ -1018,7 +1018,7 @@ static BOOL ogl_texture_upload_test()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bpp == 8)
|
if (g_ddraw.bpp == 8)
|
||||||
{
|
{
|
||||||
for (i = 0; i < TEXTURE_COUNT; i++)
|
for (i = 0; i < TEXTURE_COUNT; i++)
|
||||||
{
|
{
|
||||||
@ -1053,7 +1053,7 @@ static BOOL ogl_shader_test()
|
|||||||
|
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
|
|
||||||
if (g_ddraw->bpp != 8)
|
if (g_ddraw.bpp != 8)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if (g_oglu_got_version3 && g_ogl.main_program)
|
if (g_oglu_got_version3 && g_ogl.main_program)
|
||||||
|
@ -134,7 +134,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
|||||||
char str_time[64];
|
char str_time[64];
|
||||||
time_t t = time(NULL);
|
time_t t = time(NULL);
|
||||||
|
|
||||||
strncpy(title, g_ddraw->title, sizeof(g_ddraw->title));
|
strncpy(title, g_ddraw.title, sizeof(g_ddraw.title));
|
||||||
|
|
||||||
for (int i = 0; i < strlen(title); i++)
|
for (int i = 0; i < strlen(title); i++)
|
||||||
{
|
{
|
||||||
|
120
src/utils.c
120
src/utils.c
@ -152,25 +152,25 @@ BOOL util_is_avx_supported()
|
|||||||
|
|
||||||
void util_limit_game_ticks()
|
void util_limit_game_ticks()
|
||||||
{
|
{
|
||||||
if (GetCurrentThreadId() != g_ddraw->gui_thread_id)
|
if (GetCurrentThreadId() != g_ddraw.gui_thread_id)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_ddraw->ticks_limiter.htimer)
|
if (g_ddraw.ticks_limiter.htimer)
|
||||||
{
|
{
|
||||||
FILETIME ft = { 0 };
|
FILETIME ft = { 0 };
|
||||||
GetSystemTimeAsFileTime(&ft);
|
GetSystemTimeAsFileTime(&ft);
|
||||||
|
|
||||||
if (CompareFileTime((FILETIME*)&g_ddraw->ticks_limiter.due_time, &ft) == -1)
|
if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1)
|
||||||
{
|
{
|
||||||
memcpy(&g_ddraw->ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER));
|
memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WaitForSingleObject(g_ddraw->ticks_limiter.htimer, g_ddraw->ticks_limiter.tick_length * 2);
|
WaitForSingleObject(g_ddraw.ticks_limiter.htimer, g_ddraw.ticks_limiter.tick_length * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ddraw->ticks_limiter.due_time.QuadPart += g_ddraw->ticks_limiter.tick_length_ns;
|
g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns;
|
||||||
SetWaitableTimer(g_ddraw->ticks_limiter.htimer, &g_ddraw->ticks_limiter.due_time, 0, NULL, NULL, FALSE);
|
SetWaitableTimer(g_ddraw.ticks_limiter.htimer, &g_ddraw.ticks_limiter.due_time, 0, NULL, NULL, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -182,12 +182,12 @@ void util_limit_game_ticks()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_game_tick += g_ddraw->ticks_limiter.tick_length;
|
next_game_tick += g_ddraw.ticks_limiter.tick_length;
|
||||||
DWORD tick_count = timeGetTime();
|
DWORD tick_count = timeGetTime();
|
||||||
|
|
||||||
int sleep_time = next_game_tick - tick_count;
|
int sleep_time = next_game_tick - tick_count;
|
||||||
|
|
||||||
if (sleep_time <= 0 || sleep_time > g_ddraw->ticks_limiter.tick_length)
|
if (sleep_time <= 0 || sleep_time > g_ddraw.ticks_limiter.tick_length)
|
||||||
{
|
{
|
||||||
next_game_tick = tick_count;
|
next_game_tick = tick_count;
|
||||||
}
|
}
|
||||||
@ -203,7 +203,7 @@ void util_update_bnet_pos(int new_x, int new_y)
|
|||||||
static int old_x = -32000;
|
static int old_x = -32000;
|
||||||
static int old_y = -32000;
|
static int old_y = -32000;
|
||||||
|
|
||||||
if (old_x == -32000 || old_y == -32000 || !g_ddraw->bnet_active)
|
if (old_x == -32000 || old_y == -32000 || !g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
old_x = new_x;
|
old_x = new_x;
|
||||||
old_y = new_y;
|
old_y = new_y;
|
||||||
@ -211,10 +211,10 @@ void util_update_bnet_pos(int new_x, int new_y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
real_ClientToScreen(g_ddraw->hwnd, &pt);
|
real_ClientToScreen(g_ddraw.hwnd, &pt);
|
||||||
|
|
||||||
RECT mainrc;
|
RECT mainrc;
|
||||||
SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw->width, pt.y + g_ddraw->height);
|
SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw.width, pt.y + g_ddraw.height);
|
||||||
|
|
||||||
int adj_y = 0;
|
int adj_y = 0;
|
||||||
int adj_x = 0;
|
int adj_x = 0;
|
||||||
@ -237,7 +237,7 @@ void util_update_bnet_pos(int new_x, int new_y)
|
|||||||
0,
|
0,
|
||||||
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
|
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
|
||||||
if (rc.bottom - rc.top <= g_ddraw->height)
|
if (rc.bottom - rc.top <= g_ddraw.height)
|
||||||
{
|
{
|
||||||
if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y))
|
if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y))
|
||||||
{
|
{
|
||||||
@ -249,7 +249,7 @@ void util_update_bnet_pos(int new_x, int new_y)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc.right - rc.left <= g_ddraw->width)
|
if (rc.right - rc.left <= g_ddraw.width)
|
||||||
{
|
{
|
||||||
if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x))
|
if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x))
|
||||||
{
|
{
|
||||||
@ -340,23 +340,23 @@ void util_toggle_maximize()
|
|||||||
RECT client_rc;
|
RECT client_rc;
|
||||||
RECT dst_rc;
|
RECT dst_rc;
|
||||||
|
|
||||||
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
|
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
|
||||||
LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE);
|
LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE);
|
||||||
BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL;
|
BOOL got_menu = GetMenu(g_ddraw.hwnd) != NULL;
|
||||||
|
|
||||||
if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0))
|
if (real_GetClientRect(g_ddraw.hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0))
|
||||||
{
|
{
|
||||||
int width = (dst_rc.right - dst_rc.left);
|
int width = (dst_rc.right - dst_rc.left);
|
||||||
int height = (dst_rc.bottom - dst_rc.top);
|
int height = (dst_rc.bottom - dst_rc.top);
|
||||||
int x = dst_rc.left;
|
int x = dst_rc.left;
|
||||||
int y = dst_rc.top;
|
int y = dst_rc.top;
|
||||||
|
|
||||||
if (client_rc.right != g_ddraw->width || client_rc.bottom != g_ddraw->height)
|
if (client_rc.right != g_ddraw.width || client_rc.bottom != g_ddraw.height)
|
||||||
{
|
{
|
||||||
dst_rc.left = 0;
|
dst_rc.left = 0;
|
||||||
dst_rc.top = 0;
|
dst_rc.top = 0;
|
||||||
dst_rc.right = g_ddraw->width;
|
dst_rc.right = g_ddraw.width;
|
||||||
dst_rc.bottom = g_ddraw->height;
|
dst_rc.bottom = g_ddraw.height;
|
||||||
|
|
||||||
AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle);
|
AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle);
|
||||||
}
|
}
|
||||||
@ -364,15 +364,15 @@ void util_toggle_maximize()
|
|||||||
{
|
{
|
||||||
dst_rc.left = 0;
|
dst_rc.left = 0;
|
||||||
dst_rc.top = 0;
|
dst_rc.top = 0;
|
||||||
dst_rc.right = g_ddraw->width;
|
dst_rc.right = g_ddraw.width;
|
||||||
dst_rc.bottom = g_ddraw->height;
|
dst_rc.bottom = g_ddraw.height;
|
||||||
|
|
||||||
for (int i = 20; i-- > 1;)
|
for (int i = 20; i-- > 1;)
|
||||||
{
|
{
|
||||||
if (width >= g_ddraw->width * i && height - 20 >= g_ddraw->height * i)
|
if (width >= g_ddraw.width * i && height - 20 >= g_ddraw.height * i)
|
||||||
{
|
{
|
||||||
dst_rc.right = g_ddraw->width * i;
|
dst_rc.right = g_ddraw.width * i;
|
||||||
dst_rc.bottom = g_ddraw->height * i;
|
dst_rc.bottom = g_ddraw.height * i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -386,7 +386,7 @@ void util_toggle_maximize()
|
|||||||
int w = dst_rc.right - dst_rc.left;
|
int w = dst_rc.right - dst_rc.left;
|
||||||
int h = dst_rc.bottom - dst_rc.top;
|
int h = dst_rc.bottom - dst_rc.top;
|
||||||
|
|
||||||
double dst_ar = (double)g_ddraw->height / g_ddraw->width;
|
double dst_ar = (double)g_ddraw.height / g_ddraw.width;
|
||||||
double src_ar = (double)h / w;
|
double src_ar = (double)h / w;
|
||||||
|
|
||||||
dst_rc.top = 0;
|
dst_rc.top = 0;
|
||||||
@ -423,7 +423,7 @@ void util_toggle_maximize()
|
|||||||
|
|
||||||
void util_toggle_fullscreen()
|
void util_toggle_fullscreen()
|
||||||
{
|
{
|
||||||
if (g_ddraw->bnet_active)
|
if (g_ddraw.bnet_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_config.toggle_borderless && g_config.windowed)
|
if (g_config.toggle_borderless && g_config.windowed)
|
||||||
@ -433,7 +433,7 @@ void util_toggle_fullscreen()
|
|||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
|
||||||
g_config.upscaled_state = g_config.fullscreen = TRUE;
|
g_config.upscaled_state = g_config.fullscreen = TRUE;
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0);
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
@ -442,7 +442,7 @@ void util_toggle_fullscreen()
|
|||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
|
||||||
g_config.upscaled_state = g_config.fullscreen = FALSE;
|
g_config.upscaled_state = g_config.fullscreen = FALSE;
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0);
|
||||||
|
|
||||||
//mouse_lock();
|
//mouse_lock();
|
||||||
}
|
}
|
||||||
@ -459,7 +459,7 @@ void util_toggle_fullscreen()
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_config.window_state = g_config.windowed = FALSE;
|
g_config.window_state = g_config.windowed = FALSE;
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_WINDOWED);
|
||||||
util_update_bnet_pos(0, 0);
|
util_update_bnet_pos(0, 0);
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
@ -475,27 +475,27 @@ void util_toggle_fullscreen()
|
|||||||
|
|
||||||
g_config.window_state = g_config.windowed = TRUE;
|
g_config.window_state = g_config.windowed = TRUE;
|
||||||
|
|
||||||
if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive)
|
if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive)
|
||||||
{
|
{
|
||||||
d3d9_reset(g_config.windowed);
|
d3d9_reset(g_config.windowed);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (g_ddraw->render.thread)
|
if (g_ddraw.render.thread)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
g_ddraw->render.run = FALSE;
|
g_ddraw.render.run = FALSE;
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
|
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
|
||||||
g_ddraw->render.thread = NULL;
|
g_ddraw.render.thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
|
ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_FULLSCREEN);
|
||||||
//mouse_lock();
|
//mouse_lock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -523,15 +523,15 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags)
|
|||||||
{
|
{
|
||||||
if (g_config.windowed)
|
if (g_config.windowed)
|
||||||
{
|
{
|
||||||
if (g_ddraw->render.thread)
|
if (g_ddraw.render.thread)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
g_ddraw->render.run = FALSE;
|
g_ddraw.render.run = FALSE;
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
|
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
|
||||||
g_ddraw->render.thread = NULL;
|
g_ddraw.render.thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & SWP_NOMOVE) == 0)
|
if ((flags & SWP_NOMOVE) == 0)
|
||||||
@ -546,7 +546,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags)
|
|||||||
g_config.window_rect.right = width;
|
g_config.window_rect.right = width;
|
||||||
}
|
}
|
||||||
|
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -581,7 +581,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
|
|||||||
{
|
{
|
||||||
if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE)
|
if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE)
|
||||||
{
|
{
|
||||||
InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, hwnd);
|
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE);
|
LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE);
|
||||||
@ -603,7 +603,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE;
|
g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE;
|
||||||
|
|
||||||
if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT)
|
if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT)
|
||||||
{
|
{
|
||||||
@ -612,7 +612,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
|
|||||||
|
|
||||||
dds_GetDC(this, &src_dc);
|
dds_GetDC(this, &src_dc);
|
||||||
|
|
||||||
real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2);
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2);
|
||||||
|
|
||||||
BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY);
|
BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY);
|
||||||
|
|
||||||
@ -627,7 +627,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
|
|||||||
static unsigned char util_get_pixel(int x, int y)
|
static unsigned char util_get_pixel(int x, int y)
|
||||||
{
|
{
|
||||||
return ((unsigned char*)dds_GetBuffer(
|
return ((unsigned char*)dds_GetBuffer(
|
||||||
g_ddraw->primary))[y * g_ddraw->primary->pitch + x * g_ddraw->primary->bytes_pp];
|
g_ddraw.primary))[y * g_ddraw.primary->pitch + x * g_ddraw.primary->bytes_pp];
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL util_detect_low_res_screen()
|
BOOL util_detect_low_res_screen()
|
||||||
@ -636,12 +636,12 @@ BOOL util_detect_low_res_screen()
|
|||||||
static int* is_vqa_640 = (int*)0x0065D7BC;
|
static int* is_vqa_640 = (int*)0x0065D7BC;
|
||||||
static BYTE* should_stretch = (BYTE*)0x00607D78;
|
static BYTE* should_stretch = (BYTE*)0x00607D78;
|
||||||
|
|
||||||
if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height)
|
if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->isredalert)
|
if (g_ddraw.isredalert)
|
||||||
{
|
{
|
||||||
if ((*in_movie && !*is_vqa_640) || *should_stretch)
|
if ((*in_movie && !*is_vqa_640) || *should_stretch)
|
||||||
{
|
{
|
||||||
@ -650,15 +650,15 @@ BOOL util_detect_low_res_screen()
|
|||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (g_ddraw->iscnc1)
|
else if (g_ddraw.iscnc1)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 ||
|
util_get_pixel(g_ddraw.upscale_hack_width + 1, 0) == 0 ||
|
||||||
util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0;
|
util_get_pixel(g_ddraw.upscale_hack_width + 5, 1) == 0;
|
||||||
}
|
}
|
||||||
else if (g_ddraw->iskkndx)
|
else if (g_ddraw.iskkndx)
|
||||||
{
|
{
|
||||||
return util_get_pixel(g_ddraw->width - 3, 3) == 0;
|
return util_get_pixel(g_ddraw.width - 3, 3) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width)
|
if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width)
|
||||||
return real_GetCursorPos(lpPoint);
|
return real_GetCursorPos(lpPoint);
|
||||||
|
|
||||||
POINT pt, realpt;
|
POINT pt, realpt;
|
||||||
@ -32,16 +32,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
realpt.x = pt.x;
|
realpt.x = pt.x;
|
||||||
realpt.y = pt.y;
|
realpt.y = pt.y;
|
||||||
|
|
||||||
if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw->hwnd, &pt)))
|
if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)))
|
||||||
{
|
{
|
||||||
/* fallback solution for possible ClipCursor failure */
|
/* fallback solution for possible ClipCursor failure */
|
||||||
int diffx = 0, diffy = 0;
|
int diffx = 0, diffy = 0;
|
||||||
|
|
||||||
int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width;
|
int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width;
|
||||||
int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height;
|
int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height;
|
||||||
|
|
||||||
pt.x -= g_ddraw->mouse.x_adjust;
|
pt.x -= g_ddraw.mouse.x_adjust;
|
||||||
pt.y -= g_ddraw->mouse.y_adjust;
|
pt.y -= g_ddraw.mouse.y_adjust;
|
||||||
|
|
||||||
if (pt.x < 0)
|
if (pt.x < 0)
|
||||||
{
|
{
|
||||||
@ -75,38 +75,38 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
x = min((DWORD)(roundf(pt.x * g_ddraw->mouse.unscale_x)), g_ddraw->width - 1);
|
x = min((DWORD)(roundf(pt.x * g_ddraw.mouse.unscale_x)), g_ddraw.width - 1);
|
||||||
y = min((DWORD)(roundf(pt.y * g_ddraw->mouse.unscale_y)), g_ddraw->height - 1);
|
y = min((DWORD)(roundf(pt.y * g_ddraw.mouse.unscale_y)), g_ddraw.height - 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x = min(pt.x, g_ddraw->width - 1);
|
x = min(pt.x, g_ddraw.width - 1);
|
||||||
y = min(pt.y, g_ddraw->height - 1);
|
y = min(pt.y, g_ddraw.height - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0))
|
if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0))
|
||||||
{
|
{
|
||||||
diffx = 0;
|
diffx = 0;
|
||||||
diffy = 0;
|
diffy = 0;
|
||||||
|
|
||||||
if (x > g_ddraw->upscale_hack_width)
|
if (x > g_ddraw.upscale_hack_width)
|
||||||
{
|
{
|
||||||
diffx = x - g_ddraw->upscale_hack_width;
|
diffx = x - g_ddraw.upscale_hack_width;
|
||||||
x = g_ddraw->upscale_hack_width;
|
x = g_ddraw.upscale_hack_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y > g_ddraw->upscale_hack_height)
|
if (y > g_ddraw.upscale_hack_height)
|
||||||
{
|
{
|
||||||
diffy = y - g_ddraw->upscale_hack_height;
|
diffy = y - g_ddraw.upscale_hack_height;
|
||||||
y = g_ddraw->upscale_hack_height;
|
y = g_ddraw.upscale_hack_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diffx || diffy)
|
if (diffx || diffy)
|
||||||
real_SetCursorPos(realpt.x - diffx, realpt.y - diffy);
|
real_SetCursorPos(realpt.x - diffx, realpt.y - diffy);
|
||||||
}
|
}
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
if (lpPoint)
|
if (lpPoint)
|
||||||
{
|
{
|
||||||
@ -116,9 +116,9 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt))
|
else if (lpPoint && g_ddraw.bnet_active && real_ScreenToClient(g_ddraw.hwnd, &pt))
|
||||||
{
|
{
|
||||||
if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height)
|
if (pt.x > 0 && pt.x < g_ddraw.width && pt.y > 0 && pt.y < g_ddraw.height)
|
||||||
{
|
{
|
||||||
lpPoint->x = pt.x;
|
lpPoint->x = pt.x;
|
||||||
lpPoint->y = pt.y;
|
lpPoint->y = pt.y;
|
||||||
@ -129,8 +129,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
|
|
||||||
if (lpPoint)
|
if (lpPoint)
|
||||||
{
|
{
|
||||||
lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
|
lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
||||||
lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
|
lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -138,13 +138,13 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||||||
|
|
||||||
BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd && g_ddraw->width)
|
if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width)
|
||||||
{
|
{
|
||||||
RECT dst_rc = {
|
RECT dst_rc = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->width,
|
g_ddraw.width,
|
||||||
g_ddraw->height
|
g_ddraw.height
|
||||||
};
|
};
|
||||||
|
|
||||||
if (lpRect)
|
if (lpRect)
|
||||||
@ -152,28 +152,28 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
|||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w));
|
dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw.render.scale_w));
|
||||||
dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h));
|
dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw.render.scale_h));
|
||||||
dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw->render.scale_h));
|
dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw.render.scale_h));
|
||||||
dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w));
|
dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw.render.scale_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width;
|
int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width;
|
||||||
int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height;
|
int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height;
|
||||||
|
|
||||||
dst_rc.bottom = min(dst_rc.bottom, max_height);
|
dst_rc.bottom = min(dst_rc.bottom, max_height);
|
||||||
dst_rc.right = min(dst_rc.right, max_width);
|
dst_rc.right = min(dst_rc.right, max_width);
|
||||||
|
|
||||||
OffsetRect(
|
OffsetRect(
|
||||||
&dst_rc,
|
&dst_rc,
|
||||||
g_ddraw->mouse.x_adjust,
|
g_ddraw.mouse.x_adjust,
|
||||||
g_ddraw->mouse.y_adjust);
|
g_ddraw.mouse.y_adjust);
|
||||||
|
|
||||||
CopyRect(&g_ddraw->mouse.rc, &dst_rc);
|
CopyRect(&g_ddraw.mouse.rc, &dst_rc);
|
||||||
|
|
||||||
if (g_mouse_locked && !util_is_minimized(g_ddraw->hwnd))
|
if (g_mouse_locked && !util_is_minimized(g_ddraw.hwnd))
|
||||||
{
|
{
|
||||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2);
|
||||||
|
|
||||||
return real_ClipCursor(&dst_rc);
|
return real_ClipCursor(&dst_rc);
|
||||||
}
|
}
|
||||||
@ -184,19 +184,19 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
|
|||||||
|
|
||||||
int WINAPI fake_ShowCursor(BOOL bShow)
|
int WINAPI fake_ShowCursor(BOOL bShow)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (g_mouse_locked || g_config.devmode)
|
if (g_mouse_locked || g_config.devmode)
|
||||||
{
|
{
|
||||||
int count = real_ShowCursor(bShow);
|
int count = real_ShowCursor(bShow);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count);
|
InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, count);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return bShow ?
|
return bShow ?
|
||||||
InterlockedIncrement((LONG*)&g_ddraw->show_cursor_count) :
|
InterlockedIncrement((LONG*)&g_ddraw.show_cursor_count) :
|
||||||
InterlockedDecrement((LONG*)&g_ddraw->show_cursor_count);
|
InterlockedDecrement((LONG*)&g_ddraw.show_cursor_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,9 +205,9 @@ int WINAPI fake_ShowCursor(BOOL bShow)
|
|||||||
|
|
||||||
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor);
|
HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)hCursor);
|
||||||
|
|
||||||
if (!g_mouse_locked && !g_config.devmode)
|
if (!g_mouse_locked && !g_config.devmode)
|
||||||
return cursor;
|
return cursor;
|
||||||
@ -219,15 +219,15 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor)
|
|||||||
BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect)
|
BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect)
|
||||||
{
|
{
|
||||||
if (lpRect &&
|
if (lpRect &&
|
||||||
g_ddraw &&
|
g_ddraw.ref &&
|
||||||
g_ddraw->hwnd &&
|
g_ddraw.hwnd &&
|
||||||
(g_config.hook != 2 || g_ddraw->renderer == gdi_render_main))
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
||||||
{
|
{
|
||||||
if (g_ddraw->hwnd == hWnd)
|
if (g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
lpRect->bottom = g_ddraw->height;
|
lpRect->bottom = g_ddraw.height;
|
||||||
lpRect->left = 0;
|
lpRect->left = 0;
|
||||||
lpRect->right = g_ddraw->width;
|
lpRect->right = g_ddraw.width;
|
||||||
lpRect->top = 0;
|
lpRect->top = 0;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -236,7 +236,7 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect)
|
|||||||
{
|
{
|
||||||
if (real_GetWindowRect(hWnd, lpRect))
|
if (real_GetWindowRect(hWnd, lpRect))
|
||||||
{
|
{
|
||||||
real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)lpRect, 2);
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)lpRect, 2);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -251,13 +251,13 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect)
|
|||||||
BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect)
|
BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect)
|
||||||
{
|
{
|
||||||
if (lpRect &&
|
if (lpRect &&
|
||||||
g_ddraw &&
|
g_ddraw.ref &&
|
||||||
g_ddraw->hwnd == hWnd &&
|
g_ddraw.hwnd == hWnd &&
|
||||||
(g_config.hook != 2 || g_ddraw->renderer == gdi_render_main))
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
||||||
{
|
{
|
||||||
lpRect->bottom = g_ddraw->height;
|
lpRect->bottom = g_ddraw.height;
|
||||||
lpRect->left = 0;
|
lpRect->left = 0;
|
||||||
lpRect->right = g_ddraw->width;
|
lpRect->right = g_ddraw.width;
|
||||||
lpRect->top = 0;
|
lpRect->top = 0;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -268,29 +268,29 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect)
|
|||||||
|
|
||||||
BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd)
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
||||||
return real_ClientToScreen(hWnd, lpPoint);
|
return real_ClientToScreen(hWnd, lpPoint);
|
||||||
|
|
||||||
if (g_ddraw->hwnd != hWnd)
|
if (g_ddraw.hwnd != hWnd)
|
||||||
return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint);
|
return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw.hwnd, lpPoint);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd)
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
||||||
return real_ScreenToClient(hWnd, lpPoint);
|
return real_ScreenToClient(hWnd, lpPoint);
|
||||||
|
|
||||||
if (g_ddraw->hwnd != hWnd)
|
if (g_ddraw.hwnd != hWnd)
|
||||||
return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint);
|
return real_ClientToScreen(g_ddraw.hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width)
|
if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width)
|
||||||
return real_SetCursorPos(X, Y);
|
return real_SetCursorPos(X, Y);
|
||||||
|
|
||||||
if (!g_mouse_locked && !g_config.devmode)
|
if (!g_mouse_locked && !g_config.devmode)
|
||||||
@ -300,35 +300,35 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y)
|
|||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
pt.x = (LONG)(roundf(pt.x * g_ddraw->mouse.scale_x));
|
pt.x = (LONG)(roundf(pt.x * g_ddraw.mouse.scale_x));
|
||||||
pt.y = (LONG)(roundf(pt.y * g_ddraw->mouse.scale_y));
|
pt.y = (LONG)(roundf(pt.y * g_ddraw.mouse.scale_y));
|
||||||
}
|
}
|
||||||
|
|
||||||
pt.x += g_ddraw->mouse.x_adjust;
|
pt.x += g_ddraw.mouse.x_adjust;
|
||||||
pt.y += g_ddraw->mouse.y_adjust;
|
pt.y += g_ddraw.mouse.y_adjust;
|
||||||
|
|
||||||
return real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
return real_ClientToScreen(g_ddraw.hwnd, &pt) && real_SetCursorPos(pt.x, pt.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND WINAPI fake_WindowFromPoint(POINT Point)
|
HWND WINAPI fake_WindowFromPoint(POINT Point)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd)
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
||||||
return real_WindowFromPoint(Point);
|
return real_WindowFromPoint(Point);
|
||||||
|
|
||||||
POINT pt = { Point.x, Point.y };
|
POINT pt = { Point.x, Point.y };
|
||||||
return real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL;
|
return real_ClientToScreen(g_ddraw.hwnd, &pt) ? real_WindowFromPoint(pt) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->width)
|
if (!g_ddraw.ref || !g_ddraw.width)
|
||||||
return real_GetClipCursor(lpRect);
|
return real_GetClipCursor(lpRect);
|
||||||
|
|
||||||
if (lpRect)
|
if (lpRect)
|
||||||
{
|
{
|
||||||
lpRect->bottom = g_ddraw->height;
|
lpRect->bottom = g_ddraw.height;
|
||||||
lpRect->left = 0;
|
lpRect->left = 0;
|
||||||
lpRect->right = g_ddraw->width;
|
lpRect->right = g_ddraw.width;
|
||||||
lpRect->top = 0;
|
lpRect->top = 0;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -339,21 +339,21 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect)
|
|||||||
|
|
||||||
BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci)
|
BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd)
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
||||||
return real_GetCursorInfo(pci);
|
return real_GetCursorInfo(pci);
|
||||||
|
|
||||||
return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos);
|
return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw.hwnd, &pci->ptScreenPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WINAPI fake_GetSystemMetrics(int nIndex)
|
int WINAPI fake_GetSystemMetrics(int nIndex)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->width)
|
if (g_ddraw.ref && g_ddraw.width)
|
||||||
{
|
{
|
||||||
if (nIndex == SM_CXSCREEN)
|
if (nIndex == SM_CXSCREEN)
|
||||||
return g_ddraw->width;
|
return g_ddraw.width;
|
||||||
|
|
||||||
if (nIndex == SM_CYSCREEN)
|
if (nIndex == SM_CYSCREEN)
|
||||||
return g_ddraw->height;
|
return g_ddraw.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_GetSystemMetrics(nIndex);
|
return real_GetSystemMetrics(nIndex);
|
||||||
@ -361,19 +361,19 @@ int WINAPI fake_GetSystemMetrics(int nIndex)
|
|||||||
|
|
||||||
BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
|
BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw->hwnd == hWnd)
|
if (g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER;
|
UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER;
|
||||||
|
|
||||||
if ((uFlags & req_flags) != req_flags)
|
if ((uFlags & req_flags) != req_flags)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
||||||
{
|
{
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
if (real_ClientToScreen(g_ddraw->hwnd, &pt))
|
if (real_ClientToScreen(g_ddraw.hwnd, &pt))
|
||||||
{
|
{
|
||||||
X += pt.x;
|
X += pt.x;
|
||||||
Y += pt.y;
|
Y += pt.y;
|
||||||
@ -386,27 +386,27 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int
|
|||||||
|
|
||||||
BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
|
BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw->hwnd == hWnd)
|
if (g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw->width && g_ddraw->height && (nWidth != g_ddraw->width || nHeight != g_ddraw->height))
|
if (g_ddraw.width && g_ddraw.height && (nWidth != g_ddraw.width || nHeight != g_ddraw.height))
|
||||||
{
|
{
|
||||||
//real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y));
|
//real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y));
|
||||||
|
|
||||||
real_SendMessageA(
|
real_SendMessageA(
|
||||||
g_ddraw->hwnd,
|
g_ddraw.hwnd,
|
||||||
WM_SIZE_DDRAW,
|
WM_SIZE_DDRAW,
|
||||||
0,
|
0,
|
||||||
MAKELPARAM(min(nWidth, g_ddraw->width), min(nHeight, g_ddraw->height)));
|
MAKELPARAM(min(nWidth, g_ddraw.width), min(nHeight, g_ddraw.height)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD))
|
||||||
{
|
{
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
if (real_ClientToScreen(g_ddraw->hwnd, &pt))
|
if (real_ClientToScreen(g_ddraw.hwnd, &pt))
|
||||||
{
|
{
|
||||||
X += pt.x;
|
X += pt.x;
|
||||||
Y += pt.y;
|
Y += pt.y;
|
||||||
@ -419,35 +419,35 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO
|
|||||||
|
|
||||||
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
if (!g_ddraw || !g_ddraw->hwnd)
|
if (!g_ddraw.ref || !g_ddraw.hwnd)
|
||||||
return real_SendMessageA(hWnd, Msg, wParam, lParam);
|
return real_SendMessageA(hWnd, Msg, wParam, lParam);
|
||||||
|
|
||||||
if (g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE)
|
if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE)
|
||||||
{
|
{
|
||||||
int x = GET_X_LPARAM(lParam);
|
int x = GET_X_LPARAM(lParam);
|
||||||
int y = GET_Y_LPARAM(lParam);
|
int y = GET_Y_LPARAM(lParam);
|
||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
x = (int)(roundf(x * g_ddraw->mouse.scale_x));
|
x = (int)(roundf(x * g_ddraw.mouse.scale_x));
|
||||||
y = (int)(roundf(y * g_ddraw->mouse.scale_y));
|
y = (int)(roundf(y * g_ddraw.mouse.scale_y));
|
||||||
}
|
}
|
||||||
|
|
||||||
lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust);
|
lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2)
|
if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2)
|
||||||
{
|
{
|
||||||
Msg = WM_SIZE_DDRAW;
|
Msg = WM_SIZE_DDRAW;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam);
|
LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam);
|
||||||
|
|
||||||
if (result && g_ddraw && Msg == CB_GETDROPPEDCONTROLRECT)
|
if (result && g_ddraw.ref && Msg == CB_GETDROPPEDCONTROLRECT)
|
||||||
{
|
{
|
||||||
RECT* rc = (RECT*)lParam;
|
RECT* rc = (RECT*)lParam;
|
||||||
if (rc)
|
if (rc)
|
||||||
real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)rc, 2);
|
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)rc, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -455,15 +455,15 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar
|
|||||||
|
|
||||||
LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd)
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
if (nIndex == GWL_STYLE)
|
if (nIndex == GWL_STYLE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (nIndex == GWL_WNDPROC)
|
if (nIndex == GWL_WNDPROC)
|
||||||
{
|
{
|
||||||
WNDPROC old = g_ddraw->wndproc;
|
WNDPROC old = g_ddraw.wndproc;
|
||||||
g_ddraw->wndproc = (WNDPROC)dwNewLong;
|
g_ddraw.wndproc = (WNDPROC)dwNewLong;
|
||||||
|
|
||||||
return (LONG)old;
|
return (LONG)old;
|
||||||
}
|
}
|
||||||
@ -474,11 +474,11 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
|||||||
|
|
||||||
LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
|
LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd)
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
if (nIndex == GWL_WNDPROC)
|
if (nIndex == GWL_WNDPROC)
|
||||||
{
|
{
|
||||||
return (LONG)g_ddraw->wndproc;
|
return (LONG)g_ddraw.wndproc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,7 +487,7 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
|
|||||||
|
|
||||||
BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable)
|
BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd)
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -497,30 +497,30 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable)
|
|||||||
|
|
||||||
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
|
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (hWndTo == HWND_DESKTOP)
|
if (hWndTo == HWND_DESKTOP)
|
||||||
{
|
{
|
||||||
if (hWndFrom == g_ddraw->hwnd)
|
if (hWndFrom == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
//real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
||||||
//return real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, lpPoints, cPoints);
|
//return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hWndFrom == HWND_DESKTOP)
|
if (hWndFrom == HWND_DESKTOP)
|
||||||
{
|
{
|
||||||
if (hWndTo == g_ddraw->hwnd)
|
if (hWndTo == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, lpPoints, cPoints);
|
//real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints);
|
||||||
//return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
//return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -531,7 +531,7 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI
|
|||||||
|
|
||||||
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
|
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd == hWnd)
|
if (g_ddraw.ref && g_ddraw.hwnd == hWnd)
|
||||||
{
|
{
|
||||||
if (nCmdShow == SW_SHOWMAXIMIZED)
|
if (nCmdShow == SW_SHOWMAXIMIZED)
|
||||||
nCmdShow = SW_SHOWNORMAL;
|
nCmdShow = SW_SHOWNORMAL;
|
||||||
@ -548,9 +548,9 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
|
|||||||
|
|
||||||
HWND WINAPI fake_GetTopWindow(HWND hWnd)
|
HWND WINAPI fake_GetTopWindow(HWND hWnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_config.windowed && g_ddraw->hwnd && !hWnd)
|
if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd && !hWnd)
|
||||||
{
|
{
|
||||||
return g_ddraw->hwnd;
|
return g_ddraw.hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_GetTopWindow(hWnd);
|
return real_GetTopWindow(hWnd);
|
||||||
@ -558,9 +558,9 @@ HWND WINAPI fake_GetTopWindow(HWND hWnd)
|
|||||||
|
|
||||||
HWND WINAPI fake_GetForegroundWindow()
|
HWND WINAPI fake_GetForegroundWindow()
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_config.windowed && g_ddraw->hwnd)
|
if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
return g_ddraw->hwnd;
|
return g_ddraw.hwnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_GetForegroundWindow();
|
return real_GetForegroundWindow();
|
||||||
@ -568,7 +568,7 @@ HWND WINAPI fake_GetForegroundWindow()
|
|||||||
|
|
||||||
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd)
|
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->bnet_active)
|
if (g_ddraw.ref && g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -596,7 +596,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D
|
|||||||
|
|
||||||
BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
|
BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->width)
|
if (g_ddraw.ref && g_ddraw.width)
|
||||||
{
|
{
|
||||||
switch (lpMsg->message)
|
switch (lpMsg->message)
|
||||||
{
|
{
|
||||||
@ -609,22 +609,22 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa
|
|||||||
int x = GET_X_LPARAM(lpMsg->lParam);
|
int x = GET_X_LPARAM(lpMsg->lParam);
|
||||||
int y = GET_Y_LPARAM(lpMsg->lParam);
|
int y = GET_Y_LPARAM(lpMsg->lParam);
|
||||||
|
|
||||||
if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width ||
|
if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
|
||||||
x < g_ddraw->render.viewport.x ||
|
x < g_ddraw.render.viewport.x ||
|
||||||
y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height ||
|
y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
|
||||||
y < g_ddraw->render.viewport.y)
|
y < g_ddraw.render.viewport.y)
|
||||||
{
|
{
|
||||||
x = g_ddraw->width / 2;
|
x = g_ddraw.width / 2;
|
||||||
y = g_ddraw->height / 2;
|
y = g_ddraw.height / 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x);
|
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
|
||||||
y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y);
|
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
//return FALSE;
|
//return FALSE;
|
||||||
@ -654,12 +654,12 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa
|
|||||||
if (lpMsg->message == WM_MOUSEWHEEL)
|
if (lpMsg->message == WM_MOUSEWHEEL)
|
||||||
{
|
{
|
||||||
POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) };
|
POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) };
|
||||||
real_ScreenToClient(g_ddraw->hwnd, &pt);
|
real_ScreenToClient(g_ddraw.hwnd, &pt);
|
||||||
lpMsg->lParam = MAKELPARAM(pt.x, pt.y);
|
lpMsg->lParam = MAKELPARAM(pt.x, pt.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw->mouse.x_adjust, 0);
|
int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0);
|
||||||
int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw->mouse.y_adjust, 0);
|
int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0);
|
||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
@ -673,16 +673,16 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x));
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
||||||
y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y));
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x = min(x, g_ddraw->width - 1);
|
x = min(x, g_ddraw.width - 1);
|
||||||
y = min(y, g_ddraw->height - 1);
|
y = min(y, g_ddraw.height - 1);
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
lpMsg->lParam = MAKELPARAM(x, y);
|
lpMsg->lParam = MAKELPARAM(x, y);
|
||||||
fake_GetCursorPos(&lpMsg->pt);
|
fake_GetCursorPos(&lpMsg->pt);
|
||||||
@ -718,7 +718,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w
|
|||||||
|
|
||||||
SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
||||||
{
|
{
|
||||||
if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground())
|
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -728,7 +728,7 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey)
|
|||||||
|
|
||||||
SHORT WINAPI fake_GetAsyncKeyState(int vKey)
|
SHORT WINAPI fake_GetAsyncKeyState(int vKey)
|
||||||
{
|
{
|
||||||
if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground())
|
if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -738,18 +738,18 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey)
|
|||||||
|
|
||||||
int WINAPI fake_GetDeviceCaps(HDC hdc, int index)
|
int WINAPI fake_GetDeviceCaps(HDC hdc, int index)
|
||||||
{
|
{
|
||||||
if (g_ddraw &&
|
if (g_ddraw.ref &&
|
||||||
g_ddraw->bpp &&
|
g_ddraw.bpp &&
|
||||||
index == BITSPIXEL &&
|
index == BITSPIXEL &&
|
||||||
(g_config.hook != 2 || g_ddraw->renderer == gdi_render_main))
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
||||||
{
|
{
|
||||||
return g_ddraw->bpp;
|
return g_ddraw.bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw &&
|
if (g_ddraw.ref &&
|
||||||
g_ddraw->bpp == 8 &&
|
g_ddraw.bpp == 8 &&
|
||||||
index == RASTERCAPS &&
|
index == RASTERCAPS &&
|
||||||
(g_config.hook != 2 || g_ddraw->renderer == gdi_render_main))
|
(g_config.hook != 2 || g_ddraw.renderer == gdi_render_main))
|
||||||
{
|
{
|
||||||
return RC_PALETTE | real_GetDeviceCaps(hdc, index);
|
return RC_PALETTE | real_GetDeviceCaps(hdc, index);
|
||||||
}
|
}
|
||||||
@ -774,42 +774,42 @@ BOOL WINAPI fake_StretchBlt(
|
|||||||
|
|
||||||
char class_name[MAX_PATH] = { 0 };
|
char class_name[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd &&
|
if (g_ddraw.ref && g_ddraw.hwnd &&
|
||||||
(hwnd == g_ddraw->hwnd ||
|
(hwnd == g_ddraw.hwnd ||
|
||||||
(g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) &&
|
(g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) &&
|
||||||
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
||||||
strcmp(class_name, "MCIAVI") == 0 ||
|
strcmp(class_name, "MCIAVI") == 0 ||
|
||||||
strcmp(class_name, "AVIWnd32") == 0 ||
|
strcmp(class_name, "AVIWnd32") == 0 ||
|
||||||
strcmp(class_name, "MCIWndClass") == 0))))
|
strcmp(class_name, "MCIWndClass") == 0))))
|
||||||
{
|
{
|
||||||
if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette))
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
HDC primary_dc;
|
HDC primary_dc;
|
||||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||||
|
|
||||||
if (primary_dc)
|
if (primary_dc)
|
||||||
{
|
{
|
||||||
BOOL result =
|
BOOL result =
|
||||||
real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop);
|
real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop);
|
||||||
|
|
||||||
dds_ReleaseDC(g_ddraw->primary, primary_dc);
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_ddraw->width > 0 && g_ddraw->render.hdc)
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
||||||
{
|
{
|
||||||
return real_StretchBlt(
|
return real_StretchBlt(
|
||||||
g_ddraw->render.hdc,
|
g_ddraw.render.hdc,
|
||||||
xDest + g_ddraw->render.viewport.x,
|
xDest + g_ddraw.render.viewport.x,
|
||||||
yDest + g_ddraw->render.viewport.y,
|
yDest + g_ddraw.render.viewport.y,
|
||||||
(int)(wDest * g_ddraw->render.scale_w),
|
(int)(wDest * g_ddraw.render.scale_w),
|
||||||
(int)(hDest * g_ddraw->render.scale_h),
|
(int)(hDest * g_ddraw.render.scale_h),
|
||||||
hdcSrc,
|
hdcSrc,
|
||||||
xSrc,
|
xSrc,
|
||||||
ySrc,
|
ySrc,
|
||||||
@ -836,12 +836,12 @@ int WINAPI fake_SetDIBitsToDevice(
|
|||||||
const BITMAPINFO* lpbmi,
|
const BITMAPINFO* lpbmi,
|
||||||
UINT ColorUse)
|
UINT ColorUse)
|
||||||
{
|
{
|
||||||
if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette))
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
HDC primary_dc;
|
HDC primary_dc;
|
||||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||||
|
|
||||||
if (primary_dc)
|
if (primary_dc)
|
||||||
{
|
{
|
||||||
@ -860,7 +860,7 @@ int WINAPI fake_SetDIBitsToDevice(
|
|||||||
lpbmi,
|
lpbmi,
|
||||||
ColorUse);
|
ColorUse);
|
||||||
|
|
||||||
dds_ReleaseDC(g_ddraw->primary, primary_dc);
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -889,23 +889,23 @@ int WINAPI fake_StretchDIBits(
|
|||||||
|
|
||||||
char class_name[MAX_PATH] = { 0 };
|
char class_name[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd)
|
if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd &&
|
if (g_ddraw.ref && g_ddraw.hwnd &&
|
||||||
(hwnd == g_ddraw->hwnd ||
|
(hwnd == g_ddraw.hwnd ||
|
||||||
(g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) &&
|
(g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) &&
|
||||||
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
(g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
|
||||||
strcmp(class_name, "MCIAVI") == 0 ||
|
strcmp(class_name, "MCIAVI") == 0 ||
|
||||||
strcmp(class_name, "AVIWnd32") == 0 ||
|
strcmp(class_name, "AVIWnd32") == 0 ||
|
||||||
strcmp(class_name, "MCIWndClass") == 0))))
|
strcmp(class_name, "MCIWndClass") == 0))))
|
||||||
{
|
{
|
||||||
if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette))
|
if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette))
|
||||||
{
|
{
|
||||||
HDC primary_dc;
|
HDC primary_dc;
|
||||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||||
|
|
||||||
if (primary_dc)
|
if (primary_dc)
|
||||||
{
|
{
|
||||||
@ -925,20 +925,20 @@ int WINAPI fake_StretchDIBits(
|
|||||||
iUsage,
|
iUsage,
|
||||||
rop);
|
rop);
|
||||||
|
|
||||||
dds_ReleaseDC(g_ddraw->primary, primary_dc);
|
dds_ReleaseDC(g_ddraw.primary, primary_dc);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_ddraw->width > 0 && g_ddraw->render.hdc)
|
else if (g_ddraw.width > 0 && g_ddraw.render.hdc)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
real_StretchDIBits(
|
real_StretchDIBits(
|
||||||
g_ddraw->render.hdc,
|
g_ddraw.render.hdc,
|
||||||
xDest + g_ddraw->render.viewport.x,
|
xDest + g_ddraw.render.viewport.x,
|
||||||
yDest + g_ddraw->render.viewport.y,
|
yDest + g_ddraw.render.viewport.y,
|
||||||
(int)(DestWidth * g_ddraw->render.scale_w),
|
(int)(DestWidth * g_ddraw.render.scale_w),
|
||||||
(int)(DestHeight * g_ddraw->render.scale_h),
|
(int)(DestHeight * g_ddraw.render.scale_h),
|
||||||
xSrc,
|
xSrc,
|
||||||
ySrc,
|
ySrc,
|
||||||
SrcWidth,
|
SrcWidth,
|
||||||
@ -1227,49 +1227,49 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
|||||||
{
|
{
|
||||||
BOOL result = real_DestroyWindow(hWnd);
|
BOOL result = real_DestroyWindow(hWnd);
|
||||||
|
|
||||||
if (result && g_ddraw && hWnd == g_ddraw->hwnd)
|
if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
g_ddraw->hwnd = NULL;
|
g_ddraw.hwnd = NULL;
|
||||||
g_ddraw->wndproc = NULL;
|
g_ddraw.wndproc = NULL;
|
||||||
g_ddraw->render.hdc = NULL;
|
g_ddraw.render.hdc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw && g_ddraw->hwnd != hWnd && g_ddraw->bnet_active)
|
if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
|
|
||||||
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
||||||
{
|
{
|
||||||
g_ddraw->bnet_active = FALSE;
|
g_ddraw.bnet_active = FALSE;
|
||||||
SetFocus(g_ddraw->hwnd);
|
SetFocus(g_ddraw.hwnd);
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
|
|
||||||
if (g_config.windowed)
|
if (g_config.windowed)
|
||||||
{
|
{
|
||||||
g_ddraw->bnet_pos.x = g_ddraw->bnet_pos.y = 0;
|
g_ddraw.bnet_pos.x = g_ddraw.bnet_pos.y = 0;
|
||||||
real_ClientToScreen(g_ddraw->hwnd, &g_ddraw->bnet_pos);
|
real_ClientToScreen(g_ddraw.hwnd, &g_ddraw.bnet_pos);
|
||||||
|
|
||||||
if (!g_ddraw->bnet_was_upscaled)
|
if (!g_ddraw.bnet_was_upscaled)
|
||||||
{
|
{
|
||||||
int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left;
|
int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left;
|
||||||
int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top;
|
int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top;
|
||||||
|
|
||||||
UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE;
|
UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE;
|
||||||
|
|
||||||
int dst_width = width == g_ddraw->width ? 0 : width;
|
int dst_width = width == g_ddraw.width ? 0 : width;
|
||||||
int dst_height = height == g_ddraw->height ? 0 : height;
|
int dst_height = height == g_ddraw.height ? 0 : height;
|
||||||
|
|
||||||
util_set_window_rect(
|
util_set_window_rect(
|
||||||
g_ddraw->bnet_win_rect.left,
|
g_ddraw.bnet_win_rect.left,
|
||||||
g_ddraw->bnet_win_rect.top,
|
g_ddraw.bnet_win_rect.top,
|
||||||
dst_width,
|
dst_width,
|
||||||
dst_height,
|
dst_height,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_config.fullscreen = g_ddraw->bnet_was_upscaled;
|
g_config.fullscreen = g_ddraw.bnet_was_upscaled;
|
||||||
|
|
||||||
SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
|
SetTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
|
||||||
|
|
||||||
g_config.resizable = TRUE;
|
g_config.resizable = TRUE;
|
||||||
}
|
}
|
||||||
@ -1286,14 +1286,14 @@ HWND WINAPI fake_CreateWindowExA(
|
|||||||
/* Center Claw DVD movies */
|
/* Center Claw DVD movies */
|
||||||
if (HIWORD(lpClassName) &&
|
if (HIWORD(lpClassName) &&
|
||||||
_strcmpi(lpClassName, "Afx:400000:3") == 0 &&
|
_strcmpi(lpClassName, "Afx:400000:3") == 0 &&
|
||||||
g_ddraw && g_ddraw->hwnd && g_ddraw->width &&
|
g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width &&
|
||||||
(dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD))
|
(dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD))
|
||||||
{
|
{
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
real_ClientToScreen(g_ddraw->hwnd, &pt);
|
real_ClientToScreen(g_ddraw.hwnd, &pt);
|
||||||
|
|
||||||
int added_height = g_ddraw->render.height - g_ddraw->height;
|
int added_height = g_ddraw.render.height - g_ddraw.height;
|
||||||
int added_width = g_ddraw->render.width - g_ddraw->width;
|
int added_width = g_ddraw.render.width - g_ddraw.width;
|
||||||
int align_y = added_height > 0 ? added_height / 2 : 0;
|
int align_y = added_height > 0 ? added_height / 2 : 0;
|
||||||
int align_x = added_width > 0 ? added_width / 2 : 0;
|
int align_x = added_width > 0 ? added_width / 2 : 0;
|
||||||
|
|
||||||
@ -1302,52 +1302,52 @@ HWND WINAPI fake_CreateWindowExA(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fix for SMACKW32.DLL creating another window that steals the focus */
|
/* Fix for SMACKW32.DLL creating another window that steals the focus */
|
||||||
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd)
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
dwStyle &= ~WS_VISIBLE;
|
dwStyle &= ~WS_VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw && g_ddraw->hwnd)
|
if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
if (!g_ddraw->bnet_active)
|
if (!g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
g_ddraw->bnet_was_upscaled = g_config.fullscreen;
|
g_ddraw.bnet_was_upscaled = g_config.fullscreen;
|
||||||
g_config.fullscreen = FALSE;
|
g_config.fullscreen = FALSE;
|
||||||
|
|
||||||
if (!g_config.windowed && !g_ddraw->bnet_was_fullscreen)
|
if (!g_config.windowed && !g_ddraw.bnet_was_fullscreen)
|
||||||
{
|
{
|
||||||
int ws = g_config.window_state;
|
int ws = g_config.window_state;
|
||||||
util_toggle_fullscreen();
|
util_toggle_fullscreen();
|
||||||
g_config.window_state = ws;
|
g_config.window_state = ws;
|
||||||
g_ddraw->bnet_was_fullscreen = TRUE;
|
g_ddraw.bnet_was_fullscreen = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect);
|
real_GetClientRect(g_ddraw.hwnd, &g_ddraw.bnet_win_rect);
|
||||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2);
|
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw.bnet_win_rect, 2);
|
||||||
|
|
||||||
int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left;
|
int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left;
|
||||||
int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top;
|
int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top;
|
||||||
|
|
||||||
int x = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.x : -32000;
|
int x = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.x : -32000;
|
||||||
int y = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.y : -32000;
|
int y = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.y : -32000;
|
||||||
|
|
||||||
UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE;
|
UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE;
|
||||||
|
|
||||||
int dst_width = g_config.window_rect.right ? g_ddraw->width : 0;
|
int dst_width = g_config.window_rect.right ? g_ddraw.width : 0;
|
||||||
int dst_height = g_config.window_rect.bottom ? g_ddraw->height : 0;
|
int dst_height = g_config.window_rect.bottom ? g_ddraw.height : 0;
|
||||||
|
|
||||||
util_set_window_rect(x, y, dst_width, dst_height, flags);
|
util_set_window_rect(x, y, dst_width, dst_height, flags);
|
||||||
g_config.resizable = FALSE;
|
g_config.resizable = FALSE;
|
||||||
|
|
||||||
g_ddraw->bnet_active = TRUE;
|
g_ddraw.bnet_active = TRUE;
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
real_ClientToScreen(g_ddraw->hwnd, &pt);
|
real_ClientToScreen(g_ddraw.hwnd, &pt);
|
||||||
|
|
||||||
int added_height = g_ddraw->height - 480;
|
int added_height = g_ddraw.height - 480;
|
||||||
int added_width = g_ddraw->width - 640;
|
int added_width = g_ddraw.width - 640;
|
||||||
int align_y = added_height > 0 ? added_height / 2 : 0;
|
int align_y = added_height > 0 ? added_height / 2 : 0;
|
||||||
int align_x = added_width > 0 ? added_width / 2 : 0;
|
int align_x = added_width > 0 ? added_width / 2 : 0;
|
||||||
|
|
||||||
|
214
src/wndproc.c
214
src/wndproc.c
@ -54,15 +54,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
|
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
|
||||||
|
|
||||||
if (g_config.windowed && g_ddraw->width)
|
if (g_config.windowed && g_ddraw.width)
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
|
||||||
|
|
||||||
AdjustWindowRectEx(
|
AdjustWindowRectEx(
|
||||||
&rc,
|
&rc,
|
||||||
real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE),
|
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
|
||||||
GetMenu(g_ddraw->hwnd) != NULL,
|
GetMenu(g_ddraw.hwnd) != NULL,
|
||||||
real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE));
|
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
|
||||||
|
|
||||||
if (mmi->ptMaxTrackSize.x < rc.right - rc.left)
|
if (mmi->ptMaxTrackSize.x < rc.right - rc.left)
|
||||||
mmi->ptMaxTrackSize.x = rc.right - rc.left;
|
mmi->ptMaxTrackSize.x = rc.right - rc.left;
|
||||||
@ -71,13 +71,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
mmi->ptMaxTrackSize.y = rc.bottom - rc.top;
|
mmi->ptMaxTrackSize.y = rc.bottom - rc.top;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RECT rcmin = { 0, 0, g_ddraw->width, g_ddraw->height };
|
RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||||
|
|
||||||
AdjustWindowRectEx(
|
AdjustWindowRectEx(
|
||||||
&rcmin,
|
&rcmin,
|
||||||
real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE),
|
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
|
||||||
GetMenu(g_ddraw->hwnd) != NULL,
|
GetMenu(g_ddraw.hwnd) != NULL,
|
||||||
real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE));
|
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
|
||||||
|
|
||||||
mmi->ptMinTrackSize.x = rcmin.right - rcmin.left;
|
mmi->ptMinTrackSize.x = rcmin.right - rcmin.left;
|
||||||
mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top;
|
mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top;
|
||||||
@ -122,7 +122,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
case WM_SETCURSOR:
|
case WM_SETCURSOR:
|
||||||
{
|
{
|
||||||
/* show resize cursor on window borders */
|
/* show resize cursor on window borders */
|
||||||
if ((HWND)wParam == g_ddraw->hwnd)
|
if ((HWND)wParam == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
WORD message = HIWORD(lParam);
|
WORD message = HIWORD(lParam);
|
||||||
|
|
||||||
@ -176,8 +176,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
case WM_D3D9DEVICELOST:
|
case WM_D3D9DEVICELOST:
|
||||||
{
|
{
|
||||||
if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) &&
|
if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) &&
|
||||||
g_ddraw->renderer == d3d9_render_main &&
|
g_ddraw.renderer == d3d9_render_main &&
|
||||||
d3d9_on_device_lost())
|
d3d9_on_device_lost())
|
||||||
{
|
{
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
@ -191,24 +191,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
case IDT_TIMER_LEAVE_BNET:
|
case IDT_TIMER_LEAVE_BNET:
|
||||||
{
|
{
|
||||||
KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET);
|
KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET);
|
||||||
|
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
g_ddraw->bnet_was_fullscreen = FALSE;
|
g_ddraw.bnet_was_fullscreen = FALSE;
|
||||||
|
|
||||||
if (!g_ddraw->bnet_active)
|
if (!g_ddraw.bnet_active)
|
||||||
{
|
{
|
||||||
if (g_ddraw->bnet_was_fullscreen)
|
if (g_ddraw.bnet_was_fullscreen)
|
||||||
{
|
{
|
||||||
int ws = g_config.window_state;
|
int ws = g_config.window_state;
|
||||||
util_toggle_fullscreen();
|
util_toggle_fullscreen();
|
||||||
g_config.window_state = ws;
|
g_config.window_state = ws;
|
||||||
g_ddraw->bnet_was_fullscreen = FALSE;
|
g_ddraw.bnet_was_fullscreen = FALSE;
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bnet_was_upscaled)
|
else if (g_ddraw.bnet_was_upscaled)
|
||||||
{
|
{
|
||||||
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
g_ddraw->bnet_was_upscaled = FALSE;
|
g_ddraw.bnet_was_upscaled = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,9 +231,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
if (g_config.is_wine &&
|
if (g_config.is_wine &&
|
||||||
!g_config.windowed &&
|
!g_config.windowed &&
|
||||||
(pos->x > 0 || pos->y > 0) &&
|
(pos->x > 0 || pos->y > 0) &&
|
||||||
g_ddraw->last_set_window_pos_tick + 500 < timeGetTime())
|
g_ddraw.last_set_window_pos_tick + 500 < timeGetTime())
|
||||||
{
|
{
|
||||||
PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0);
|
PostMessage(g_ddraw.hwnd, WM_WINEFULLSCREEN, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -242,24 +242,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
{
|
{
|
||||||
g_ddraw->last_set_window_pos_tick = timeGetTime();
|
g_ddraw.last_set_window_pos_tick = timeGetTime();
|
||||||
|
|
||||||
real_SetWindowPos(
|
real_SetWindowPos(
|
||||||
g_ddraw->hwnd,
|
g_ddraw.hwnd,
|
||||||
HWND_TOPMOST,
|
HWND_TOPMOST,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
g_ddraw->render.width,
|
g_ddraw.render.width,
|
||||||
g_ddraw->render.height,
|
g_ddraw.render.height,
|
||||||
SWP_SHOWWINDOW);
|
SWP_SHOWWINDOW);
|
||||||
|
|
||||||
real_SetWindowPos(
|
real_SetWindowPos(
|
||||||
g_ddraw->hwnd,
|
g_ddraw.hwnd,
|
||||||
HWND_TOPMOST,
|
HWND_TOPMOST,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
g_ddraw->render.width,
|
g_ddraw.render.width,
|
||||||
g_ddraw->render.height,
|
g_ddraw.render.height,
|
||||||
SWP_SHOWWINDOW);
|
SWP_SHOWWINDOW);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -278,8 +278,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
in_size_move = FALSE;
|
in_size_move = FALSE;
|
||||||
|
|
||||||
if (!g_ddraw->render.thread)
|
if (!g_ddraw.render.thread)
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -291,15 +291,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (in_size_move)
|
if (in_size_move)
|
||||||
{
|
{
|
||||||
if (g_ddraw->render.thread)
|
if (g_ddraw.render.thread)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&g_ddraw->cs);
|
EnterCriticalSection(&g_ddraw.cs);
|
||||||
g_ddraw->render.run = FALSE;
|
g_ddraw.render.run = FALSE;
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
LeaveCriticalSection(&g_ddraw->cs);
|
LeaveCriticalSection(&g_ddraw.cs);
|
||||||
|
|
||||||
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
|
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
|
||||||
g_ddraw->render.thread = NULL;
|
g_ddraw.render.thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RECT clientrc = { 0 };
|
RECT clientrc = { 0 };
|
||||||
@ -314,8 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
||||||
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
||||||
{
|
{
|
||||||
double scaleH = (double)g_ddraw->height / g_ddraw->width;
|
double scaleH = (double)g_ddraw.height / g_ddraw.width;
|
||||||
double scaleW = (double)g_ddraw->width / g_ddraw->height;
|
double scaleW = (double)g_ddraw.width / g_ddraw.height;
|
||||||
|
|
||||||
switch (wParam)
|
switch (wParam)
|
||||||
{
|
{
|
||||||
@ -351,7 +351,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
||||||
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
||||||
{
|
{
|
||||||
if (clientrc.right < g_ddraw->width)
|
if (clientrc.right < g_ddraw.width)
|
||||||
{
|
{
|
||||||
switch (wParam)
|
switch (wParam)
|
||||||
{
|
{
|
||||||
@ -361,20 +361,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
case WMSZ_BOTTOM:
|
case WMSZ_BOTTOM:
|
||||||
case WMSZ_TOP:
|
case WMSZ_TOP:
|
||||||
{
|
{
|
||||||
windowrc->right += g_ddraw->width - clientrc.right;
|
windowrc->right += g_ddraw.width - clientrc.right;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WMSZ_TOPLEFT:
|
case WMSZ_TOPLEFT:
|
||||||
case WMSZ_BOTTOMLEFT:
|
case WMSZ_BOTTOMLEFT:
|
||||||
case WMSZ_LEFT:
|
case WMSZ_LEFT:
|
||||||
{
|
{
|
||||||
windowrc->left -= g_ddraw->width - clientrc.right;
|
windowrc->left -= g_ddraw.width - clientrc.right;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clientrc.bottom < g_ddraw->height)
|
if (clientrc.bottom < g_ddraw.height)
|
||||||
{
|
{
|
||||||
switch (wParam)
|
switch (wParam)
|
||||||
{
|
{
|
||||||
@ -384,14 +384,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
case WMSZ_RIGHT:
|
case WMSZ_RIGHT:
|
||||||
case WMSZ_LEFT:
|
case WMSZ_LEFT:
|
||||||
{
|
{
|
||||||
windowrc->bottom += g_ddraw->height - clientrc.bottom;
|
windowrc->bottom += g_ddraw.height - clientrc.bottom;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WMSZ_TOPLEFT:
|
case WMSZ_TOPLEFT:
|
||||||
case WMSZ_TOPRIGHT:
|
case WMSZ_TOPRIGHT:
|
||||||
case WMSZ_TOP:
|
case WMSZ_TOP:
|
||||||
{
|
{
|
||||||
windowrc->top -= g_ddraw->height - clientrc.bottom;
|
windowrc->top -= g_ddraw.height - clientrc.bottom;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -423,24 +423,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (wParam == SIZE_RESTORED)
|
if (wParam == SIZE_RESTORED)
|
||||||
{
|
{
|
||||||
if (in_size_move && !g_ddraw->render.thread)
|
if (in_size_move && !g_ddraw.render.thread)
|
||||||
{
|
{
|
||||||
g_config.window_rect.right = LOWORD(lParam);
|
g_config.window_rect.right = LOWORD(lParam);
|
||||||
g_config.window_rect.bottom = HIWORD(lParam);
|
g_config.window_rect.bottom = HIWORD(lParam);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
else if (g_ddraw->wine)
|
else if (g_ddraw.wine)
|
||||||
{
|
{
|
||||||
WindowRect.right = LOWORD(lParam);
|
WindowRect.right = LOWORD(lParam);
|
||||||
WindowRect.bottom = HIWORD(lParam);
|
WindowRect.bottom = HIWORD(lParam);
|
||||||
if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height)
|
if (WindowRect.right != g_ddraw.render.width || WindowRect.bottom != g_ddraw.render.height)
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
|
dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->got_child_windows)
|
if (g_ddraw.got_child_windows)
|
||||||
{
|
{
|
||||||
redraw_count = 2;
|
redraw_count = 2;
|
||||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
util_update_bnet_pos(x, y);
|
util_update_bnet_pos(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw->render.thread))
|
if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw.render.thread))
|
||||||
{
|
{
|
||||||
if (x != -32000)
|
if (x != -32000)
|
||||||
g_config.window_rect.left = x; /* -32000 = Exit/Minimize */
|
g_config.window_rect.left = x; /* -32000 = Exit/Minimize */
|
||||||
@ -470,7 +470,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->got_child_windows)
|
if (g_ddraw.got_child_windows)
|
||||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
|
|
||||||
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
|
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
|
||||||
@ -479,11 +479,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (!g_config.is_wine) /* hack: disable aero snap */
|
if (!g_config.is_wine) /* hack: disable aero snap */
|
||||||
{
|
{
|
||||||
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
|
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
|
||||||
|
|
||||||
if (!(style & WS_MAXIMIZEBOX))
|
if (!(style & WS_MAXIMIZEBOX))
|
||||||
{
|
{
|
||||||
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
|
real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -492,11 +492,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */
|
if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */
|
||||||
{
|
{
|
||||||
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
|
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
|
||||||
|
|
||||||
if ((style & WS_MAXIMIZEBOX))
|
if ((style & WS_MAXIMIZEBOX))
|
||||||
{
|
{
|
||||||
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX);
|
real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +515,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL)
|
if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!GameHandlesClose)
|
if (!GameHandlesClose)
|
||||||
@ -541,7 +541,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
|
||||||
if (real_GetForegroundWindow() == g_ddraw->hwnd)
|
if (real_GetForegroundWindow() == g_ddraw.hwnd)
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -556,7 +556,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE)
|
if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE)
|
||||||
{
|
{
|
||||||
if (g_ddraw->got_child_windows)
|
if (g_ddraw.got_child_windows)
|
||||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,7 +597,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (g_ddraw->windowed || g_ddraw->noactivateapp)
|
//if (g_ddraw.windowed || g_ddraw.noactivateapp)
|
||||||
|
|
||||||
if (!g_config.allow_wmactivate)
|
if (!g_config.allow_wmactivate)
|
||||||
return 0;
|
return 0;
|
||||||
@ -610,19 +610,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
{
|
{
|
||||||
if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive)
|
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN);
|
||||||
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
|
real_ShowWindow(g_ddraw.hwnd, SW_RESTORE);
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)
|
else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)
|
||||||
{
|
{
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -631,15 +631,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
|
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
|
||||||
if (g_config.is_wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime())
|
if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!g_config.windowed)
|
if (!g_config.windowed)
|
||||||
{
|
{
|
||||||
if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive)
|
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
|
||||||
{
|
{
|
||||||
real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE);
|
real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE);
|
||||||
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
|
ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -674,8 +674,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wParam && g_ddraw->alt_key_down && !g_config.releasealt)
|
if (wParam && g_ddraw.alt_key_down && !g_config.releasealt)
|
||||||
PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0);
|
PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -684,8 +684,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
case WM_AUTORENDERER:
|
case WM_AUTORENDERER:
|
||||||
{
|
{
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
real_SetWindowPos(g_ddraw.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
real_SetWindowPos(g_ddraw.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -751,7 +751,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
|
|
||||||
if (wParam == VK_MENU)
|
if (wParam == VK_MENU)
|
||||||
{
|
{
|
||||||
g_ddraw->alt_key_down = TRUE;
|
g_ddraw.alt_key_down = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -760,7 +760,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (wParam == VK_MENU)
|
if (wParam == VK_MENU)
|
||||||
{
|
{
|
||||||
g_ddraw->alt_key_down = FALSE;
|
g_ddraw.alt_key_down = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen))
|
if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen))
|
||||||
@ -792,7 +792,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
|
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
|
||||||
if (video_hwnd)
|
if (video_hwnd)
|
||||||
{
|
{
|
||||||
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
||||||
@ -804,9 +804,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
{
|
{
|
||||||
if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot)
|
if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot)
|
||||||
ss_take_screenshot(g_ddraw->primary);
|
ss_take_screenshot(g_ddraw.primary);
|
||||||
|
|
||||||
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
|
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
|
||||||
if (video_hwnd)
|
if (video_hwnd)
|
||||||
{
|
{
|
||||||
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
||||||
@ -825,22 +825,22 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
int x = GET_X_LPARAM(lParam);
|
int x = GET_X_LPARAM(lParam);
|
||||||
int y = GET_Y_LPARAM(lParam);
|
int y = GET_Y_LPARAM(lParam);
|
||||||
|
|
||||||
if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width ||
|
if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
|
||||||
x < g_ddraw->render.viewport.x ||
|
x < g_ddraw.render.viewport.x ||
|
||||||
y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height ||
|
y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
|
||||||
y < g_ddraw->render.viewport.y)
|
y < g_ddraw.render.viewport.y)
|
||||||
{
|
{
|
||||||
x = g_ddraw->width / 2;
|
x = g_ddraw.width / 2;
|
||||||
y = g_ddraw->height / 2;
|
y = g_ddraw.height / 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x);
|
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
|
||||||
y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y);
|
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
return 0;
|
return 0;
|
||||||
@ -869,12 +869,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
if (uMsg == WM_MOUSEWHEEL)
|
if (uMsg == WM_MOUSEWHEEL)
|
||||||
{
|
{
|
||||||
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
||||||
real_ScreenToClient(g_ddraw->hwnd, &pt);
|
real_ScreenToClient(g_ddraw.hwnd, &pt);
|
||||||
lParam = MAKELPARAM(pt.x, pt.y);
|
lParam = MAKELPARAM(pt.x, pt.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0);
|
int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0);
|
||||||
int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0);
|
int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0);
|
||||||
|
|
||||||
if (g_config.adjmouse)
|
if (g_config.adjmouse)
|
||||||
{
|
{
|
||||||
@ -888,20 +888,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x));
|
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
|
||||||
y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y));
|
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x = min(x, g_ddraw->width - 1);
|
x = min(x, g_ddraw.width - 1);
|
||||||
y = min(y, g_ddraw->height - 1);
|
y = min(y, g_ddraw.height - 1);
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
lParam = MAKELPARAM(x, y);
|
lParam = MAKELPARAM(x, y);
|
||||||
|
|
||||||
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
|
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
|
||||||
if (video_hwnd)
|
if (video_hwnd)
|
||||||
{
|
{
|
||||||
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
PostMessageA(video_hwnd, uMsg, wParam, lParam);
|
||||||
@ -924,11 +924,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
{
|
{
|
||||||
if (!g_config.devmode && !g_mouse_locked)
|
if (!g_config.devmode && !g_mouse_locked)
|
||||||
{
|
{
|
||||||
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x);
|
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
|
||||||
int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y);
|
int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
|
||||||
|
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
|
||||||
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
|
||||||
|
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
@ -945,19 +945,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
{
|
{
|
||||||
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
|
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
|
||||||
{
|
{
|
||||||
InterlockedExchange(&g_ddraw->render.clear_screen, TRUE);
|
InterlockedExchange(&g_ddraw.render.clear_screen, TRUE);
|
||||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam);
|
return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user