From 0e2ea5edc4d2154d27893715caab5aaf92937718 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 14 May 2025 01:52:27 +0200 Subject: [PATCH] miinwin: Get to the CD check (#76) --- miniwin/miniwin/include/miniwin.h | 11 +- miniwin/miniwin/include/miniwin_d3d.h | 4 +- miniwin/miniwin/include/miniwin_d3drm.h | 28 ++-- miniwin/miniwin/include/miniwin_ddraw.h | 8 +- miniwin/miniwin/src/miniwin.cpp | 21 +++ miniwin/miniwin/src/miniwin_d3drm.cpp | 204 +++++++++++++++++++++++- miniwin/miniwin/src/miniwin_ddraw.cpp | 93 ++++++++--- 7 files changed, 324 insertions(+), 45 deletions(-) diff --git a/miniwin/miniwin/include/miniwin.h b/miniwin/miniwin/include/miniwin.h index cee400ca..53b1041a 100644 --- a/miniwin/miniwin/include/miniwin.h +++ b/miniwin/miniwin/include/miniwin.h @@ -205,9 +205,14 @@ typedef GUID REFIID; typedef GUID* LPGUID; struct IUnknown { - virtual ULONG AddRef() = 0; - virtual ULONG Release() = 0; - virtual HRESULT QueryInterface(const GUID& riid, void** ppvObject) = 0; + IUnknown() : m_refCount(1) {} + virtual ULONG AddRef(); + virtual ULONG Release(); + virtual HRESULT QueryInterface(const GUID& riid, void** ppvObject); + virtual ~IUnknown() = default; + +private: + int m_refCount; }; typedef struct IUnknown* LPUNKNOWN; diff --git a/miniwin/miniwin/include/miniwin_d3d.h b/miniwin/miniwin/include/miniwin_d3d.h index eff84786..16d5a368 100644 --- a/miniwin/miniwin/include/miniwin_d3d.h +++ b/miniwin/miniwin/include/miniwin_d3d.h @@ -35,10 +35,10 @@ struct D3DDEVICEDESC { }; typedef D3DDEVICEDESC* LPD3DDEVICEDESC; -struct IDirect3DDevice2 : public IUnknown {}; +struct IDirect3DDevice2 : virtual public IUnknown {}; typedef HRESULT (*LPD3DENUMDEVICESCALLBACK)(LPGUID, LPSTR, LPSTR, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); -struct IDirect3D2 : public IUnknown { +struct IDirect3D2 : virtual public IUnknown { virtual HRESULT CreateDevice(const GUID& guid, void* pBackBuffer, IDirect3DDevice2** ppDirect3DDevice) = 0; virtual HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK cb, void* ctx) = 0; }; diff --git a/miniwin/miniwin/include/miniwin_d3drm.h b/miniwin/miniwin/include/miniwin_d3drm.h index 0236c40d..2ac59ea6 100644 --- a/miniwin/miniwin/include/miniwin_d3drm.h +++ b/miniwin/miniwin/include/miniwin_d3drm.h @@ -127,10 +127,10 @@ struct D3DRMVERTEX { float tu, tv; }; -struct IDirect3DRMVisual : public IUnknown {}; +struct IDirect3DRMVisual : virtual public IUnknown {}; typedef IDirect3DRMVisual* LPDIRECT3DRMVISUAL; -struct IDirect3DRMObject : public IUnknown { +struct IDirect3DRMObject : virtual public IUnknown { virtual HRESULT Clone(void** ppObject) = 0; virtual HRESULT AddDestroyCallback(void (*cb)(IDirect3DRMObject*, void*), void* arg) = 0; virtual HRESULT DeleteDestroyCallback(void (*cb)(IDirect3DRMObject*, void*), void* arg) = 0; @@ -140,7 +140,7 @@ struct IDirect3DRMObject : public IUnknown { virtual HRESULT GetName(DWORD* size, char* name) = 0; virtual HRESULT GetClassName(DWORD* size, char* name) = 0; }; -struct IDirect3DRMTexture : public IUnknown { +struct IDirect3DRMTexture : virtual public IUnknown { virtual HRESULT AddDestroyCallback(void (*cb)(IDirect3DRMObject*, void*), void* arg) = 0; virtual LPVOID GetAppData() = 0; virtual HRESULT SetAppData(LPD3DRM_APPDATA appData) = 0; @@ -154,7 +154,7 @@ typedef IDirect3DRMTexture2* LPDIRECT3DRMTEXTURE2; typedef struct IDirect3DRMMaterial *LPDIRECT3DRMMATERIAL, **LPLPDIRECT3DRMMATERIAL; -struct IDirect3DRMMesh : public IUnknown { +struct IDirect3DRMMesh : virtual public IUnknown { virtual HRESULT Clone(int flags, GUID iid, void** object) = 0; virtual HRESULT GetBox(D3DRMBOX* box) = 0; virtual HRESULT AddGroup( @@ -186,22 +186,22 @@ struct IDirect3DRMMesh : public IUnknown { virtual HRESULT GetVertices(int groupIndex, int startIndex, int count, D3DRMVERTEX* vertices) = 0; }; -struct IDirect3DRMLight : public IUnknown { +struct IDirect3DRMLight : virtual public IUnknown { virtual HRESULT SetColorRGB(float r, float g, float b) = 0; }; -struct IDirect3DRMLightArray : public IUnknown { +struct IDirect3DRMLightArray : virtual public IUnknown { virtual DWORD GetSize() = 0; virtual HRESULT GetElement(int index, IDirect3DRMLight** light) const = 0; }; -struct IDirect3DRMVisualArray : public IUnknown { +struct IDirect3DRMVisualArray : virtual public IUnknown { virtual DWORD GetSize() = 0; virtual HRESULT GetElement(int index, IDirect3DRMVisual** visual) const = 0; }; typedef struct IDirect3DRMFrameArray* LPDIRECT3DRMFRAMEARRAY; -struct IDirect3DRMFrame : public IUnknown { +struct IDirect3DRMFrame : virtual public IUnknown { virtual HRESULT SetAppData(LPD3DRM_APPDATA appData) = 0; virtual LPVOID GetAppData() = 0; virtual HRESULT AddChild(IDirect3DRMFrame* child) = 0; @@ -231,7 +231,7 @@ typedef IDirect3DRMFrame* LPDIRECT3DRMFRAME; struct IDirect3DRMFrame2 : public IDirect3DRMFrame {}; typedef IDirect3DRMFrame2* LPDIRECT3DRMFRAME2; -struct IDirect3DRMFrameArray : public IUnknown { +struct IDirect3DRMFrameArray : virtual public IUnknown { virtual DWORD GetSize() = 0; virtual HRESULT GetElement(DWORD index, IDirect3DRMFrame** frame) = 0; }; @@ -242,7 +242,7 @@ struct D3DRMPICKDESC { float dist; }; -struct IDirect3DRMPickedArray : public IUnknown { +struct IDirect3DRMPickedArray : virtual public IUnknown { virtual DWORD GetSize() = 0; virtual HRESULT GetPick( DWORD index, @@ -274,19 +274,19 @@ struct IDirect3DRMViewport : public IDirect3DRMObject { virtual HRESULT Pick(float x, float y, LPDIRECT3DRMPICKEDARRAY* pickedArray) = 0; }; -struct IDirect3DRMWinDevice : public IUnknown { +struct IDirect3DRMWinDevice : virtual public IUnknown { virtual HRESULT Activate() = 0; virtual HRESULT Paint() = 0; virtual void HandleActivate(WORD wParam) = 0; virtual void HandlePaint(void* p_dc) = 0; }; -struct IDirect3DRMViewportArray : public IUnknown { +struct IDirect3DRMViewportArray : virtual public IUnknown { virtual DWORD GetSize() = 0; virtual HRESULT GetElement(int index, IDirect3DRMViewport** viewport) = 0; }; -struct IDirect3DRMDevice2 : public IUnknown { +struct IDirect3DRMDevice2 : virtual public IUnknown { virtual unsigned long GetWidth() = 0; virtual unsigned long GetHeight() = 0; virtual HRESULT SetBufferCount(int count) = 0; @@ -305,7 +305,7 @@ struct IDirect3DRMDevice2 : public IUnknown { virtual HRESULT GetViewports(IDirect3DRMViewportArray** ppViewportArray) = 0; }; -struct IDirect3DRM : public IUnknown { +struct IDirect3DRM : virtual public IUnknown { virtual HRESULT CreateDeviceFromD3D( const IDirect3D2* d3d, IDirect3DDevice2* d3dDevice, diff --git a/miniwin/miniwin/include/miniwin_ddraw.h b/miniwin/miniwin/include/miniwin_ddraw.h index e114fb54..41291185 100644 --- a/miniwin/miniwin/include/miniwin_ddraw.h +++ b/miniwin/miniwin/include/miniwin_ddraw.h @@ -212,7 +212,7 @@ struct DDSURFACEDESC { typedef struct DDSURFACEDESC* LPDDSURFACEDESC; typedef struct IDirectDraw* LPDIRECTDRAW; -struct IDirectDrawPalette : public IUnknown { +struct IDirectDrawPalette : virtual public IUnknown { virtual HRESULT GetCaps(LPDWORD lpdwCaps) = 0; virtual HRESULT GetEntries(DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) = 0; virtual HRESULT Initialize(LPDIRECTDRAW lpDD, DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) = 0; @@ -220,14 +220,14 @@ struct IDirectDrawPalette : public IUnknown { }; typedef struct IDirectDrawPalette* LPDIRECTDRAWPALETTE; -struct IDirectDrawClipper : public IUnknown { +struct IDirectDrawClipper : virtual public IUnknown { virtual HRESULT SetHWnd(DWORD unnamedParam1, HWND hWnd) = 0; }; typedef IDirectDrawClipper* LPDIRECTDRAWCLIPPER; typedef void *LPDDBLTFX, *LPDDENUMSURFACESCALLBACK; typedef struct IDirectDrawSurface* LPDIRECTDRAWSURFACE; -struct IDirectDrawSurface : public IUnknown { +struct IDirectDrawSurface : virtual public IUnknown { virtual HRESULT AddAttachedSurface(LPDIRECTDRAWSURFACE lpDDSAttachedSurface) = 0; virtual HRESULT Blt( LPRECT lpDestRect, @@ -267,7 +267,7 @@ struct IDirectDrawSurface3 : public IDirectDrawSurface {}; typedef IDirectDrawSurface3* LPDIRECTDRAWSURFACE3; typedef HRESULT (*LPDDENUMMODESCALLBACK)(LPDDSURFACEDESC, LPVOID); -struct IDirectDraw : public IUnknown { +struct IDirectDraw : virtual public IUnknown { virtual HRESULT CreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) = 0; virtual HRESULT CreatePalette( DWORD dwFlags, diff --git a/miniwin/miniwin/src/miniwin.cpp b/miniwin/miniwin/src/miniwin.cpp index 892df7dc..88b397b4 100644 --- a/miniwin/miniwin/src/miniwin.cpp +++ b/miniwin/miniwin/src/miniwin.cpp @@ -4,6 +4,27 @@ #include #include +ULONG IUnknown::AddRef() +{ + m_refCount += 1; + return m_refCount; +} + +ULONG IUnknown::Release() +{ + m_refCount -= 1; + if (m_refCount == 0) { + delete this; + return 0; + } + return m_refCount; +} + +HRESULT IUnknown::QueryInterface(const GUID& riid, void** ppvObject) +{ + return E_NOINTERFACE; +} + static std::vector> sdl_hwnd_mapping; SDL_Window* miniwin_GetSdlWindow(HWND hWnd) diff --git a/miniwin/miniwin/src/miniwin_d3drm.cpp b/miniwin/miniwin/src/miniwin_d3drm.cpp index 0b5063f9..9719c52f 100644 --- a/miniwin/miniwin/src/miniwin_d3drm.cpp +++ b/miniwin/miniwin/src/miniwin_d3drm.cpp @@ -1,8 +1,210 @@ #include "miniwin_d3drm.h" +#include +#include + +struct Direct3DRMDevice2Impl : public IDirect3DRMDevice2 { + unsigned long GetWidth() override { return 640; } + unsigned long GetHeight() override { return 480; } + HRESULT SetBufferCount(int count) override { return DD_OK; } + HRESULT GetBufferCount() override { return DD_OK; } + HRESULT SetShades(unsigned long shadeCount) override { return DD_OK; } + HRESULT GetShades() override { return DD_OK; } + HRESULT SetQuality(int quality) override { return DD_OK; } + HRESULT GetQuality() override { return DD_OK; } + HRESULT SetDither(int dither) override { return DD_OK; } + HRESULT GetDither() override { return DD_OK; } + HRESULT SetTextureQuality(D3DRMTEXTUREQUALITY quality) override { return DD_OK; } + D3DRMTEXTUREQUALITY GetTextureQuality() override { return D3DRMTEXTURE_NEAREST; } + HRESULT SetRenderMode(int mode) override { return DD_OK; } + HRESULT GetRenderMode() override { return DD_OK; } + HRESULT Update() override { return DD_OK; } + HRESULT GetViewports(IDirect3DRMViewportArray** ppViewportArray) override { return DD_OK; } +}; + +struct Direct3DRMFrameImpl : public IDirect3DRMFrame2 { + HRESULT SetAppData(LPD3DRM_APPDATA appData) override { return DD_OK; } + LPVOID GetAppData() override { return 0; } + HRESULT AddChild(IDirect3DRMFrame* child) override + { + child->AddRef(); + return DD_OK; + } + HRESULT DeleteChild(IDirect3DRMFrame* child) override + { + child->Release(); + return DD_OK; + } + HRESULT SetSceneBackgroundRGB(float r, float g, float b) override { return DD_OK; } + HRESULT AddLight(IDirect3DRMLight* light) override + { + light->AddRef(); + return DD_OK; + } + HRESULT GetLights(IDirect3DRMLightArray** lightArray) override { return DD_OK; } + HRESULT AddTransform(int combine, D3DRMMATRIX4D matrix) override { return DD_OK; } + HRESULT GetPosition(int index, D3DVECTOR* position) override { return DD_OK; } + HRESULT AddVisual(IDirect3DRMVisual* visual) override + { + visual->AddRef(); + return DD_OK; + } + HRESULT DeleteVisual(IDirect3DRMVisual* visual) override + { + visual->Release(); + return DD_OK; + } + HRESULT AddVisual(IDirect3DRMMesh* visual) override + { + visual->AddRef(); + return DD_OK; + } + HRESULT DeleteVisual(IDirect3DRMMesh* visual) override + { + visual->Release(); + return DD_OK; + } + HRESULT AddVisual(IDirect3DRMFrame* visual) override + { + visual->AddRef(); + return DD_OK; + } + HRESULT DeleteVisual(IDirect3DRMFrame* visual) override + { + visual->Release(); + return DD_OK; + } + HRESULT GetVisuals(IDirect3DRMVisualArray** visuals) override { return DD_OK; } + HRESULT SetTexture(const IDirect3DRMTexture* texture) override { return DD_OK; } + HRESULT GetTexture(IDirect3DRMTexture** texture) override { return DD_OK; } + HRESULT SetColor(float r, float g, float b, float a) override { return DD_OK; } + HRESULT SetColor(D3DCOLOR) override { return DD_OK; } + HRESULT SetColorRGB(float r, float g, float b) override { return DD_OK; } + HRESULT SetMaterialMode(D3DRMMATERIALMODE mode) override { return DD_OK; } + HRESULT GetChildren(IDirect3DRMFrameArray** children) override { return DD_OK; } +}; + +struct Direct3DRMViewportImpl : public IDirect3DRMViewport { + Direct3DRMViewportImpl() : m_data(nullptr) {} + HRESULT Clone(void** ppObject) override { return DD_OK; } + HRESULT AddDestroyCallback(void (*cb)(IDirect3DRMObject*, void*), void* arg) override { return DD_OK; } + HRESULT DeleteDestroyCallback(void (*cb)(IDirect3DRMObject*, void*), void* arg) override { return DD_OK; } + HRESULT SetAppData(LPD3DRM_APPDATA appData) override + { + m_data = appData; + return DD_OK; + } + LPVOID GetAppData() override { return m_data; } + HRESULT SetName(const char* name) override { return DD_OK; } + HRESULT GetName(DWORD* size, char* name) override { return DD_OK; } + HRESULT GetClassName(DWORD* size, char* name) override { return DD_OK; } + HRESULT Render(IDirect3DRMFrame* group) override { return DD_OK; } + HRESULT ForceUpdate(int x, int y, int w, int h) override { return DD_OK; } + HRESULT Clear() override { return DD_OK; } + HRESULT SetCamera(IDirect3DRMFrame* camera) override { return DD_OK; } + HRESULT GetCamera(IDirect3DRMFrame** camera) override { return DD_OK; } + HRESULT SetProjection(D3DRMPROJECTIONTYPE type) override { return DD_OK; } + D3DRMPROJECTIONTYPE GetProjection() override { return D3DRMPROJECT_PERSPECTIVE; } + HRESULT SetFront(D3DVALUE z) override { return DD_OK; } + D3DVALUE GetFront() override { return 0; } + HRESULT SetBack(D3DVALUE z) override { return DD_OK; } + D3DVALUE GetBack() override { return 0; } + HRESULT SetField(D3DVALUE field) override { return DD_OK; } + D3DVALUE GetField() override { return 0; } + int GetWidth() override { return 640; } + int GetHeight() override { return 480; } + HRESULT Transform(D3DRMVECTOR4D* screen, D3DVECTOR* world) override { return DD_OK; } + HRESULT InverseTransform(D3DVECTOR* world, D3DRMVECTOR4D* screen) override { return DD_OK; } + HRESULT Pick(float x, float y, LPDIRECT3DRMPICKEDARRAY* pickedArray) override { return DD_OK; } + +private: + LPD3DRM_APPDATA m_data; +}; + +struct Direct3DRMLightImpl : public IDirect3DRMLight { + HRESULT SetColorRGB(float r, float g, float b) override { return DD_OK; } +}; + +struct Direct3DRMImpl : public IDirect3DRM2 { + // IUnknown interface + HRESULT QueryInterface(const GUID& riid, void** ppvObject) override + { + if (SDL_memcmp(&riid, &IID_IDirect3DRM2, sizeof(GUID)) == 0) { + this->IUnknown::AddRef(); + *ppvObject = static_cast(this); + return S_OK; + } + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "DirectDrawImpl does not implement guid"); + return E_NOINTERFACE; + } + // IDirect3DRM interface + HRESULT CreateDeviceFromD3D(const IDirect3D2* d3d, IDirect3DDevice2* d3dDevice, IDirect3DRMDevice2** outDevice) + override + { + *outDevice = static_cast(new Direct3DRMDevice2Impl); + return S_OK; + } + HRESULT CreateDeviceFromSurface( + const GUID* guid, + IDirectDraw* dd, + IDirectDrawSurface* surface, + IDirect3DRMDevice2** outDevice + ) override + { + assert(false && "unimplemented"); + return DDERR_GENERIC; + } + HRESULT CreateTexture(D3DRMIMAGE* image, IDirect3DRMTexture2** outTexture) override + { + assert(false && "unimplemented"); + return DDERR_GENERIC; + } + HRESULT CreateTextureFromSurface(LPDIRECTDRAWSURFACE surface, IDirect3DRMTexture2** outTexture) override + { + assert(false && "unimplemented"); + return DDERR_GENERIC; + } + HRESULT CreateMesh(IDirect3DRMMesh** outMesh) override + { + assert(false && "unimplemented"); + return DDERR_GENERIC; + } + HRESULT CreateMaterial(D3DVAL power, IDirect3DRMMaterial** outMaterial) override + { + assert(false && "unimplemented"); + return DDERR_GENERIC; + } + HRESULT CreateLightRGB(D3DRMLIGHTTYPE type, D3DVAL r, D3DVAL g, D3DVAL b, IDirect3DRMLight** outLight) override + { + *outLight = static_cast(new Direct3DRMLightImpl); + return DD_OK; + } + HRESULT CreateFrame(IDirect3DRMFrame* parent, IDirect3DRMFrame2** outFrame) override + { + *outFrame = static_cast(new Direct3DRMFrameImpl); + return DD_OK; + } + HRESULT CreateViewport( + IDirect3DRMDevice2* device, + IDirect3DRMFrame* camera, + int x, + int y, + int width, + int height, + IDirect3DRMViewport** outViewport + ) override + { + *outViewport = static_cast(new Direct3DRMViewportImpl); + return DD_OK; + } + HRESULT SetDefaultTextureShades(unsigned int count) override { return DD_OK; } + HRESULT SetDefaultTextureColors(unsigned int count) override { return DD_OK; } +}; + HRESULT WINAPI Direct3DRMCreate(IDirect3DRM** direct3DRM) { - return DDERR_GENERIC; + *direct3DRM = new Direct3DRMImpl; + return DD_OK; } D3DCOLOR D3DRMCreateColorRGBA(D3DVALUE red, D3DVALUE green, D3DVALUE blue, D3DVALUE alpha) diff --git a/miniwin/miniwin/src/miniwin_ddraw.cpp b/miniwin/miniwin/src/miniwin_ddraw.cpp index 3b38906e..d7a39d48 100644 --- a/miniwin/miniwin/src/miniwin_ddraw.cpp +++ b/miniwin/miniwin/src/miniwin_ddraw.cpp @@ -4,32 +4,81 @@ #include -struct DirectDrawImpl : public IDirectDraw2, public IDirect3D2 { - DirectDrawImpl() : m_refCount(1) {} +struct DirectDrawSurfaceImpl : public IDirectDrawSurface3 { // IUnknown interface - ULONG AddRef() override + HRESULT QueryInterface(const GUID& riid, void** ppvObject) override { - m_refCount += 1; - return m_refCount; - } - ULONG Release() override - { - m_refCount -= 1; - if (m_refCount == 0) { - delete this; - return 0; + if (SDL_memcmp(&riid, &IID_IDirectDrawSurface3, sizeof(GUID)) == 0) { + this->IUnknown::AddRef(); + *ppvObject = static_cast(this); + return S_OK; } - return m_refCount; + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "DirectDrawImpl does not implement guid"); + return E_NOINTERFACE; } + // IDirectDrawSurface interface + HRESULT AddAttachedSurface(LPDIRECTDRAWSURFACE lpDDSAttachedSurface) override { return DD_OK; } + HRESULT Blt( + LPRECT lpDestRect, + LPDIRECTDRAWSURFACE lpDDSrcSurface, + LPRECT lpSrcRect, + DWORD dwFlags, + LPDDBLTFX lpDDBltFx + ) override + { + return DD_OK; + } + HRESULT BltFast(DWORD dwX, DWORD dwY, LPDIRECTDRAWSURFACE lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans) override + { + return DD_OK; + } + HRESULT DeleteAttachedSurface(DWORD dwFlags, LPDIRECTDRAWSURFACE lpDDSAttachedSurface) override { return DD_OK; } + HRESULT Flip(LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride, DWORD dwFlags) override { return DDERR_GENERIC; } + HRESULT GetAttachedSurface(LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE* lplpDDAttachedSurface) override + { + return DDERR_GENERIC; + } + HRESULT GetCaps(LPDDSCAPS lpDDSCaps) override { return DD_OK; } + HRESULT GetDC(HDC* lphDC) override { return DD_OK; } + HRESULT GetOverlayPosition(LPLONG lplX, LPLONG lplY) override { return DD_OK; } + HRESULT GetPalette(LPDIRECTDRAWPALETTE* lplpDDPalette) override { return DDERR_GENERIC; } + HRESULT GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat) override + { + memset(lpDDPixelFormat, 0, sizeof(*lpDDPixelFormat)); + lpDDPixelFormat->dwFlags = DDPF_RGB; + return DD_OK; + } + HRESULT GetSurfaceDesc(LPDDSURFACEDESC lpDDSurfaceDesc) override { return DD_OK; } + HRESULT Initialize(LPDIRECTDRAW lpDD, LPDDSURFACEDESC lpDDSurfaceDesc) override { return DD_OK; } + HRESULT IsLost() override { return DD_OK; } + HRESULT Lock(LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent) override + { + return DD_OK; + } + HRESULT ReleaseDC(HDC hDC) override { return DD_OK; } + HRESULT Restore() override { return DD_OK; } + HRESULT SetClipper(LPDIRECTDRAWCLIPPER lpDDClipper) override { return DD_OK; } + HRESULT SetColorKey(DWORD dwFlags, LPDDCOLORKEY lpDDColorKey) override { return DD_OK; } + HRESULT SetPalette(LPDIRECTDRAWPALETTE lpDDPalette) override { return DD_OK; } + HRESULT Unlock(LPVOID lpSurfaceData) override { return DD_OK; } +}; + +struct DirectDrawClipperImpl : public IDirectDrawClipper { + // IDirectDrawClipper interface + HRESULT SetHWnd(DWORD unnamedParam1, HWND hWnd) override { return DD_OK; } +}; + +struct DirectDrawImpl : public IDirectDraw2, public IDirect3D2 { + // IUnknown interface HRESULT QueryInterface(const GUID& riid, void** ppvObject) override { if (SDL_memcmp(&riid, &IID_IDirectDraw2, sizeof(GUID)) == 0) { - AddRef(); + this->IUnknown::AddRef(); *ppvObject = static_cast(this); return S_OK; } if (SDL_memcmp(&riid, &IID_IDirect3D2, sizeof(GUID)) == 0) { - AddRef(); + this->IUnknown::AddRef(); *ppvObject = static_cast(this); return S_OK; } @@ -39,7 +88,9 @@ struct DirectDrawImpl : public IDirectDraw2, public IDirect3D2 { // IDirecdtDraw interface HRESULT CreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER* lplpDDClipper, IUnknown* pUnkOuter) override { - return DDERR_GENERIC; + *lplpDDClipper = static_cast(new DirectDrawClipperImpl); + + return DD_OK; } HRESULT CreatePalette( DWORD dwFlags, @@ -53,7 +104,9 @@ struct DirectDrawImpl : public IDirectDraw2, public IDirect3D2 { HRESULT CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE* lplpDDSurface, IUnknown* pUnkOuter) override { - return DDERR_GENERIC; + *lplpDDSurface = static_cast(new DirectDrawSurfaceImpl); + + return DD_OK; } HRESULT EnumDisplayModes( DWORD dwFlags, @@ -80,12 +133,10 @@ struct DirectDrawImpl : public IDirectDraw2, public IDirect3D2 { // IDirect3D2 interface HRESULT CreateDevice(const GUID& guid, void* pBackBuffer, IDirect3DDevice2** ppDirect3DDevice) override { - return DDERR_GENERIC; + *ppDirect3DDevice = new IDirect3DDevice2; + return DD_OK; } HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK cb, void* ctx) override; - -private: - int m_refCount; }; HRESULT DirectDrawImpl::EnumDevices(LPD3DENUMDEVICESCALLBACK cb, void* ctx)