miinwin: Get to the CD check (#76)

This commit is contained in:
Anders Jenbo 2025-05-14 01:52:27 +02:00 committed by GitHub
parent 27affb7531
commit 0e2ea5edc4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 324 additions and 45 deletions

View File

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

View File

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

View File

@ -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,

View File

@ -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,

View File

@ -4,6 +4,27 @@
#include <utility>
#include <vector>
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<std::pair<SDL_Window*, HWND>> sdl_hwnd_mapping;
SDL_Window* miniwin_GetSdlWindow(HWND hWnd)

View File

@ -1,8 +1,210 @@
#include "miniwin_d3drm.h"
#include <SDL3/SDL.h>
#include <assert.h>
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<IDirect3DRM2*>(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<IDirect3DRMDevice2*>(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<IDirect3DRMLight*>(new Direct3DRMLightImpl);
return DD_OK;
}
HRESULT CreateFrame(IDirect3DRMFrame* parent, IDirect3DRMFrame2** outFrame) override
{
*outFrame = static_cast<IDirect3DRMFrame2*>(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<IDirect3DRMViewport*>(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)

View File

@ -4,32 +4,81 @@
#include <SDL3/SDL.h>
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<IDirectDrawSurface3*>(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<IDirectDraw2*>(this);
return S_OK;
}
if (SDL_memcmp(&riid, &IID_IDirect3D2, sizeof(GUID)) == 0) {
AddRef();
this->IUnknown::AddRef();
*ppvObject = static_cast<IDirect3D2*>(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<IDirectDrawClipper*>(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<IDirectDrawSurface*>(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)