| |
| /* DirectDraw Base Functions |
| * |
| * Copyright 1997-1999 Marcus Meissner |
| * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) |
| * Copyright 2000 TransGaming Technologies Inc. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include "config.h" |
| #include "wine/port.h" |
| |
| #include <stddef.h> |
| |
| #include "d3d.h" |
| #include "ddraw.h" |
| #include "winerror.h" |
| |
| #include "wine/exception.h" |
| #include "ddraw_private.h" |
| |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(ddraw); |
| |
| /****************************************************************************** |
| * debug output functions |
| */ |
| typedef struct |
| { |
| DWORD val; |
| const char* name; |
| } flag_info; |
| |
| #define FE(x) { x, #x } |
| |
| typedef struct |
| { |
| DWORD val; |
| const char* name; |
| void (*func)(const void *); |
| ptrdiff_t offset; |
| } member_info; |
| |
| #define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) } |
| |
| static void DDRAW_dump_flags(DWORD flags, const flag_info* names, |
| size_t num_names) |
| { |
| unsigned int i; |
| |
| for (i=0; i < num_names; i++) |
| if (names[i].val & flags) |
| DPRINTF("%s ", names[i].name); |
| |
| DPRINTF("\n"); |
| } |
| |
| static void DDRAW_dump_members(DWORD flags, const void* data, |
| const member_info* mems, size_t num_mems) |
| { |
| unsigned int i; |
| |
| for (i=0; i < num_mems; i++) |
| { |
| if (mems[i].val & flags) |
| { |
| DPRINTF(" - %s : ", mems[i].name); |
| mems[i].func((const char *)data + mems[i].offset); |
| DPRINTF("\n"); |
| } |
| } |
| } |
| |
| void DDRAW_dump_DDBLTFX(DWORD flagmask) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_DDBLTFAST(DWORD flagmask) |
| { |
| static const flag_info flags[] = |
| { |
| FE(DDBLTFAST_NOCOLORKEY), |
| FE(DDBLTFAST_SRCCOLORKEY), |
| FE(DDBLTFAST_DESTCOLORKEY), |
| FE(DDBLTFAST_WAIT) |
| }; |
| |
| DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_DDBLT(DWORD flagmask) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_DDSCAPS(const DDSCAPS2 *in) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| DDRAW_dump_flags(in->dwCaps, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_pixelformat_flag(DWORD flagmask) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| DDRAW_dump_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_paletteformat(DWORD dwFlags) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| DDRAW_dump_flags(dwFlags, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| void DDRAW_dump_pixelformat(const DDPIXELFORMAT *pf) { |
| DPRINTF("( "); |
| DDRAW_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->u1.dwYUVBitCount |
| ); |
| } |
| if (pf->dwFlags & DDPF_RGB) { |
| char *cmd; |
| DPRINTF(", RGB bits: %ld, ", pf->u1.dwRGBBitCount); |
| switch (pf->u1.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->u2.dwRBitMask); |
| DPRINTF(" G "); DPRINTF(cmd, pf->u3.dwGBitMask); |
| DPRINTF(" B "); DPRINTF(cmd, pf->u4.dwBBitMask); |
| if (pf->dwFlags & DDPF_ALPHAPIXELS) { |
| DPRINTF(" A "); DPRINTF(cmd, pf->u5.dwRGBAlphaBitMask); |
| } |
| if (pf->dwFlags & DDPF_ZPIXELS) { |
| DPRINTF(" Z "); DPRINTF(cmd, pf->u5.dwRGBZBitMask); |
| } |
| } |
| if (pf->dwFlags & DDPF_ZBUFFER) { |
| DPRINTF(", Z bits : %ld", pf->u1.dwZBufferBitDepth); |
| } |
| if (pf->dwFlags & DDPF_ALPHA) { |
| DPRINTF(", Alpha bits : %ld", pf->u1.dwAlphaBitDepth); |
| } |
| DPRINTF(")"); |
| } |
| |
| void DDRAW_dump_colorkeyflag(DWORD ck) |
| { |
| static const flag_info flags[] = |
| { |
| FE(DDCKEY_COLORSPACE), |
| FE(DDCKEY_DESTBLT), |
| FE(DDCKEY_DESTOVERLAY), |
| FE(DDCKEY_SRCBLT), |
| FE(DDCKEY_SRCOVERLAY) |
| }; |
| |
| DDRAW_dump_flags(ck, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| |
| static void DDRAW_dump_DWORD(const void *in) { |
| DPRINTF("%ld", *((const DWORD *) in)); |
| } |
| static void DDRAW_dump_PTR(const void *in) { |
| DPRINTF("%p", *((const void **) in)); |
| } |
| void DDRAW_dump_DDCOLORKEY(const DDCOLORKEY *ddck) { |
| DPRINTF(" Low : %ld - High : %ld", ddck->dwColorSpaceLowValue, ddck->dwColorSpaceHighValue); |
| } |
| |
| void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd) |
| { |
| #define STRUCT DDSURFACEDESC2 |
| static const member_info members[] = |
| { |
| ME(DDSD_CAPS, DDRAW_dump_DDSCAPS, ddsCaps), |
| ME(DDSD_HEIGHT, DDRAW_dump_DWORD, dwHeight), |
| ME(DDSD_WIDTH, DDRAW_dump_DWORD, dwWidth), |
| ME(DDSD_PITCH, DDRAW_dump_DWORD, u1.lPitch), |
| ME(DDSD_LINEARSIZE, DDRAW_dump_DWORD, u1.dwLinearSize), |
| ME(DDSD_BACKBUFFERCOUNT, DDRAW_dump_DWORD, dwBackBufferCount), |
| ME(DDSD_MIPMAPCOUNT, DDRAW_dump_DWORD, u2.dwMipMapCount), |
| ME(DDSD_REFRESHRATE, DDRAW_dump_DWORD, u2.dwRefreshRate), |
| ME(DDSD_ALPHABITDEPTH, DDRAW_dump_DWORD, dwAlphaBitDepth), |
| ME(DDSD_LPSURFACE, DDRAW_dump_PTR, lpSurface), |
| ME(DDSD_CKDESTOVERLAY, DDRAW_dump_DDCOLORKEY, u3.ddckCKDestOverlay), |
| ME(DDSD_CKDESTBLT, DDRAW_dump_DDCOLORKEY, ddckCKDestBlt), |
| ME(DDSD_CKSRCOVERLAY, DDRAW_dump_DDCOLORKEY, ddckCKSrcOverlay), |
| ME(DDSD_CKSRCBLT, DDRAW_dump_DDCOLORKEY, ddckCKSrcBlt), |
| ME(DDSD_PIXELFORMAT, DDRAW_dump_pixelformat, u4.ddpfPixelFormat) |
| }; |
| |
| DDRAW_dump_members(lpddsd->dwFlags, lpddsd, members, |
| sizeof(members)/sizeof(members[0])); |
| } |
| |
| void DDRAW_dump_cooperativelevel(DWORD cooplevel) |
| { |
| static const flag_info flags[] = |
| { |
| 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) |
| }; |
| |
| if (TRACE_ON(ddraw)) |
| { |
| DPRINTF(" - "); |
| DDRAW_dump_flags(cooplevel, flags, sizeof(flags)/sizeof(flags[0])); |
| } |
| } |