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:
parent
c70e0e61d8
commit
2b47947742
2
Makefile
2
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
|
||||
|
62
main.c
62
main.c
@ -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;
|
||||
|
13
palette.c
13
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);
|
||||
|
@ -31,7 +31,7 @@ typedef struct IDirectDrawPaletteImpl
|
||||
ULONG Ref;
|
||||
|
||||
int data_bgr[256];
|
||||
RGBQUAD *data_rgb;
|
||||
RGBQUAD data_rgb[256];
|
||||
|
||||
} IDirectDrawPaletteImpl;
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user