fdopen: don't rewind the file after creating the FILE* handle. Added
[wine] / dlls / ddraw / helper.c
1
2 /*              DirectDraw Base Functions
3  *
4  * Copyright 1997-1999 Marcus Meissner
5  * Copyright 1998 Lionel Ulmer (most of Direct3D stuff)
6  * Copyright 2000 TransGaming Technologies Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #include "config.h"
24 #include "wine/port.h"
25
26 #include <stddef.h>
27
28 #include "d3d.h"
29 #include "ddraw.h"
30 #include "winerror.h"
31
32 #include "wine/exception.h"
33 #include "ddraw_private.h"
34
35 #include "wine/debug.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
38
39 /******************************************************************************
40  *              debug output functions
41  */
42 void DDRAW_dump_flags_(DWORD flags, const flag_info* names,
43                        size_t num_names, int newline)
44 {
45     unsigned int        i;
46
47     for (i=0; i < num_names; i++)
48         if ((flags & names[i].val) ||      /* standard flag value */
49             ((!flags) && (!names[i].val))) /* zero value only */
50             DPRINTF("%s ", names[i].name);
51
52     if (newline)
53         DPRINTF("\n");
54 }
55
56 void DDRAW_dump_members(DWORD flags, const void* data,
57                         const member_info* mems, size_t num_mems)
58 {
59     unsigned int i;
60
61     for (i=0; i < num_mems; i++)
62     {
63         if (mems[i].val & flags)
64         {
65             DPRINTF(" - %s : ", mems[i].name);
66             mems[i].func((const char *)data + mems[i].offset);
67             DPRINTF("\n");
68         }
69     }
70 }
71
72 void DDRAW_dump_DDBLTFX(DWORD flagmask)
73 {
74     static const flag_info flags[] =
75         {
76             FE(DDBLTFX_ARITHSTRETCHY),
77             FE(DDBLTFX_MIRRORLEFTRIGHT),
78             FE(DDBLTFX_MIRRORUPDOWN),
79             FE(DDBLTFX_NOTEARING),
80             FE(DDBLTFX_ROTATE180),
81             FE(DDBLTFX_ROTATE270),
82             FE(DDBLTFX_ROTATE90),
83             FE(DDBLTFX_ZBUFFERRANGE),
84             FE(DDBLTFX_ZBUFFERBASEDEST)
85         };
86
87     DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0]));
88 }
89
90 void DDRAW_dump_DDBLTFAST(DWORD flagmask)
91 {
92     static const flag_info flags[] =
93         {
94             FE(DDBLTFAST_NOCOLORKEY),
95             FE(DDBLTFAST_SRCCOLORKEY),
96             FE(DDBLTFAST_DESTCOLORKEY),
97             FE(DDBLTFAST_WAIT)
98         };
99
100     DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0]));
101 }
102
103 void DDRAW_dump_DDBLT(DWORD flagmask)
104 {
105     static const flag_info flags[] =
106         {
107             FE(DDBLT_ALPHADEST),
108             FE(DDBLT_ALPHADESTCONSTOVERRIDE),
109             FE(DDBLT_ALPHADESTNEG),
110             FE(DDBLT_ALPHADESTSURFACEOVERRIDE),
111             FE(DDBLT_ALPHAEDGEBLEND),
112             FE(DDBLT_ALPHASRC),
113             FE(DDBLT_ALPHASRCCONSTOVERRIDE),
114             FE(DDBLT_ALPHASRCNEG),
115             FE(DDBLT_ALPHASRCSURFACEOVERRIDE),
116             FE(DDBLT_ASYNC),
117             FE(DDBLT_COLORFILL),
118             FE(DDBLT_DDFX),
119             FE(DDBLT_DDROPS),
120             FE(DDBLT_KEYDEST),
121             FE(DDBLT_KEYDESTOVERRIDE),
122             FE(DDBLT_KEYSRC),
123             FE(DDBLT_KEYSRCOVERRIDE),
124             FE(DDBLT_ROP),
125             FE(DDBLT_ROTATIONANGLE),
126             FE(DDBLT_ZBUFFER),
127             FE(DDBLT_ZBUFFERDESTCONSTOVERRIDE),
128             FE(DDBLT_ZBUFFERDESTOVERRIDE),
129             FE(DDBLT_ZBUFFERSRCCONSTOVERRIDE),
130             FE(DDBLT_ZBUFFERSRCOVERRIDE),
131             FE(DDBLT_WAIT),
132             FE(DDBLT_DEPTHFILL)
133     };
134
135     DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0]));
136 }
137
138 void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in)
139 {
140     static const flag_info flags[] = {
141         FE(DDSCAPS_RESERVED1),
142         FE(DDSCAPS_ALPHA),
143         FE(DDSCAPS_BACKBUFFER),
144         FE(DDSCAPS_COMPLEX),
145         FE(DDSCAPS_FLIP),
146         FE(DDSCAPS_FRONTBUFFER),
147         FE(DDSCAPS_OFFSCREENPLAIN),
148         FE(DDSCAPS_OVERLAY),
149         FE(DDSCAPS_PALETTE),
150         FE(DDSCAPS_PRIMARYSURFACE),
151         FE(DDSCAPS_PRIMARYSURFACELEFT),
152         FE(DDSCAPS_SYSTEMMEMORY),
153         FE(DDSCAPS_TEXTURE),
154         FE(DDSCAPS_3DDEVICE),
155         FE(DDSCAPS_VIDEOMEMORY),
156         FE(DDSCAPS_VISIBLE),
157         FE(DDSCAPS_WRITEONLY),
158         FE(DDSCAPS_ZBUFFER),
159         FE(DDSCAPS_OWNDC),
160         FE(DDSCAPS_LIVEVIDEO),
161         FE(DDSCAPS_HWCODEC),
162         FE(DDSCAPS_MODEX),
163         FE(DDSCAPS_MIPMAP),
164         FE(DDSCAPS_RESERVED2),
165         FE(DDSCAPS_ALLOCONLOAD),
166         FE(DDSCAPS_VIDEOPORT),
167         FE(DDSCAPS_LOCALVIDMEM),
168         FE(DDSCAPS_NONLOCALVIDMEM),
169         FE(DDSCAPS_STANDARDVGAMODE),
170         FE(DDSCAPS_OPTIMIZED)
171     };
172     static const flag_info flags2[] = {
173         FE(DDSCAPS2_HARDWAREDEINTERLACE),
174         FE(DDSCAPS2_HINTDYNAMIC),
175         FE(DDSCAPS2_HINTSTATIC),
176         FE(DDSCAPS2_TEXTUREMANAGE),
177         FE(DDSCAPS2_RESERVED1),
178         FE(DDSCAPS2_RESERVED2),
179         FE(DDSCAPS2_OPAQUE),
180         FE(DDSCAPS2_HINTANTIALIASING),
181         FE(DDSCAPS2_CUBEMAP),
182         FE(DDSCAPS2_CUBEMAP_POSITIVEX),
183         FE(DDSCAPS2_CUBEMAP_NEGATIVEX),
184         FE(DDSCAPS2_CUBEMAP_POSITIVEY),
185         FE(DDSCAPS2_CUBEMAP_NEGATIVEY),
186         FE(DDSCAPS2_CUBEMAP_POSITIVEZ),
187         FE(DDSCAPS2_CUBEMAP_NEGATIVEZ),
188         FE(DDSCAPS2_MIPMAPSUBLEVEL),
189         FE(DDSCAPS2_D3DTEXTUREMANAGE),
190         FE(DDSCAPS2_DONOTPERSIST),
191         FE(DDSCAPS2_STEREOSURFACELEFT)
192     };
193  
194     DDRAW_dump_flags_(in->dwCaps, flags, sizeof(flags)/sizeof(flags[0]), 0);
195     DDRAW_dump_flags_(in->dwCaps2, flags2, sizeof(flags2)/sizeof(flags2[0]), 0);
196 }
197
198 void DDRAW_dump_DDSCAPS(const DDSCAPS *in) {
199     DDSCAPS2 in_bis;
200
201     in_bis.dwCaps = in->dwCaps;
202     in_bis.dwCaps2 = 0;
203     in_bis.dwCaps3 = 0;
204     in_bis.dwCaps4 = 0;
205
206     DDRAW_dump_DDSCAPS2(&in_bis);
207 }
208
209 void DDRAW_dump_pixelformat_flag(DWORD flagmask)
210 {
211     static const flag_info flags[] =
212         {
213             FE(DDPF_ALPHAPIXELS),
214             FE(DDPF_ALPHA),
215             FE(DDPF_FOURCC),
216             FE(DDPF_PALETTEINDEXED4),
217             FE(DDPF_PALETTEINDEXEDTO8),
218             FE(DDPF_PALETTEINDEXED8),
219             FE(DDPF_RGB),
220             FE(DDPF_COMPRESSED),
221             FE(DDPF_RGBTOYUV),
222             FE(DDPF_YUV),
223             FE(DDPF_ZBUFFER),
224             FE(DDPF_PALETTEINDEXED1),
225             FE(DDPF_PALETTEINDEXED2),
226             FE(DDPF_ZPIXELS)
227     };
228
229     DDRAW_dump_flags_(flagmask, flags, sizeof(flags)/sizeof(flags[0]), 0);
230 }
231
232 void DDRAW_dump_paletteformat(DWORD dwFlags)
233 {
234     static const flag_info flags[] =
235         {
236             FE(DDPCAPS_4BIT),
237             FE(DDPCAPS_8BITENTRIES),
238             FE(DDPCAPS_8BIT),
239             FE(DDPCAPS_INITIALIZE),
240             FE(DDPCAPS_PRIMARYSURFACE),
241             FE(DDPCAPS_PRIMARYSURFACELEFT),
242             FE(DDPCAPS_ALLOW256),
243             FE(DDPCAPS_VSYNC),
244             FE(DDPCAPS_1BIT),
245             FE(DDPCAPS_2BIT),
246             FE(DDPCAPS_ALPHA)
247     };
248
249     DDRAW_dump_flags(dwFlags, flags, sizeof(flags)/sizeof(flags[0]));
250 }
251
252 void DDRAW_dump_pixelformat(const DDPIXELFORMAT *pf) {
253     DPRINTF("( ");
254     DDRAW_dump_pixelformat_flag(pf->dwFlags);
255     if (pf->dwFlags & DDPF_FOURCC) {
256         DPRINTF(", dwFourCC code '%c%c%c%c' (0x%08lx) - %ld bits per pixel",
257                 (unsigned char)( pf->dwFourCC     &0xff),
258                 (unsigned char)((pf->dwFourCC>> 8)&0xff),
259                 (unsigned char)((pf->dwFourCC>>16)&0xff),
260                 (unsigned char)((pf->dwFourCC>>24)&0xff),
261                 pf->dwFourCC,
262                 pf->u1.dwYUVBitCount
263         );
264     }
265     if (pf->dwFlags & DDPF_RGB) {
266         char *cmd;
267         DPRINTF(", RGB bits: %ld, ", pf->u1.dwRGBBitCount);
268         switch (pf->u1.dwRGBBitCount) {
269         case 4: cmd = "%1lx"; break;
270         case 8: cmd = "%02lx"; break;
271         case 16: cmd = "%04lx"; break;
272         case 24: cmd = "%06lx"; break;
273         case 32: cmd = "%08lx"; break;
274         default: ERR("Unexpected bit depth !\n"); cmd = "%d"; break;
275         }
276         DPRINTF(" R "); DPRINTF(cmd, pf->u2.dwRBitMask);
277         DPRINTF(" G "); DPRINTF(cmd, pf->u3.dwGBitMask);
278         DPRINTF(" B "); DPRINTF(cmd, pf->u4.dwBBitMask);
279         if (pf->dwFlags & DDPF_ALPHAPIXELS) {
280             DPRINTF(" A "); DPRINTF(cmd, pf->u5.dwRGBAlphaBitMask);
281         }
282         if (pf->dwFlags & DDPF_ZPIXELS) {
283             DPRINTF(" Z "); DPRINTF(cmd, pf->u5.dwRGBZBitMask);
284         }
285     }
286     if (pf->dwFlags & DDPF_ZBUFFER) {
287         DPRINTF(", Z bits : %ld", pf->u1.dwZBufferBitDepth);
288     }
289     if (pf->dwFlags & DDPF_ALPHA) {
290         DPRINTF(", Alpha bits : %ld", pf->u1.dwAlphaBitDepth);
291     }
292     DPRINTF(")");
293 }
294
295 void DDRAW_dump_colorkeyflag(DWORD ck)
296 {
297     static const flag_info flags[] =
298         {
299             FE(DDCKEY_COLORSPACE),
300             FE(DDCKEY_DESTBLT),
301             FE(DDCKEY_DESTOVERLAY),
302             FE(DDCKEY_SRCBLT),
303             FE(DDCKEY_SRCOVERLAY)
304     };
305
306     DDRAW_dump_flags(ck, flags, sizeof(flags)/sizeof(flags[0]));
307 }
308
309 void DDRAW_dump_lockflag(DWORD lockflag)
310 {
311     static const flag_info flags[] =
312         {
313             FE(DDLOCK_SURFACEMEMORYPTR),
314             FE(DDLOCK_WAIT),
315             FE(DDLOCK_EVENT),
316             FE(DDLOCK_READONLY),
317             FE(DDLOCK_WRITEONLY),
318             FE(DDLOCK_NOSYSLOCK),
319             FE(DDLOCK_DISCARDCONTENTS),
320             FE(DDLOCK_NOOVERWRITE)
321         };
322
323     DDRAW_dump_flags(lockflag, flags, sizeof(flags)/sizeof(flags[0]));
324 }
325
326 static void DDRAW_dump_DWORD(const void *in) {
327     DPRINTF("%ld", *((const DWORD *) in));
328 }
329 static void DDRAW_dump_PTR(const void *in) {
330     DPRINTF("%p", *((const void **) in));
331 }
332 void DDRAW_dump_DDCOLORKEY(const DDCOLORKEY *ddck) {
333     DPRINTF(" Low : %ld  - High : %ld", ddck->dwColorSpaceLowValue, ddck->dwColorSpaceHighValue);
334 }
335
336 void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd)
337 {
338 #define STRUCT DDSURFACEDESC2
339     static const member_info members[] =
340         {
341             ME(DDSD_HEIGHT, DDRAW_dump_DWORD, dwHeight),
342             ME(DDSD_WIDTH, DDRAW_dump_DWORD, dwWidth),
343             ME(DDSD_PITCH, DDRAW_dump_DWORD, u1.lPitch),
344             ME(DDSD_LINEARSIZE, DDRAW_dump_DWORD, u1.dwLinearSize),
345             ME(DDSD_BACKBUFFERCOUNT, DDRAW_dump_DWORD, dwBackBufferCount),
346             ME(DDSD_MIPMAPCOUNT, DDRAW_dump_DWORD, u2.dwMipMapCount),
347             ME(DDSD_REFRESHRATE, DDRAW_dump_DWORD, u2.dwRefreshRate),
348             ME(DDSD_ALPHABITDEPTH, DDRAW_dump_DWORD, dwAlphaBitDepth),
349             ME(DDSD_LPSURFACE, DDRAW_dump_PTR, lpSurface),
350             ME(DDSD_CKDESTOVERLAY, DDRAW_dump_DDCOLORKEY, u3.ddckCKDestOverlay),
351             ME(DDSD_CKDESTBLT, DDRAW_dump_DDCOLORKEY, ddckCKDestBlt),
352             ME(DDSD_CKSRCOVERLAY, DDRAW_dump_DDCOLORKEY, ddckCKSrcOverlay),
353             ME(DDSD_CKSRCBLT, DDRAW_dump_DDCOLORKEY, ddckCKSrcBlt),
354             ME(DDSD_PIXELFORMAT, DDRAW_dump_pixelformat, u4.ddpfPixelFormat)
355         };
356     static const member_info members_caps[] =
357         {
358             ME(DDSD_CAPS, DDRAW_dump_DDSCAPS, ddsCaps)
359         };
360     static const member_info members_caps2[] =
361         {
362             ME(DDSD_CAPS, DDRAW_dump_DDSCAPS2, ddsCaps)
363         };
364 #undef STRUCT
365
366     if (lpddsd->dwSize >= sizeof(DDSURFACEDESC2)) {
367         DDRAW_dump_members(lpddsd->dwFlags, lpddsd, members_caps2, 1);
368     } else {
369         DDRAW_dump_members(lpddsd->dwFlags, lpddsd, members_caps, 1);
370     }
371                                                   
372     DDRAW_dump_members(lpddsd->dwFlags, lpddsd, members,
373                        sizeof(members)/sizeof(members[0]));
374 }
375
376 void DDRAW_dump_cooperativelevel(DWORD cooplevel)
377 {
378     static const flag_info flags[] =
379         {
380             FE(DDSCL_FULLSCREEN),
381             FE(DDSCL_ALLOWREBOOT),
382             FE(DDSCL_NOWINDOWCHANGES),
383             FE(DDSCL_NORMAL),
384             FE(DDSCL_ALLOWMODEX),
385             FE(DDSCL_EXCLUSIVE),
386             FE(DDSCL_SETFOCUSWINDOW),
387             FE(DDSCL_SETDEVICEWINDOW),
388             FE(DDSCL_CREATEDEVICEWINDOW)
389     };
390
391     if (TRACE_ON(ddraw))
392     {
393         DPRINTF(" - ");
394         DDRAW_dump_flags(cooplevel, flags, sizeof(flags)/sizeof(flags[0]));
395     }
396 }
397
398 void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) {
399     static const flag_info flags1[] = {
400       FE(DDCAPS_3D),
401       FE(DDCAPS_ALIGNBOUNDARYDEST),
402       FE(DDCAPS_ALIGNSIZEDEST),
403       FE(DDCAPS_ALIGNBOUNDARYSRC),
404       FE(DDCAPS_ALIGNSIZESRC),
405       FE(DDCAPS_ALIGNSTRIDE),
406       FE(DDCAPS_BLT),
407       FE(DDCAPS_BLTQUEUE),
408       FE(DDCAPS_BLTFOURCC),
409       FE(DDCAPS_BLTSTRETCH),
410       FE(DDCAPS_GDI),
411       FE(DDCAPS_OVERLAY),
412       FE(DDCAPS_OVERLAYCANTCLIP),
413       FE(DDCAPS_OVERLAYFOURCC),
414       FE(DDCAPS_OVERLAYSTRETCH),
415       FE(DDCAPS_PALETTE),
416       FE(DDCAPS_PALETTEVSYNC),
417       FE(DDCAPS_READSCANLINE),
418       FE(DDCAPS_STEREOVIEW),
419       FE(DDCAPS_VBI),
420       FE(DDCAPS_ZBLTS),
421       FE(DDCAPS_ZOVERLAYS),
422       FE(DDCAPS_COLORKEY),
423       FE(DDCAPS_ALPHA),
424       FE(DDCAPS_COLORKEYHWASSIST),
425       FE(DDCAPS_NOHARDWARE),
426       FE(DDCAPS_BLTCOLORFILL),
427       FE(DDCAPS_BANKSWITCHED),
428       FE(DDCAPS_BLTDEPTHFILL),
429       FE(DDCAPS_CANCLIP),
430       FE(DDCAPS_CANCLIPSTRETCHED),
431       FE(DDCAPS_CANBLTSYSMEM)
432     };
433     static const flag_info flags2[] = {
434       FE(DDCAPS2_CERTIFIED),
435       FE(DDCAPS2_NO2DDURING3DSCENE),
436       FE(DDCAPS2_VIDEOPORT),
437       FE(DDCAPS2_AUTOFLIPOVERLAY),
438       FE(DDCAPS2_CANBOBINTERLEAVED),
439       FE(DDCAPS2_CANBOBNONINTERLEAVED),
440       FE(DDCAPS2_COLORCONTROLOVERLAY),
441       FE(DDCAPS2_COLORCONTROLPRIMARY),
442       FE(DDCAPS2_CANDROPZ16BIT),
443       FE(DDCAPS2_NONLOCALVIDMEM),
444       FE(DDCAPS2_NONLOCALVIDMEMCAPS),
445       FE(DDCAPS2_NOPAGELOCKREQUIRED),
446       FE(DDCAPS2_WIDESURFACES),
447       FE(DDCAPS2_CANFLIPODDEVEN),
448       FE(DDCAPS2_CANBOBHARDWARE),
449       FE(DDCAPS2_COPYFOURCC),
450       FE(DDCAPS2_PRIMARYGAMMA),
451       FE(DDCAPS2_CANRENDERWINDOWED),
452       FE(DDCAPS2_CANCALIBRATEGAMMA),
453       FE(DDCAPS2_FLIPINTERVAL),
454       FE(DDCAPS2_FLIPNOVSYNC),
455       FE(DDCAPS2_CANMANAGETEXTURE),
456       FE(DDCAPS2_TEXMANINNONLOCALVIDMEM),
457       FE(DDCAPS2_STEREO),
458       FE(DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL)
459     };
460     static const flag_info flags3[] = {
461       FE(DDCKEYCAPS_DESTBLT),
462       FE(DDCKEYCAPS_DESTBLTCLRSPACE),
463       FE(DDCKEYCAPS_DESTBLTCLRSPACEYUV),
464       FE(DDCKEYCAPS_DESTBLTYUV),
465       FE(DDCKEYCAPS_DESTOVERLAY),
466       FE(DDCKEYCAPS_DESTOVERLAYCLRSPACE),
467       FE(DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV),
468       FE(DDCKEYCAPS_DESTOVERLAYONEACTIVE),
469       FE(DDCKEYCAPS_DESTOVERLAYYUV),
470       FE(DDCKEYCAPS_SRCBLT),
471       FE(DDCKEYCAPS_SRCBLTCLRSPACE),
472       FE(DDCKEYCAPS_SRCBLTCLRSPACEYUV),
473       FE(DDCKEYCAPS_SRCBLTYUV),
474       FE(DDCKEYCAPS_SRCOVERLAY),
475       FE(DDCKEYCAPS_SRCOVERLAYCLRSPACE),
476       FE(DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV),
477       FE(DDCKEYCAPS_SRCOVERLAYONEACTIVE),
478       FE(DDCKEYCAPS_SRCOVERLAYYUV),
479       FE(DDCKEYCAPS_NOCOSTOVERLAY)
480     };
481     static const flag_info flags4[] = {
482       FE(DDFXCAPS_BLTALPHA),
483       FE(DDFXCAPS_OVERLAYALPHA),
484       FE(DDFXCAPS_BLTARITHSTRETCHYN),
485       FE(DDFXCAPS_BLTARITHSTRETCHY),
486       FE(DDFXCAPS_BLTMIRRORLEFTRIGHT),
487       FE(DDFXCAPS_BLTMIRRORUPDOWN),
488       FE(DDFXCAPS_BLTROTATION),
489       FE(DDFXCAPS_BLTROTATION90),
490       FE(DDFXCAPS_BLTSHRINKX),
491       FE(DDFXCAPS_BLTSHRINKXN),
492       FE(DDFXCAPS_BLTSHRINKY),
493       FE(DDFXCAPS_BLTSHRINKYN),
494       FE(DDFXCAPS_BLTSTRETCHX),
495       FE(DDFXCAPS_BLTSTRETCHXN),
496       FE(DDFXCAPS_BLTSTRETCHY),
497       FE(DDFXCAPS_BLTSTRETCHYN),
498       FE(DDFXCAPS_OVERLAYARITHSTRETCHY),
499       FE(DDFXCAPS_OVERLAYARITHSTRETCHYN),
500       FE(DDFXCAPS_OVERLAYSHRINKX),
501       FE(DDFXCAPS_OVERLAYSHRINKXN),
502       FE(DDFXCAPS_OVERLAYSHRINKY),
503       FE(DDFXCAPS_OVERLAYSHRINKYN),
504       FE(DDFXCAPS_OVERLAYSTRETCHX),
505       FE(DDFXCAPS_OVERLAYSTRETCHXN),
506       FE(DDFXCAPS_OVERLAYSTRETCHY),
507       FE(DDFXCAPS_OVERLAYSTRETCHYN),
508       FE(DDFXCAPS_OVERLAYMIRRORLEFTRIGHT),
509       FE(DDFXCAPS_OVERLAYMIRRORUPDOWN)
510     };
511     static const flag_info flags5[] = {
512       FE(DDFXALPHACAPS_BLTALPHAEDGEBLEND),
513       FE(DDFXALPHACAPS_BLTALPHAPIXELS),
514       FE(DDFXALPHACAPS_BLTALPHAPIXELSNEG),
515       FE(DDFXALPHACAPS_BLTALPHASURFACES),
516       FE(DDFXALPHACAPS_BLTALPHASURFACESNEG),
517       FE(DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND),
518       FE(DDFXALPHACAPS_OVERLAYALPHAPIXELS),
519       FE(DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG),
520       FE(DDFXALPHACAPS_OVERLAYALPHASURFACES),
521       FE(DDFXALPHACAPS_OVERLAYALPHASURFACESNEG)
522     };
523     static const flag_info flags6[] = {
524       FE(DDPCAPS_4BIT),
525       FE(DDPCAPS_8BITENTRIES),
526       FE(DDPCAPS_8BIT),
527       FE(DDPCAPS_INITIALIZE),
528       FE(DDPCAPS_PRIMARYSURFACE),
529       FE(DDPCAPS_PRIMARYSURFACELEFT),
530       FE(DDPCAPS_ALLOW256),
531       FE(DDPCAPS_VSYNC),
532       FE(DDPCAPS_1BIT),
533       FE(DDPCAPS_2BIT),
534       FE(DDPCAPS_ALPHA),
535     };
536     static const flag_info flags7[] = {
537       FE(DDSVCAPS_RESERVED1),
538       FE(DDSVCAPS_RESERVED2),
539       FE(DDSVCAPS_RESERVED3),
540       FE(DDSVCAPS_RESERVED4),
541       FE(DDSVCAPS_STEREOSEQUENTIAL),
542     };
543
544     DPRINTF(" - dwSize : %ld\n", lpcaps->dwSize);
545     DPRINTF(" - dwCaps : "); DDRAW_dump_flags(lpcaps->dwCaps, flags1, sizeof(flags1)/sizeof(flags1[0]));
546     DPRINTF(" - dwCaps2 : "); DDRAW_dump_flags(lpcaps->dwCaps2, flags2, sizeof(flags2)/sizeof(flags2[0]));
547     DPRINTF(" - dwCKeyCaps : "); DDRAW_dump_flags(lpcaps->dwCKeyCaps, flags3, sizeof(flags3)/sizeof(flags3[0]));
548     DPRINTF(" - dwFXCaps : "); DDRAW_dump_flags(lpcaps->dwFXCaps, flags4, sizeof(flags4)/sizeof(flags4[0]));
549     DPRINTF(" - dwFXAlphaCaps : "); DDRAW_dump_flags(lpcaps->dwFXAlphaCaps, flags5, sizeof(flags5)/sizeof(flags5[0]));
550     DPRINTF(" - dwPalCaps : "); DDRAW_dump_flags(lpcaps->dwPalCaps, flags6, sizeof(flags6)/sizeof(flags6[0]));
551     DPRINTF(" - dwSVCaps : "); DDRAW_dump_flags(lpcaps->dwSVCaps, flags7, sizeof(flags7)/sizeof(flags7[0]));
552     DPRINTF("...\n");
553     DPRINTF(" - dwNumFourCCCodes : %ld\n", lpcaps->dwNumFourCCCodes);
554     DPRINTF(" - dwCurrVisibleOverlays : %ld\n", lpcaps->dwCurrVisibleOverlays);
555     DPRINTF(" - dwMinOverlayStretch : %ld\n", lpcaps->dwMinOverlayStretch);
556     DPRINTF(" - dwMaxOverlayStretch : %ld\n", lpcaps->dwMaxOverlayStretch);
557     DPRINTF("...\n");
558     DPRINTF(" - ddsCaps : "); DDRAW_dump_DDSCAPS2(&lpcaps->ddsCaps); DPRINTF("\n");
559 }