ReactOS 0.4.17-dev-934-g091855f
ddrawex_private.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  ddrawex
 
struct  ddrawex_surface
 

Macros

#define INTERFACE   IDirectDrawFactory
 
#define IDirectDrawFactory_QueryInterface(p, a, b)   (p)->lpVtbl->QueryInterface(p,a,b)
 
#define IDirectDrawFactory_AddRef(p)   (p)->lpVtbl->AddRef(p)
 
#define IDirectDrawFactory_Release(p)   (p)->lpVtbl->Release(p)
 
#define IDirectDrawFactory_CreateDirectDraw(p, a, b, c, d, e, f)   (p)->lpVtbl->CreateDirectDraw(p,a,b,c,d,e,f)
 
#define IDirectDrawFactory_DirectDrawEnumerate(p, a, b)   (p)->lpVtbl->_DirectDrawEnumerate(p,a,b)
 
#define IID_DDrawexPriv   IID_IDirectDrawSurface4
 

Functions

 DEFINE_GUID (CLSID_DirectDrawFactory, 0x4fd2a832, 0x86c8, 0x11d0, 0x8f, 0xca, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d)
 
 DEFINE_GUID (IID_IDirectDrawFactory, 0x4fd2a833, 0x86c8, 0x11d0, 0x8f, 0xca, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0x9d)
 
 DECLARE_INTERFACE_ (IDirectDrawFactory, IUnknown)
 
HRESULT WINAPI ddrawex_factory_CreateDirectDraw (IDirectDrawFactory *iface, GUID *guid, HWND window, DWORD coop_level, DWORD reserved, IUnknown *outer_unknown, IDirectDraw **ddraw)
 
void DDSD_to_DDSD2 (const DDSURFACEDESC *in, DDSURFACEDESC2 *out)
 
void DDSD2_to_DDSD (const DDSURFACEDESC2 *in, DDSURFACEDESC *out)
 
IDirectDraw4 * dd_get_outer (IDirectDraw4 *inner)
 
IDirectDraw4 * dd_get_inner (IDirectDraw4 *outer)
 
struct ddrawex_surface * unsafe_impl_from_IDirectDrawSurface4 (IDirectDrawSurface4 *iface)
 
IDirectDrawSurface4 * dds_get_outer (IDirectDrawSurface4 *inner)
 
HRESULT prepare_permanent_dc (IDirectDrawSurface4 *iface)
 

Macro Definition Documentation

◆ IDirectDrawFactory_AddRef

#define IDirectDrawFactory_AddRef (   p)    (p)->lpVtbl->AddRef(p)

Definition at line 40 of file ddrawex_private.h.

◆ IDirectDrawFactory_CreateDirectDraw

#define IDirectDrawFactory_CreateDirectDraw (   p,
  a,
  b,
  c,
  d,
  e,
  f 
)    (p)->lpVtbl->CreateDirectDraw(p,a,b,c,d,e,f)

Definition at line 42 of file ddrawex_private.h.

◆ IDirectDrawFactory_DirectDrawEnumerate

#define IDirectDrawFactory_DirectDrawEnumerate (   p,
  a,
  b 
)    (p)->lpVtbl->_DirectDrawEnumerate(p,a,b)

Definition at line 43 of file ddrawex_private.h.

◆ IDirectDrawFactory_QueryInterface

#define IDirectDrawFactory_QueryInterface (   p,
  a,
  b 
)    (p)->lpVtbl->QueryInterface(p,a,b)

Definition at line 39 of file ddrawex_private.h.

◆ IDirectDrawFactory_Release

#define IDirectDrawFactory_Release (   p)    (p)->lpVtbl->Release(p)

Definition at line 41 of file ddrawex_private.h.

◆ IID_DDrawexPriv

#define IID_DDrawexPriv   IID_IDirectDrawSurface4

Definition at line 82 of file ddrawex_private.h.

◆ INTERFACE

#define INTERFACE   IDirectDrawFactory

Definition at line 25 of file ddrawex_private.h.

Function Documentation

◆ dd_get_inner()

IDirectDraw4 * dd_get_inner ( IDirectDraw4 *  outer)

Definition at line 1458 of file ddraw.c.

