Module: wine Branch: refs/heads/master Commit: 93db443319ae99e1f499a9b2982ddfae19828040 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=93db443319ae99e1f499a9b2...
Author: Stefan Dösinger stefan@codeweavers.com Date: Wed May 24 17:15:24 2006 +0200
wined3d: Color keying emulation.
---
dlls/wined3d/device.c | 92 +++++++++++++++++++++++++++++++------------------ 1 files changed, 58 insertions(+), 34 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 5ac899c..efa6836 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3212,46 +3212,55 @@ HRESULT WINAPI IWineD3DDeviceImpl_SetRen break;
case WINED3DRS_ALPHATESTENABLE : - if (Value) { - glEnable(GL_ALPHA_TEST); - checkGLcall("glEnable GL_ALPHA_TEST"); - } else { - glDisable(GL_ALPHA_TEST); - checkGLcall("glDisable GL_ALPHA_TEST"); - } - break; - case WINED3DRS_ALPHAFUNC : + case WINED3DRS_ALPHAREF : + case WINED3DRS_COLORKEYENABLE : { - int glParm = GL_LESS; - float ref = ((float) This->stateBlock->renderState[WINED3DRS_ALPHAREF]) / 255.0f; + int glParm = 0.0; + float ref = GL_LESS; + BOOL enable_ckey = FALSE;
- switch ((D3DCMPFUNC) Value) { - case D3DCMP_NEVER: glParm = GL_NEVER; break; - case D3DCMP_LESS: glParm = GL_LESS; break; - case D3DCMP_EQUAL: glParm = GL_EQUAL; break; - case D3DCMP_LESSEQUAL: glParm = GL_LEQUAL; break; - case D3DCMP_GREATER: glParm = GL_GREATER; break; - case D3DCMP_NOTEQUAL: glParm = GL_NOTEQUAL; break; - case D3DCMP_GREATEREQUAL: glParm = GL_GEQUAL; break; - case D3DCMP_ALWAYS: glParm = GL_ALWAYS; break; - default: - FIXME("Unrecognized/Unhandled D3DCMPFUNC value %ld\n", Value); + IWineD3DSurfaceImpl *surf; + + /* Find out if the texture on the first stage has a ckey set */ + if(This->stateBlock->textures[0]) { + surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)This->stateBlock->textures[0])->surfaces[0]; + if(surf->CKeyFlags & DDSD_CKSRCBLT) enable_ckey = TRUE; } - TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref); - glAlphaFunc(glParm, ref); - This->alphafunc = glParm; - checkGLcall("glAlphaFunc"); - } - break;
- case WINED3DRS_ALPHAREF : - { - int glParm = This->alphafunc; - float ref = 1.0f; + if (This->stateBlock->renderState[WINED3DRS_ALPHATESTENABLE] || + (This->stateBlock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey)) { + glEnable(GL_ALPHA_TEST); + checkGLcall("glEnable GL_ALPHA_TEST"); + } else { + glDisable(GL_ALPHA_TEST); + checkGLcall("glDisable GL_ALPHA_TEST"); + /* Alpha test is disabled, don't bother setting the params - it will happen on the next + * enable call + */ + break; + }
- ref = ((float) Value) / 255.0f; - TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref); + if(This->stateBlock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey) { + glParm = GL_NOTEQUAL; + ref = 0.0; + } else { + ref = ((float) This->stateBlock->renderState[WINED3DRS_ALPHAREF]) / 255.0f; + + switch ((D3DCMPFUNC) This->stateBlock->renderState[WINED3DRS_ALPHAFUNC]) { + case D3DCMP_NEVER: glParm = GL_NEVER; break; + case D3DCMP_LESS: glParm = GL_LESS; break; + case D3DCMP_EQUAL: glParm = GL_EQUAL; break; + case D3DCMP_LESSEQUAL: glParm = GL_LEQUAL; break; + case D3DCMP_GREATER: glParm = GL_GREATER; break; + case D3DCMP_NOTEQUAL: glParm = GL_NOTEQUAL; break; + case D3DCMP_GREATEREQUAL: glParm = GL_GEQUAL; break; + case D3DCMP_ALWAYS: glParm = GL_ALWAYS; break; + default: + FIXME("Unrecognized/Unhandled D3DCMPFUNC value %ld\n", Value); + } + } + This->alphafunc = glParm; glAlphaFunc(glParm, ref); checkGLcall("glAlphaFunc"); } @@ -5231,6 +5240,21 @@ #endif IWineD3DBaseTexture_Release(oldTexture); }
+ /* Reset color keying */ + if(Stage == 0 && This->stateBlock->renderState[WINED3DRS_COLORKEYENABLE]) { + BOOL enable_ckey = FALSE; + + if(pTexture) { + IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)pTexture)->surfaces[0]; + if(surf->CKeyFlags & DDSD_CKSRCBLT) enable_ckey = TRUE; + } + + if(enable_ckey) { + glAlphaFunc(GL_NOTEQUAL, 0.0); + checkGLcall("glAlphaFunc"); + } + } + return WINED3D_OK; }