From 8549494af298bf8b9c856bdc7bfd75ed732b0f4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Oct 2020 16:38:51 +0200 Subject: [PATCH] #51 support GetDisplayMode --- inc/dd.h | 1 + src/IDirectDraw/IDirectDraw.c | 8 ++++---- src/dd.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fb2ef4e..3d9c674 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -14,6 +14,7 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp); HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps); +HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); HRESULT dd_GetAvailableVidMem(void* lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index fdeb35d..c687c56 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -176,11 +176,11 @@ HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDrive return ret; } -HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC a) +HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc) { - dprintf("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_UNSUPPORTEDMODE; - dprintf("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + dprintf("-> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = dd_GetDisplayMode(lpDDSurfaceDesc); + dprintf("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/dd.c b/src/dd.c index f5be3d3..c20d0db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -180,6 +180,37 @@ HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) return DD_OK; } +HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) +{ + if (lpDDSurfaceDesc) + { + memset(lpDDSurfaceDesc, 0, sizeof(DDSURFACEDESC)); + + lpDDSurfaceDesc->dwSize = sizeof(DDSURFACEDESC); + lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; + lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; + lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth; + lpDDSurfaceDesc->dwRefreshRate = 60; + lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + + if (g_ddraw->bpp != 8) + { + lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth * 2; + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; + lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; + lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; + lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; + } + } + + return DD_OK; +} + HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) { *lpdwFreq = 60;