From d4c4e5d167e84321f94050b774bb0792d826f1d2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Thu, 15 Feb 2007 03:05:54 +0100 Subject: [PATCH] wined3d: Enable color keying only for surfaces without an alpha channel. --- dlls/wined3d/state.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 438f6f0abd..e437136a74 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -337,9 +337,19 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D * used WINED3DRS_COLORKEYENABLE state(which is d3d <= 3 only). The texture function will call alpha * in case it finds some texture+colorkeyenable combination which needs extra care. */ - if(stateblock->textures[0]) { + if(stateblock->textures[0] && stateblock->textureDimensions[0] == GL_TEXTURE_2D) { surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)stateblock->textures[0])->surfaces[0]; - if(surf->CKeyFlags & DDSD_CKSRCBLT) enable_ckey = TRUE; + + if(surf->CKeyFlags & DDSD_CKSRCBLT) { + const PixelFormatDesc *fmt = getFormatDescEntry(surf->resource.format); + /* The surface conversion does not do color keying conversion for surfaces that have an alpha + * channel on their own. Likewise, the alpha test shouldn't be set up for color keying if the + * surface has alpha bits + */ + if(fmt->alphaMask == 0x00000000) { + enable_ckey = TRUE; + } + } } if (stateblock->renderState[WINED3DRS_ALPHATESTENABLE] || -- 2.32.0.93.g670b81a890