Changelog: - re-activate the color-keying code - fix yet again texture enumeration to please all games :-/ -- Lionel Ulmer - http://www.bbrox.org/
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c 2003-01-03 10:56:21.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c 2003-01-03 13:32:39.000000000 +0100 @@ -415,16 +415,6 @@ if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK; if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK; - TRACE("Enumerating GL_RGBA packed GL_UNSIGNED_SHORT_5_5_5_1 (16)\n"); - pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; - pformat->u1.dwRGBBitCount = 16; - pformat->u2.dwRBitMask = 0x0000F800; - pformat->u3.dwGBitMask = 0x000007C0; - pformat->u4.dwBBitMask = 0x0000003E; - pformat->u5.dwRGBAlphaBitMask = 0x00000001; - if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK; - if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK; - TRACE("Enumerating GL_RGBA packed GL_UNSIGNED_SHORT_4_4_4_4 (ARGB) (16)\n"); pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; pformat->u1.dwRGBBitCount = 16; @@ -435,6 +425,12 @@ if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK; if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK; +#if 0 + /* This is a compromise : some games choose the first 16 bit texture format with alpha they + find enumerated, others the last one. And both want to have the ARGB one. + + So basically, forget our OpenGL roots and do not even enumerate our RGBA ones. + */ TRACE("Enumerating GL_RGBA packed GL_UNSIGNED_SHORT_4_4_4_4 (16)\n"); pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; pformat->u1.dwRGBBitCount = 16; @@ -445,6 +441,17 @@ if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK; if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK; + TRACE("Enumerating GL_RGBA packed GL_UNSIGNED_SHORT_5_5_5_1 (16)\n"); + pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; + pformat->u1.dwRGBBitCount = 16; + pformat->u2.dwRBitMask = 0x0000F800; + pformat->u3.dwGBitMask = 0x000007C0; + pformat->u4.dwBBitMask = 0x0000003E; + pformat->u5.dwRGBAlphaBitMask = 0x00000001; + if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK; + if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK; +#endif + TRACE("Enumerating GL_RGB packed GL_UNSIGNED_BYTE_3_3_2 (8)\n"); pformat->dwFlags = DDPF_RGB; pformat->u1.dwRGBBitCount = 8; --- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dtexture.c 2003-01-02 10:45:48.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dtexture.c 2003-01-03 14:12:34.000000000 +0100 @@ -41,7 +41,8 @@ #ifdef TEXTURE_SNOOP #include <stdio.h> -static void snoop_texture(IDirectDrawSurfaceImpl *This) { +static void +snoop_texture(IDirectDrawSurfaceImpl *This) { IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private; char buf[128]; FILE *f; @@ -60,83 +61,6 @@ /******************************************************************************* * IDirectSurface callback methods */ -HRESULT gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) -{ - DDSURFACEDESC *tex_d; - GLuint current_texture; - IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) texture->tex_private; - - TRACE("(%p) : colorkey callback\n", texture); - - /* Get the texture description */ - tex_d = (DDSURFACEDESC *)&(texture->surface_desc); - - /* Now, save the current texture */ - ENTER_GL(); - glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); - if (glThis->tex_name == 0) ERR("Unbound GL texture !!!\n"); - glBindTexture(GL_TEXTURE_2D, glThis->tex_name); - - if (tex_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { - FIXME("Todo Paletted\n"); - } else if (tex_d->ddpfPixelFormat.dwFlags & DDPF_RGB) { - if (tex_d->ddpfPixelFormat.u1.dwRGBBitCount == 8) { - FIXME("Todo 3_3_2_0\n"); - } else if (tex_d->ddpfPixelFormat.u1.dwRGBBitCount == 16) { - if (tex_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000) { - /* Now transform the 5_6_5 into a 5_5_5_1 surface to support color keying */ - unsigned short *dest = (unsigned short *) HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - tex_d->u1.lPitch * tex_d->dwHeight); - unsigned short *src = (unsigned short *) tex_d->lpSurface; - int x, y; - - for (y = 0; y < tex_d->dwHeight; y++) { - for (x = 0; x < tex_d->dwWidth; x++) { - unsigned short cpixel = src[x + y * tex_d->dwWidth]; - - if ((dwFlags & DDCKEY_SRCBLT) && - (cpixel >= ckey->dwColorSpaceLowValue) && - (cpixel <= ckey->dwColorSpaceHighValue)) /* No alpha bit => this pixel is transparent */ - dest[x + y * tex_d->dwWidth] = (cpixel & ~0x003F) | ((cpixel & 0x001F) << 1) | 0x0000; - else /* Alpha bit is set => this pixel will be seen */ - dest[x + y * tex_d->dwWidth] = (cpixel & ~0x003F) | ((cpixel & 0x001F) << 1) | 0x0001; - } - } - - glTexSubImage2D(GL_TEXTURE_2D, - texture->mipmap_level, - 0, 0, - tex_d->dwWidth, tex_d->dwHeight, - GL_RGBA, - GL_UNSIGNED_SHORT_5_5_5_1, - dest); - - /* Frees the temporary surface */ - HeapFree(GetProcessHeap(),0,dest); - } else if (tex_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000001) { - FIXME("Todo 5_5_5_1\n"); - } else if (tex_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000000F) { - FIXME("Todo 4_4_4_4\n"); - } else { - ERR("Unhandled texture format (bad Aplha channel for a 16 bit texture)\n"); - } - } else if (tex_d->ddpfPixelFormat.u1.dwRGBBitCount == 24) { - FIXME("Todo 8_8_8_0\n"); - } else if (tex_d->ddpfPixelFormat.u1.dwRGBBitCount == 32) { - FIXME("Todo 8_8_8_8\n"); - } else { - ERR("Unhandled texture format (bad RGB count)\n"); - } - } else { - ERR("Unhandled texture format (neither RGB nor INDEX)\n"); - } - glBindTexture(GL_TEXTURE_2D, current_texture); - LEAVE_GL(); - - return DD_OK; -} - static HRESULT gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private; @@ -189,6 +113,9 @@ if ((src_d->dwFlags & DDSD_CKSRCBLT) && (i >= src_d->ddckCKSrcBlt.dwColorSpaceLowValue) && (i <= src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + /* We should maybe here put a more 'neutral' color than the standard bright purple + one often used by application to prevent the nice purple borders when bi-linear + filtering is on */ table[i][3] = 0x00; else table[i][3] = 0xFF; @@ -243,8 +170,14 @@ /* ********************** GL_UNSIGNED_BYTE_3_3_2 ********************** */ - format = GL_RGB; - pixel_format = GL_UNSIGNED_BYTE_3_3_2; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* This texture format will never be used.. So do not care about color keying + up until the point in time it will be needed :-) */ + error = TRUE; + } else { + format = GL_RGB; + pixel_format = GL_UNSIGNED_BYTE_3_3_2; + } } else { error = TRUE; } @@ -253,20 +186,81 @@ (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x07E0) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x001F) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000)) { - format = GL_RGB; - pixel_format = GL_UNSIGNED_SHORT_5_6_5; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* Converting the 565 format in 5551 packed to emulate color-keying. + + Note : in all these conversion, it would be best to average the averaging + pixels to get the color of the pixel that will be color-keyed to + prevent 'color bleeding'. This will be done later on if ever it is + too visible. + + Note2: when using color-keying + alpha, are the alpha bits part of the + color-space or not ? + */ + DWORD i; + WORD *src = (WORD *) src_d->lpSurface, *dst; + + surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD)); + dst = (WORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + WORD color = *src++; + *dst = ((color & 0xFFC0) | ((color & 0x1F) << 1)); + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= 0x0001; + dst++; + } + + format = GL_RGBA; + pixel_format = GL_UNSIGNED_SHORT_5_5_5_1; + } else { + format = GL_RGB; + pixel_format = GL_UNSIGNED_SHORT_5_6_5; + } } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask == 0xF800) && (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x07C0) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x003E) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0001)) { - format = GL_RGBA; - pixel_format = GL_UNSIGNED_SHORT_5_5_5_1; + format = GL_RGBA; + pixel_format = GL_UNSIGNED_SHORT_5_5_5_1; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* Change the alpha value of the color-keyed pixels to emulate color-keying. */ + DWORD i; + WORD *src = (WORD *) src_d->lpSurface, *dst; + + surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD)); + dst = (WORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + WORD color = *src++; + *dst = color & 0xFFFE; + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= color & 0x0001; + dst++; + } + } } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask == 0xF000) && (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x0F00) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x00F0) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x000F)) { format = GL_RGBA; pixel_format = GL_UNSIGNED_SHORT_4_4_4_4; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* Change the alpha value of the color-keyed pixels to emulate color-keying. */ + DWORD i; + WORD *src = (WORD *) src_d->lpSurface, *dst; + + surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD)); + dst = (WORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + WORD color = *src++; + *dst = color & 0xFFF0; + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= color & 0x000F; + dst++; + } + } } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask == 0x0F00) && (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x00F0) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x000F) && @@ -279,9 +273,13 @@ dst = surface; for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { - *dst++ = (((*src & 0xFFF0) >> 4) | - ((*src & 0x000F) << 12)); - src++; + WORD color = *src++; + *dst = (color & 0x0FFF) << 4; + if (((src_d->dwFlags & DDSD_CKSRCBLT) == 0) || + (color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= (color & 0xF000) >> 12; + dst++; } format = GL_RGBA; @@ -297,9 +295,13 @@ surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD)); dst = (WORD *) surface; for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { - *dst++ = (((*src & 0x8000) >> 15) | - ((*src & 0x7FFF) << 1)); - src++; + WORD color = *src++; + *dst = (color & 0x7FFF) << 1; + if (((src_d->dwFlags & DDSD_CKSRCBLT) == 0) || + (color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= (color & 0x8000) >> 15; + dst++; } format = GL_RGBA; @@ -312,8 +314,29 @@ (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x0000FF00) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x000000FF) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) { - format = GL_BGR; - pixel_format = GL_UNSIGNED_BYTE; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* This is a pain :-) */ + DWORD i; + BYTE *src = (BYTE *) src_d->lpSurface; + DWORD *dst; + + surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD)); + dst = (DWORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + DWORD color = *((DWORD *) src) & 0x00FFFFFF; + src += 3; + *dst = *src++ << 8; + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= 0xFF; + dst++; + } + format = GL_RGBA; + pixel_format = GL_UNSIGNED_INT_8_8_8_8; + } else { + format = GL_BGR; + pixel_format = GL_UNSIGNED_BYTE; + } } else { error = TRUE; } @@ -322,20 +345,43 @@ (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x00FF0000) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x0000FF00) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x000000FF)) { + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* Just use the alpha component to handle color-keying... */ + DWORD i; + DWORD *src = (DWORD *) src_d->lpSurface, *dst; + + surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD)); + dst = (DWORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + DWORD color = *src++; + *dst = color & 0xFFFFFF00; + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= color & 0x000000FF; + dst++; + } + } format = GL_RGBA; pixel_format = GL_UNSIGNED_INT_8_8_8_8; } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask == 0x00FF0000) && (src_d->ddpfPixelFormat.u3.dwGBitMask == 0x0000FF00) && (src_d->ddpfPixelFormat.u4.dwBBitMask == 0x000000FF) && (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) { - /* Just add an alpha component... */ - DWORD i; - DWORD *src = (DWORD *) src_d->lpSurface, *dst; + if (src_d->dwFlags & DDSD_CKSRCBLT) { + /* Just add an alpha component and handle color-keying... */ + DWORD i; + DWORD *src = (DWORD *) src_d->lpSurface, *dst; - surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD)); - dst = (DWORD *) surface; - for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { - *dst++ = (*src++ << 8) | 0xFF; + surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD)); + dst = (DWORD *) surface; + for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) { + DWORD color = *src++; + *dst = color << 8; + if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) || + (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue)) + *dst |= 0xFF; + dst++; + } } format = GL_RGBA; pixel_format = GL_UNSIGNED_INT_8_8_8_8; @@ -389,6 +435,20 @@ return DD_OK; } +static HRESULT +gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *This, DWORD dwFlags, LPDDCOLORKEY ckey ) +{ + IDirect3DTextureGLImpl *glThis = (IDirect3DTextureGLImpl *) This->tex_private; + + /* Basically, the only thing we have to do is to re-upload the texture */ + if (glThis->first_unlock == FALSE) { + ENTER_GL(); + gltex_upload_texture(This, glThis->first_unlock); + LEAVE_GL(); + } + return DD_OK; +} + HRESULT WINAPI Main_IDirect3DTextureImpl_2_1T_PaletteChanged(LPDIRECT3DTEXTURE2 iface, DWORD dwStart, @@ -433,10 +493,12 @@ /* First call the previous set_palette function */ glThis->set_palette(This, pal); - /* Then re-upload the texture to OpenGL */ - ENTER_GL(); - gltex_upload_texture(This, glThis->first_unlock); - LEAVE_GL(); + /* Then re-upload the texture to OpenGL only if the surface was already 'unlocked' once */ + if (glThis->first_unlock == FALSE) { + ENTER_GL(); + gltex_upload_texture(This, glThis->first_unlock); + LEAVE_GL(); + } } static void @@ -591,7 +653,7 @@ dst_d->ddckCKSrcBlt.dwColorSpaceHighValue = src_d->ddckCKSrcBlt.dwColorSpaceHighValue; } - /* Copy the main memry texture into the surface that corresponds to the OpenGL + /* Copy the main memory texture into the surface that corresponds to the OpenGL texture object. */ memcpy(dst_d->lpSurface, src_d->lpSurface, src_d->u1.lPitch * src_d->dwHeight); --- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c 2003-01-02 18:01:43.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c 2003-01-03 12:53:24.000000000 +0100 @@ -401,6 +401,7 @@ case D3DRENDERSTATE_COLORKEYENABLE: /* 41 */ + /* This needs to be fixed. */ if (dwRenderState) glEnable(GL_BLEND); else --- /home/ulmer/Wine/wine_base//dlls/ddraw/dsurface/main.c 2002-12-27 17:40:23.000000000 +0100 +++ /home/ulmer/Wine/wine_work//dlls/ddraw/dsurface/main.c 2003-01-03 13:22:16.000000000 +0100 @@ -735,6 +735,11 @@ ICOM_THIS(IDirectDrawSurfaceImpl, iface); TRACE("(%p)->(%08lx,%p)\n",This,dwFlags,pCKey); + if (TRACE_ON(ddraw)) { + TRACE(" - colorkey flags : "); + DDRAW_dump_colorkeyflag(dwFlags); + } + switch (dwFlags) { case DDCKEY_DESTBLT: @@ -1095,37 +1100,73 @@ DWORD dwFlags, LPDDCOLORKEY pCKey) { ICOM_THIS(IDirectDrawSurfaceImpl, iface); - + TRACE("(%p)->(%08lx,%p)\n",This,dwFlags,pCKey); - if (pCKey == NULL) - { - FIXME("supposedly removing color key %lu\n", - dwFlags & ~DDCKEY_COLORSPACE); - return DD_OK; - } - switch (dwFlags & ~DDCKEY_COLORSPACE) - { - case DDCKEY_DESTBLT: - This->surface_desc.ddckCKDestBlt = *pCKey; - break; - - case DDCKEY_DESTOVERLAY: - This->surface_desc.u3.ddckCKDestOverlay = *pCKey; - break; + if (TRACE_ON(ddraw)) { + TRACE(" - colorkey flags : "); + DDRAW_dump_colorkeyflag(dwFlags); + } - case DDCKEY_SRCOVERLAY: - This->surface_desc.ddckCKSrcOverlay = *pCKey; - break; + if ((dwFlags & DDCKEY_COLORSPACE) != 0) { + FIXME(" colorkey value not supported (%08lx) !\n", dwFlags); + return DDERR_INVALIDPARAMS; + } + + /* TODO: investigate if this function can take multiple bits set at the same + time (ie setting multiple colorkey values at the same time with only + one API call). + */ + if (pCKey) { + switch (dwFlags & ~DDCKEY_COLORSPACE) { + case DDCKEY_DESTBLT: + This->surface_desc.ddckCKDestBlt = *pCKey; + This->surface_desc.dwFlags |= DDSD_CKDESTBLT; + break; + + case DDCKEY_DESTOVERLAY: + This->surface_desc.u3.ddckCKDestOverlay = *pCKey; + This->surface_desc.dwFlags |= DDSD_CKDESTOVERLAY; + break; + + case DDCKEY_SRCOVERLAY: + This->surface_desc.ddckCKSrcOverlay = *pCKey; + This->surface_desc.dwFlags |= DDSD_CKSRCOVERLAY; + break; + + case DDCKEY_SRCBLT: + This->surface_desc.ddckCKSrcBlt = *pCKey; + This->surface_desc.dwFlags |= DDSD_CKSRCBLT; + break; - case DDCKEY_SRCBLT: - This->surface_desc.ddckCKSrcBlt = *pCKey; - break; + default: + return DDERR_INVALIDPARAMS; + } + } else { + switch (dwFlags & ~DDCKEY_COLORSPACE) { + case DDCKEY_DESTBLT: + This->surface_desc.dwFlags &= ~DDSD_CKDESTBLT; + break; + + case DDCKEY_DESTOVERLAY: + This->surface_desc.dwFlags &= ~DDSD_CKDESTOVERLAY; + break; + + case DDCKEY_SRCOVERLAY: + This->surface_desc.dwFlags &= ~DDSD_CKSRCOVERLAY; + break; + + case DDCKEY_SRCBLT: + This->surface_desc.dwFlags &= ~DDSD_CKSRCBLT; + break; - default: - return DDERR_INVALIDPARAMS; + default: + return DDERR_INVALIDPARAMS; + } } + if (This->aux_setcolorkey_cb) This->aux_setcolorkey_cb(This, dwFlags, pCKey); + return DD_OK; }