From 2b479477421c8b0f0f1f8bcadb16939419666092 Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Sun, 21 Aug 2011 10:34:42 +0300 Subject: [PATCH] Add support for cnc-plugin --- Makefile | 2 +- main.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++--- palette.c | 13 ++++------- palette.h | 2 +- render_soft.c | 4 ++-- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 758399d..519c26b 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ REV=$(shell sh -c 'git rev-parse --short @{0}') all: sed 's/__REV__/$(REV)/g' ddraw.rc.in > ddraw.rc $(WINDRES) -J rc ddraw.rc ddraw.rc.o - $(CC) $(CFLAGS) -shared -o ddraw.dll main.c mouse.c palette.c surface.c clipper.c render.c render_soft.c screenshot.c ddraw.def ddraw.rc.o $(LIBS) + $(CC) $(CFLAGS) -shared -o ddraw.dll main.c mouse.c palette.c surface.c clipper.c render.c render_soft.c render_dummy.c screenshot.c ddraw.def ddraw.rc.o $(LIBS) clean: rm -f ddraw.dll diff --git a/main.c b/main.c index b6c37b1..c113e06 100644 --- a/main.c +++ b/main.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include "ddraw.h" @@ -39,6 +40,7 @@ IDirectDrawImpl *ddraw = NULL; DWORD WINAPI render_main(void); DWORD WINAPI render_soft_main(void); +DWORD WINAPI render_dummy_main(void); HRESULT __stdcall ddraw_Compact(IDirectDrawImpl *This) { @@ -177,8 +179,6 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD { printf("DirectDraw::SetDisplayMode(This=%p, width=%d, height=%d, bpp=%d)\n", This, (unsigned int)width, (unsigned int)height, (unsigned int)bpp); - This->render.run = TRUE; - This->mode.dmSize = sizeof(DEVMODE); This->mode.dmDriverExtra = 0; @@ -206,6 +206,13 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD This->render.height = This->height; } + if (This->renderer == render_dummy_main) + { + return DD_OK; + } + + This->render.run = TRUE; + mouse_unlock(); if(This->windowed) @@ -263,6 +270,42 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD return DD_OK; } +/* minimal window proc for dummy renderer as everything is emulated */ +LRESULT CALLBACK dummy_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_USER: + ddraw->render.width = LOWORD(wParam); + ddraw->render.height = HIWORD(wParam); + ddraw->render.hDC = GetDC((HWND)lParam); + if (!ddraw->render.thread) + { + ddraw->render.run = TRUE; + ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ddraw->renderer, NULL, 0, NULL); + } + 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: + ddraw->cursor.x = GET_X_LPARAM(lParam); + ddraw->cursor.y = GET_Y_LPARAM(lParam); + break; + } + + if (ddraw->WndProc) + { + return ddraw->WndProc(hWnd, uMsg, wParam, lParam); + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height }; @@ -401,6 +444,14 @@ HRESULT __stdcall ddraw_SetCooperativeLevel(IDirectDrawImpl *This, HWND hWnd, DW mouse_init(hWnd); This->WndProc = (LRESULT CALLBACK (*)(HWND, UINT, WPARAM, LPARAM))GetWindowLong(This->hWnd, GWL_WNDPROC); + + if (This->renderer == render_dummy_main) + { + SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)dummy_WndProc); + ShowWindow(This->hWnd, SW_HIDE); + return DD_OK; + } + if(!This->devmode) { SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)WndProc); @@ -749,7 +800,12 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk } GetPrivateProfileStringA("ddraw", "renderer", "opengl", tmp, sizeof(tmp), ini_path); - if(tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') + if(tolower(tmp[0]) == 'd' || tolower(tmp[0]) == 'd') + { + printf("DirectDrawCreate: Using dummy renderer\n"); + This->renderer = render_dummy_main; + } + else if(tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') { printf("DirectDrawCreate: Using software renderer\n"); This->renderer = render_soft_main; diff --git a/palette.c b/palette.c index 97a7355..cfaf27f 100644 --- a/palette.c +++ b/palette.c @@ -36,13 +36,10 @@ 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; - 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; - } + 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) @@ -117,8 +114,6 @@ HRESULT __stdcall ddraw_CreatePalette(IDirectDrawImpl *This, DWORD dwFlags, LPPA printf(" Palette = %p\n", Palette); *lpDDPalette = (LPDIRECTDRAWPALETTE)Palette; - Palette->data_rgb = NULL; - ddraw_palette_SetEntries(Palette, dwFlags, 0, 256, lpDDColorArray); ddraw_palette_AddRef(Palette); diff --git a/palette.h b/palette.h index ee4d978..5263fb2 100644 --- a/palette.h +++ b/palette.h @@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl ULONG Ref; int data_bgr[256]; - RGBQUAD *data_rgb; + RGBQUAD data_rgb[256]; } IDirectDrawPaletteImpl; diff --git a/render_soft.c b/render_soft.c index 6820abc..6d0daee 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 && ddraw->primary->palette->data_rgb == NULL) + if (ddraw->primary->palette) { - ddraw->primary->palette->data_rgb = &bmi->bmiColors[0]; + memcpy(bmi->bmiColors, ddraw->primary->palette->data_rgb, sizeof(RGBQUAD) * 256); } if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height)