1459{
1461
1462 if (outer->lpVtbl != &ddrawex4_vtbl)
1463 return NULL;
1464 return ddrawex->parent;
1465}
#define NULL
Definition: types.h:112
static const IDirectDraw4Vtbl ddrawex4_vtbl
Definition: ddraw.c:1299
static struct ddrawex * impl_from_IDirectDraw4(IDirectDraw4 *iface)
Definition: ddraw.c:49
static IUnknown * outer
Definition: compobj.c:82
IDirectDraw4 * parent

Referenced by ddrawex_surface4_Initialize().

◆ dd_get_outer()

IDirectDraw4 * dd_get_outer ( IDirectDraw4 *  inner)

◆ ddrawex_factory_CreateDirectDraw()

HRESULT WINAPI ddrawex_factory_CreateDirectDraw ( IDirectDrawFactory *  iface,
GUID *  guid,
HWND  window,
DWORD  coop_level,
DWORD  reserved,
IUnknown *  outer_unknown,
IDirectDraw **  ddraw 
)

Definition at line 1415 of file ddraw.c.

1417{
1418 IDirectDraw *parent = NULL;
1419 struct ddrawex *object;
1420 HRESULT hr;
1421
1422 TRACE("iface %p, guid %s, window %p, coop_level %#lx, reserved %#lx, outer_unknown %p, ddraw %p.\n",
1423 iface, debugstr_guid(guid), window, coop_level, reserved, outer_unknown, ddraw);
1424
1425 if (outer_unknown)
1426 FIXME("Implement aggregation in ddrawex's IDirectDraw interface.\n");
1427
1428 if (!(object = calloc(1, sizeof(*object))))
1429 return E_OUTOFMEMORY;
1430
1431 object->ref = 1;
1432 object->IDirectDraw_iface.lpVtbl = &ddrawex1_vtbl;
1433 object->IDirectDraw2_iface.lpVtbl = &ddrawex2_vtbl;
1434 object->IDirectDraw3_iface.lpVtbl = &ddrawex3_vtbl;
1435 object->IDirectDraw4_iface.lpVtbl = &ddrawex4_vtbl;
1436
1438 goto err;
1439 if (FAILED(hr = IDirectDraw_QueryInterface(parent, &IID_IDirectDraw4, (void **)&object->parent)))
1440 goto err;
1441 if (FAILED(hr = IDirectDraw_SetCooperativeLevel(&object->IDirectDraw_iface, window, coop_level)))
1442 goto err;
1443
1444 *ddraw = &object->IDirectDraw_iface;
1445 IDirectDraw_Release(parent);
1446 return DD_OK;
1447
1448err:
1449 if (object && object->parent)
1450 IDirectDraw4_Release(object->parent);
1451 if (parent)
1452 IDirectDraw_Release(parent);
1453 free(object);
1454 *ddraw = NULL;
1455 return hr;
1456}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
HRESULT WINAPI DirectDrawCreate(LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter)
Definition: main.c:86
static const IDirectDrawVtbl ddrawex1_vtbl
Definition: ddraw.c:1388
static const IDirectDraw3Vtbl ddrawex3_vtbl
Definition: ddraw.c:1331
static const IDirectDraw2Vtbl ddrawex2_vtbl
Definition: ddraw.c:1360
GUID guid
Definition: version.c:147
r parent
Definition: btrfs.c:3010
r reserved
Definition: btrfs.c:3006
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static IHTMLWindow2 * window
Definition: events.c:77
#define err(...)
#define calloc
Definition: rosglue.h:14
#define DD_OK
Definition: ddraw.h:188
#define TRACE(s)
Definition: solgame.cpp:4
IDirectDraw IDirectDraw_iface
Definition: ddraw_private.h:86

◆ dds_get_outer()

IDirectDrawSurface4 * dds_get_outer ( IDirectDrawSurface4 *  inner)

Definition at line 1195 of file surface.c.

