| |
| /* DirectDraw Base Functions |
| * |
| * Copyright 1997-1999 Marcus Meissner |
| * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) |
| */ |
| |
| #include "config.h" |
| |
| #include <unistd.h> |
| #include <assert.h> |
| #include <fcntl.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| |
| #include "winerror.h" |
| #include "heap.h" |
| #include "wine/exception.h" |
| #include "ddraw.h" |
| #include "d3d.h" |
| #include "debugtools.h" |
| #include "options.h" |
| |
| DEFAULT_DEBUG_CHANNEL(ddraw); |
| |
| /****************************************************************************** |
| * debug output functions |
| */ |
| void _dump_DDBLTFX(DWORD flagmask) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDBLTFX_ARITHSTRETCHY) |
| FE(DDBLTFX_MIRRORLEFTRIGHT) |
| FE(DDBLTFX_MIRRORUPDOWN) |
| FE(DDBLTFX_NOTEARING) |
| FE(DDBLTFX_ROTATE180) |
| FE(DDBLTFX_ROTATE270) |
| FE(DDBLTFX_ROTATE90) |
| FE(DDBLTFX_ZBUFFERRANGE) |
| FE(DDBLTFX_ZBUFFERBASEDEST) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| |
| void _dump_DDOVERLAY(DWORD flagmask) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDOVER_ALPHADEST) |
| FE(DDOVER_ALPHADESTCONSTOVERRIDE) |
| FE(DDOVER_ALPHADESTNEG) |
| FE(DDOVER_ALPHADESTSURFACEOVERRIDE) |
| FE(DDOVER_ALPHAEDGEBLEND) |
| FE(DDOVER_ALPHASRC) |
| FE(DDOVER_ALPHASRCCONSTOVERRIDE) |
| FE(DDOVER_ALPHASRCNEG) |
| FE(DDOVER_ALPHASRCSURFACEOVERRIDE) |
| FE(DDOVER_HIDE) |
| FE(DDOVER_KEYDEST) |
| FE(DDOVER_KEYDESTOVERRIDE) |
| FE(DDOVER_KEYSRC) |
| FE(DDOVER_KEYSRCOVERRIDE) |
| FE(DDOVER_SHOW) |
| FE(DDOVER_ADDDIRTYRECT) |
| FE(DDOVER_REFRESHDIRTYRECTS) |
| FE(DDOVER_REFRESHALL) |
| FE(DDOVER_DDFX) |
| FE(DDOVER_AUTOFLIP) |
| FE(DDOVER_BOB) |
| FE(DDOVER_OVERRIDEBOBWEAVE) |
| FE(DDOVER_INTERLEAVED) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| |
| void _dump_DDBLTFAST(DWORD flagmask) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDBLTFAST_NOCOLORKEY) |
| FE(DDBLTFAST_SRCCOLORKEY) |
| FE(DDBLTFAST_DESTCOLORKEY) |
| FE(DDBLTFAST_WAIT) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| |
| void _dump_DDBLT(DWORD flagmask) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDBLT_ALPHADEST) |
| FE(DDBLT_ALPHADESTCONSTOVERRIDE) |
| FE(DDBLT_ALPHADESTNEG) |
| FE(DDBLT_ALPHADESTSURFACEOVERRIDE) |
| FE(DDBLT_ALPHAEDGEBLEND) |
| FE(DDBLT_ALPHASRC) |
| FE(DDBLT_ALPHASRCCONSTOVERRIDE) |
| FE(DDBLT_ALPHASRCNEG) |
| FE(DDBLT_ALPHASRCSURFACEOVERRIDE) |
| FE(DDBLT_ASYNC) |
| FE(DDBLT_COLORFILL) |
| FE(DDBLT_DDFX) |
| FE(DDBLT_DDROPS) |
| FE(DDBLT_KEYDEST) |
| FE(DDBLT_KEYDESTOVERRIDE) |
| FE(DDBLT_KEYSRC) |
| FE(DDBLT_KEYSRCOVERRIDE) |
| FE(DDBLT_ROP) |
| FE(DDBLT_ROTATIONANGLE) |
| FE(DDBLT_ZBUFFER) |
| FE(DDBLT_ZBUFFERDESTCONSTOVERRIDE) |
| FE(DDBLT_ZBUFFERDESTOVERRIDE) |
| FE(DDBLT_ZBUFFERSRCCONSTOVERRIDE) |
| FE(DDBLT_ZBUFFERSRCOVERRIDE) |
| FE(DDBLT_WAIT) |
| FE(DDBLT_DEPTHFILL) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| |
| void _dump_DDSCAPS(void *in) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDSCAPS_RESERVED1) |
| FE(DDSCAPS_ALPHA) |
| FE(DDSCAPS_BACKBUFFER) |
| FE(DDSCAPS_COMPLEX) |
| FE(DDSCAPS_FLIP) |
| FE(DDSCAPS_FRONTBUFFER) |
| FE(DDSCAPS_OFFSCREENPLAIN) |
| FE(DDSCAPS_OVERLAY) |
| FE(DDSCAPS_PALETTE) |
| FE(DDSCAPS_PRIMARYSURFACE) |
| FE(DDSCAPS_PRIMARYSURFACELEFT) |
| FE(DDSCAPS_SYSTEMMEMORY) |
| FE(DDSCAPS_TEXTURE) |
| FE(DDSCAPS_3DDEVICE) |
| FE(DDSCAPS_VIDEOMEMORY) |
| FE(DDSCAPS_VISIBLE) |
| FE(DDSCAPS_WRITEONLY) |
| FE(DDSCAPS_ZBUFFER) |
| FE(DDSCAPS_OWNDC) |
| FE(DDSCAPS_LIVEVIDEO) |
| FE(DDSCAPS_HWCODEC) |
| FE(DDSCAPS_MODEX) |
| FE(DDSCAPS_MIPMAP) |
| FE(DDSCAPS_RESERVED2) |
| FE(DDSCAPS_ALLOCONLOAD) |
| FE(DDSCAPS_VIDEOPORT) |
| FE(DDSCAPS_LOCALVIDMEM) |
| FE(DDSCAPS_NONLOCALVIDMEM) |
| FE(DDSCAPS_STANDARDVGAMODE) |
| FE(DDSCAPS_OPTIMIZED) |
| #undef FE |
| }; |
| DWORD flagmask = *((DWORD *) in); |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| } |
| |
| void _dump_pixelformat_flag(DWORD flagmask) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDPF_ALPHAPIXELS) |
| FE(DDPF_ALPHA) |
| FE(DDPF_FOURCC) |
| FE(DDPF_PALETTEINDEXED4) |
| FE(DDPF_PALETTEINDEXEDTO8) |
| FE(DDPF_PALETTEINDEXED8) |
| FE(DDPF_RGB) |
| FE(DDPF_COMPRESSED) |
| FE(DDPF_RGBTOYUV) |
| FE(DDPF_YUV) |
| FE(DDPF_ZBUFFER) |
| FE(DDPF_PALETTEINDEXED1) |
| FE(DDPF_PALETTEINDEXED2) |
| FE(DDPF_ZPIXELS) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & flagmask) |
| DPRINTF("%s ",flags[i].name); |
| } |
| |
| void _dump_paletteformat(DWORD dwFlags) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDPCAPS_4BIT) |
| FE(DDPCAPS_8BITENTRIES) |
| FE(DDPCAPS_8BIT) |
| FE(DDPCAPS_INITIALIZE) |
| FE(DDPCAPS_PRIMARYSURFACE) |
| FE(DDPCAPS_PRIMARYSURFACELEFT) |
| FE(DDPCAPS_ALLOW256) |
| FE(DDPCAPS_VSYNC) |
| FE(DDPCAPS_1BIT) |
| FE(DDPCAPS_2BIT) |
| FE(DDPCAPS_ALPHA) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & dwFlags) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| |
| void _dump_pixelformat(void *in) { |
| LPDDPIXELFORMAT pf = (LPDDPIXELFORMAT) in; |
| |
| DPRINTF("( "); |
| _dump_pixelformat_flag(pf->dwFlags); |
| if (pf->dwFlags & DDPF_FOURCC) { |
| DPRINTF(", dwFourCC code '%c%c%c%c' (0x%08lx) - %ld bits per pixel", |
| (unsigned char)( pf->dwFourCC &0xff), |
| (unsigned char)((pf->dwFourCC>> 8)&0xff), |
| (unsigned char)((pf->dwFourCC>>16)&0xff), |
| (unsigned char)((pf->dwFourCC>>24)&0xff), |
| pf->dwFourCC, |
| pf->u.dwYUVBitCount |
| ); |
| } |
| if (pf->dwFlags & DDPF_RGB) { |
| char *cmd; |
| DPRINTF(", RGB bits: %ld, ", pf->u.dwRGBBitCount); |
| switch (pf->u.dwRGBBitCount) { |
| case 4: cmd = "%1lx"; break; |
| case 8: cmd = "%02lx"; break; |
| case 16: cmd = "%04lx"; break; |
| case 24: cmd = "%06lx"; break; |
| case 32: cmd = "%08lx"; break; |
| default: ERR("Unexpected bit depth !\n"); cmd = "%d"; break; |
| } |
| DPRINTF(" R "); DPRINTF(cmd, pf->u1.dwRBitMask); |
| DPRINTF(" G "); DPRINTF(cmd, pf->u2.dwGBitMask); |
| DPRINTF(" B "); DPRINTF(cmd, pf->u3.dwBBitMask); |
| if (pf->dwFlags & DDPF_ALPHAPIXELS) { |
| DPRINTF(" A "); DPRINTF(cmd, pf->u4.dwRGBAlphaBitMask); |
| } |
| if (pf->dwFlags & DDPF_ZPIXELS) { |
| DPRINTF(" Z "); DPRINTF(cmd, pf->u4.dwRGBZBitMask); |
| } |
| } |
| if (pf->dwFlags & DDPF_ZBUFFER) { |
| DPRINTF(", Z bits : %ld", pf->u.dwZBufferBitDepth); |
| } |
| if (pf->dwFlags & DDPF_ALPHA) { |
| DPRINTF(", Alpha bits : %ld", pf->u.dwAlphaBitDepth); |
| } |
| DPRINTF(")"); |
| } |
| |
| void _dump_colorkeyflag(DWORD ck) { |
| int i; |
| const struct { |
| DWORD mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDCKEY_COLORSPACE) |
| FE(DDCKEY_DESTBLT) |
| FE(DDCKEY_DESTOVERLAY) |
| FE(DDCKEY_SRCBLT) |
| FE(DDCKEY_SRCOVERLAY) |
| #undef FE |
| }; |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & ck) |
| DPRINTF("%s ",flags[i].name); |
| } |
| |
| static void _dump_DWORD(void *in) { |
| DPRINTF("%ld", *((DWORD *) in)); |
| } |
| static void _dump_PTR(void *in) { |
| DPRINTF("%p", *((void **) in)); |
| } |
| void _dump_DDCOLORKEY(void *in) { |
| DDCOLORKEY *ddck = (DDCOLORKEY *) in; |
| |
| DPRINTF(" Low : %ld - High : %ld", ddck->dwColorSpaceLowValue, ddck->dwColorSpaceHighValue); |
| } |
| |
| void _dump_surface_desc(DDSURFACEDESC *lpddsd) { |
| int i; |
| struct { |
| DWORD mask; |
| char *name; |
| void (*func)(void *); |
| void *elt; |
| } flags[16], *fe = flags; |
| #define FE(x,f,e) do { fe->mask = x; fe->name = #x; fe->func = f; fe->elt = (void *) &(lpddsd->e); fe++; } while(0) |
| FE(DDSD_CAPS, _dump_DDSCAPS, ddsCaps); |
| FE(DDSD_HEIGHT, _dump_DWORD, dwHeight); |
| FE(DDSD_WIDTH, _dump_DWORD, dwWidth); |
| FE(DDSD_PITCH, _dump_DWORD, lPitch); |
| FE(DDSD_BACKBUFFERCOUNT, _dump_DWORD, dwBackBufferCount); |
| FE(DDSD_ZBUFFERBITDEPTH, _dump_DWORD, u.dwZBufferBitDepth); |
| FE(DDSD_ALPHABITDEPTH, _dump_DWORD, dwAlphaBitDepth); |
| FE(DDSD_PIXELFORMAT, _dump_pixelformat, ddpfPixelFormat); |
| FE(DDSD_CKDESTOVERLAY, _dump_DDCOLORKEY, ddckCKDestOverlay); |
| FE(DDSD_CKDESTBLT, _dump_DDCOLORKEY, ddckCKDestBlt); |
| FE(DDSD_CKSRCOVERLAY, _dump_DDCOLORKEY, ddckCKSrcOverlay); |
| FE(DDSD_CKSRCBLT, _dump_DDCOLORKEY, ddckCKSrcBlt); |
| FE(DDSD_MIPMAPCOUNT, _dump_DWORD, u.dwMipMapCount); |
| FE(DDSD_REFRESHRATE, _dump_DWORD, u.dwRefreshRate); |
| FE(DDSD_LINEARSIZE, _dump_DWORD, u1.dwLinearSize); |
| FE(DDSD_LPSURFACE, _dump_PTR, u1.lpSurface); |
| #undef FE |
| |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & lpddsd->dwFlags) { |
| DPRINTF(" - %s : ",flags[i].name); |
| flags[i].func(flags[i].elt); |
| DPRINTF("\n"); |
| } |
| } |
| void _dump_cooperativelevel(DWORD cooplevel) { |
| int i; |
| const struct { |
| int mask; |
| char *name; |
| } flags[] = { |
| #define FE(x) { x, #x}, |
| FE(DDSCL_FULLSCREEN) |
| FE(DDSCL_ALLOWREBOOT) |
| FE(DDSCL_NOWINDOWCHANGES) |
| FE(DDSCL_NORMAL) |
| FE(DDSCL_ALLOWMODEX) |
| FE(DDSCL_EXCLUSIVE) |
| FE(DDSCL_SETFOCUSWINDOW) |
| FE(DDSCL_SETDEVICEWINDOW) |
| FE(DDSCL_CREATEDEVICEWINDOW) |
| #undef FE |
| }; |
| |
| if (TRACE_ON(ddraw)) { |
| DPRINTF(" - "); |
| for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) |
| if (flags[i].mask & cooplevel) |
| DPRINTF("%s ",flags[i].name); |
| DPRINTF("\n"); |
| } |
| } |