Be more flexible with cnc-plugin, also now transparently just works without touching the ini

This commit is contained in:
Toni Spets 2011-08-22 17:40:21 +03:00
parent 2b47947742
commit 30f5b46e6c
4 changed files with 53 additions and 23 deletions

58
main.c
View file

@ -206,13 +206,17 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
This->render.height = This->height;
}
This->render.run = TRUE;
if (This->renderer == render_dummy_main)
{
if(This->render.thread == NULL)
{
This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL);
}
return DD_OK;
}
This->render.run = TRUE;
mouse_unlock();
if(This->windowed)
@ -275,21 +279,17 @@ LRESULT CALLBACK dummy_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara
{
switch(uMsg)
{
/* if the plugin window changes */
case WM_USER:
ddraw->render.width = LOWORD(wParam);
ddraw->render.height = HIWORD(wParam);
ddraw->render.hDC = GetDC((HWND)lParam);
if (!ddraw->render.thread)
ddraw->hWnd = (HWND)lParam;
ddraw->render.hDC = GetDC(ddraw->hWnd);
case WM_ACTIVATEAPP:
if (wParam == TRUE)
{
ddraw->render.run = TRUE;
ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ddraw->renderer, NULL, 0, NULL);
break;
}
uMsg = WM_ACTIVATEAPP;
wParam = TRUE;
break;
case WM_SIZE:
case WM_NCACTIVATE:
case WM_ACTIVATEAPP:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
@ -439,16 +439,22 @@ HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DW
return DDERR_INVALIDPARAMS;
}
This->hWnd = hWnd;
if (This->hWnd == NULL)
{
This->hWnd = hWnd;
}
mouse_init(hWnd);
This->WndProc = (LRESULT CALLBACK (*)(HWND, UINT, WPARAM, LPARAM))GetWindowLong(This->hWnd, GWL_WNDPROC);
This->WndProc = (LRESULT CALLBACK (*)(HWND, UINT, WPARAM, LPARAM))GetWindowLong(hWnd, GWL_WNDPROC);
if (This->renderer == render_dummy_main)
{
SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)dummy_WndProc);
ShowWindow(This->hWnd, SW_HIDE);
This->render.hDC = GetDC(This->hWnd);
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)dummy_WndProc);
ShowWindow(hWnd, SW_HIDE);
PostMessage(hWnd, WM_ACTIVATEAPP, TRUE, TRUE);
PostMessage(This->hWnd, WM_USER, 0, (LPARAM)hWnd);
return DD_OK;
}
@ -816,5 +822,25 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
This->renderer = render_main;
}
/* last minute check for cnc-plugin */
if (GetEnvironmentVariable("DDRAW_WINDOW", tmp, sizeof(tmp)) > 0)
{
This->hWnd = (HWND)atoi(tmp);
This->renderer = render_dummy_main;
This->windowed = TRUE;
if (GetEnvironmentVariable("DDRAW_WIDTH", tmp, sizeof(tmp)) > 0)
{
This->render.width = atoi(tmp);
}
if (GetEnvironmentVariable("DDRAW_HEIGHT", tmp, sizeof(tmp)) > 0)
{
This->render.height = atoi(tmp);
}
printf("DirectDrawCreate: Detected cnc-plugin at window %08X in %dx%d\n", (unsigned int)This->hWnd, This->render.width, This->render.height);
}
return DD_OK;
}

View file

@ -36,10 +36,14 @@ HRESULT __stdcall ddraw_palette_SetEntries(IDirectDrawPaletteImpl *This, DWORD d
for(i=0;i<256;i++)
{
This->data_bgr[i] = (lpEntries[i].peBlue<<16)|(lpEntries[i].peGreen<<8)|lpEntries[i].peRed;
This->data_rgb[i].rgbRed = lpEntries[i].peRed;
This->data_rgb[i].rgbGreen = lpEntries[i].peGreen;
This->data_rgb[i].rgbBlue = lpEntries[i].peBlue;
This->data_rgb[i].rgbReserved = 0;
if (This->data_rgb)
{
This->data_rgb[i].rgbRed = lpEntries[i].peRed;
This->data_rgb[i].rgbGreen = lpEntries[i].peGreen;
This->data_rgb[i].rgbBlue = lpEntries[i].peBlue;
This->data_rgb[i].rgbReserved = 0;
}
}
if(ddraw->primary && !(ddraw->primary->flags & DDSD_BACKBUFFERCOUNT) && ddraw->render.run)

View file

@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl
ULONG Ref;
int data_bgr[256];
RGBQUAD data_rgb[256];
RGBQUAD *data_rgb;
} IDirectDrawPaletteImpl;

View file

@ -77,9 +77,9 @@ DWORD WINAPI render_soft_main(void)
if (ddraw->primary && (ddraw->primary->palette || ddraw->bpp == 16))
{
if (ddraw->primary->palette)
if (ddraw->primary->palette && ddraw->primary->palette->data_rgb == NULL)
{
memcpy(bmi->bmiColors, ddraw->primary->palette->data_rgb, sizeof(RGBQUAD) * 256);
ddraw->primary->palette->data_rgb = &bmi->bmiColors[0];
}
if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height)