diff --git a/inc/dd.h b/inc/dd.h index 2939e26..0936488 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -16,6 +16,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, BOOL setBy HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps); +HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps); HRESULT dd_GetDisplayMode(LPDDSURFACEDESC2 lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); HRESULT dd_GetAvailableVidMem(LPDDSCAPS2 lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index c7037be..46f3f5f 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -303,7 +303,7 @@ HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) { TRACE("-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p)\n", __FUNCTION__, This, lpDDDriverCaps, lpDDEmulCaps); - HRESULT ret = dd_GetCaps(lpDDDriverCaps, lpDDEmulCaps); + HRESULT ret = dd_GetCaps((LPDDCAPS_DX1)lpDDDriverCaps, (LPDDCAPS_DX1)lpDDEmulCaps); TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/dd.c b/src/dd.c index 875240e..c5ff15b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -249,11 +249,20 @@ HRESULT dd_EnumDisplayModes( return DD_OK; } -HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) +HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) { if (lpDDDriverCaps) { - lpDDDriverCaps->dwSize = sizeof(DDCAPS_DX5); + int size = + lpDDDriverCaps->dwSize == sizeof(DDCAPS_DX3) ? sizeof(DDCAPS_DX3) : + lpDDDriverCaps->dwSize == sizeof(DDCAPS_DX5) ? sizeof(DDCAPS_DX5) : + lpDDDriverCaps->dwSize == sizeof(DDCAPS_DX6) ? sizeof(DDCAPS_DX6) : + lpDDDriverCaps->dwSize == sizeof(DDCAPS_DX7) ? sizeof(DDCAPS_DX7) : + sizeof(DDCAPS_DX1); + + memset(lpDDDriverCaps, 0, size); + + lpDDDriverCaps->dwSize = size; lpDDDriverCaps->dwCaps = DDCAPS_BLT | DDCAPS_PALETTE | @@ -273,12 +282,21 @@ HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) lpDDDriverCaps->dwAlignSizeSrc = 0; lpDDDriverCaps->dwAlignBoundaryDest = 0; lpDDDriverCaps->dwAlignSizeDest = 0; - lpDDDriverCaps->ddsOldCaps.dwCaps = DDSCAPS_FLIP; + lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP; } if (lpDDEmulCaps) { - lpDDEmulCaps->dwSize = 0; + int size = + lpDDEmulCaps->dwSize == sizeof(DDCAPS_DX3) ? sizeof(DDCAPS_DX3) : + lpDDEmulCaps->dwSize == sizeof(DDCAPS_DX5) ? sizeof(DDCAPS_DX5) : + lpDDEmulCaps->dwSize == sizeof(DDCAPS_DX6) ? sizeof(DDCAPS_DX6) : + lpDDEmulCaps->dwSize == sizeof(DDCAPS_DX7) ? sizeof(DDCAPS_DX7) : + sizeof(DDCAPS_DX1); + + memset(lpDDEmulCaps, 0, size); + + lpDDEmulCaps->dwSize = size; } return DD_OK;