From 3f061f3a3ba60b044c71820304d87f5aa6474dae Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Sat, 9 Jul 2011 17:39:01 +0300 Subject: [PATCH] Implement letter- and windowboxing for GDI --- main.c | 19 +++++++++++++++++++ main.h | 1 + render.c | 1 + render_soft.c | 24 +++++++++++++++++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 539b523..8ecad5e 100644 --- a/main.c +++ b/main.c @@ -265,6 +265,7 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height }; POINT pt; switch(uMsg) @@ -372,6 +373,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return ddraw->WndProc(hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y)); } return ddraw->WndProc(hWnd, uMsg, wParam, lParam); + + case WM_ERASEBKGND: + EnterCriticalSection(&ddraw->cs); + FillRect(ddraw->render.hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH)); + LeaveCriticalSection(&ddraw->cs); + return TRUE; } return DefWindowProc(hWnd, uMsg, wParam, lParam); @@ -601,6 +608,8 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk "windowed=true\n" "; show window borders in windowed mode\n" "border=true\n" + "; use letter- or windowboxing to make a best fit (GDI only!)\n" + "boxing=false\n" "; real rendering rate, -1 = screen rate, 0 = unlimited, n = cap\n" "maxfps=0\n" "; vertical synchronization, enable if you get tearing (OpenGL only)\n" @@ -641,6 +650,16 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->border = TRUE; } + GetPrivateProfileStringA("ddraw", "boxing", "FALSE", tmp, sizeof(tmp), ini_path); + if(tolower(tmp[0]) == 'n' || tolower(tmp[0]) == 'f' || tmp[0] == '0') + { + This->boxing = FALSE; + } + else + { + This->boxing = TRUE; + } + This->render.maxfps = GetPrivateProfileIntA("ddraw", "maxfps", 0, ini_path); This->render.width = GetPrivateProfileIntA("ddraw", "width", 640, ini_path); if(This->render.width < 640) diff --git a/main.h b/main.h index bc7afa4..636839a 100644 --- a/main.h +++ b/main.h @@ -39,6 +39,7 @@ typedef struct IDirectDrawImpl DWORD bpp; BOOL windowed; BOOL border; + BOOL boxing; BOOL windowed_init; DEVMODE mode; struct IDirectDrawSurfaceImpl *primary; diff --git a/render.c b/render.c index 09d6ddc..2160875 100644 --- a/render.c +++ b/render.c @@ -99,6 +99,7 @@ DWORD WINAPI render_main(void) /* convert ddraw surface to opengl texture */ EnterCriticalSection(&ddraw->cs); + if(ddraw->primary && ddraw->primary->palette) { if(ddraw->vhack && detect_cutscene()) diff --git a/render_soft.c b/render_soft.c index 0b7b7c9..6820abc 100644 --- a/render_soft.c +++ b/render_soft.c @@ -31,10 +31,31 @@ DWORD WINAPI render_soft_main(void) bmi->bmiHeader.biBitCount = ddraw->bpp; bmi->bmiHeader.biCompression = BI_RGB; + DWORD dst_top = 0; + DWORD dst_left = 0; + DWORD dst_width = ddraw->render.width; + DWORD dst_height = ddraw->render.height; + DWORD tick_start = 0; DWORD tick_end = 0; DWORD frame_len = 0; + if (ddraw->boxing) + { + dst_width = ddraw->width; + dst_height = ddraw->height; + + /* test if we can double scale the window */ + if (ddraw->width * 2 <= ddraw->render.width && ddraw->height * 2 <= ddraw->render.height) + { + dst_width *= 2; + dst_height *= 2; + } + + dst_top = ddraw->render.height / 2 - dst_height / 2; + dst_left = ddraw->render.width / 2 - dst_width / 2; + } + if(ddraw->render.maxfps < 0) { ddraw->render.maxfps = ddraw->mode.dmDisplayFrequency; @@ -53,6 +74,7 @@ DWORD WINAPI render_soft_main(void) } EnterCriticalSection(&ddraw->cs); + if (ddraw->primary && (ddraw->primary->palette || ddraw->bpp == 16)) { if (ddraw->primary->palette && ddraw->primary->palette->data_rgb == NULL) @@ -62,7 +84,7 @@ DWORD WINAPI render_soft_main(void) if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height) { - StretchDIBits(ddraw->render.hDC, 0, 0, ddraw->render.width, ddraw->render.height, 0, 0, ddraw->width, ddraw->height, ddraw->primary->surface, bmi, DIB_RGB_COLORS, SRCCOPY); + StretchDIBits(ddraw->render.hDC, dst_left, dst_top, dst_width, dst_height, 0, 0, ddraw->width, ddraw->height, ddraw->primary->surface, bmi, DIB_RGB_COLORS, SRCCOPY); } else {