1196{
1197 IDirectDrawSurface4 *outer = NULL;
1198 DWORD size = sizeof(outer);
1199 HRESULT hr;
1200 if(!inner) return NULL;
1201
1202 hr = IDirectDrawSurface4_GetPrivateData(inner,
1204 &outer,
1205 &size);
1206 if(FAILED(hr) || outer == NULL)
1207 {
1208 struct ddrawex_surface *impl;
1209
1210 TRACE("Creating new ddrawex surface wrapper for surface %p\n", inner);
1211 impl = calloc(1, sizeof(*impl));
1212 impl->ref = 1;
1215 IDirectDrawSurface4_AddRef(inner);
1216 impl->parent = inner;
1217
1219
1220 hr = IDirectDrawSurface4_SetPrivateData(inner,
1222 &outer,
1223 sizeof(outer),
1224 0 /* Flags */);
1225 if(FAILED(hr))
1226 {
1227 ERR("IDirectDrawSurface4_SetPrivateData failed\n");
1228 }
1229 }
1230
1231 return outer;
1232}
#define ERR(fmt,...)
Definition: precomp.h:57
#define IID_DDrawexPriv
static const IDirectDrawSurface3Vtbl ddrawex_surface3_vtbl
Definition: surface.c:1078
static const IDirectDrawSurface4Vtbl ddrawex_surface4_vtbl
Definition: surface.c:1122
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
IDirectDrawSurface4 * parent
IDirectDrawSurface3 IDirectDrawSurface3_iface
IDirectDrawSurface4 IDirectDrawSurface4_iface

Referenced by ddrawex3_GetSurfaceFromDC(), ddrawex4_CreateSurface(), ddrawex4_GetGDISurface(), ddrawex_surface4_GetAttachedSurface(), enum_surfaces_wrapper(), and enumsurfaces_wrap_cb().

◆ DDSD2_to_DDSD()

void DDSD2_to_DDSD ( const DDSURFACEDESC2 *  in,
DDSURFACEDESC *  out 
)

Definition at line 1242 of file utils.c.

