diff --git a/main.c b/main.c index dc131af..6fc994c 100644 --- a/main.c +++ b/main.c @@ -72,19 +72,6 @@ HRESULT ddraw_CreatePalette(void *This, LPPALETTEENTRY DDColorArray, LPDIRECTDRA return DD_OK; } -HRESULT ddraw_CreateSurface(void *This, LPDDSURFACEDESC DDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *DDSurface, IUnknown FAR * unkOuter) -{ - printf("DirectDraw::CreateSurface(This=%p, DDSurfaceDesc=%p, DDSurface=%p, unkOuter=%p)\n", This, DDSurfaceDesc, DDSurface, unkOuter); - - fakeDirectDrawSurfaceObject *Surface = (fakeDirectDrawSurfaceObject *)malloc(sizeof(fakeDirectDrawSurfaceObject)); - Surface->Ref = 1; - Surface->Functions = &siface; - printf(" Surface = %p\n", Surface); - *DDSurface = (LPDIRECTDRAWSURFACE)Surface; - - return DD_OK; -} - HRESULT ddraw_SetCooperativeLevel(void *This, HWND hWnd, DWORD dwFlags) { printf("DirectDraw::SetCooperativeLevel(This=%p, hWnd=0x%08X, dwFlags=0x%08X)\n", This, (unsigned int)hWnd, (unsigned int)dwFlags); diff --git a/surface.c b/surface.c index bec9ea3..f409dd4 100644 --- a/surface.c +++ b/surface.c @@ -15,24 +15,130 @@ */ #include +#include #include "surface.h" /* from main */ HRESULT QueryInterface(void *This, REFIID riid, void **obj); ULONG AddRef(void *This); -ULONG Release(void *This); HRESULT null(); +void dump_surface_desc_flags(LPDDSURFACEDESC lpDDSurfaceDesc); + +ULONG ddraw_surface_AddRef(void *_This) +{ + fakeDirectDrawSurfaceObject *This = (fakeDirectDrawSurfaceObject *)_This; + + printf("DirectDrawSurface::AddRef(This=%p)\n", This); + This->Ref++; + return This->Ref; +} + +ULONG ddraw_surface_Release(void *_This) +{ + fakeDirectDrawSurfaceObject *This = (fakeDirectDrawSurfaceObject *)_This; + + printf("DirectDrawSurface::Release(((fakeDirectDrawSurfaceObject *)This)=%p)\n", ((fakeDirectDrawSurfaceObject *)This)); + + This->Ref--; + + if(This->Ref == 0) + { + if(This->surface) + { + free(This->surface); + } + free(This); + return 0; + } + return This->Ref; +} + +HRESULT ddraw_CreateSurface(void *This, LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *lpDDSurface, IUnknown FAR * unkOuter) +{ + printf("DirectDraw::CreateSurface(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n", This, lpDDSurfaceDesc, lpDDSurface, unkOuter); + + dump_surface_desc_flags(lpDDSurfaceDesc); + + printf(" lpDDSurfaceDesc->dwHeight: %d\n", (int)lpDDSurfaceDesc->dwHeight); + printf(" lpDDSurfaceDesc->dwWidth: %d\n", (int)lpDDSurfaceDesc->dwWidth); + + fakeDirectDrawSurfaceObject *Surface = (fakeDirectDrawSurfaceObject *)malloc(sizeof(fakeDirectDrawSurfaceObject)); + Surface->Functions = &siface; + + /* private stuff */ + Surface->width = lpDDSurfaceDesc->dwWidth; + Surface->height = lpDDSurfaceDesc->dwHeight; + Surface->surface = NULL; + + printf(" Surface = %p\n", Surface); + + Surface->Ref = 0; + ddraw_surface_AddRef(Surface); + + *lpDDSurface = (LPDIRECTDRAWSURFACE)Surface; + + return DD_OK; +} + +HRESULT ddraw_surface_Blt(void *This, LPRECT lpDestRect, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx) +{ + printf("DirectDrawSurface::Blt(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%d, lpDDBltFx=%p)\n", This, lpDestRect, lpDDSrcSurface, lpSrcRect, (int)dwFlags, lpDDBltFx); + return DD_OK; +} + +HRESULT ddraw_surface_Lock(void *_This, LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) +{ + fakeDirectDrawSurfaceObject *This = (fakeDirectDrawSurfaceObject *)_This; + + printf("DirectDrawSurface::Lock(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%d, hEvent=%p)\n", This, lpDestRect, lpDDSurfaceDesc, (int)dwFlags, hEvent); + + if(dwFlags & DDLOCK_SURFACEMEMORYPTR) + { + printf(" dwFlags: DDLOCK_SURFACEMEMORYPTR\n"); + } + if(dwFlags & DDLOCK_WAIT) + { + printf(" dwFlags: DDLOCK_WAIT\n"); + } + if(dwFlags & DDLOCK_EVENT) + { + printf(" dwFlags: DDLOCK_EVENT\n"); + } + if(dwFlags & DDLOCK_READONLY) + { + printf(" dwFlags: DDLOCK_READONLY\n"); + } + if(dwFlags & DDLOCK_WRITEONLY) + { + printf(" dwFlags: DDLOCK_WRITEONLY\n"); + } + + This->surface = malloc(This->width * This->height); + + lpDDSurfaceDesc->dwSize = sizeof(DDSURFACEDESC); + lpDDSurfaceDesc->dwFlags = DDSD_LPSURFACE; + lpDDSurfaceDesc->lpSurface = This->surface; + + return DD_OK; +} + +HRESULT ddraw_surface_Unlock(void *This, LPVOID lpRect) +{ + printf("DirectDrawSurface::Unlock(This=%p, lpRect=%p)\n", This, lpRect); + return DD_OK; +} + fakeDirectDrawSurface siface = { /* IUnknown */ QueryInterface, - AddRef, - Release, + ddraw_surface_AddRef, + ddraw_surface_Release, /* IDirectDrawSurface */ null, // ddraw_surface_AddAttachedSurface null, // ddraw_surface_AddOverlayDirtyRect - null, // ddraw_surface_Blt + ddraw_surface_Blt, null, // ddraw_surface_BltBatch null, // ddraw_surface_BltFast null, // ddraw_surface_DeleteAttachedSurface @@ -52,15 +158,87 @@ fakeDirectDrawSurface siface = null, // ddraw_surface_GetSurfaceDesc null, // ddraw_surface_Initialize null, // ddraw_surface_IsLost - null, // ddraw_surface_Lock + ddraw_surface_Lock, null, // ddraw_surface_ReleaseDC null, // ddraw_surface_Restore null, // ddraw_surface_SetClipper null, // ddraw_surface_SetColorKey null, // ddraw_surface_SetOverlayPosition null, // ddraw_surface_SetPalette - null, // ddraw_surface_Unlock + ddraw_surface_Unlock, null, // ddraw_surface_UpdateOverlay null, // ddraw_surface_UpdateOverlayDisplay null // ddraw_surface_UpdateOverlayZOrder }; + +void dump_surface_desc_flags(LPDDSURFACEDESC lpDDSurfaceDesc) +{ + if(lpDDSurfaceDesc->dwFlags & DDSD_CAPS) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_CAPS\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_HEIGHT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_WIDTH\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_PITCH) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_PITCH\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_BACKBUFFERCOUNT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_BACKBUFFERCOUNT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_ZBUFFERBITDEPTH) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_ZBUFFERBITDEPTH\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_ALPHABITDEPTH) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_ALPHABITDEPTH\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_LPSURFACE) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_LPSURFACE\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_PIXELFORMAT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_CKDESTOVERLAY) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_CKDESTOVERLAY\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_CKDESTBLT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_CKDESTBLT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_CKSRCOVERLAY) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_CKSRCOVERLAY\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_CKSRCBLT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_CKSRCBLT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_MIPMAPCOUNT) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_MIPMAPCOUNT\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_REFRESHRATE) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_REFRESHRATE\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_LINEARSIZE) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_LINEARSIZE\n"); + } + if(lpDDSurfaceDesc->dwFlags & DDSD_ALL) + { + printf(" lpDDSurfaceDesc->dwFlags: DDSD_ALL\n"); + } +} diff --git a/surface.h b/surface.h index 319e0b9..1bc8be1 100644 --- a/surface.h +++ b/surface.h @@ -20,6 +20,8 @@ #include #include "ddraw.h" +HRESULT ddraw_CreateSurface(void *This, LPDDSURFACEDESC DDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *DDSurface, IUnknown FAR * unkOuter); + typedef struct { /* IUnknown */ @@ -70,6 +72,10 @@ typedef struct { fakeDirectDrawSurface *Functions; + DWORD width; + DWORD height; + void *surface; + ULONG Ref; } fakeDirectDrawSurfaceObject;