1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

Add support for cnc-plugin

This commit is contained in:
Toni Spets 2011-08-21 10:34:42 +03:00
parent c70e0e61d8
commit 2b47947742
5 changed files with 67 additions and 16 deletions

View File

@ -7,7 +7,7 @@ REV=$(shell sh -c 'git rev-parse --short @{0}')
all: all:
sed 's/__REV__/$(REV)/g' ddraw.rc.in > ddraw.rc sed 's/__REV__/$(REV)/g' ddraw.rc.in > ddraw.rc
$(WINDRES) -J rc ddraw.rc ddraw.rc.o $(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: clean:
rm -f ddraw.dll rm -f ddraw.dll

62
main.c
View File

@ -15,6 +15,7 @@
*/ */
#include <windows.h> #include <windows.h>
#include <windowsx.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include "ddraw.h" #include "ddraw.h"
@ -39,6 +40,7 @@ IDirectDrawImpl *ddraw = NULL;
DWORD WINAPI render_main(void); DWORD WINAPI render_main(void);
DWORD WINAPI render_soft_main(void); DWORD WINAPI render_soft_main(void);
DWORD WINAPI render_dummy_main(void);
HRESULT __stdcall ddraw_Compact(IDirectDrawImpl *This) 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); 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.dmSize = sizeof(DEVMODE);
This->mode.dmDriverExtra = 0; This->mode.dmDriverExtra = 0;
@ -206,6 +206,13 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
This->render.height = This->height; This->render.height = This->height;
} }
if (This->renderer == render_dummy_main)
{
return DD_OK;
}
This->render.run = TRUE;
mouse_unlock(); mouse_unlock();
if(This->windowed) if(This->windowed)
@ -263,6 +270,42 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
return DD_OK; 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) LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
RECT rc = { 0, 0, ddraw->render.width, ddraw->render.height }; 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); 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(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) if(!This->devmode)
{ {
SetWindowLong(This->hWnd, GWL_WNDPROC, (LONG)WndProc); 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); 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"); printf("DirectDrawCreate: Using software renderer\n");
This->renderer = render_soft_main; This->renderer = render_soft_main;

View File

@ -36,13 +36,10 @@ HRESULT __stdcall ddraw_palette_SetEntries(IDirectDrawPaletteImpl *This, DWORD d
for(i=0;i<256;i++) for(i=0;i<256;i++)
{ {
This->data_bgr[i] = (lpEntries[i].peBlue<<16)|(lpEntries[i].peGreen<<8)|lpEntries[i].peRed; 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].rgbRed = lpEntries[i].peRed; This->data_rgb[i].rgbBlue = lpEntries[i].peBlue;
This->data_rgb[i].rgbGreen = lpEntries[i].peGreen; This->data_rgb[i].rgbReserved = 0;
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) 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); printf(" Palette = %p\n", Palette);
*lpDDPalette = (LPDIRECTDRAWPALETTE)Palette; *lpDDPalette = (LPDIRECTDRAWPALETTE)Palette;
Palette->data_rgb = NULL;
ddraw_palette_SetEntries(Palette, dwFlags, 0, 256, lpDDColorArray); ddraw_palette_SetEntries(Palette, dwFlags, 0, 256, lpDDColorArray);
ddraw_palette_AddRef(Palette); ddraw_palette_AddRef(Palette);

View File

@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl
ULONG Ref; ULONG Ref;
int data_bgr[256]; int data_bgr[256];
RGBQUAD *data_rgb; RGBQUAD data_rgb[256];
} IDirectDrawPaletteImpl; } 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 && (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) if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height)