1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

Add support for C&C video scaling

This commit is contained in:
Toni Spets 2011-03-24 19:41:36 +02:00
parent a803c12995
commit c073805db3
3 changed files with 46 additions and 0 deletions

24
main.c
View File

@ -405,6 +405,14 @@ HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DW
GetWindowText(This->hWnd, (LPTSTR)&This->title, sizeof(This->title));
if(This->vhack == 1)
{
if (strcmp(This->title, "Command & Conquer"))
{
This->vhack = 0;
}
}
return DD_OK;
}
@ -589,6 +597,8 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
"sensitivity=0.0\n"
"; enable C&C/RA mouse hack\n"
"mhack=true\n"
"; enable C&C video resize hack, auto = auto-detect game, true = forced, false = disabled\n"
"vhack=auto\n"
, fh);
fclose(fh);
}
@ -675,5 +685,19 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
GetPrivateProfileStringA("ddraw", "sensitivity", "0", tmp, sizeof(tmp), ini_path);
This->sensitivity = strtof(tmp, NULL);
GetPrivateProfileStringA("ddraw", "vhack", "auto", tmp, sizeof(tmp), ini_path);
if(tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tmp[0] == '1')
{
This->vhack = 2;
}
else if(tolower(tmp[0]) == 'a')
{
This->vhack = 1;
}
else
{
This->vhack = 0;
}
return DD_OK;
}

1
main.h
View File

@ -77,6 +77,7 @@ typedef struct IDirectDrawImpl
BOOL devmode;
BOOL vsync;
float sensitivity;
BOOL vhack;
} IDirectDrawImpl;

View File

@ -20,6 +20,8 @@
#include "main.h"
#include "surface.h"
BOOL detect_cutscene();
DWORD WINAPI render_main(void)
{
int i,j;
@ -96,6 +98,12 @@ DWORD WINAPI render_main(void)
EnterCriticalSection(&ddraw->cs);
if(ddraw->primary && ddraw->primary->palette)
{
if(ddraw->vhack && detect_cutscene())
{
scale_w *= 640.0f / ddraw->width;
scale_h *= 400.0f / ddraw->height;
}
for(i=0; i<ddraw->height; i++)
{
for(j=0; j<ddraw->width; j++)
@ -137,3 +145,16 @@ DWORD WINAPI render_main(void)
return 0;
}
static unsigned char getPixel(int x, int y)
{
return ((unsigned char *)ddraw->primary->surface)[y*ddraw->primary->lPitch + x*ddraw->primary->lXPitch];
}
BOOL detect_cutscene()
{
if(ddraw->width <= 640 || ddraw->height <= 480)
return FALSE;
return getPixel(641, 0) == 0 || getPixel(645, 1) == 0 ? TRUE : FALSE;
}