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
30 extern "C" {
31 #endif
32 
33 typedef struct _DDVIDEOPORTCAPS *LPDDVIDEOPORTCAPS; /* should be in dvp.h */
34 typedef struct _DDKERNELCAPS *LPDDKERNELCAPS; /* should be in ddkernel.h */
35 typedef 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  */
57 typedef struct {
58     char szName[260];
59     char szEntryPoint[64];
60     DWORD dwContext;
61 } DD32BITDRIVERDATA,*LPDD32BITDRIVERDATA;
62 
63 typedef struct {
64     DWORD dwHALVersion;
65     ULONG_PTR dwReserved1;
66     ULONG_PTR dwReserved2;
67 } DDVERSIONDATA,*LPDDVERSIONDATA;
68 
69 typedef DWORD (PASCAL *LPDD32BITDRIVERINIT)(DWORD dwContext);
70 
71 /* pointer to video memory */
72 typedef ULONG_PTR FLATPTR;
73 
74 /* predeclare some structures */
75 typedef struct _DDHALINFO *LPDDHALINFO;
76 typedef struct _DDRAWI_DIRECTDRAW_INT *LPDDRAWI_DIRECTDRAW_INT;
77 typedef struct _DDRAWI_DIRECTDRAW_LCL *LPDDRAWI_DIRECTDRAW_LCL;
78 typedef struct _DDRAWI_DIRECTDRAW_GBL *LPDDRAWI_DIRECTDRAW_GBL;
79 typedef struct _DDRAWI_DDRAWSURFACE_INT *LPDDRAWI_DDRAWSURFACE_INT;
80 typedef struct _DDRAWI_DDRAWSURFACE_LCL *LPDDRAWI_DDRAWSURFACE_LCL;
81 typedef struct _DDRAWI_DDRAWSURFACE_GBL *LPDDRAWI_DDRAWSURFACE_GBL;
82 typedef struct _DDRAWI_DDRAWSURFACE_MORE *LPDDRAWI_DDRAWSURFACE_MORE;
83 typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE *LPDDRAWI_DDRAWSURFACE_GBL_MORE;
84 typedef struct _DDRAWI_DDRAWPALETTE_INT *LPDDRAWI_DDRAWPALETTE_INT;
85 typedef struct _DDRAWI_DDRAWPALETTE_LCL *LPDDRAWI_DDRAWPALETTE_LCL;
86 typedef struct _DDRAWI_DDRAWPALETTE_GBL *LPDDRAWI_DDRAWPALETTE_GBL;
87 typedef struct _DDRAWI_DDRAWCLIPPER_INT *LPDDRAWI_DDRAWCLIPPER_INT;
88 typedef struct _DDRAWI_DDRAWCLIPPER_LCL *LPDDRAWI_DDRAWCLIPPER_LCL;
89 typedef struct _DDRAWI_DDRAWCLIPPER_GBL *LPDDRAWI_DDRAWCLIPPER_GBL;
90 typedef struct _DDRAWI_DDVIDEOPORT_INT *LPDDRAWI_DDVIDEOPORT_INT;
91 typedef struct _DDRAWI_DDVIDEOPORT_LCL *LPDDRAWI_DDVIDEOPORT_LCL;
92 typedef struct _DDRAWI_DDMOTIONCOMP_INT *LPDDRAWI_DDMOTIONCOMP_INT;
93 typedef struct _DDRAWI_DDMOTIONCOMP_LCL *LPDDRAWI_DDMOTIONCOMP_LCL;
94 
95 /* structure GUIDs for GetDriverInfo */
96 DEFINE_GUID( GUID_MiscellaneousCallbacks,	0xEFD60CC0,0x49E7,0x11D0,0x88,0x9D,0x00,0xAA,0x00,0xBB,0xB7,0x6A );
97 /* ...videport stuff here... */
98 DEFINE_GUID( GUID_D3DCallbacks2,		0x0BA584E1,0x70B6,0x11D0,0x88,0x9D,0x00,0xAA,0x00,0xBB,0xB7,0x6A );
99 DEFINE_GUID( GUID_D3DCallbacks3,		0xDDF41230,0xEC0A,0x11D0,0xA9,0xB6,0x00,0xAA,0x00,0xC0,0x99,0x3E );
100 DEFINE_GUID( GUID_NonLocalVidMemCaps,		0x86C4FA80,0x8D84,0x11D0,0x94,0xE8,0x00,0xC0,0x4F,0xC3,0x41,0x37 );
101 /* ...kernel stuff here... */
102 DEFINE_GUID( GUID_D3DExtendedCaps,		0x7DE41F80,0x9D93,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29 );
103 DEFINE_GUID( GUID_ZPixelFormats,		0x93869880,0x36CF,0x11D1,0x9B,0x1B,0x00,0xAA,0x00,0xBB,0xB8,0xAE );
104 DEFINE_GUID( GUID_DDMoreSurfaceCaps,		0x3B8A0466,0xF269,0x11D1,0x88,0x0B,0x00,0xC0,0x4F,0xD9,0x30,0xC5 );
105 DEFINE_GUID( GUID_DDStereoMode,			0xF828169C,0xA8E8,0x11D2,0xA1,0xF2,0x00,0xA0,0xC9,0x83,0xEA,0xF6 );
106 /* ...more stuff here... */
107 DEFINE_GUID(GUID_D3DParseUnknownCommandCallback,0x2E04FFA0,0x98E4,0x11D1,0x8C,0xE1,0x00,0xA0,0xC9,0x06,0x29,0xA8 );
108 /* ...motioncomp stuff here... */
109 DEFINE_GUID( GUID_Miscellaneous2Callbacks,	0x406B2F00,0x3E5A,0x11D1,0xB6,0x40,0x00,0xAA,0x00,0xA1,0xF9,0x6A );
110 
111 /*****************************************************************************
112  * driver->ddraw callbacks
113  */
114 typedef BOOL    (DDAPI *LPDDHAL_SETINFO)(LPDDHALINFO lpDDHalInfo, BOOL reset);
115 typedef FLATPTR (DDAPI *LPDDHAL_VIDMEMALLOC)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, DWORD dwWidth, DWORD dwHeight);
116 typedef void    (DDAPI *LPDDHAL_VIDMEMFREE)(LPDDRAWI_DIRECTDRAW_GBL lpDD, int heap, FLATPTR fpMem);
117 
118 typedef 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  */
128 typedef 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  */
151 typedef 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 
173 typedef 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 
189 typedef struct _HEAPALIAS {
190     FLATPTR	fpVidMem;
191     LPVOID	lpAlias;
192     DWORD	dwAliasSize;
193 } HEAPALIAS,*LPHEAPALIAS;
194 
195 typedef 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  */
208 typedef 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 
262 typedef 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 
282 typedef struct _DDHAL_DESTROYDRIVERDATA		*LPDDHAL_DESTROYDRIVERDATA;
283 typedef struct _DDHAL_CREATESURFACEDATA		*LPDDHAL_CREATESURFACEDATA;
284 typedef struct _DDHAL_DRVSETCOLORKEYDATA	*LPDDHAL_DRVSETCOLORKEYDATA;
285 typedef struct _DDHAL_SETMODEDATA		*LPDDHAL_SETMODEDATA;
286 typedef struct _DDHAL_WAITFORVERTICALBLANKDATA	*LPDDHAL_WAITFORVERTICALBLANKDATA;
287 typedef struct _DDHAL_CANCREATESURFACEDATA	*LPDDHAL_CANCREATESURFACEDATA;
288 typedef struct _DDHAL_CREATEPALETTEDATA		*LPDDHAL_CREATEPALETTEDATA;
289 typedef struct _DDHAL_GETSCANLINEDATA		*LPDDHAL_GETSCANLINEDATA;
290 typedef struct _DDHAL_SETEXCLUSIVEMODEDATA	*LPDDHAL_SETEXCLUSIVEMODEDATA;
291 typedef struct _DDHAL_FLIPTOGDISURFACEDATA	*LPDDHAL_FLIPTOGDISURFACEDATA;
292 
293 typedef DWORD (PASCAL *LPDDHAL_DESTROYDRIVER)	    (LPDDHAL_DESTROYDRIVERDATA);
294 typedef DWORD (PASCAL *LPDDHAL_CREATESURFACE)	    (LPDDHAL_CREATESURFACEDATA);
295 typedef DWORD (PASCAL *LPDDHAL_SETCOLORKEY)	    (LPDDHAL_DRVSETCOLORKEYDATA);
296 typedef DWORD (PASCAL *LPDDHAL_SETMODE)		    (LPDDHAL_SETMODEDATA);
297 typedef DWORD (PASCAL *LPDDHAL_WAITFORVERTICALBLANK)(LPDDHAL_WAITFORVERTICALBLANKDATA);
298 typedef DWORD (PASCAL *LPDDHAL_CANCREATESURFACE)    (LPDDHAL_CANCREATESURFACEDATA );
299 typedef DWORD (PASCAL *LPDDHAL_CREATEPALETTE)	    (LPDDHAL_CREATEPALETTEDATA);
300 typedef DWORD (PASCAL *LPDDHAL_GETSCANLINE)	    (LPDDHAL_GETSCANLINEDATA);
301 typedef DWORD (PASCAL *LPDDHAL_SETEXCLUSIVEMODE)    (LPDDHAL_SETEXCLUSIVEMODEDATA);
302 typedef DWORD (PASCAL *LPDDHAL_FLIPTOGDISURFACE)    (LPDDHAL_FLIPTOGDISURFACEDATA);
303 
304 typedef 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 
320 typedef struct _DDHAL_DESTROYSURFACEDATA	*LPDDHAL_DESTROYSURFACEDATA;
321 typedef struct _DDHAL_FLIPDATA			*LPDDHAL_FLIPDATA;
322 typedef struct _DDHAL_SETCLIPLISTDATA		*LPDDHAL_SETCLIPLISTDATA;
323 typedef struct _DDHAL_LOCKDATA			*LPDDHAL_LOCKDATA;
324 typedef struct _DDHAL_UNLOCKDATA		*LPDDHAL_UNLOCKDATA;
325 typedef struct _DDHAL_BLTDATA			*LPDDHAL_BLTDATA;
326 typedef struct _DDHAL_SETCOLORKEYDATA		*LPDDHAL_SETCOLORKEYDATA;
327 typedef struct _DDHAL_ADDATTACHEDSURFACEDATA	*LPDDHAL_ADDATTACHEDSURFACEDATA;
328 typedef struct _DDHAL_GETBLTSTATUSDATA		*LPDDHAL_GETBLTSTATUSDATA;
329 typedef struct _DDHAL_GETFLIPSTATUSDATA		*LPDDHAL_GETFLIPSTATUSDATA;
330 typedef struct _DDHAL_UPDATEOVERLAYDATA		*LPDDHAL_UPDATEOVERLAYDATA;
331 typedef struct _DDHAL_SETOVERLAYPOSITIONDATA	*LPDDHAL_SETOVERLAYPOSITIONDATA;
332 typedef struct _DDHAL_SETPALETTEDATA		*LPDDHAL_SETPALETTEDATA;
333 
334 typedef DWORD (PASCAL *LPDDHALSURFCB_DESTROYSURFACE)	(LPDDHAL_DESTROYSURFACEDATA);
335 typedef DWORD (PASCAL *LPDDHALSURFCB_FLIP)		(LPDDHAL_FLIPDATA);
336 typedef DWORD (PASCAL *LPDDHALSURFCB_SETCLIPLIST)	(LPDDHAL_SETCLIPLISTDATA);
337 typedef DWORD (PASCAL *LPDDHALSURFCB_LOCK)		(LPDDHAL_LOCKDATA);
338 typedef DWORD (PASCAL *LPDDHALSURFCB_UNLOCK)		(LPDDHAL_UNLOCKDATA);
339 typedef DWORD (PASCAL *LPDDHALSURFCB_BLT)		(LPDDHAL_BLTDATA);
340 typedef DWORD (PASCAL *LPDDHALSURFCB_SETCOLORKEY)	(LPDDHAL_SETCOLORKEYDATA);
341 typedef DWORD (PASCAL *LPDDHALSURFCB_ADDATTACHEDSURFACE)(LPDDHAL_ADDATTACHEDSURFACEDATA);
342 typedef DWORD (PASCAL *LPDDHALSURFCB_GETBLTSTATUS)	(LPDDHAL_GETBLTSTATUSDATA);
343 typedef DWORD (PASCAL *LPDDHALSURFCB_GETFLIPSTATUS)	(LPDDHAL_GETFLIPSTATUSDATA);
344 typedef DWORD (PASCAL *LPDDHALSURFCB_UPDATEOVERLAY)	(LPDDHAL_UPDATEOVERLAYDATA);
345 typedef DWORD (PASCAL *LPDDHALSURFCB_SETOVERLAYPOSITION)(LPDDHAL_SETOVERLAYPOSITIONDATA);
346 typedef DWORD (PASCAL *LPDDHALSURFCB_SETPALETTE)	(LPDDHAL_SETPALETTEDATA);
347 
348 typedef 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 
367 typedef struct _DDHAL_DESTROYPALETTEDATA	*LPDDHAL_DESTROYPALETTEDATA;
368 typedef struct _DDHAL_SETENTRIESDATA		*LPDDHAL_SETENTRIESDATA;
369 
370 typedef DWORD (PASCAL *LPDDHALPALCB_DESTROYPALETTE)(LPDDHAL_DESTROYPALETTEDATA);
371 typedef DWORD (PASCAL *LPDDHALPALCB_SETENTRIES)    (LPDDHAL_SETENTRIESDATA);
372 
373 typedef struct _DDHAL_DDPALETTECALLBACKS {
374     DWORD				dwSize;
375     DWORD				dwFlags;
376     LPDDHALPALCB_DESTROYPALETTE		DestroyPalette;
377     LPDDHALPALCB_SETENTRIES		SetEntries;
378 } DDHAL_DDPALETTECALLBACKS,*LPDDHAL_DDPALETTECALLBACKS;
379 
380 typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CANCREATEEXEBUF)(LPDDHAL_CANCREATESURFACEDATA);
381 typedef DWORD (PASCAL *LPDDHALEXEBUFCB_CREATEEXEBUF)   (LPDDHAL_CREATESURFACEDATA);
382 typedef DWORD (PASCAL *LPDDHALEXEBUFCB_DESTROYEXEBUF)  (LPDDHAL_DESTROYSURFACEDATA);
383 typedef DWORD (PASCAL *LPDDHALEXEBUFCB_LOCKEXEBUF)     (LPDDHAL_LOCKDATA);
384 typedef DWORD (PASCAL *LPDDHALEXEBUFCB_UNLOCKEXEBUF)   (LPDDHAL_UNLOCKDATA);
385 
386 typedef 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 
396 typedef struct _DDHAL_GETAVAILDRIVERMEMORYDATA	*LPDDHAL_GETAVAILDRIVERMEMORYDATA;
397 typedef struct _DDHAL_UPDATENONLOCALHEAPDATA	*LPDDHAL_UPDATENONLOCALHEAPDATA;
398 typedef struct _DDHAL_GETHEAPALIGNMENTDATA	*LPDDHAL_GETHEAPALIGNMENTDATA;
399 
400 typedef DWORD (PASCAL *LPDDHAL_GETAVAILDRIVERMEMORY)(LPDDHAL_GETAVAILDRIVERMEMORYDATA);
401 typedef DWORD (PASCAL *LPDDHAL_UPDATENONLOCALHEAP)  (LPDDHAL_UPDATENONLOCALHEAPDATA);
402 typedef DWORD (PASCAL *LPDDHAL_GETHEAPALIGNMENT)    (LPDDHAL_GETHEAPALIGNMENTDATA);
403 
404 typedef 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 
413 typedef struct _DDHAL_CREATESURFACEEXDATA	*LPDDHAL_CREATESURFACEEXDATA;
414 typedef struct _DDHAL_GETDRIVERSTATEDATA	*LPDDHAL_GETDRIVERSTATEDATA;
415 typedef struct _DDHAL_DESTROYDDLOCALDATA	*LPDDHAL_DESTROYDDLOCALDATA;
416 
417 typedef DWORD (PASCAL *LPDDHAL_CREATESURFACEEX)(LPDDHAL_CREATESURFACEEXDATA);
418 typedef DWORD (PASCAL *LPDDHAL_GETDRIVERSTATE) (LPDDHAL_GETDRIVERSTATEDATA);
419 typedef DWORD (PASCAL *LPDDHAL_DESTROYDDLOCAL) (LPDDHAL_DESTROYDDLOCALDATA);
420 
421 typedef 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 
430 typedef 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  */
437 typedef struct _DDHAL_GETDRIVERINFODATA *LPDDHAL_GETDRIVERINFODATA;
438 typedef DWORD (PASCAL *LPDDHAL_GETDRIVERINFO)(LPDDHAL_GETDRIVERINFODATA);
439 
440 typedef 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 */
467 typedef 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  */
486 typedef struct _DDHAL_DESTROYDRIVERDATA {
487     LPDDRAWI_DIRECTDRAW_GBL	lpDD;
488     HRESULT			ddRVal;
489     LPDDHAL_DESTROYDRIVER	DestroyDriver;
490 } DDHAL_DESTROYDRIVERDATA;
491 
492 typedef 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 
501 typedef 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 
510 typedef 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 
518 typedef 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 
527 typedef 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 */
536 typedef struct _DDHAL_DESTROYSURFACEDATA {
537     LPDDRAWI_DIRECTDRAW_GBL	lpDD;
538     LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
539     HRESULT			ddRVal;
540     LPDDHALSURFCB_DESTROYSURFACE DestroySurface;
541 } DDHAL_DESTROYSURFACEDATA;
542 
543 typedef 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 
554 typedef 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 
565 typedef struct _DDHAL_UNLOCKDATA {
566     LPDDRAWI_DIRECTDRAW_GBL	lpDD;
567     LPDDRAWI_DDRAWSURFACE_LCL	lpDDSurface;
568     HRESULT			ddRVal;
569     LPDDHALSURFCB_UNLOCK	Unlock;
570 } DDHAL_UNLOCKDATA;
571 
572 typedef 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 
590 typedef 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 
602 typedef 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 */
612 typedef struct _DDHAL_DESTROYPALETTEDATA {
613     LPDDRAWI_DIRECTDRAW_GBL	lpDD;
614     LPDDRAWI_DDRAWPALETTE_GBL	lpDDPalette;
615     HRESULT			ddRVal;
616     LPDDHALPALCB_DESTROYPALETTE	DestroyPalette;
617 } DDHAL_DESTROYPALETTEDATA;
618 
619 typedef 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 
629 typedef 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  */
643 typedef struct _IUNKNOWN_LIST {
644     struct _IUNKNOWN_LIST *	lpLink;
645     LPGUID			lpGuid;
646     IUnknown *			lpIUnknown;
647 } IUNKNOWN_LIST,*LPIUNKNOWN_LIST;
648 
649 typedef 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 
657 typedef 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 
666 typedef 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 
679 typedef 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 
686 typedef 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 
693 typedef 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 
747 typedef 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 */
835 typedef 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 
842 typedef 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 
889 typedef 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 
920 typedef 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 
955 typedef 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 */
1006 typedef 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 
1013 typedef 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 
1047 typedef 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