1/*
2 * DirectDraw driver interface
3 * (DirectX 7 version)
4 *
5 * Copyright (C) 2001 Ove Kaaven
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#ifndef __DDRAWI_INCLUDED__
23#define __DDRAWI_INCLUDED__
24
25#include <_mingw_dxhelper.h>
26#include <ddraw.h>
27#include <dciddi.h> /* the DD HAL is layered onto DCI escapes */
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33typedef struct _DDVIDEOPORTCAPS *LPDDVIDEOPORTCAPS; /* should be in dvp.h */
34typedef struct _DDKERNELCAPS *LPDDKERNELCAPS; /* should be in ddkernel.h */
35typedef struct _VMEMHEAP *LPVMEMHEAP; /* should be in dmemmgr.h */
36
37#define DDAPI WINAPI
38
39/* the DirectDraw versions */
40#define DD_VERSION		0x0200 /* compatibility version */
41#define DD_RUNTIME_VERSION	0x0700 /* actual version */
42
43/* the HAL version returned from QUERYESCSUPPORT - DCICOMMAND */
44#define DD_HAL_VERSION	0x0100
45
46/* more DCICOMMAND escapes */
47#define DDCREATEDRIVEROBJECT	10
48#define DDGET32BITDRIVERNAME	11
49#define DDNEWCALLBACKFNS	12
50#define DDVERSIONINFO		13
51
52#define MAX_DRIVER_NAME		CCHDEVICENAME
53
54/*****************************************************************************
55 * Initialization stuff
56 */
57typedef struct {
58    char szName[260];
59    char szEntryPoint[64];
60    DWORD dwContext;
61} DD32BITDRIVERDATA,*LPDD32BITDRIVERDATA;
62
63typedef struct {
64    DWORD dwHALVersion;
65    ULONG_PTR dwReserved1;
66    ULONG_PTR dwReserved2;
67} DDVERSIONDATA,*LPDDVERSIONDATA;
68
69typedef DWORD (PASCAL *LPDD32BITDRIVERINIT)(DWORD dwContext);
70
71/* pointer to video memory */
72typedef ULONG_PTR FLATPTR;
73
74/* predeclare some structures */
75typedef struct _DDHALINFO *LPDDHALINFO;
76typedef struct _DDRAWI_DIRECTDRAW_INT *LPDDRAWI_DIRECTDRAW_INT;
77typedef struct _DDRAWI_DIRECTDRAW_LCL *LPDDRAWI_DIRECTDRAW_LCL;
78typedef struct _DDRAWI_DIRECTDRAW_GBL *LPDDRAWI_DIRECTDRAW_GBL;
79typedef struct _DDRAWI_DDRAWSURFACE_INT *LPDDRAWI_DDRAWSURFACE_INT;
80typedef struct _DDRAWI_DDRAWSURFACE_LCL *LPDDRAWI_DDRAWSURFACE_LCL;
81typedef struct _DDRAWI_DDRAWSURFACE_GBL *LPDDRAWI_DDRAWSURFACE_GBL;
82typedef struct _DDRAWI_DDRAWSURFACE_MORE *LPDDRAWI_DDRAWSURFACE_MORE;
83typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE *LPDDRAWI_DDRAWSURFACE_GBL_MORE;
84typedef struct _DDRAWI_DDRAWPALETTE_INT *LPDDRAWI_DDRAWPALETTE_INT;
85typedef struct _DDRAWI_DDRAWPALETTE_LCL *LPDDRAWI_DDRAWPALETTE_LCL;
86typedef struct _DDRAWI_DDRAWPALETTE_GBL *LPDDRAWI_DDRAWPALETTE_GBL;
87typedef struct _DDRAWI_DDRAWCLIPPER_INT *LPDDRAWI_DDRAWCLIPPER_INT;
88typedef struct _DDRAWI_DDRAWCLIPPER_LCL *LPDDRAWI_DDRAWCLIPPER_LCL;
89typedef struct _DDRAWI_DDRAWCLIPPER_GBL *LPDDRAWI_DDRAWCLIPPER_GBL;
90typedef struct _DDRAWI_DDVIDEOPORT_INT *LPDDRAWI_DDVIDEOPORT_INT;
91typedef struct _DDRAWI_DDVIDEOPORT_LCL *LPDDRAWI_DDVIDEOPORT_LCL;
92typedef struct _DDRAWI_DDMOTIONCOMP_INT *LPDDRAWI_DDMOTIONCOMP_INT;
93typedef struct _DDRAWI_DDMOTIONCOMP_LCL *LPDDRAWI_DDMOTIONCOMP_LCL;
94
95/* structure GUIDs for GetDriverInfo */
96DEFINE_GUID( GUID_MiscellaneousCallbacks,	0xEFD60CC0,0x49E7,0x11D0,0x88,0x9D,0x00,0xAA,0x00,0xBB,0xB7,0x6A );
97/* ...videport stuff here... */
98DEFINE_GUID( GUID_D3DCallbacks2,		0x0BA584E1,0x70B6,0x11D0,0x88,0x9D,0x00,0xAA,0x00,0xBB,0xB7,0x6A );
99DEFINE_GUID( GUID_D3DCallbacks3,		0xDDF41230,0xEC0A,0x11D0,0xA9,0xB6,0x00,0xAA,0x00,0xC0,0x99,0x3E );
100DEFINE_GUID( GUID_NonLocalVidMemCaps,		0x86C4FA80,0x8D84,0x11D0,0x94,0xE8,0x00,0xC0,0x4F,0xC3,0x41,0x37 );
101/* ...kernel stuff here... */
102DEFINE_GUID( GUID_D3DExtendedCaps,		0x7DE41F80,0x9D93,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29 );
103DEFINE_GUID( GUID_ZPixelFormats,		0x93869880,0x36CF,0x11D1,0x9B,0x1B,0x00,0xAA,0x00,0xBB,0xB8,0xAE );
104DEFINE_GUID( GUID_DDMoreSurfaceCaps,		0x3B8A0466,0xF269,0x11D1,0x88,0x0B,0x00,0xC0,0x4F,0xD9,0x30,0xC5 );
105DEFINE_GUID( GUID_DDStereoMode,			0xF828169C,0xA8E8,0x11D2,0xA1,0xF2,0x00,0xA0,0xC9,0x83,0xEA,0xF6 );
106/* ...more stuff here... */
107DEFINE_GUID(GUID_D3DParseUnknownCommandCallback,0x2E04FFA0,0x98E4,0x11D1,0x8C,0xE1,0x00,0xA0,0xC9,0x06,0x29,0xA8 );
108/* ...motioncomp stuff here... */
109DEFINE_GUID( GUID_Miscellaneous2Callbacks,	0x406B2F00,0x3E5A,0x11D1,0xB6,0x40,0x00,0xAA,0x00,0xA1,0xF9,0x6A );
110
111/*****************************************************************************
112 * driver->ddraw callbacks
113 */
114typedef BOOL    (DDAPI *LPDDHAL_SETINFO)(LPDDHALINFO lpDDHalInfo, BOOL reset);
115typedef FLATPTR (DDAPI *LPDDHAL_VIDMEMALLOC)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, DWORD dwWidth, DWORD dwHeight);
116typedef void    (DDAPI *LPDDHAL_VIDMEMFREE)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, FLATPTR fpMem);
117
118typedef struct {
119    DWORD		dwSize;
120    LPDDHAL_SETINFO	lpSetInfo;
121    LPDDHAL_VIDMEMALLOC	lpVidMemAlloc;
122    LPDDHAL_VIDMEMFREE	lpVidMemFree;
123} DDHALDDRAWFNS,*LPDDHALDDRAWFNS;
124
125/*****************************************************************************
126 * mode info structure
127 */
128typedef struct _DDHALMODEINFO {
129    DWORD	dwWidth;
130    DWORD	dwHeight;
131    LONG	lPitch;
132    DWORD	dwBPP;
133    WORD	wFlags;
134    WORD	wRefreshRate;
135    DWORD	dwRBitMask;
136    DWORD	dwGBitMask;
137    DWORD	dwBBitMask;
138    DWORD	dwAlphaBitMask;
139} DDHALMODEINFO,*LPDDHALMODEINFO;
140
141#define DDMODEINFO_PALETTIZED	0x0001
142#define DDMODEINFO_MODEX	0x0002
143#define DDMODEINFO_UNSUPPORTED	0x0004
144#define DDMODEINFO_STANDARDVGA	0x0008
145#define DDMODEINFO_MAXREFRESH	0x0010
146#define DDMODEINFO_STEREO	0x0020
147
148/*****************************************************************************
149 * video memory info structure
150 */
151typedef struct _VIDMEM {
152    DWORD	dwFlags;
153    FLATPTR	fpStart;
154    union {
155	FLATPTR		fpEnd;
156	DWORD		dwWidth;
157    } DUMMYUNIONNAME1;
158    DDSCAPS	ddsCaps;
159    DDSCAPS	ddsCapsAlt;
160    union {
161	LPVMEMHEAP	lpHeap;
162	DWORD		dwHeight;
163    } DUMMYUNIONNAME2;
164} VIDMEM,*LPVIDMEM;
165
166#define VIDMEM_ISLINEAR		0x00000001
167#define VIDMEM_ISRECTANGULAR	0x00000002
168#define VIDMEM_ISHEAP		0x00000004
169#define VIDMEM_ISNONLOCAL	0x00000008
170#define VIDMEM_ISWC		0x00000010
171#define VIDMEM_HEAPDISABLED	0x00000020
172
173typedef struct _VIDMEMINFO {
174    FLATPTR		fpPrimary;
175    DWORD		dwFlags;
176    DWORD		dwDisplayWidth;
177    DWORD		dwDisplayHeight;
178    LONG		lDisplayPitch;
179    DDPIXELFORMAT	ddpfDisplay;
180    DWORD		dwOffscreenAlign;
181    DWORD		dwOverlayAlign;
182    DWORD		dwTextureAlign;
183    DWORD		dwZBufferAlign;
184    DWORD		dwAlphaAlign;
185    DWORD		dwNumHeaps;
186    LPVIDMEM		pvmList;
187} VIDMEMINFO,*LPVIDMEMINFO;
188
189typedef struct _HEAPALIAS {
190    FLATPTR	fpVidMem;
191    LPVOID	lpAlias;
192    DWORD	dwAliasSize;
193} HEAPALIAS,*LPHEAPALIAS;
194
195typedef struct _HEAPALIASINFO {
196    DWORD	dwRefCnt;
197    DWORD	dwFlags;
198    DWORD	dwNumHeaps;
199    LPHEAPALIAS	lpAliases;
200} HEAPALIASINFO,*LPHEAPALIASINFO;
201
202#define HEAPALIASINFO_MAPPEDREAL	0x00000001
203#define HEAPALIASINFO_MAPPEDDUMMY	0x00000002
204
205/*****************************************************************************
206 * capabilities structures
207 */
208typedef struct _DDCORECAPS {
209    DWORD	dwSize;
210    DWORD	dwCaps;
211    DWORD	dwCaps2;
212    DWORD	dwCKeyCaps;
213    DWORD	dwFXCaps;
214    DWORD	dwFXAlphaCaps;
215    DWORD	dwPalCaps;
216    DWORD	dwSVCaps;
217    DWORD	dwAlphaBltConstBitDepths;
218    DWORD	dwAlphaBltPixelBitDepths;
219    DWORD	dwAlphaBltSurfaceBitDepths;
220    DWORD	dwAlphaOverlayConstBitDepths;
221    DWORD	dwAlphaOverlayPixelBitDepths;
222    DWORD	dwAlphaOverlaySurfaceBitDepths;
223    DWORD	dwZBufferBitDepths;
224    DWORD	dwVidMemTotal;
225    DWORD	dwVidMemFree;
226    DWORD	dwMaxVisibleOverlays;
227    DWORD	dwCurrVisibleOverlays;
228    DWORD	dwNumFourCCCodes;
229    DWORD	dwAlignBoundarySrc;
230    DWORD	dwAlignSizeSrc;
231    DWORD	dwAlignBoundaryDest;
232    DWORD	dwAlignSizeDest;
233    DWORD	dwAlignStrideAlign;
234    DWORD	dwRops[DD_ROP_SPACE];
235    DDSCAPS	ddsCaps;
236    DWORD	dwMinOverlayStretch;
237    DWORD	dwMaxOverlayStretch;
238    DWORD	dwMinLiveVideoStretch;
239    DWORD	dwMaxLiveVideoStretch;
240    DWORD	dwMinHwCodecStretch;
241    DWORD	dwMaxHwCodecStretch;
242    DWORD	dwReserved1;
243    DWORD	dwReserved2;
244    DWORD	dwReserved3;
245    DWORD	dwSVBCaps;
246    DWORD	dwSVBCKeyCaps;
247    DWORD	dwSVBFXCaps;
248    DWORD	dwSVBRops[DD_ROP_SPACE];
249    DWORD	dwVSBCaps;
250    DWORD	dwVSBCKeyCaps;
251    DWORD	dwVSBFXCaps;
252    DWORD	dwVSBRops[DD_ROP_SPACE];
253    DWORD	dwSSBCaps;
254    DWORD	dwSSBCKeyCaps;
255    DWORD	dwSSBFXCaps;
256    DWORD	dwSSBRops[DD_ROP_SPACE];
257    DWORD	dwMaxVideoPorts;
258    DWORD	dwCurrVideoPorts;
259    DWORD	dwSVBCaps2;
260} DDCORECAPS,*LPDDCORECAPS;
261
262typedef struct _DDNONLOCALVIDMEMCAPS {
263    DWORD	dwSize;
264    DWORD	dwNLVBCaps;
265    DWORD	dwNLVBCaps2;
266    DWORD	dwNLVBCKeyCaps;
267    DWORD	dwNLVBFXCaps;
268    DWORD	dwNLVBRops[DD_ROP_SPACE];
269} DDNONLOCALVIDMEMCAPS,*LPDDNONLOCALVIDMEMCAPS;
270
271#define DDSCAPS_EXECUTEBUFFER	DDSCAPS_RESERVED2
272#define DDSCAPS2_VERTEXBUFFER	DDSCAPS2_RESERVED1
273#define DDSCAPS2_COMMANDBUFFER	DDSCAPS2_RESERVED2
274
275/*****************************************************************************
276 * ddraw->driver callbacks
277 */
278#define DDHAL_DRIVER_NOTHANDLED	0
279#define DDHAL_DRIVER_HANDLED	1
280#define DDHAL_DRIVER_NOCKEYHW	2
281
282typedef struct _DDHAL_DESTROYDRIVERDATA		*LPDDHAL_DESTROYDRIVERDATA;
283typedef struct _DDHAL_CREATESURFACEDATA		*LPDDHAL_CREATESURFACEDATA;
284typedef struct _DDHAL_DRVSETCOLORKEYDATA	*LPDDHAL_DRVSETCOLORKEYDATA;
285typedef struct _DDHAL_SETMODEDATA		*LPDDHAL_SETMODEDATA;
286typedef struct _DDHAL_WAITFORVERTICALBLANKDATA	*LPDDHAL_WAITFORVERTICALBLANKDATA;
287typedef struct _DDHAL_CANCREATESURFACEDATA	*LPDDHAL_CANCREATESURFACEDATA;
288typedef struct _DDHAL_CREATEPALETTEDATA		*LPDDHAL_CREATEPALETTEDATA;
289typedef struct _DDHAL_GETSCANLINEDATA		*LPDDHAL_GETSCANLINEDATA;
290typedef struct _DDHAL_SETEXCLUSIVEMODEDATA	*LPDDHAL_SETEXCLUSIVEMODEDATA;
291typedef struct _DDHAL_FLIPTOGDISURFACEDATA	*LPDDHAL_FLIPTOGDISURFACEDATA;
292
293typedef DWORD (PASCAL *LPDDHAL_DESTROYDRIVER)	    (LPDDHAL_DESTROYDRIVERDATA);
294typedef DWORD (PASCAL *LPDDHAL_CREATESURFACE)	    (LPDDHAL_CREATESURFACEDATA);
295typedef DWORD (PASCAL *LPDDHAL_SETCOLORKEY)	    (LPDDHAL_DRVSETCOLORKEYDATA);
296typedef DWORD (PASCAL *LPDDHAL_SETMODE)		    (LPDDHAL_SETMODEDATA);
297typedef DWORD (PASCAL *LPDDHAL_WAITFORVERTICALBLANK)(LPDDHAL_WAITFORVERTICALBLANKDATA);
298typedef DWORD (PASCAL *LPDDHAL_CANCREATESURFACE)    (LPDDHAL_CANCREATESURFACEDATA );
299typedef DWORD (PASCAL *LPDDHAL_CREATEPALETTE)	    (LPDDHAL_CREATEPALETTEDATA);
300typedef DWORD (PASCAL *LPDDHAL_GETSCANLINE)	    (LPDDHAL_GETSCANLINEDATA);
301typedef DWORD (PASCAL *LPDDHAL_SETEXCLUSIVEMODE)    (LPDDHAL_SETEXCLUSIVEMODEDATA);
302typedef DWORD (PASCAL *LPDDHAL_FLIPTOGDISURFACE)    (LPDDHAL_FLIPTOGDISURFACEDATA);
303
304typedef struct _DDHAL_DDCALLBACKS {
305    DWORD				dwSize;
306    DWORD				dwFlags;
307    LPDDHAL_DESTROYDRIVER		DestroyDriver;
308    LPDDHAL_CREATESURFACE		CreateSurface;
309    LPDDHAL_SETCOLORKEY			SetColorKey;
310    LPDDHAL_SETMODE			SetMode;
311    LPDDHAL_WAITFORVERTICALBLANK	WaitForVerticalBlank;
312    LPDDHAL_CANCREATESURFACE		CanCreateSurface;
313    LPDDHAL_CREATEPALETTE		CreatePalette;
314    LPDDHAL_GETSCANLINE			GetScanLine;
315    /* DirectX 2 */
316    LPDDHAL_SETEXCLUSIVEMODE		SetExclusiveMode;
317    LPDDHAL_FLIPTOGDISURFACE		FlipToGDISurface;
318} DDHAL_DDCALLBACKS,*LPDDHAL_DDCALLBACKS;
319
320typedef struct _DDHAL_DESTROYSURFACEDATA	*LPDDHAL_DESTROYSURFACEDATA;
321typedef struct _DDHAL_FLIPDATA			*LPDDHAL_FLIPDATA;
322typedef struct _DDHAL_SETCLIPLISTDATA		*LPDDHAL_SETCLIPLISTDATA;
323typedef struct _DDHAL_LOCKDATA			*LPDDHAL_LOCKDATA;
324typedef struct _DDHAL_UNLOCKDATA		*LPDDHAL_UNLOCKDATA;
325typedef struct _DDHAL_BLTDATA			*LPDDHAL_BLTDATA;
326typedef struct _DDHAL_SETCOLORKEYDATA		*LPDDHAL_SETCOLORKEYDATA;
327typedef struct _DDHAL_ADDATTACHEDSURFACEDATA	*LPDDHAL_ADDATTACHEDSURFACEDATA;
328typedef struct _DDHAL_GETBLTSTATUSDATA		*LPDDHAL_GETBLTSTATUSDATA;
329typedef struct _DDHAL_GETFLIPSTATUSDATA		*LPDDHAL_GETFLIPSTATUSDATA;
330typedef struct _DDHAL_UPDATEOVERLAYDATA		*LPDDHAL_UPDATEOVERLAYDATA;
331typedef struct _DDHAL_SETOVERLAYPOSITIONDATA	*LPDDHAL_SETOVERLAYPOSITIONDATA;
332typedef struct _DDHAL_SETPALETTEDATA		*LPDDHAL_SETPALETTEDATA;
333
334typedef DWORD (PASCAL *LPDDHALSURFCB_DESTROYSURFACE)	(LPDDHAL_DESTROYSURFACEDATA);
335typedef DWORD (PASCAL *LPDDHALSURFCB_FLIP)		(LPDDHAL_FLIPDATA);
336typedef DWORD (PASCAL *LPDDHALSURFCB_SETCLIPLIST)	(LPDDHAL_SETCLIPLISTDATA);
337typedef DWORD (PASCAL *LPDDHALSURFCB_LOCK)		(LPDDHAL_LOCKDATA);
338typedef DWORD (PASCAL *LPDDHALSURFCB_UNLOCK)		(LPDDHAL_UNLOCKDATA);
339typedef DWORD (PASCAL *LPDDHALSURFCB_BLT)		(LPDDHAL_BLTDATA);
340typedef DWORD (PASCAL *LPDDHALSURFCB_SETCOLORKEY)	(LPDDHAL_SETCOLORKEYDATA);
341typedef DWORD (PASCAL *LPDDHALSURFCB_ADDATTACHEDSURFACE)(LPDDHAL_ADDATTACHEDSURFACEDATA);
342typedef DWORD (PASCAL *LPDDHALSURFCB_GETBLTSTATUS)	(LPDDHAL_GETBLTSTATUSDATA);
343typedef DWORD (PASCAL *LPDDHALSURFCB_GETFLIPSTATUS)	(LPDDHAL_GETFLIPSTATUSDATA);
344typedef DWORD (PASCAL *LPDDHALSURFCB_UPDATEOVERLAY)	(LPDDHAL_UPDATEOVERLAYDATA);
345typedef DWORD (PASCAL *LPDDHALSURFCB_SETOVERLAYPOSITION)(LPDDHAL_SETOVERLAYPOSITIONDATA);
346typedef DWORD (PASCAL *LPDDHALSURFCB_SETPALETTE)	(LPDDHAL_SETPALETTEDATA);
347
348typedef struct _DDHAL_DDSURFACECALLBACKS {
349    DWORD				dwSize;
350    DWORD				dwFlags;
351    LPDDHALSURFCB_DESTROYSURFACE	DestroySurface;
352    LPDDHALSURFCB_FLIP			Flip;
353    LPDDHALSURFCB_SETCLIPLIST		SetClipList;
354    LPDDHALSURFCB_LOCK			Lock;
355    LPDDHALSURFCB_UNLOCK		Unlock;
356    LPDDHALSURFCB_BLT			Blt;
357    LPDDHALSURFCB_SETCOLORKEY		SetColorKey;
358    LPDDHALSURFCB_ADDATTACHEDSURFACE	AddAttachedSurface;
359    LPDDHALSURFCB_GETBLTSTATUS		GetBltStatus;
360    LPDDHALSURFCB_GETFLIPSTATUS		GetFlipStatus;
361    LPDDHALSURFCB_UPDATEOVERLAY		UpdateOverlay;
362    LPDDHALSURFCB_SETOVERLAYPOSITION	SetOverlayPosition;
363    LPVOID				reserved4;
364    LPDDHALSURFCB_SETPALETTE		SetPalette;
365} DDHAL_DDSURFACECALLBACKS,*LPDDHAL_DDSURFACECALLBACKS;
366
367typedef struct _DDHAL_DESTROYPALETTEDATA	*LPDDHAL_DESTROYPALETTEDATA;
368typedef struct _DDHAL_SETENTRIESDATA		*LPDDHAL_SETENTRIESDATA;
369
370typedef DWORD (PASCAL *LPDDHALPALCB_DESTROYPALETTE)(LPDDHAL_DESTROYPALETTEDATA);
371typedef DWORD (PASCAL *LPDDHALPALCB_SETENTRIES)    (LPDDHAL_SETENTRIESDATA);
372
373typedef struct _DDHAL_DDPALETTECALLBACKS {
374    DWORD				dwSize;
375    DWORD				dwFlags;
376    LPDDHALPALCB_DESTROYPALETTE		DestroyPalette;
377    LPDDHALPALCB_SETENTRIES		SetEntries;
378} DDHAL_DDPALETTECALLBACKS,*LPDDHAL_DDPALETTECALLBACKS;
379
380typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CANCREATEEXEBUF)(LPDDHAL_CANCREATESURFACEDATA);
381typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CREATEEXEBUF)   (LPDDHAL_CREATESURFACEDATA);
382typedef DWORD (PASCAL *LPDDHALEXEBUFCB_DESTROYEXEBUF)  (LPDDHAL_DESTROYSURFACEDATA);
383typedef DWORD (PASCAL *LPDDHALEXEBUFCB_LOCKEXEBUF)     (LPDDHAL_LOCKDATA);
384typedef DWORD (PASCAL *LPDDHALEXEBUFCB_UNLOCKEXEBUF)   (LPDDHAL_UNLOCKDATA);
385
386typedef struct _DDHAL_DDEXEBUFCALLBACKS {
387    DWORD				dwSize;
388    DWORD				dwFlags;
389    LPDDHALEXEBUFCB_CANCREATEEXEBUF	CanCreateExecuteBuffer;
390    LPDDHALEXEBUFCB_CREATEEXEBUF	CreateExecuteBuffer;
391    LPDDHALEXEBUFCB_DESTROYEXEBUF	DestroyExecuteBuffer;
392    LPDDHALEXEBUFCB_LOCKEXEBUF		LockExecuteBuffer;
393    LPDDHALEXEBUFCB_UNLOCKEXEBUF	UnlockExecuteBuffer;
394} DDHAL_DDEXEBUFCALLBACKS,*LPDDHAL_DDEXEBUFCALLBACKS;
395
396typedef struct _DDHAL_GETAVAILDRIVERMEMORYDATA	*LPDDHAL_GETAVAILDRIVERMEMORYDATA;
397typedef struct _DDHAL_UPDATENONLOCALHEAPDATA	*LPDDHAL_UPDATENONLOCALHEAPDATA;
398typedef struct _DDHAL_GETHEAPALIGNMENTDATA	*LPDDHAL_GETHEAPALIGNMENTDATA;
399
400typedef DWORD (PASCAL *LPDDHAL_GETAVAILDRIVERMEMORY)(LPDDHAL_GETAVAILDRIVERMEMORYDATA);
401typedef DWORD (PASCAL *LPDDHAL_UPDATENONLOCALHEAP)  (LPDDHAL_UPDATENONLOCALHEAPDATA);
402typedef DWORD (PASCAL *LPDDHAL_GETHEAPALIGNMENT)    (LPDDHAL_GETHEAPALIGNMENTDATA);
403
404typedef struct _DDHAL_DDMISCELLANEOUSCALLBACKS {
405    DWORD				dwSize;
406    DWORD				dwFlags;
407    LPDDHAL_GETAVAILDRIVERMEMORY	GetAvailDriverMemory;
408    LPDDHAL_UPDATENONLOCALHEAP		UpdateNonLocalHeap;
409    LPDDHAL_GETHEAPALIGNMENT		GetHeapAlignment;
410    LPDDHALSURFCB_GETBLTSTATUS		GetSysmemBltStatus;
411} DDHAL_DDMISCELLANEOUSCALLBACKS,*LPDDHAL_DDMISCELLANEOUSCALLBACKS;
412
413typedef struct _DDHAL_CREATESURFACEEXDATA	*LPDDHAL_CREATESURFACEEXDATA;
414typedef struct _DDHAL_GETDRIVERSTATEDATA	*LPDDHAL_GETDRIVERSTATEDATA;
415typedef struct _DDHAL_DESTROYDDLOCALDATA	*LPDDHAL_DESTROYDDLOCALDATA;
416
417typedef DWORD (PASCAL *LPDDHAL_CREATESURFACEEX)(LPDDHAL_CREATESURFACEEXDATA);
418typedef DWORD (PASCAL *LPDDHAL_GETDRIVERSTATE) (LPDDHAL_GETDRIVERSTATEDATA);
419typedef DWORD (PASCAL *LPDDHAL_DESTROYDDLOCAL) (LPDDHAL_DESTROYDDLOCALDATA);
420
421typedef struct _DDHAL_DDMISCELLANEOUS2CALLBACKS {
422    DWORD				dwSize;
423    DWORD				dwFlags;
424    LPVOID				Reserved;
425    LPDDHAL_CREATESURFACEEX		CreateSurfaceEx;
426    LPDDHAL_GETDRIVERSTATE		GetDriverState;
427    LPDDHAL_DESTROYDDLOCAL		DestroyDDLocal;
428} DDHAL_DDMISCELLANEOUS2CALLBACKS,*LPDDHAL_DDMISCELLANEOUS2CALLBACKS;
429
430typedef HRESULT (WINAPI *LPDDGAMMACALIBRATORPROC)(LPDDGAMMARAMP, LPBYTE);
431
432/*****************************************************************************
433 * driver info structure
434 *
435 * The HAL is queried for additional callbacks via the GetDriverInfo callback.
436 */
437typedef struct _DDHAL_GETDRIVERINFODATA *LPDDHAL_GETDRIVERINFODATA;
438typedef DWORD (PASCAL *LPDDHAL_GETDRIVERINFO)(LPDDHAL_GETDRIVERINFODATA);
439
440typedef struct _DDHALINFO {
441    DWORD			dwSize;
442    LPDDHAL_DDCALLBACKS		lpDDCallbacks;
443    LPDDHAL_DDSURFACECALLBACKS	lpDDSurfaceCallbacks;
444    LPDDHAL_DDPALETTECALLBACKS	lpDDPaletteCallbacks;
445    VIDMEMINFO			vmiData;
446    DDCORECAPS			ddCaps;
447    DWORD			dwMonitorFrequency;
448    LPDDHAL_GETDRIVERINFO	GetDriverInfo;
449    DWORD			dwModeIndex;
450    LPDWORD			lpdwFourCC;
451    DWORD			dwNumModes;
452    LPDDHALMODEINFO		lpModeInfo;
453    DWORD			dwFlags;
454    LPVOID			lpPDevice;
455    DWORD			hInstance;
456    /* DirectX 2 */
457    ULONG_PTR			lpD3DGlobalDriverData;
458    ULONG_PTR			lpD3DHALCallbacks;
459    LPDDHAL_DDEXEBUFCALLBACKS	lpDDExeBufCallbacks;
460} DDHALINFO;
461
462#define DDHALINFO_ISPRIMARYDISPLAY	0x00000001
463#define DDHALINFO_MODEXILLEGAL		0x00000002
464#define DDHALINFO_GETDRIVERINFOSET	0x00000004
465
466/* where the high-level ddraw implementation stores the callbacks */
467typedef struct _DDHAL_CALLBACKS {
468    DDHAL_DDCALLBACKS		cbDDCallbacks;
469    DDHAL_DDSURFACECALLBACKS	cbDDSurfaceCallbacks;
470    DDHAL_DDPALETTECALLBACKS	cbDDPaletteCallbacks;
471    DDHAL_DDCALLBACKS		HALDD;
472    DDHAL_DDSURFACECALLBACKS	HALDDSurface;
473    DDHAL_DDPALETTECALLBACKS	HALDDPalette;
474    DDHAL_DDCALLBACKS		HELDD;
475    DDHAL_DDSURFACECALLBACKS	HELDDSurface;
476    DDHAL_DDPALETTECALLBACKS	HELDDPalette;
477    DDHAL_DDEXEBUFCALLBACKS	cbDDExeBufCallbacks;
478    DDHAL_DDEXEBUFCALLBACKS	HALDDExeBuf;
479    DDHAL_DDEXEBUFCALLBACKS	HELDDExeBuf;
480    /* there's more... videoport, colorcontrol, misc, and motion compensation callbacks... */
481} DDHAL_CALLBACKS,*LPDDHAL_CALLBACKS;
482
483/*****************************************************************************
484 * parameter structures
485 */
486typedef struct _DDHAL_DESTROYDRIVERDATA {
487    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
488    HRESULT			ddRVal;
489    LPDDHAL_DESTROYDRIVER	DestroyDriver;
490} DDHAL_DESTROYDRIVERDATA;
491
492typedef struct _DDHAL_SETMODEDATA {
493    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
494    DWORD			dwModeIndex;
495    HRESULT			ddRVal;
496    LPDDHAL_SETMODE		SetMode;
497    BOOL			inexcl;
498    BOOL			useRefreshRate;
499} DDHAL_SETMODEDATA;
500
501typedef struct _DDHAL_CREATESURFACEDATA {
502    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
503    LPDDSURFACEDESC		lpDDSurfaceDesc;
504    LPDDRAWI_DDRAWSURFACE_LCL *	lplpSList;
505    DWORD			dwSCnt;
506    HRESULT			ddRVal;
507    LPDDHAL_CREATESURFACE	CreateSurface;
508} DDHAL_CREATESURFACEDATA;
509
510typedef struct _DDHAL_CANCREATESURFACEDATA {
511    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
512    LPDDSURFACEDESC		lpDDSurfaceDesc;
513    DWORD			bIsDifferentPixelFormat;
514    HRESULT			ddRVal;
515    LPDDHAL_CANCREATESURFACE	CanCreateSurface;
516} DDHAL_CANCREATESURFACEDATA;
517
518typedef struct _DDHAL_CREATEPALETTEDATA {
519    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
520    LPDDRAWI_DDRAWPALETTE_GBL	lpDDPalette;
521    LPPALETTEENTRY		lpColorTable;
522    HRESULT			ddRVal;
523    LPDDHAL_CREATEPALETTE	CreatePalette;
524    BOOL			is_excl;
525} DDHAL_CREATEPALETTEDATA;
526
527typedef struct _DDHAL_SETEXCLUSIVEMODEDATA {
528    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
529    DWORD			dwEnterExcl;
530    DWORD			dwReserved;
531    HRESULT			ddRVal;
532    LPDDHAL_SETEXCLUSIVEMODE	SetExclusiveMode;
533} DDHAL_SETEXCLUSIVEMODEDATA;
534
535/* surfaces */
536typedef struct _DDHAL_DESTROYSURFACEDATA {
537    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
538    LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
539    HRESULT			ddRVal;
540    LPDDHALSURFCB_DESTROYSURFACE DestroySurface;
541} DDHAL_DESTROYSURFACEDATA;
542
543typedef struct _DDHAL_FLIPDATA {
544    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
545    LPDDRAWI_DDRAWSURFACE_LCL	lpSurfCurr;
546    LPDDRAWI_DDRAWSURFACE_LCL	lpSurfTarg;
547    DWORD			dwFlags;
548    HRESULT			ddRVal;
549    LPDDHALSURFCB_FLIP		Flip;
550    LPDDRAWI_DDRAWSURFACE_LCL	lpSurfCurrLeft;
551    LPDDRAWI_DDRAWSURFACE_LCL	lpSurfTargLeft;
552} DDHAL_FLIPDATA;
553
554typedef struct _DDHAL_LOCKDATA {
555    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
556    LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
557    DWORD			bHasRect;
558    RECTL			rArea;
559    LPVOID			lpSurfData;
560    HRESULT			ddRVal;
561    LPDDHALSURFCB_LOCK		Lock;
562    DWORD			dwFlags;
563} DDHAL_LOCKDATA;
564
565typedef struct _DDHAL_UNLOCKDATA {
566    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
567    LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
568    HRESULT			ddRVal;
569    LPDDHALSURFCB_UNLOCK	Unlock;
570} DDHAL_UNLOCKDATA;
571
572typedef struct _DDHAL_BLTDATA {
573    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
574    LPDDRAWI_DDRAWSURFACE_LCL	lpDDDestSurface;
575    RECTL			rDest;
576    LPDDRAWI_DDRAWSURFACE_LCL	lpDDSrcSurface;
577    RECTL			rSrc;
578    DWORD			dwFlags;
579    DWORD			dwROPFlags;
580    DDBLTFX			bltFX;
581    HRESULT			ddRVal;
582    LPDDHALSURFCB_BLT		Blt;
583    BOOL			IsClipped;
584    RECTL			rOrigDest;
585    RECTL			rOrigSrc;
586    DWORD			dwRectCnt;
587    LPRECT			prDestRects;
588} DDHAL_BLTDATA;
589
590typedef struct _DDHAL_UPDATEOVERLAYDATA {
591 LPDDRAWI_DIRECTDRAW_GBL lpDD;
592 LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
593 RECTL rDest;
594 LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
595 RECTL rSrc;
596 DWORD dwFlags;
597 DDOVERLAYFX overlayFX;
598 HRESULT ddRVal;
599 LPDDHALSURFCB_UPDATEOVERLAY UpdateOverlay;
600} DDHAL_UPDATEOVERLAYDATA;
601
602typedef struct _DDHAL_SETPALETTEDATA {
603    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
604    LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
605    LPDDRAWI_DDRAWPALETTE_GBL	lpDDPalette;
606    HRESULT			ddRVal;
607    LPDDHALSURFCB_SETPALETTE	SetPalette;
608    BOOL			Attach;
609} DDHAL_SETPALETTEDATA;
610
611/* palettes */
612typedef struct _DDHAL_DESTROYPALETTEDATA {
613    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
614    LPDDRAWI_DDRAWPALETTE_GBL	lpDDPalette;
615    HRESULT			ddRVal;
616    LPDDHALPALCB_DESTROYPALETTE	DestroyPalette;
617} DDHAL_DESTROYPALETTEDATA;
618
619typedef struct _DDHAL_SETENTRIESDATA {
620    LPDDRAWI_DIRECTDRAW_GBL	lpDD;
621    LPDDRAWI_DDRAWPALETTE_GBL	lpDDPalette;
622    DWORD			dwBase;
623    DWORD			dwNumEntries;
624    LPPALETTEENTRY		lpEntries;
625    HRESULT			ddRVal;
626    LPDDHALPALCB_SETENTRIES	SetEntries;
627} DDHAL_SETENTRIESDATA;
628
629typedef struct _DDHAL_GETDRIVERINFODATA {
630    DWORD	dwSize;
631    DWORD	dwFlags;
632    GUID	guidInfo;
633    DWORD	dwExpectedSize;
634    LPVOID	lpvData;
635    DWORD	dwActualSize;
636    HRESULT	ddRVal;
637    ULONG_PTR	dwContext;
638} DDHAL_GETDRIVERINFODATA;
639
640/*****************************************************************************
641 * high-level ddraw implementation structures
642 */
643typedef struct _IUNKNOWN_LIST {
644    struct _IUNKNOWN_LIST *	lpLink;
645    LPGUID			lpGuid;
646    IUnknown *			lpIUnknown;
647} IUNKNOWN_LIST,*LPIUNKNOWN_LIST;
648
649typedef struct _PROCESS_LIST {
650    struct _PROCESS_LIST *	lpLink;
651    DWORD			dwProcessId;
652    DWORD			dwRefCnt;
653    DWORD			dwAlphaDepth;
654    DWORD			dwZDepth;
655} PROCESS_LIST,*LPPROCESS_LIST;
656
657typedef struct _ATTACHLIST {
658    DWORD			dwFlags;
659    struct _ATTACHLIST *	lpLink;
660    LPDDRAWI_DDRAWSURFACE_LCL	lpAttached;
661    LPDDRAWI_DDRAWSURFACE_INT	lpIAttached;
662} ATTACHLIST,*LPATTACHLIST;
663
664#define DDAL_IMPLICIT	0x00000001
665
666typedef struct _ACCESSRECTLIST {
667    struct _ACCESSRECTLIST *	lpLink;
668    RECT			rDest;
669    LPDDRAWI_DIRECTDRAW_LCL	lpOwner;
670    LPVOID			lpSurfaceData;
671    DWORD			dwFlags;
672    LPHEAPALIASINFO		lpHeapAliasInfo;
673} ACCESSRECTLIST,*LPACCESSRECTLIST;
674
675#define ACCESSRECT_VRAMSTYLE		0x00000001
676#define ACCESSRECT_NOTHOLDINGWIN16LOCK	0x00000002
677#define ACCESSRECT_BROKEN		0x00000004
678
679typedef struct _DBLNODE {
680    struct _DBLNODE *		next;
681    struct _DBLNODE *		prev;
682    LPDDRAWI_DDRAWSURFACE_LCL	object;
683    LPDDRAWI_DDRAWSURFACE_INT	object_int;
684} DBLNODE,*LPDBLNODE;
685
686typedef struct _DDRAWI_DIRECTDRAW_INT {
687    LPVOID			lpVtbl;
688    LPDDRAWI_DIRECTDRAW_LCL	lpLcl;
689    LPDDRAWI_DIRECTDRAW_INT	lpLink;
690    DWORD			dwIntRefCnt;
691} DDRAWI_DIRECTDRAW_INT;
692
693typedef struct _DDRAWI_DIRECTDRAW_LCL {
694    DWORD			lpDDMore;
695    LPDDRAWI_DIRECTDRAW_GBL	lpGbl;
696    DWORD			dwUnused0;
697    DWORD			dwLocalFlags;
698    DWORD			dwLocalRefCnt;
699    DWORD			dwProcessId;
700    IUnknown *			pUnkOuter;
701    DWORD			dwObsolete1;
702    ULONG_PTR			hWnd;
703    ULONG_PTR			hDC;
704    DWORD			dwErrorMode;
705    LPDDRAWI_DDRAWSURFACE_INT	lpPrimary;
706    LPDDRAWI_DDRAWSURFACE_INT	lpCB;
707    DWORD			dwPreferredMode;
708    /* DirectX 2 */
709    HINSTANCE			hD3DInstance;
710    IUnknown *			pD3DIUnknown;
711    LPDDHAL_CALLBACKS		lpDDCB;
712    ULONG_PTR			hDDVxd;
713    /* DirectX 5.0 */
714    DWORD			dwAppHackFlags;
715    /* DirectX 5.0A */
716    ULONG_PTR			hFocusWnd;
717    DWORD			dwHotTracking;
718    DWORD			dwIMEState;
719    /* DirectX 6.0 */
720    ULONG_PTR			hWndPopup;
721    ULONG_PTR			hDD;
722    ULONG_PTR			hGammaCalibrator;
723    LPDDGAMMACALIBRATORPROC	lpGammaCalibrator;
724} DDRAWI_DIRECTDRAW_LCL;
725
726#define DDRAWILCL_HASEXCLUSIVEMODE	0x00000001
727#define DDRAWILCL_ISFULLSCREEN		0x00000002
728#define DDRAWILCL_SETCOOPCALLED		0x00000004
729#define DDRAWILCL_ACTIVEYES		0x00000008
730#define DDRAWILCL_ACTIVENO		0x00000010
731#define DDRAWILCL_HOOKEDHWND		0x00000020
732#define DDRAWILCL_ALLOWMODEX		0x00000040
733#define DDRAWILCL_V1SCLBEHAVIOUR	0x00000080
734#define DDRAWILCL_MODEHASBEENCHANGED	0x00000100
735#define DDRAWILCL_CREATEDWINDOW		0x00000200
736#define DDRAWILCL_DIRTYDC		0x00000400
737#define DDRAWILCL_DISABLEINACTIVATE	0x00000800
738#define DDRAWILCL_CURSORCLIPPED		0x00001000
739#define DDRAWILCL_EXPLICITMONITOR	0x00002000
740#define DDRAWILCL_MULTITHREADED		0x00004000
741#define DDRAWILCL_FPUSETUP		0x00008000
742#define DDRAWILCL_POWEREDDOWN		0x00010000
743#define DDRAWILCL_DIRECTDRAW7		0x00020000
744#define DDRAWILCL_ATTEMPTEDD3DCONTEXT	0x00040000
745#define DDRAWILCL_FPUPRESERVE		0x00080000
746
747typedef struct _DDRAWI_DIRECTDRAW_GBL {
748    DWORD			dwRefCnt;
749    DWORD			dwFlags;
750    FLATPTR			fpPrimaryOrig;
751    DDCORECAPS			ddCaps;
752    DWORD			dwInternal1;
753    DWORD			dwUnused1[9];
754    LPDDHAL_CALLBACKS		lpDDCBtmp;
755    LPDDRAWI_DDRAWSURFACE_INT	dsList;
756    LPDDRAWI_DDRAWPALETTE_INT	palList;
757    LPDDRAWI_DDRAWCLIPPER_INT	clipperList;
758    LPDDRAWI_DIRECTDRAW_GBL	lp16DD;
759    DWORD			dwMaxOverlays;
760    DWORD			dwCurrOverlays;
761    DWORD			dwMonitorFrequency;
762    DDCORECAPS			ddHELCaps;
763    DWORD			dwUnused2[50];
764    DDCOLORKEY			ddckCKDestOverlay;
765    DDCOLORKEY			ddckCKSrcOverlay;
766    VIDMEMINFO			vmiData;
767    LPVOID			lpDriverHandle;
768    LPDDRAWI_DIRECTDRAW_LCL	lpExclusiveOwner;
769    DWORD			dwModeIndex;
770    DWORD			dwModeIndexOrig;
771    DWORD			dwNumFourCC;
772    LPDWORD			lpdwFourCC;
773    DWORD			dwNumModes;
774    LPDDHALMODEINFO		lpModeInfo;
775    PROCESS_LIST		plProcessList;
776    DWORD			dwSurfaceLockCount;
777    DWORD			dwAliasedLockCnt;
778    ULONG_PTR			dwReserved3;
779    ULONG_PTR			hDD;
780    char			cObsolete[12];
781    DWORD			dwReserved1;
782    DWORD			dwReserved2;
783    DBLNODE			dbnOverlayRoot;
784    volatile LPWORD		lpwPDeviceFlags;
785    DWORD			dwPDevice;
786    DWORD			dwWin16LockCnt;
787    DWORD			dwUnused3;
788    DWORD			hInstance;
789    DWORD			dwEvent16;
790    DWORD			dwSaveNumModes;
791    /* DirectX 2 */
792    ULONG_PTR			lpD3DGlobalDriverData;
793    ULONG_PTR			lpD3DHALCallbacks;
794    DDCORECAPS			ddBothCaps;
795    /* DirectX 5.0 */
796    LPDDVIDEOPORTCAPS		lpDDVideoPortCaps;
797    LPDDRAWI_DDVIDEOPORT_INT	dvpList;
798    ULONG_PTR			lpD3DHALCallbacks2;
799    RECT			rectDevice;
800    DWORD			cMonitors;
801    LPVOID			gpbmiSrc;
802    LPVOID			gpbmiDest;
803    LPHEAPALIASINFO		phaiHeapAliases;
804    ULONG_PTR			hKernelHandle;
805    ULONG_PTR			pfnNotifyProc;
806    LPDDKERNELCAPS		lpDDKernelCaps;
807    LPDDNONLOCALVIDMEMCAPS	lpddNLVCaps;
808    LPDDNONLOCALVIDMEMCAPS	lpddNLVHELCaps;
809    LPDDNONLOCALVIDMEMCAPS	lpddNLVBothCaps;
810    ULONG_PTR			lpD3DExtendedCaps;
811    /* DirectX 5.0A */
812    DWORD			dwDOSBoxEvent;
813    RECT			rectDesktop;
814    char			cDriverName[MAX_DRIVER_NAME];
815    /* DirectX 6.0 */
816    ULONG_PTR			lpD3DHALCallbacks3;
817    DWORD			dwNumZPixelFormats;
818    LPDDPIXELFORMAT		lpZPixelFormats;
819    LPDDRAWI_DDMOTIONCOMP_INT	mcList;
820    DWORD			hDDVxd;
821    DDSCAPSEX			ddsCapsMore;
822} DDRAWI_DIRECTDRAW_GBL;
823
824#define DDRAWI_VIRTUALDESKTOP	0x00000008
825#define DDRAWI_MODEX		0x00000010
826#define DDRAWI_DISPLAYDRV	0x00000020
827#define DDRAWI_FULLSCREEN	0x00000040
828#define DDRAWI_MODECHANGED	0x00000080
829#define DDRAWI_NOHARDWARE	0x00000100
830#define DDRAWI_PALETTEINIT	0x00000200
831#define DDRAWI_NOEMULATION	0x00000400
832/* more... */
833
834/* surfaces */
835typedef struct _DDRAWI_DDRAWSURFACE_INT {
836    LPVOID			lpVtbl;
837    LPDDRAWI_DDRAWSURFACE_LCL	lpLcl;
838    LPDDRAWI_DDRAWSURFACE_INT	lpLink;
839    DWORD			dwIntRefCnt;
840} DDRAWI_DDRAWSURFACE_INT;
841
842typedef struct _DDRAWI_DDRAWSURFACE_GBL {
843    DWORD			dwRefCnt;
844    DWORD			dwGlobalFlags;
845    union {
846	LPACCESSRECTLIST	lpRectList;
847	DWORD			dwBlockSizeY;
848    } DUMMYUNIONNAME1;
849    union {
850	LPVMEMHEAP		lpVidMemHeap;
851	DWORD			dwBlockSizeX;
852    } DUMMYUNIONNAME2;
853    union {
854	LPDDRAWI_DIRECTDRAW_GBL	lpDD;
855	LPVOID			lpDDHandle;
856    } DUMMYUNIONNAME3;
857    FLATPTR			fpVidMem;
858    union {
859	LONG			lPitch;
860	DWORD			dwLinearSize;
861    } DUMMYUNIONNAME4;
862    WORD			wHeight;
863    WORD			wWidth;
864    DWORD			dwUsageCount;
865    ULONG_PTR			dwReserved1; /* for display driver use */
866    /* optional (defaults to primary surface pixelformat) */
867    DDPIXELFORMAT		ddpfSurface;
868} DDRAWI_DDRAWSURFACE_GBL;
869
870#define DDRAWISURFGBL_MEMFREE			0x00000001
871#define DDRAWISURFGBL_SYSMEMREQUESTED		0x00000002
872#define DDRAWISURFGBL_ISGDISURFACE		0x00000004
873#define DDRAWISURFGBL_SOFTWAREAUTOFLIP		0x00000008
874#define DDRAWISURFGBL_LOCKNOTHOLDINGWIN16LOCK	0x00000010
875#define DDRAWISURFGBL_LOCKVRAMSTYLE		0x00000020
876#define DDRAWISURFGBL_LOCKBROKEN		0x00000040
877#define DDRAWISURFGBL_IMPLICITHANDLE		0x00000080
878#define DDRAWISURFGBL_ISCLIENTMEM		0x00000100
879#define DDRAWISURFGBL_HARDWAREOPSOURCE		0x00000200
880#define DDRAWISURFGBL_HARDWAREOPDEST		0x00000400
881#define DDRAWISURFGBL_HARDWAREOPSTARTED		0x00000600
882#define DDRAWISURFGBL_VPORTINTERLEAVED		0x00000800
883#define DDRAWISURFGBL_VPORTDATA			0x00001000
884#define DDRAWISURFGBL_LATEALLOCATELINEAR	0x00002000
885#define DDRAWISURFGBL_SYSMEMEXECUTEBUFFER	0x00004000
886#define DDRAWISURFGBL_FASTLOCKHELD		0x00008000
887#define DDRAWISURFGBL_READONLYLOCKHELD		0x00010000
888
889typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE {
890    DWORD			dwSize;
891    union {
892	DWORD			dwPhysicalPageTable;
893	FLATPTR			fpPhysicalVidMem;
894    } DUMMYUNIONNAME1;
895    LPDWORD			pPageTable;
896    DWORD			cPages;
897    ULONG_PTR			dwSavedDCContext;
898    FLATPTR			fpAliasedVidMem;
899    ULONG_PTR			dwDriverReserved;
900    ULONG_PTR			dwHELReserved;
901    DWORD			cPageUnlocks;
902    ULONG_PTR			hKernelSurface;
903    DWORD			dwKernelRefCnt;
904    LPDDCOLORCONTROL		lpColorInfo;
905    FLATPTR			fpNTAlias;
906    DWORD			dwContentsStamp;
907    LPVOID			lpvUnswappedDriverReserved;
908    LPVOID			lpDDRAWReserved2;
909    DWORD			dwDDRAWReserved1;
910    DWORD			dwDDRAWReserved2;
911    FLATPTR			fpAliasOfVidMem;
912} DDRAWI_DDRAWSURFACE_GBL_MORE;
913
914/* the MS version of this macro was somewhat obfuscated and unreadable
915 * (possibly because of mediocre MS coders)... so I simplified it...
916 * (and so I commit no copyright violations either, hah) */
917#define GET_LPDDRAWSURFACE_GBL_MORE(psurf_gbl) \
918    (*(((LPDDRAWI_DDRAWSURFACE_GBL_MORE *)(psurf_gbl)) - 1))
919
920typedef struct _DDRAWI_DDRAWSURFACE_MORE {
921    DWORD			dwSize;
922    IUNKNOWN_LIST *		lpIUnknowns;
923    LPDDRAWI_DIRECTDRAW_LCL	lpDD_lcl;
924    DWORD			dwPageLockCount;
925    DWORD			dwBytesAllocated;
926    LPDDRAWI_DIRECTDRAW_INT	lpDD_int;
927    DWORD			dwMipMapCount;
928    LPDDRAWI_DDRAWCLIPPER_INT	lpDDIClipper;
929    /* DirectX 5.0 */
930    LPHEAPALIASINFO		lpHeapAliasInfo;
931    DWORD			dwOverlayFlags;
932    VOID			*rgjunc;
933    LPDDRAWI_DDVIDEOPORT_LCL	lpVideoPort;
934    LPDDOVERLAYFX		lpddOverlayFX;
935    DDSCAPSEX			ddsCapsEx;
936    DWORD			dwTextureStage;
937    LPVOID			lpDDRAWReserved;
938    LPVOID			lpDDRAWReserved2;
939    LPVOID			lpDDrawReserved3;
940    DWORD			dwDDrawReserved4;
941    LPVOID			lpDDrawReserved5;
942    LPDWORD			lpGammaRamp;
943    LPDWORD			lpOriginalGammaRamp;
944    LPVOID			lpDDrawReserved6;
945    DWORD			dwSurfaceHandle;
946    DWORD			qwDDrawReserved8[2];
947    LPVOID			lpDDrawReserved9;
948    DWORD			cSurfaces;
949    LPDDSURFACEDESC2		pCreatedDDSurfaceDesc2;
950    LPDDRAWI_DDRAWSURFACE_LCL	*slist;
951    DWORD			dwFVF;
952    LPVOID			lpVB;
953} DDRAWI_DDRAWSURFACE_MORE;
954
955typedef struct _DDRAWI_DDRAWSURFACE_LCL {
956    LPDDRAWI_DDRAWSURFACE_MORE	lpSurfMore;
957    LPDDRAWI_DDRAWSURFACE_GBL	lpGbl;
958    ULONG_PTR			hDDSurface;
959    LPATTACHLIST		lpAttachList;
960    LPATTACHLIST		lpAttachListFrom;
961    DWORD			dwLocalRefCnt;
962    DWORD			dwProcessId;
963    DWORD			dwFlags;
964    DDSCAPS			ddsCaps;
965    LPDDRAWI_DDRAWPALETTE_INT	lpDDPalette;
966    LPDDRAWI_DDRAWCLIPPER_LCL	lpDDClipper;
967    DWORD			dwModeCreatedIn;
968    DWORD			dwBackBufferCount;
969    DDCOLORKEY			ddckCKDestBlt;
970    DDCOLORKEY			ddckCKSrcBlt;
971    ULONG_PTR			hDC;
972    ULONG_PTR			dwReserved1; /* for display driver use */
973    /* overlays only */
974    DDCOLORKEY			ddckCKSrcOverlay;
975    DDCOLORKEY			ddckCKDestOverlay;
976    LPDDRAWI_DDRAWSURFACE_INT	lpSurfaceOverlaying;
977    DBLNODE			dbnOverlayNode;
978    RECT			rcOverlaySrc;
979    RECT			rcOverlayDest;
980    DWORD			dwClrXparent;
981    DWORD			dwAlpha;
982    LONG			lOverlayX;
983    LONG			lOverlayY;
984} DDRAWI_DDRAWSURFACE_LCL;
985
986#define DDRAWISURF_ATTACHED		0x00000001
987#define DDRAWISURF_IMPLICITCREATE	0x00000002
988#define DDRAWISURF_ISFREE		0x00000004
989#define DDRAWISURF_ATTACHED_FROM	0x00000008
990#define DDRAWISURF_IMPLICITROOT		0x00000010
991#define DDRAWISURF_PARTOFPRIMARYCHAIN	0x00000020
992#define DDRAWISURF_DATAISALIASED	0x00000040
993#define DDRAWISURF_HASDC		0x00000080
994#define DDRAWISURF_HASCKEYDESTOVERLAY	0x00000100
995#define DDRAWISURF_HASCKEYDESTBLT	0x00000200
996#define DDRAWISURF_HASCKEYSRCOVERLAY	0x00000400
997#define DDRAWISURF_HASCKEYSRCBLT	0x00000800
998#define DDRAWISURF_LOCKEXCLUDEDCURSOR	0x00001000
999#define DDRAWISURF_HASPIXELFORMAT	0x00002000
1000#define DDRAWISURF_HASOVERLAYDATA	0x00004000
1001#define DDRAWISURF_SETGAMMA		0x00008000
1002/* more... */
1003#define DDRAWISURF_INVALID		0x10000000
1004
1005/* palettes */
1006typedef struct _DDRAWI_DDRAWPALETTE_INT {
1007    LPVOID			lpVtbl;
1008    LPDDRAWI_DDRAWPALETTE_LCL	lpLcl;
1009    LPDDRAWI_DDRAWPALETTE_INT	lpLink;
1010    DWORD			dwIntRefCnt;
1011} DDRAWI_DDRAWPALETTE_INT;
1012
1013typedef struct _DDRAWI_DDRAWPALETTE_GBL {
1014    DWORD			dwRefCnt;
1015    DWORD			dwFlags;
1016    LPDDRAWI_DIRECTDRAW_LCL	lpDD_lcl;
1017    DWORD			dwProcessId;
1018    LPPALETTEENTRY		lpColorTable;
1019    union {
1020	ULONG_PTR		dwReserved1; /* for display driver use */
1021	HPALETTE		hHELGDIPalette;
1022    } DUMMYUNIONNAME1;
1023    /* DirectX 5.0 */
1024    DWORD			dwDriverReserved;
1025    DWORD			dwContentsStamp;
1026    /* DirectX 6.0 */
1027    DWORD			dwSaveStamp;
1028    /* DirectX 7.0 */
1029    DWORD			dwHandle;
1030} DDRAWI_DDRAWPALETTE_GBL;
1031
1032#define DDRAWIPAL_256		0x00000001
1033#define DDRAWIPAL_16		0x00000002
1034#define DDRAWIPAL_GDI		0x00000004
1035#define DDRAWIPAL_STORED_8	0x00000008
1036#define DDRAWIPAL_STORED_16	0x00000010
1037#define DDRAWIPAL_STORED_24	0x00000020
1038#define DDRAWIPAL_EXCLUSIVE	0x00000040
1039#define DDRAWIPAL_INHEL		0x00000080
1040#define DDRAWIPAL_DIRTY		0x00000100
1041#define DDRAWIPAL_ALLOW256	0x00000200
1042#define DDRAWIPAL_4		0x00000400
1043#define DDRAWIPAL_2		0x00000800
1044#define DDRAWIPAL_STORED_8INDEX	0x00001000
1045#define DDRAWIPAL_ALPHA		0x00002000
1046
1047typedef struct _DDRAWI_DDRAWPALETTE_LCL {
1048    DWORD			lpPalMore;
1049    LPDDRAWI_DDRAWPALETTE_GBL	lpGbl;
1050    ULONG_PTR			dwUnused0;
1051    DWORD			dwLocalRefCnt;
1052    IUnknown *			pUnkOuter;
1053    LPDDRAWI_DIRECTDRAW_LCL	lpDD_lcl;
1054    ULONG_PTR			dwReserved1;
1055    /* DirectX 6.0 */
1056    ULONG_PTR			dwDDRAWReserved1;
1057    ULONG_PTR			dwDDRAWReserved2;
1058    ULONG_PTR			dwDDRAWReserved3;
1059} DDRAWI_DDRAWPALETTE_LCL;
1060
1061#ifdef __cplusplus
1062} /* extern "C" */
1063#endif
1064
1065#endif /* __DDRAWI_INCLUDED__ */
1066