diff --git a/main.c b/main.c index c113e06..5e7f986 100644 --- a/main.c +++ b/main.c @@ -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; } diff --git a/palette.c b/palette.c index cfaf27f..018f6e3 100644 --- a/palette.c +++ b/palette.c @@ -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) diff --git a/palette.h b/palette.h index 5263fb2..ee4d978 100644 --- a/palette.h +++ b/palette.h @@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl ULONG Ref; int data_bgr[256]; - RGBQUAD data_rgb[256]; + RGBQUAD *data_rgb; } IDirectDrawPaletteImpl; diff --git a/render_soft.c b/render_soft.c index 6d0daee..6820abc 100644 --- a/render_soft.c +++ b/render_soft.c @@ -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)