1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +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:
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

62
main.c
View File

@ -15,6 +15,7 @@
*/
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ctype.h>
#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;

View File

@ -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);

View File

@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl
ULONG Ref;
int data_bgr[256];
RGBQUAD *data_rgb;
RGBQUAD data_rgb[256];
} 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 && 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)