Cleaned up some more USER dependencies.
[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  */
7
8 #include "config.h"
9
10 #include <unistd.h>
11 #include <assert.h>
12 #include <fcntl.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <stdio.h>
16
17 #include "winerror.h"
18 #include "gdi.h"
19 #include "heap.h"
20 #include "dc.h"
21 #include "win.h"
22 #include "wine/exception.h"
23 #include "ddraw.h"
24 #include "d3d.h"
25 #include "debugtools.h"
26 #include "spy.h"
27 #include "message.h"
28 #include "options.h"
29
30 DEFAULT_DEBUG_CHANNEL(ddraw);
31
32 /******************************************************************************
33  *              debug output functions
34  */
35 void _dump_DDBLTFX(DWORD flagmask) {
36     int i;
37     const struct {
38         DWORD   mask;
39         char    *name;
40     } flags[] = {
41 #define FE(x) { x, #x},
42         FE(DDBLTFX_ARITHSTRETCHY)
43         FE(DDBLTFX_MIRRORLEFTRIGHT)
44         FE(DDBLTFX_MIRRORUPDOWN)
45         FE(DDBLTFX_NOTEARING)
46         FE(DDBLTFX_ROTATE180)
47         FE(DDBLTFX_ROTATE270)
48         FE(DDBLTFX_ROTATE90)
49         FE(DDBLTFX_ZBUFFERRANGE)
50         FE(DDBLTFX_ZBUFFERBASEDEST)
51 #undef FE
52     };
53     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
54         if (flags[i].mask & flagmask)
55             DPRINTF("%s ",flags[i].name);
56     DPRINTF("\n");
57 }
58
59 void _dump_DDBLTFAST(DWORD flagmask) {
60     int i;
61     const struct {
62         DWORD   mask;
63         char    *name;
64     } flags[] = {
65 #define FE(x) { x, #x},
66         FE(DDBLTFAST_NOCOLORKEY)
67         FE(DDBLTFAST_SRCCOLORKEY)
68         FE(DDBLTFAST_DESTCOLORKEY)
69         FE(DDBLTFAST_WAIT)
70 #undef FE
71     };
72     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
73         if (flags[i].mask & flagmask)
74             DPRINTF("%s ",flags[i].name);
75     DPRINTF("\n");
76 }
77
78 void _dump_DDBLT(DWORD flagmask) {
79     int i;
80     const struct {
81         DWORD   mask;
82         char    *name;
83     } flags[] = {
84 #define FE(x) { x, #x},
85         FE(DDBLT_ALPHADEST)
86         FE(DDBLT_ALPHADESTCONSTOVERRIDE)
87         FE(DDBLT_ALPHADESTNEG)
88         FE(DDBLT_ALPHADESTSURFACEOVERRIDE)
89         FE(DDBLT_ALPHAEDGEBLEND)
90         FE(DDBLT_ALPHASRC)
91         FE(DDBLT_ALPHASRCCONSTOVERRIDE)
92         FE(DDBLT_ALPHASRCNEG)
93         FE(DDBLT_ALPHASRCSURFACEOVERRIDE)
94         FE(DDBLT_ASYNC)
95         FE(DDBLT_COLORFILL)
96         FE(DDBLT_DDFX)
97         FE(DDBLT_DDROPS)
98         FE(DDBLT_KEYDEST)
99         FE(DDBLT_KEYDESTOVERRIDE)
100         FE(DDBLT_KEYSRC)
101         FE(DDBLT_KEYSRCOVERRIDE)
102         FE(DDBLT_ROP)
103         FE(DDBLT_ROTATIONANGLE)
104         FE(DDBLT_ZBUFFER)
105         FE(DDBLT_ZBUFFERDESTCONSTOVERRIDE)
106         FE(DDBLT_ZBUFFERDESTOVERRIDE)
107         FE(DDBLT_ZBUFFERSRCCONSTOVERRIDE)
108         FE(DDBLT_ZBUFFERSRCOVERRIDE)
109         FE(DDBLT_WAIT)
110         FE(DDBLT_DEPTHFILL)
111 #undef FE
112     };
113     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
114         if (flags[i].mask & flagmask)
115             DPRINTF("%s ",flags[i].name);
116     DPRINTF("\n");
117 }
118
119 void _dump_DDSCAPS(void *in) {
120     int i;
121     const struct {
122         DWORD   mask;
123         char    *name;
124     } flags[] = {
125 #define FE(x) { x, #x},
126         FE(DDSCAPS_RESERVED1)
127         FE(DDSCAPS_ALPHA)
128         FE(DDSCAPS_BACKBUFFER)
129         FE(DDSCAPS_COMPLEX)
130         FE(DDSCAPS_FLIP)
131         FE(DDSCAPS_FRONTBUFFER)
132         FE(DDSCAPS_OFFSCREENPLAIN)
133         FE(DDSCAPS_OVERLAY)
134         FE(DDSCAPS_PALETTE)
135         FE(DDSCAPS_PRIMARYSURFACE)
136         FE(DDSCAPS_PRIMARYSURFACELEFT)
137         FE(DDSCAPS_SYSTEMMEMORY)
138         FE(DDSCAPS_TEXTURE)
139         FE(DDSCAPS_3DDEVICE)
140         FE(DDSCAPS_VIDEOMEMORY)
141         FE(DDSCAPS_VISIBLE)
142         FE(DDSCAPS_WRITEONLY)
143         FE(DDSCAPS_ZBUFFER)
144         FE(DDSCAPS_OWNDC)
145         FE(DDSCAPS_LIVEVIDEO)
146         FE(DDSCAPS_HWCODEC)
147         FE(DDSCAPS_MODEX)
148         FE(DDSCAPS_MIPMAP)
149         FE(DDSCAPS_RESERVED2)
150         FE(DDSCAPS_ALLOCONLOAD)
151         FE(DDSCAPS_VIDEOPORT)
152         FE(DDSCAPS_LOCALVIDMEM)
153         FE(DDSCAPS_NONLOCALVIDMEM)
154         FE(DDSCAPS_STANDARDVGAMODE)
155         FE(DDSCAPS_OPTIMIZED)
156 #undef FE
157     };
158     DWORD flagmask = *((DWORD *) in);
159     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
160         if (flags[i].mask & flagmask)
161             DPRINTF("%s ",flags[i].name);
162 }
163
164 void _dump_pixelformat_flag(DWORD flagmask) {
165     int i;
166     const struct {
167         DWORD   mask;
168         char    *name;
169     } flags[] = {
170 #define FE(x) { x, #x},
171         FE(DDPF_ALPHAPIXELS)
172         FE(DDPF_ALPHA)
173         FE(DDPF_FOURCC)
174         FE(DDPF_PALETTEINDEXED4)
175         FE(DDPF_PALETTEINDEXEDTO8)
176         FE(DDPF_PALETTEINDEXED8)
177         FE(DDPF_RGB)
178         FE(DDPF_COMPRESSED)
179         FE(DDPF_RGBTOYUV)
180         FE(DDPF_YUV)
181         FE(DDPF_ZBUFFER)
182         FE(DDPF_PALETTEINDEXED1)
183         FE(DDPF_PALETTEINDEXED2)
184         FE(DDPF_ZPIXELS)
185 #undef FE
186     };
187     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
188         if (flags[i].mask & flagmask)
189             DPRINTF("%s ",flags[i].name);
190 }
191
192 void _dump_paletteformat(DWORD dwFlags) {
193     int i;
194     const struct {
195         DWORD   mask;
196         char    *name;
197     } flags[] = {
198 #define FE(x) { x, #x},
199         FE(DDPCAPS_4BIT)
200         FE(DDPCAPS_8BITENTRIES)
201         FE(DDPCAPS_8BIT)
202         FE(DDPCAPS_INITIALIZE)
203         FE(DDPCAPS_PRIMARYSURFACE)
204         FE(DDPCAPS_PRIMARYSURFACELEFT)
205         FE(DDPCAPS_ALLOW256)
206         FE(DDPCAPS_VSYNC)
207         FE(DDPCAPS_1BIT)
208         FE(DDPCAPS_2BIT)
209         FE(DDPCAPS_ALPHA)
210 #undef FE
211     };
212     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
213         if (flags[i].mask & dwFlags)
214             DPRINTF("%s ",flags[i].name);
215     DPRINTF("\n");
216 }
217
218 void _dump_pixelformat(void *in) {
219     LPDDPIXELFORMAT pf = (LPDDPIXELFORMAT) in;
220
221     DPRINTF("( ");
222     _dump_pixelformat_flag(pf->dwFlags);
223     if (pf->dwFlags & DDPF_FOURCC) {
224         DPRINTF(", dwFourCC : %c%c%c%c",
225                 (unsigned char)((pf->dwFourCC>>24)&0xff),
226                 (unsigned char)((pf->dwFourCC>>16)&0xff),
227                 (unsigned char)((pf->dwFourCC>> 8)&0xff),
228                 (unsigned char)( pf->dwFourCC     &0xff)
229         );
230     }
231     if (pf->dwFlags & DDPF_RGB) {
232         char *cmd;
233         DPRINTF(", RGB bits: %ld, ", pf->u.dwRGBBitCount);
234         switch (pf->u.dwRGBBitCount) {
235         case 4: cmd = "%1lx"; break;
236         case 8: cmd = "%02lx"; break;
237         case 16: cmd = "%04lx"; break;
238         case 24: cmd = "%06lx"; break;
239         case 32: cmd = "%08lx"; break;
240         default: ERR("Unexpected bit depth !\n"); cmd = "%d"; break;
241         }
242         DPRINTF(" R "); DPRINTF(cmd, pf->u1.dwRBitMask);
243         DPRINTF(" G "); DPRINTF(cmd, pf->u2.dwGBitMask);
244         DPRINTF(" B "); DPRINTF(cmd, pf->u3.dwBBitMask);
245         if (pf->dwFlags & DDPF_ALPHAPIXELS) {
246             DPRINTF(" A "); DPRINTF(cmd, pf->u4.dwRGBAlphaBitMask);
247         }
248         if (pf->dwFlags & DDPF_ZPIXELS) {
249             DPRINTF(" Z "); DPRINTF(cmd, pf->u4.dwRGBZBitMask);
250         }
251     }
252     if (pf->dwFlags & DDPF_ZBUFFER) {
253         DPRINTF(", Z bits : %ld", pf->u.dwZBufferBitDepth);
254     }
255     if (pf->dwFlags & DDPF_ALPHA) {
256         DPRINTF(", Alpha bits : %ld", pf->u.dwAlphaBitDepth);
257     }
258     DPRINTF(")");
259 }
260
261 void _dump_colorkeyflag(DWORD ck) {
262     int i;
263     const struct {
264         DWORD   mask;
265         char    *name;
266     } flags[] = {
267 #define FE(x) { x, #x},
268         FE(DDCKEY_COLORSPACE)
269         FE(DDCKEY_DESTBLT)
270         FE(DDCKEY_DESTOVERLAY)
271         FE(DDCKEY_SRCBLT)
272         FE(DDCKEY_SRCOVERLAY)
273 #undef FE
274     };
275     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
276         if (flags[i].mask & ck)
277             DPRINTF("%s ",flags[i].name);
278 }
279
280 static void _dump_DWORD(void *in) {
281     DPRINTF("%ld", *((DWORD *) in));
282 }
283 static void _dump_PTR(void *in) {
284     DPRINTF("%p", *((void **) in));
285 }
286 void _dump_DDCOLORKEY(void *in) {
287     DDCOLORKEY *ddck = (DDCOLORKEY *) in;
288
289     DPRINTF(" Low : %ld  - High : %ld", ddck->dwColorSpaceLowValue, ddck->dwColorSpaceHighValue);
290 }
291
292 void _dump_surface_desc(DDSURFACEDESC *lpddsd) {
293     int i;
294     struct {
295         DWORD   mask;
296         char    *name;
297         void (*func)(void *);
298         void    *elt;
299     } flags[16], *fe = flags;
300 #define FE(x,f,e) do { fe->mask = x;  fe->name = #x; fe->func = f; fe->elt = (void *) &(lpddsd->e); fe++; } while(0)
301         FE(DDSD_CAPS, _dump_DDSCAPS, ddsCaps);
302         FE(DDSD_HEIGHT, _dump_DWORD, dwHeight);
303         FE(DDSD_WIDTH, _dump_DWORD, dwWidth);
304         FE(DDSD_PITCH, _dump_DWORD, lPitch);
305         FE(DDSD_BACKBUFFERCOUNT, _dump_DWORD, dwBackBufferCount);
306         FE(DDSD_ZBUFFERBITDEPTH, _dump_DWORD, u.dwZBufferBitDepth);
307         FE(DDSD_ALPHABITDEPTH, _dump_DWORD, dwAlphaBitDepth);
308         FE(DDSD_PIXELFORMAT, _dump_pixelformat, ddpfPixelFormat);
309         FE(DDSD_CKDESTOVERLAY, _dump_DDCOLORKEY, ddckCKDestOverlay);
310         FE(DDSD_CKDESTBLT, _dump_DDCOLORKEY, ddckCKDestBlt);
311         FE(DDSD_CKSRCOVERLAY, _dump_DDCOLORKEY, ddckCKSrcOverlay);
312         FE(DDSD_CKSRCBLT, _dump_DDCOLORKEY, ddckCKSrcBlt);
313         FE(DDSD_MIPMAPCOUNT, _dump_DWORD, u.dwMipMapCount);
314         FE(DDSD_REFRESHRATE, _dump_DWORD, u.dwRefreshRate);
315         FE(DDSD_LINEARSIZE, _dump_DWORD, u1.dwLinearSize);
316         FE(DDSD_LPSURFACE, _dump_PTR, u1.lpSurface);
317 #undef FE
318
319     for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
320         if (flags[i].mask & lpddsd->dwFlags) {
321             DPRINTF(" - %s : ",flags[i].name);
322             flags[i].func(flags[i].elt);
323             DPRINTF("\n");  
324         }
325 }
326 void _dump_cooperativelevel(DWORD cooplevel) {
327     int i;
328     const struct {
329         int     mask;
330         char    *name;
331     } flags[] = {
332 #define FE(x) { x, #x},
333             FE(DDSCL_FULLSCREEN)
334             FE(DDSCL_ALLOWREBOOT)
335             FE(DDSCL_NOWINDOWCHANGES)
336             FE(DDSCL_NORMAL)
337             FE(DDSCL_ALLOWMODEX)
338             FE(DDSCL_EXCLUSIVE)
339             FE(DDSCL_SETFOCUSWINDOW)
340             FE(DDSCL_SETDEVICEWINDOW)
341             FE(DDSCL_CREATEDEVICEWINDOW)
342 #undef FE
343     };
344
345     if (TRACE_ON(ddraw)) {
346         DPRINTF(" - ");
347         for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
348             if (flags[i].mask & cooplevel)
349                 DPRINTF("%s ",flags[i].name);
350         DPRINTF("\n");
351     }
352 }