diff --git a/main.c b/main.c index 7fbbebe..d05bcf3 100644 --- a/main.c +++ b/main.c @@ -51,6 +51,13 @@ HRESULT ddraw_GetCaps(void *This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps return DD_OK; } +HRESULT ddraw_RestoreDisplayMode(void *_This) +{ + printf("DirectDraw::RestoreDisplayMode(This=%p)\n", _This); + + return DD_OK; +} + HRESULT ddraw_SetCooperativeLevel(void *_This, HWND hWnd, DWORD dwFlags) { fakeDirectDrawObject *This = (fakeDirectDrawObject *)_This; @@ -72,36 +79,42 @@ HRESULT ddraw_SetDisplayMode(void *_This, DWORD width, DWORD height, DWORD bpp) This->bpp = bpp; MoveWindow(This->hWnd, 0, 0, This->width, This->height, TRUE); - SetWindowLong(This->hWnd, GWL_STYLE, WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE); return DD_OK; } -HRESULT QueryInterface(void *This, REFIID riid, void **obj) +HRESULT ddraw_QueryInterface(void *This, REFIID riid, void **obj) { - printf("QueryInterface(This=%p, riid=%08X, obj=%p)\n", This, (unsigned int)riid, obj); + printf("DirectDraw::QueryInterface(This=%p, riid=%08X, obj=%p)\n", This, (unsigned int)riid, obj); return S_OK; } -ULONG AddRef(void *This) +ULONG ddraw_AddRef(void *_This) { - printf("AddRef(This=%p)\n", This); - ((fakeDirectDrawObject *)This)->Ref++; - return ((fakeDirectDrawObject *)This)->Ref; + fakeDirectDrawObject *This = (fakeDirectDrawObject *)_This; + + printf("DirectDraw::AddRef(This=%p)\n", This); + + This->Ref++; + + return This->Ref; } -ULONG Release(void *This) +ULONG ddraw_Release(void *_This) { - printf("Release(This=%p)\n", This); - ((fakeDirectDrawObject *)This)->Ref--; + fakeDirectDrawObject *This = (fakeDirectDrawObject *)_This; - if(((fakeDirectDrawObject *)This)->Ref == 0) + printf("DirectDraw::Release(This=%p)\n", This); + + This->Ref--; + + if(This->Ref == 0) { free(This); return 0; } - return ((fakeDirectDrawObject *)This)->Ref; + return This->Ref; } HRESULT null(void *This) @@ -113,9 +126,9 @@ HRESULT null(void *This) fakeDirectDraw iface = { /* IUnknown */ - QueryInterface, - AddRef, - Release, + ddraw_QueryInterface, + ddraw_AddRef, + ddraw_Release, /* IDirectDraw */ null, //Compact, null, //CreateClipper, @@ -133,14 +146,12 @@ fakeDirectDraw iface = null, //GetScanLine, null, //GetVerticalBlankStatus, null, //Initialize, - null, //RestoreDisplayMode, + ddraw_RestoreDisplayMode, ddraw_SetCooperativeLevel, ddraw_SetDisplayMode, null //WaitForVerticalBlank }; -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { printf("DirectDrawCreate(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", lpGUID, lplpDD, pUnkOuter); @@ -154,18 +165,3 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk return DD_OK; } - -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_CLOSE: - PostQuitMessage( 0 ); - case WM_CREATE: - case WM_DESTROY: - case WM_KEYDOWN: - return 0; - default: - return DefWindowProc( hWnd, message, wParam, lParam ); - } -} diff --git a/palette.c b/palette.c index ae23d30..2a17cb0 100644 --- a/palette.c +++ b/palette.c @@ -19,30 +19,8 @@ #include "palette.h" /* from main */ -HRESULT QueryInterface(void *This, REFIID riid, void **obj); -ULONG AddRef(void *This); -ULONG Release(void *This); HRESULT null(); -HRESULT ddraw_palette_SetEntries(void *_This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); - -HRESULT ddraw_CreatePalette(void *_This, DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, LPDIRECTDRAWPALETTE FAR * lpDDPalette, IUnknown FAR * unkOuter) -{ - fakeDirectDrawPaletteObject *This = (fakeDirectDrawPaletteObject *)_This; - - printf("DirectDraw::CreatePalette(This=%p, dwFlags=%d, DDColorArray=%p, DDPalette=%p, unkOuter=%p)\n", This, (int)dwFlags, lpDDColorArray, lpDDPalette, unkOuter); - - fakeDirectDrawPaletteObject *Palette = (fakeDirectDrawPaletteObject *)malloc(sizeof(fakeDirectDrawPaletteObject)); - Palette->Ref = 1; - Palette->Functions = &piface; - printf(" Palette = %p\n", Palette); - *lpDDPalette = (LPDIRECTDRAWPALETTE)Palette; - - ddraw_palette_SetEntries(Palette, dwFlags, 0, 256, lpDDColorArray); - - return DD_OK; -} - HRESULT ddraw_palette_GetEntries(void *This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) { printf("DirectDrawPalette::GetEntries(This=%p, dwFlags=%d, dwBase=%d, dwNumEntries=%d, lpEntries=%p)\n", This, (int)dwFlags, (int)dwBase, (int)dwNumEntries, lpEntries); @@ -67,15 +45,69 @@ HRESULT ddraw_palette_SetEntries(void *_This, DWORD dwFlags, DWORD dwStartingEnt return DD_OK; } +HRESULT ddraw_palette_QueryInterface(void *This, REFIID riid, void **obj) +{ + printf("DirectDrawPalette::QueryInterface(This=%p, riid=%08X, obj=%p)\n", This, (unsigned int)riid, obj); + return S_OK; +} + +ULONG ddraw_palette_AddRef(void *_This) +{ + fakeDirectDrawPaletteObject *This = (fakeDirectDrawPaletteObject *)_This; + + printf("DirectDraw::AddRef(This=%p)\n", This); + + This->Ref++; + + return This->Ref; +} + +ULONG ddraw_palette_Release(void *_This) +{ + fakeDirectDrawPaletteObject *This = (fakeDirectDrawPaletteObject *)_This; + + printf("DirectDrawPalette::Release(This=%p)\n", This); + + This->Ref--; + + if(This->Ref == 0) + { + free(This); + return 0; + } + + return This->Ref; +} + fakeDirectDrawPalette piface = { /* IUnknown */ - QueryInterface, - AddRef, - Release, + ddraw_palette_QueryInterface, + ddraw_palette_AddRef, + ddraw_palette_Release, /* IDirectDrawPalette */ null, // ddraw_palette_GetCaps ddraw_palette_GetEntries, null, // ddraw_palette_Initialize ddraw_palette_SetEntries }; + +HRESULT ddraw_CreatePalette(void *_This, DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, LPDIRECTDRAWPALETTE FAR * lpDDPalette, IUnknown FAR * unkOuter) +{ + fakeDirectDrawPaletteObject *This = (fakeDirectDrawPaletteObject *)_This; + + printf("DirectDraw::CreatePalette(This=%p, dwFlags=%d, DDColorArray=%p, DDPalette=%p, unkOuter=%p)\n", This, (int)dwFlags, lpDDColorArray, lpDDPalette, unkOuter); + + fakeDirectDrawPaletteObject *Palette = (fakeDirectDrawPaletteObject *)malloc(sizeof(fakeDirectDrawPaletteObject)); + Palette->Functions = &piface; + printf(" Palette = %p\n", Palette); + *lpDDPalette = (LPDIRECTDRAWPALETTE)Palette; + + ddraw_palette_SetEntries(Palette, dwFlags, 0, 256, lpDDColorArray); + + Palette->Ref = 0; + ddraw_palette_AddRef(Palette); + + return DD_OK; +} + diff --git a/surface.c b/surface.c index ffc25f6..b44439d 100644 --- a/surface.c +++ b/surface.c @@ -21,15 +21,18 @@ #include "surface.h" /* from main */ -HRESULT QueryInterface(void *This, REFIID riid, void **obj); -ULONG AddRef(void *This); HRESULT null(); DWORD WINAPI ogl_Thread(void *_This); -void surface_flip(fakeDirectDrawSurfaceObject *This); void dump_ddsd(DWORD); void dump_ddscaps(DWORD); +HRESULT ddraw_surface_QueryInterface(void *This, REFIID riid, void **obj) +{ + printf("DirectDrawSurface::QueryInterface(This=%p, riid=%08X, obj=%p)\n", This, (unsigned int)riid, obj); + return S_OK; +} + ULONG ddraw_surface_AddRef(void *_This) { fakeDirectDrawSurfaceObject *This = (fakeDirectDrawSurfaceObject *)_This; @@ -49,10 +52,24 @@ ULONG ddraw_surface_Release(void *_This) if(This->Ref == 0) { + if(This->glThread) + { + This->glRun = FALSE; + SetEvent(This->flipEvent); + WaitForSingleObject(This->glThread, INFINITE); + } if(This->surface) { free(This->surface); } + if(This->glTex) + { + free(This->glTex); + } + if(This->palette) + { + This->palette->Functions->Release(This->palette); + } free(This); return 0; } @@ -79,6 +96,7 @@ HRESULT ddraw_CreateSurface(void *_This, LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRE Surface->caps = 0; Surface->palette = NULL; Surface->glThread = NULL; + Surface->glRun = TRUE; if(lpDDSurfaceDesc->dwFlags & DDSD_CAPS) { @@ -87,8 +105,7 @@ HRESULT ddraw_CreateSurface(void *_This, LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRE Surface->width = This->width; Surface->height = This->height; Surface->hWnd = This->hWnd; - - CreateThread(NULL, 0, ogl_Thread, (void *)Surface, 0, Surface->glThread); + Surface->glThread = CreateThread(NULL, 0, ogl_Thread, (void *)Surface, 0, NULL); } dump_ddscaps(lpDDSurfaceDesc->ddsCaps.dwCaps); @@ -252,7 +269,7 @@ HRESULT ddraw_surface_Unlock(void *_This, LPVOID lpRect) fakeDirectDrawSurface siface = { /* IUnknown */ - QueryInterface, + ddraw_surface_QueryInterface, ddraw_surface_AddRef, ddraw_surface_Release, /* IDirectDrawSurface */ @@ -314,7 +331,7 @@ DWORD WINAPI ogl_Thread(void *_This) This->flipEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - while(1) + while(This->glRun) { WaitForSingleObject(This->flipEvent, INFINITE); ResetEvent(This->flipEvent); @@ -344,6 +361,12 @@ DWORD WINAPI ogl_Thread(void *_This) SwapBuffers(This->hDC); } + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(This->hRC); + ReleaseDC(This->hWnd, This->hDC); + + return 0; } void dump_ddscaps(DWORD dwCaps) diff --git a/surface.h b/surface.h index 4cf100b..672fda5 100644 --- a/surface.h +++ b/surface.h @@ -82,6 +82,7 @@ typedef struct DWORD lXPitch; HANDLE glThread; + BOOL glRun; HANDLE flipEvent; HWND hWnd;