1243{
1244 memset(out, 0, sizeof(*out));
1245 out->dwSize = sizeof(*out);
1246 out->dwFlags = in->dwFlags;
1247 if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
1248 if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
1249 if (in->dwFlags & DDSD_PIXELFORMAT)
1250 {
1251 out->ddpfPixelFormat = in->ddpfPixelFormat;
1252 if ((in->dwFlags & DDSD_CAPS) && (in->ddsCaps.dwCaps & DDSCAPS_ZBUFFER))
1253 {
1254 /* Z buffers have DDSD_ZBUFFERBITDEPTH set, but not DDSD_PIXELFORMAT. They do
1255 * have valid data in ddpfPixelFormat though */
1256 out->dwFlags &= ~DDSD_PIXELFORMAT;
1257 out->dwFlags |= DDSD_ZBUFFERBITDEPTH;
1258 out->dwZBufferBitDepth = in->ddpfPixelFormat.dwZBufferBitDepth;
1259 }
1260 }
1261 /* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
1262 out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
1263 if (in->dwFlags & DDSD_PITCH) out->lPitch = in->lPitch;
1264 if (in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount = in->dwBackBufferCount;
1265 if (in->dwFlags & DDSD_ZBUFFERBITDEPTH) out->dwZBufferBitDepth = in->dwMipMapCount; /* same union */
1266 if (in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth = in->dwAlphaBitDepth;
1267 /* DDraw(native, and wine) does not set the DDSD_LPSURFACE, so always copy */
1268 out->lpSurface = in->lpSurface;
1269 if (in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay = in->ddckCKDestOverlay;
1270 if (in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt = in->ddckCKDestBlt;
1271 if (in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay = in->ddckCKSrcOverlay;
1272 if (in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt = in->ddckCKSrcBlt;
1273 if (in->dwFlags & DDSD_MIPMAPCOUNT) out->dwMipMapCount = in->dwMipMapCount;
1274 if (in->dwFlags & DDSD_REFRESHRATE) out->dwRefreshRate = in->dwRefreshRate;
1275 if (in->dwFlags & DDSD_LINEARSIZE) out->dwLinearSize = in->dwLinearSize;
1276 /* Does not exist in DDSURFACEDESC:
1277 * DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
1278 */
1279 if (in->dwFlags & DDSD_TEXTURESTAGE) WARN("Does not exist in DDSURFACEDESC: DDSD_TEXTURESTAGE\n");
1280 if (in->dwFlags & DDSD_FVF) WARN("Does not exist in DDSURFACEDESC: DDSD_FVF\n");
1281 if (in->dwFlags & DDSD_SRCVBHANDLE) WARN("Does not exist in DDSURFACEDESC: DDSD_SRCVBHANDLE\n");
1283}
#define WARN(fmt,...)
Definition: precomp.h:61
GLuint in
Definition: glext.h:9616
#define DDSD_WIDTH
Definition: ddraw.h:212
#define DDSCAPS_ZBUFFER
Definition: ddraw.h:269
#define DDSD_PIXELFORMAT
Definition: ddraw.h:218
#define DDSD_PITCH
Definition: ddraw.h:213
#define DDSD_REFRESHRATE
Definition: ddraw.h:224
#define DDSD_MIPMAPCOUNT
Definition: ddraw.h:223
#define DDSD_ALPHABITDEPTH
Definition: ddraw.h:216
#define DDSD_TEXTURESTAGE
Definition: ddraw.h:226
#define DDSD_HEIGHT
Definition: ddraw.h:211
#define DDSD_ZBUFFERBITDEPTH
Definition: ddraw.h:215
#define DDSD_CKDESTOVERLAY
Definition: ddraw.h:219
#define DDSD_CKSRCBLT
Definition: ddraw.h:222
#define DDSD_LINEARSIZE
Definition: ddraw.h:225
#define DDSD_SRCVBHANDLE
Definition: ddraw.h:228
#define DDSD_CAPS
Definition: ddraw.h:210
#define DDSD_CKDESTBLT
Definition: ddraw.h:220
#define DDSD_FVF
Definition: ddraw.h:227
#define DDSD_BACKBUFFERCOUNT
Definition: ddraw.h:214
#define DDSD_CKSRCOVERLAY
Definition: ddraw.h:221
#define memset(x, y, z)
Definition: compat.h:39
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

◆ DDSD_to_DDSD2()

void DDSD_to_DDSD2 ( const DDSURFACEDESC *  in,
DDSURFACEDESC2 *  out 
)

Definition at line 1198 of file utils.c.

1199{
1200 /* The output of this function is never passed to the application directly, so
1201 * the memset is not strictly needed. CreateSurface still has problems with this
1202 * though. Don't forget to set ddsCaps.dwCaps2/3/4 to 0 when removing this */
1203 memset(out, 0x00, sizeof(*out));
1204 out->dwSize = sizeof(*out);
1205 out->dwFlags = in->dwFlags & ~DDSD_ZBUFFERBITDEPTH;
1206 if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
1207 if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
1208 if (in->dwFlags & DDSD_PIXELFORMAT) out->ddpfPixelFormat = in->ddpfPixelFormat;
1209 else if(in->dwFlags & DDSD_ZBUFFERBITDEPTH)
1210 {
1211 out->dwFlags |= DDSD_PIXELFORMAT;
1212 memset(&out->ddpfPixelFormat, 0, sizeof(out->ddpfPixelFormat));
1213 out->ddpfPixelFormat.dwSize = sizeof(out->ddpfPixelFormat);
1214 out->ddpfPixelFormat.dwFlags = DDPF_ZBUFFER;
1215 out->ddpfPixelFormat.dwZBufferBitDepth = in->dwZBufferBitDepth;
1216 /* 0 is not a valid DDSURFACEDESC / DDPIXELFORMAT on either side of the
1217 * conversion */
1218 out->ddpfPixelFormat.dwZBitMask = ~0U >> (32 - in->dwZBufferBitDepth);
1219 }
1220 /* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
1221 out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
1222 if (in->dwFlags & DDSD_PITCH) out->lPitch = in->lPitch;
1223 if (in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount = in->dwBackBufferCount;
1224 if (in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth = in->dwAlphaBitDepth;
1225 /* DDraw(native, and wine) does not set the DDSD_LPSURFACE, so always copy */
1226 out->lpSurface = in->lpSurface;
1227 if (in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay = in->ddckCKDestOverlay;
1228 if (in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt = in->ddckCKDestBlt;
1229 if (in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay = in->ddckCKSrcOverlay;
1230 if (in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt = in->ddckCKSrcBlt;
1231 if (in->dwFlags & DDSD_MIPMAPCOUNT) out->dwMipMapCount = in->dwMipMapCount;
1232 if (in->dwFlags & DDSD_REFRESHRATE) out->dwRefreshRate = in->dwRefreshRate;
1233 if (in->dwFlags & DDSD_LINEARSIZE) out->dwLinearSize = in->dwLinearSize;
1234 /* Does not exist in DDSURFACEDESC:
1235 * DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
1236 */
1237}
#define U(x)
Definition: wordpad.c:45
#define DDPF_ZBUFFER
Definition: ddraw.h:513

◆ DECLARE_INTERFACE_()

DECLARE_INTERFACE_ ( IDirectDrawFactory  ,
IUnknown   
)

Definition at line 26 of file ddrawex_private.h.

27{
31 STDMETHOD(CreateDirectDraw)(THIS_ GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags,
32 DWORD dwReserved, IUnknown *pUnkOuter, IDirectDraw **ppDirectDraw) PURE;
33 STDMETHOD(_DirectDrawEnumerate)(THIS_ LPDDENUMCALLBACKW cb, void *ctx) PURE;
34};
HWND hWnd
Definition: settings.c:17
#define PURE
Definition: basetyps.h:64
#define THIS_
Definition: basetyps.h:65
#define THIS
Definition: basetyps.h:66
#define STDMETHOD_(t, m)
Definition: basetyps.h:63
#define STDMETHOD(m)
Definition: basetyps.h:62
_In_ BOOLEAN Release
Definition: cdrom.h:920
_Check_return_ _In_ PQUERY_INTERFACE QueryInterface
Definition: dispmprt.h:1318
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
REFIID riid
Definition: atlbase.h:39
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define REFIID
Definition: guiddef.h:118
uint32_t ULONG
Definition: typedefs.h:59

◆ DEFINE_GUID() [1/2]

DEFINE_GUID ( CLSID_DirectDrawFactory  ,
0x4fd2a832  ,
0x86c8  ,
0x11d0  ,
0x8f  ,
0xca  ,
0x0  ,
0xc0  ,
0x4f  ,
0xd9  ,
0x18  ,
0x9d   
)

◆ DEFINE_GUID() [2/2]

DEFINE_GUID ( IID_IDirectDrawFactory  ,
0x4fd2a833  ,
0x86c8  ,
0x11d0  ,
0x8f  ,
0xca  ,
0x0  ,
0xc0  ,
0x4f  ,
0xd9  ,
0x18  ,
0x9d   
)

◆ prepare_permanent_dc()

HRESULT prepare_permanent_dc ( IDirectDrawSurface4 *  iface)

Definition at line 1234 of file surface.c.

1235{
1237 HRESULT hr;
1238
1239 surface->permanent_dc = TRUE;
1240 if (FAILED(hr = IDirectDrawSurface4_GetDC(surface->parent, &surface->hdc)))
1241 return hr;
1242 return IDirectDrawSurface4_ReleaseDC(surface->parent, surface->hdc);
1243}
#define TRUE
Definition: types.h:120
struct ddrawex_surface * unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
Definition: surface.c:1178

Referenced by ddrawex4_CreateSurface().

◆ unsafe_impl_from_IDirectDrawSurface4()

struct ddrawex_surface * unsafe_impl_from_IDirectDrawSurface4 ( IDirectDrawSurface4 *  iface)

Definition at line 5966 of file surface.c.

5967{
5968 if (!iface) return NULL;
5969 if (iface->lpVtbl != &ddraw_surface4_vtbl)
5970 {
5971 HRESULT hr = IDirectDrawSurface4_QueryInterface(iface, &IID_IDirectDrawSurface4, (void **)&iface);
5972 if (FAILED(hr))
5973 {
5974 WARN("Object %p doesn't expose interface IDirectDrawSurface4.\n", iface);
5975 return NULL;
5976 }
5977 IDirectDrawSurface4_Release(iface);
5978 }
5979 return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface4_iface);
5980}
static struct IDirectDrawSurface4Vtbl ddraw_surface4_vtbl
Definition: surface.c:5724
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by ddraw_surface4_AddAttachedSurface(), ddraw_surface4_Blt(), ddraw_surface4_BltFast(), ddraw_surface4_DeleteAttachedSurface(), ddraw_surface4_Flip(), ddraw_surface4_UpdateOverlay(), ddraw_surface4_UpdateOverlayZOrder(), ddrawex_surface4_AddAttachedSurface(), ddrawex_surface4_Blt(), ddrawex_surface4_BltFast(), ddrawex_surface4_DeleteAttachedSurface(), ddrawex_surface4_Flip(), ddrawex_surface4_UpdateOverlay(), ddrawex_surface4_UpdateOverlayZOrder(), enumsurfaces_thunk_cb(), and prepare_permanent_dc().