Stefan Dösinger : wined3d: Enable color keying only for surfaces without an alpha channel.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 15 05:28:00 CST 2007


Module: wine
Branch: master
Commit: d4c4e5d167e84321f94050b774bb0792d826f1d2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d4c4e5d167e84321f94050b774bb0792d826f1d2

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Feb 15 03:05:54 2007 +0100

wined3d: Enable color keying only for surfaces without an alpha channel.

---

 dlls/wined3d/state.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 438f6f0..e437136 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] ||




More information about the wine-cvs mailing list