make old windows xp workaround optional
This commit is contained in:
parent
93e81ddc1c
commit
6efc112c39
9 changed files with 97 additions and 72 deletions
|
@ -4,6 +4,7 @@
|
|||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include "IDirectDrawPalette.h"
|
||||
#include "IDirectDrawClipper.h"
|
||||
#include "ddraw.h"
|
||||
|
||||
|
||||
|
@ -36,6 +37,7 @@ typedef struct IDirectDrawSurfaceImpl
|
|||
DWORD last_blt_tick;
|
||||
|
||||
struct IDirectDrawSurfaceImpl* backbuffer;
|
||||
struct IDirectDrawClipperImpl* clipper;
|
||||
|
||||
} IDirectDrawSurfaceImpl;
|
||||
|
||||
|
|
10
inc/dd.h
10
inc/dd.h
|
@ -6,6 +6,8 @@
|
|||
#include "ddraw.h"
|
||||
|
||||
|
||||
typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*);
|
||||
|
||||
ULONG dd_AddRef();
|
||||
ULONG dd_Release();
|
||||
HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback);
|
||||
|
@ -46,11 +48,11 @@ typedef struct cnc_ddraw
|
|||
DEVMODE mode;
|
||||
struct IDirectDrawSurfaceImpl *primary;
|
||||
char title[128];
|
||||
HMODULE real_dll;
|
||||
CRITICAL_SECTION cs;
|
||||
|
||||
/* real export from system32\ddraw.dll */
|
||||
HRESULT (WINAPI *DirectDrawCreate)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*);
|
||||
CRITICAL_SECTION cs;
|
||||
HMODULE real_dll;
|
||||
DIRECTDRAWCREATEPROC DirectDrawCreate;
|
||||
|
||||
struct
|
||||
{
|
||||
|
@ -102,11 +104,11 @@ typedef struct cnc_ddraw
|
|||
BOOL accurate_timers;
|
||||
BOOL resizable;
|
||||
BOOL sierrahack;
|
||||
BOOL dk2hack;
|
||||
BOOL nonexclusive;
|
||||
BOOL fixchildwindows;
|
||||
BOOL d3d9linear;
|
||||
BOOL backbuffer;
|
||||
BOOL passthrough;
|
||||
int maxgameticks;
|
||||
BOOL alt_key_down;
|
||||
BOOL bnet_active;
|
||||
|
|
|
@ -18,12 +18,14 @@ HRESULT dds_EnumAttachedSurfaces(IDirectDrawSurfaceImpl* This, LPVOID lpContext,
|
|||
HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWSURFACE surface, DWORD flags);
|
||||
HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, LPDIRECTDRAWSURFACE FAR* surface);
|
||||
HRESULT dds_GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDDSCaps);
|
||||
HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper);
|
||||
HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD flags, LPDDCOLORKEY colorKey);
|
||||
HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* a);
|
||||
HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC);
|
||||
HRESULT dds_GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette);
|
||||
HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat);
|
||||
HRESULT dds_Lock(IDirectDrawSurfaceImpl* This, LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent);
|
||||
HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD flags, LPDDCOLORKEY colorKey);
|
||||
HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper);
|
||||
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette);
|
||||
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPVOID lpRect);
|
||||
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
|
||||
|
|
|
@ -8,6 +8,8 @@ extern BOOL GameHandlesClose;
|
|||
extern PVOID FakePrimarySurface;
|
||||
extern HMODULE g_ddraw_module;
|
||||
|
||||
HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter);
|
||||
|
||||
typedef enum PROCESS_DPI_AWARENESS {
|
||||
PROCESS_DPI_UNAWARE = 0,
|
||||
PROCESS_SYSTEM_DPI_AWARE = 1,
|
||||
|
|
|
@ -113,7 +113,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
|
|||
{
|
||||
dprintf("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
|
||||
ret = E_FAIL;
|
||||
ret = E_NOINTERFACE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -205,11 +205,11 @@ HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl *This, LPDD
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWCLIPPER FAR *a)
|
||||
HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWCLIPPER FAR *lpClipper)
|
||||
{
|
||||
dprintfex("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
dprintfex("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
dprintfex("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper);
|
||||
HRESULT ret = dds_GetClipper(This, lpClipper);
|
||||
dprintfex("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -221,10 +221,10 @@ HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl *This,
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *a)
|
||||
HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC)
|
||||
{
|
||||
dprintfex("-> %s(This=%p, ...)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_GetDC(This, a);
|
||||
dprintfex("-> %s(This=%p, lpHDC=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_GetDC(This, lpHDC);
|
||||
dprintfex("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
@ -301,11 +301,11 @@ HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl *This)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWCLIPPER a)
|
||||
HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWCLIPPER lpClipper)
|
||||
{
|
||||
dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
dprintf("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_SetClipper(This, lpClipper);
|
||||
dprintf("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,8 +51,8 @@ void cfg_load()
|
|||
g_ddraw->fixchildwindows = cfg_get_bool("fixchildwindows", TRUE);
|
||||
g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE);
|
||||
g_ddraw->backbuffer = cfg_get_bool("backbuffer", TRUE);
|
||||
g_ddraw->passthrough = cfg_get_bool("passthrough", TRUE);
|
||||
g_ddraw->sierrahack = cfg_get_bool("sierrahack", FALSE); // Sierra Caesar III, Pharaoh, and Zeus hack
|
||||
g_ddraw->dk2hack = cfg_get_bool("dk2hack", FALSE); // Dungeon Keeper 2 hack
|
||||
|
||||
g_config.window_rect.right = cfg_get_int("width", 0);
|
||||
g_config.window_rect.bottom = cfg_get_int("height", 0);
|
||||
|
@ -509,7 +509,7 @@ static void cfg_create_ini()
|
|||
"[DKII]\n"
|
||||
"maxgameticks=60\n"
|
||||
"noactivateapp=true\n"
|
||||
"dk2hack=true\n"
|
||||
"passthrough=false\n"
|
||||
"\n"
|
||||
"; Chris Sawyer's Locomotion\n"
|
||||
"[LOCO]\n"
|
||||
|
|
56
src/dd.c
56
src/dd.c
|
@ -766,12 +766,6 @@ ULONG dd_Release()
|
|||
{
|
||||
g_ddraw->ref--;
|
||||
|
||||
if (g_ddraw->dk2hack)
|
||||
{
|
||||
static BOOL once;
|
||||
if (!once) once = g_ddraw->ref-- + 1;
|
||||
}
|
||||
|
||||
if (g_ddraw->ref == 0)
|
||||
{
|
||||
if (g_ddraw->bpp)
|
||||
|
@ -860,16 +854,39 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
|
|||
{
|
||||
if (g_ddraw)
|
||||
{
|
||||
/* Passthrough required for WIN XP - FIXME: check the calling module before passing the call! */
|
||||
if (iid && IsEqualGUID(&IID_IDirectDraw, iid) && g_ddraw->DirectDrawCreate)
|
||||
if (g_ddraw->passthrough)
|
||||
{
|
||||
if (iid && IsEqualGUID(&IID_IDirectDraw, iid))
|
||||
{
|
||||
if (!g_ddraw->real_dll)
|
||||
g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll");
|
||||
|
||||
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate = (DIRECTDRAWCREATEPROC)GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
|
||||
|
||||
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate = NULL;
|
||||
|
||||
if (g_ddraw->DirectDrawCreate)
|
||||
return g_ddraw->DirectDrawCreate(lpGuid, (LPDIRECTDRAW*)lplpDD, pUnkOuter);
|
||||
}
|
||||
|
||||
return DDERR_DIRECTDRAWALREADYCREATED;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
g_ddraw = (cnc_ddraw*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(cnc_ddraw));
|
||||
g_ddraw->ref++;
|
||||
|
||||
InitializeCriticalSection(&g_ddraw->cs);
|
||||
|
||||
g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
||||
g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
|
||||
|
||||
cfg_load();
|
||||
g_ddraw->ref--;
|
||||
}
|
||||
|
||||
IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
|
||||
|
||||
|
@ -890,26 +907,5 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
|
|||
|
||||
*lplpDD = (LPVOID)dd;
|
||||
|
||||
if (!g_ddraw->real_dll)
|
||||
{
|
||||
g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll");
|
||||
}
|
||||
|
||||
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
|
||||
{
|
||||
g_ddraw->DirectDrawCreate =
|
||||
(HRESULT(WINAPI*)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*))GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
|
||||
|
||||
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate = NULL;
|
||||
}
|
||||
|
||||
InitializeCriticalSection(&g_ddraw->cs);
|
||||
|
||||
g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
||||
g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
|
||||
|
||||
cfg_load();
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
|
|
@ -748,6 +748,14 @@ HRESULT dds_GetCaps(IDirectDrawSurfaceImpl *This, LPDDSCAPS lpDDSCaps)
|
|||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* a)
|
||||
{
|
||||
if (a)
|
||||
*a = This->clipper;
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl *This, DWORD flags, LPDDCOLORKEY colorKey)
|
||||
{
|
||||
if (colorKey)
|
||||
|
@ -759,7 +767,7 @@ HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl *This, DWORD flags, LPDDCOLORKEY
|
|||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *a)
|
||||
HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC)
|
||||
{
|
||||
if ((This->l_pitch % 4))
|
||||
{
|
||||
|
@ -774,7 +782,9 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *a)
|
|||
if (data)
|
||||
SetDIBColorTable(dds_GetHDC(This), 0, 256, data);
|
||||
|
||||
*a = dds_GetHDC(This);
|
||||
if (lpHDC)
|
||||
*lpHDC = dds_GetHDC(This);
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
|
@ -858,6 +868,12 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl *This, DWORD flags, LPDDCOLORKEY
|
|||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper)
|
||||
{
|
||||
This->clipper = (IDirectDrawClipperImpl*)lpClipper;
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWPALETTE lpDDPalette)
|
||||
{
|
||||
if (!lpDDPalette)
|
||||
|
@ -989,6 +1005,19 @@ HDC dds_GetHDC(IDirectDrawSurfaceImpl* This)
|
|||
HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *lpDDSurface, IUnknown FAR * unkOuter)
|
||||
{
|
||||
dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags);
|
||||
dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps);
|
||||
|
||||
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
|
||||
g_ddraw->primary &&
|
||||
g_ddraw->primary->width == g_ddraw->width &&
|
||||
g_ddraw->primary->height == g_ddraw->height &&
|
||||
g_ddraw->primary->bpp == g_ddraw->bpp)
|
||||
{
|
||||
*lpDDSurface = (LPDIRECTDRAWSURFACE)g_ddraw->primary;
|
||||
IDirectDrawSurface_AddRef(g_ddraw->primary);
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
IDirectDrawSurfaceImpl *dst_surface = (IDirectDrawSurfaceImpl *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl));
|
||||
|
||||
|
@ -996,25 +1025,16 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA
|
|||
|
||||
lpDDSurfaceDesc->dwFlags |= DDSD_CAPS;
|
||||
|
||||
/* private stuff */
|
||||
dst_surface->bpp = g_ddraw->bpp;
|
||||
dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp;
|
||||
dst_surface->flags = lpDDSurfaceDesc->dwFlags;
|
||||
dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
|
||||
|
||||
if(lpDDSurfaceDesc->dwFlags & DDSD_CAPS)
|
||||
{
|
||||
if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
|
||||
{
|
||||
g_ddraw->primary = dst_surface;
|
||||
|
||||
dst_surface->width = g_ddraw->width;
|
||||
dst_surface->height = g_ddraw->height;
|
||||
}
|
||||
|
||||
dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps);
|
||||
dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
|
||||
}
|
||||
|
||||
if( !(lpDDSurfaceDesc->dwFlags & DDSD_CAPS) || !(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) )
|
||||
else
|
||||
{
|
||||
dst_surface->width = lpDDSurfaceDesc->dwWidth;
|
||||
dst_surface->height = lpDDSurfaceDesc->dwHeight;
|
||||
|
@ -1079,6 +1099,7 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA
|
|||
|
||||
if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
|
||||
{
|
||||
g_ddraw->primary = dst_surface;
|
||||
FakePrimarySurface = dst_surface->surface;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue