wined3d: Simplify IWineD3DBaseTextureImpl_ApplyStateChanges.
diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c
index 996a622..8df0b3e 100644
--- a/dlls/wined3d/basetexture.c
+++ b/dlls/wined3d/basetexture.c
@@ -26,34 +26,6 @@
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
 #define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
 
-static const Wined3dTextureStateMap textureObjectSamplerStates[]  = {
-    {WINED3DSAMP_ADDRESSU,      WINED3DSAMP_ADDRESSU},
-    {WINED3DSAMP_ADDRESSV,      WINED3DSAMP_ADDRESSV},
-    {WINED3DSAMP_ADDRESSW,      WINED3DSAMP_ADDRESSW},
-    {WINED3DSAMP_BORDERCOLOR,   WINED3DSAMP_BORDERCOLOR},
-    {WINED3DSAMP_MAGFILTER,     WINED3DSAMP_MAGFILTER},
-    {WINED3DSAMP_MINFILTER,     WINED3DSAMP_MINFILTER},
-    {WINED3DSAMP_MIPFILTER,     WINED3DSAMP_MIPFILTER},
-/* applies to the texture unit
-    WINED3DSAMP_MIPMAPLODBIAS, WINED3DSAMP_MIPMAPLODBIAS,
-*/
-    {WINED3DSAMP_MAXMIPLEVEL,   WINED3DSAMP_MAXMIPLEVEL},
-#if 0
-    {WINED3DSAMP_MAXANISOTROPY, GL_SUPPORTED(EXT_TEXTURE_FILTER_ANISOTROPIC) ? WINED3DSAMP_MAXANISOTROPY : WINED3DFUNC_NOTSUPPORTED},
-#else
-    {WINED3DSAMP_MAXANISOTROPY, WINED3DSAMP_MAXANISOTROPY},
-#endif
-    {WINED3DSAMP_SRGBTEXTURE,   WINED3DFUNC_UNIMPLEMENTED},
-    {WINED3DSAMP_ELEMENTINDEX,  WINED3DFUNC_UNIMPLEMENTED},
-    {WINED3DSAMP_DMAPOFFSET,    WINED3DFUNC_UNIMPLEMENTED},
-    {-1, 0}
-};
-
-static const Wined3dTextureStateMap textureObjectTextureStates[] = {
-    {WINED3DTSS_ADDRESSW , WINED3DTSS_ADDRESSW},
-    {-1, 0}
-};
-
 /* *******************************************
    IWineD3DBaseTexture IUnknown parts follow
    ******************************************* */
@@ -337,133 +309,124 @@
     }
 }
 
+static inline void apply_wrap(const GLint textureDimensions, const DWORD state, const GLint type) {
+    GLint wrapParm;
+
+    if (state < minLookup[WINELOOKUP_WARPPARAM] || state > maxLookup[WINELOOKUP_WARPPARAM]) {
+        FIXME("Unrecognized or unsupported WINED3DTADDRESS_U value %d\n", state);
+    } else {
+        if(textureDimensions==GL_TEXTURE_CUBE_MAP_ARB) {
+            /* Cubemaps are always set to clamp, regardeless of the sampler state. */
+            wrapParm = GL_CLAMP_TO_EDGE;
+        } else {
+            wrapParm = stateLookup[WINELOOKUP_WARPPARAM][state - minLookup[WINELOOKUP_WARPPARAM]];
+        }
+        TRACE("Setting WRAP_S to %d for %x\n", wrapParm, textureDimensions);
+        glTexParameteri(textureDimensions, type, wrapParm);
+        checkGLcall("glTexParameteri(..., type, wrapParm)");
+    }
+}
+
 void WINAPI IWineD3DBaseTextureImpl_ApplyStateChanges(IWineD3DBaseTexture *iface,
                                     const DWORD textureStates[WINED3D_HIGHEST_TEXTURE_STATE + 1],
                                     const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) {
     IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
-    int i;
-    DWORD *state = This->baseTexture.states;
+    DWORD state;
     GLint textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface);
+
     IWineD3DBaseTexture_PreLoad(iface);
-    /* run through a couple of loops and apply and states that are different */
-    /* this will reduce the number of texture state changes to an absolute minimum
-    for multi-parameter states we  pickup the first one that changes, work out the correct values for the other states
-    and set all the states that we've just applied to their new values */
 
-    for (i = 0 ;textureObjectSamplerStates[i].state != -1; i++) {
-        if (*state != samplerStates[textureObjectSamplerStates[i].state]) {
-            /* apply the state */
-            TRACE("(%p) : Changing state %u from %d to %d\n", This, i, *state , samplerStates[textureObjectSamplerStates[i].state]);
-            switch (textureObjectSamplerStates[i].function) {
-            case WINED3DSAMP_ADDRESSU:
-            case WINED3DSAMP_ADDRESSV: /* fall through */
-            case WINED3DSAMP_ADDRESSW: /* fall through */
-                *state = samplerStates[textureObjectSamplerStates[i].state];
-                if (*state < minLookup[WINELOOKUP_WARPPARAM] || *state > maxLookup[WINELOOKUP_WARPPARAM]) {
-                    FIXME("Unrecognized or unsupported WINED3DTADDRESS_* value %d, state %d\n", *state, textureObjectSamplerStates[i].function);
-                } else {
-                    GLint wrapParm;
-                    if(textureDimensions==GL_TEXTURE_CUBE_MAP_ARB) {
-                        /* Cubemaps are always set to clamp, regardeless of the sampler state. */
-                        wrapParm = GL_CLAMP_TO_EDGE;
-                    } else {
-                        wrapParm = stateLookup[WINELOOKUP_WARPPARAM][*state - minLookup[WINELOOKUP_WARPPARAM]];
-                    }
-                    TRACE("Setting WRAP_R to %d for %x\n", wrapParm, textureDimensions);
-                    glTexParameteri(textureDimensions, warpLookupType(textureObjectSamplerStates[i].function), wrapParm);
-                    checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_R, wrapParm)");
-                }
-            break;
-            case WINED3DSAMP_BORDERCOLOR:
-            {
-                float col[4];
-                *state = samplerStates[textureObjectSamplerStates[i].state];
-                D3DCOLORTOGLFLOAT4(*state, col);
-                TRACE("Setting border color for %u to %x\n", textureDimensions, *state);
-                glTexParameterfv(textureDimensions, GL_TEXTURE_BORDER_COLOR, &col[0]);
-                checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)");
-            }
-            break;
-            case WINED3DSAMP_MAGFILTER:
-                {
-                    GLint glValue;
-                    *state = samplerStates[textureObjectSamplerStates[i].state];
-                    if (*state < minLookup[WINELOOKUP_MAGFILTER] || *state > maxLookup[WINELOOKUP_MAGFILTER]) {
-                        FIXME("Unrecognized or unsupported MAGFILTER* value %d, state %d\n", *state, textureObjectSamplerStates[i].function);
-                    }
-                    glValue = stateLookup[WINELOOKUP_MAGFILTER][*state - minLookup[WINELOOKUP_MAGFILTER]];
-                    TRACE("ValueMAG=%d setting MAGFILTER to %x\n", *state, glValue);
-                    glTexParameteri(textureDimensions, GL_TEXTURE_MAG_FILTER, glValue);
-                /* We need to reset the Aniotropic filtering state when we change the mag filter to WINED3DTEXF_ANISOTROPIC (this seems a bit weird, check the documentataion to see how it should be switched off. */
-                    if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && WINED3DTEXF_ANISOTROPIC == *state) {
-                        glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, samplerStates[WINED3DSAMP_MAXANISOTROPY]);
-                    }
-                }
-            break;
+    if(samplerStates[WINED3DSAMP_ADDRESSU]      != This->baseTexture.states[WINED3DTEXSTA_ADDRESSU]) {
+        state = samplerStates[WINED3DSAMP_ADDRESSU];
+        apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_S);
+        This->baseTexture.states[WINED3DTEXSTA_ADDRESSU] = state;
+    }
 
-            case WINED3DSAMP_MINFILTER:
-            case WINED3DSAMP_MAXMIPLEVEL:
-            case WINED3DSAMP_MIPFILTER: /* fall through */
-                {
-                    GLint glValue;
+    if(samplerStates[WINED3DSAMP_ADDRESSV]      != This->baseTexture.states[WINED3DTEXSTA_ADDRESSV]) {
+        state = samplerStates[WINED3DSAMP_ADDRESSV];
+        apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_T);
+        This->baseTexture.states[WINED3DTEXSTA_ADDRESSV] = state;
+    }
 
-                    This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] = samplerStates[WINED3DSAMP_MIPFILTER];
-                    This->baseTexture.states[WINED3DTEXSTA_MINFILTER] = samplerStates[WINED3DSAMP_MINFILTER];
-                    This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] = samplerStates[WINED3DSAMP_MAXMIPLEVEL];
+    if(samplerStates[WINED3DSAMP_ADDRESSW]      != This->baseTexture.states[WINED3DTEXSTA_ADDRESSW]) {
+        state = samplerStates[WINED3DSAMP_ADDRESSW];
+        apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_R);
+        This->baseTexture.states[WINED3DTEXSTA_ADDRESSW] = state;
+    }
 
-                    *state = samplerStates[textureObjectSamplerStates[i].state];
-                    if (This->baseTexture.states[WINED3DTEXSTA_MINFILTER] < WINED3DTEXF_NONE ||
-                        This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] < WINED3DTEXF_NONE ||
-                        This->baseTexture.states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC ||
-                        This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_LINEAR)
-                    {
+    if(samplerStates[WINED3DSAMP_BORDERCOLOR]   != This->baseTexture.states[WINED3DTEXSTA_BORDERCOLOR]) {
+        float col[4];
 
-                        FIXME("Unrecognized or unsupported D3DSAMP_MINFILTER value %d, state %d D3DSAMP_MIPFILTER value %d, state %d\n",
-                                This->baseTexture.states[WINED3DTEXSTA_MINFILTER],
-                                textureObjectSamplerStates[WINED3DTEXSTA_MINFILTER].function,
-                                This->baseTexture.states[WINED3DTEXSTA_MIPFILTER],
-                                textureObjectSamplerStates[WINED3DTEXSTA_MIPFILTER].function);
-                    }
-                    glValue = minMipLookup[min(max(This->baseTexture.states[WINED3DTEXSTA_MINFILTER],WINED3DTEXF_NONE), WINED3DTEXF_ANISOTROPIC)]
-                                                [min(max(This->baseTexture.states[WINED3DTEXSTA_MIPFILTER],WINED3DTEXF_NONE), WINED3DTEXF_LINEAR)];
+        state = samplerStates[WINED3DSAMP_BORDERCOLOR];
+        D3DCOLORTOGLFLOAT4(state, col);
+        TRACE("Setting border color for %u to %x\n", textureDimensions, state);
+        glTexParameterfv(textureDimensions, GL_TEXTURE_BORDER_COLOR, &col[0]);
+        checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)");
+        This->baseTexture.states[WINED3DTEXSTA_BORDERCOLOR] = state;
+    }
 
-                    TRACE("ValueMIN=%d, ValueMIP=%d, setting MINFILTER to %x\n", 
-                            This->baseTexture.states[WINED3DTEXSTA_MINFILTER], 
-                            This->baseTexture.states[WINED3DTEXSTA_MIPFILTER], glValue);
-                    glTexParameteri(textureDimensions, GL_TEXTURE_MIN_FILTER, glValue);
-                    checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ...");
-
-                    if(This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) {
-                        glValue = 0;
-                    } else if(This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) {
-                        glValue = This->baseTexture.levels - 1;
-                    } else {
-                        glValue = This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL];
-                    }
-                    glTexParameteri(textureDimensions, GL_TEXTURE_BASE_LEVEL, glValue);
-                }
-            break;
-            break;
-            case WINED3DSAMP_MAXANISOTROPY:
-                *state = samplerStates[textureObjectSamplerStates[i].state];
-                if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) {
-                    glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT,  *state);
-                    checkGLcall("glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT ...");
-                } else {
-                    WARN("Unsupported in local OpenGL implementation: glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT\n");
-                }
-            break;
-            case WINED3DFUNC_UNIMPLEMENTED: /* unimplemented */
-                TRACE("(%p) : stub\n", This);
-                *state = samplerStates[textureObjectSamplerStates[i].state];
-            break;
-            case WINED3DFUNC_NOTSUPPORTED: /* nop */
-                TRACE("(%p) : %s function is not supported by this opengl implementation\n", This, "unknown" /* TODO: replace with debug_blah... */);
-                *state = samplerStates[textureObjectSamplerStates[i].state];
-            break;
-            }
+    if(samplerStates[WINED3DSAMP_MAGFILTER]     != This->baseTexture.states[WINED3DTEXSTA_MAGFILTER]) {
+        GLint glValue;
+        state = samplerStates[WINED3DSAMP_MAGFILTER];
+        if (state < minLookup[WINELOOKUP_MAGFILTER] || state > maxLookup[WINELOOKUP_MAGFILTER]) {
+            FIXME("Unrecognized or unsupported MAGFILTER* value %d\n", state);
         }
-        state++;
+        glValue = stateLookup[WINELOOKUP_MAGFILTER][state - minLookup[WINELOOKUP_MAGFILTER]];
+        TRACE("ValueMAG=%d setting MAGFILTER to %x\n", state, glValue);
+        glTexParameteri(textureDimensions, GL_TEXTURE_MAG_FILTER, glValue);
+        /* We need to reset the Aniotropic filtering state when we change the mag filter to WINED3DTEXF_ANISOTROPIC (this seems a bit weird, check the documentataion to see how it should be switched off. */
+        if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC) && WINED3DTEXF_ANISOTROPIC == state) {
+            glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, samplerStates[WINED3DSAMP_MAXANISOTROPY]);
+        }
+        This->baseTexture.states[WINED3DTEXSTA_MAGFILTER] = state;
+    }
+
+    if(samplerStates[WINED3DSAMP_MINFILTER]     != This->baseTexture.states[WINED3DTEXSTA_MINFILTER] ||
+       samplerStates[WINED3DSAMP_MIPFILTER]     != This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] ||
+       samplerStates[WINED3DSAMP_MAXMIPLEVEL]   != This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL]) {
+        GLint glValue;
+
+        This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] = samplerStates[WINED3DSAMP_MIPFILTER];
+        This->baseTexture.states[WINED3DTEXSTA_MINFILTER] = samplerStates[WINED3DSAMP_MINFILTER];
+        This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] = samplerStates[WINED3DSAMP_MAXMIPLEVEL];
+
+        if (This->baseTexture.states[WINED3DTEXSTA_MINFILTER] < WINED3DTEXF_NONE ||
+            This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] < WINED3DTEXF_NONE ||
+            This->baseTexture.states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC ||
+            This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_LINEAR)
+        {
+
+            FIXME("Unrecognized or unsupported D3DSAMP_MINFILTER value %d D3DSAMP_MIPFILTER value %d\n",
+                  This->baseTexture.states[WINED3DTEXSTA_MINFILTER],
+                  This->baseTexture.states[WINED3DTEXSTA_MIPFILTER]);
+        }
+        glValue = minMipLookup[min(max(samplerStates[WINED3DSAMP_MINFILTER],WINED3DTEXF_NONE), WINED3DTEXF_ANISOTROPIC)]
+                [min(max(samplerStates[WINED3DSAMP_MIPFILTER],WINED3DTEXF_NONE), WINED3DTEXF_LINEAR)];
+
+        TRACE("ValueMIN=%d, ValueMIP=%d, setting MINFILTER to %x\n",
+              samplerStates[WINED3DSAMP_MINFILTER],
+              samplerStates[WINED3DSAMP_MIPFILTER], glValue);
+        glTexParameteri(textureDimensions, GL_TEXTURE_MIN_FILTER, glValue);
+        checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ...");
+
+        if(This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) {
+            glValue = 0;
+        } else if(This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) {
+            glValue = This->baseTexture.levels - 1;
+        } else {
+            glValue = This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL];
+        }
+        glTexParameteri(textureDimensions, GL_TEXTURE_BASE_LEVEL, glValue);
+    }
+
+    if(samplerStates[WINED3DSAMP_MAXANISOTROPY] != This->baseTexture.states[WINED3DTEXSTA_MAXANISOTROPY]) {
+        if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) {
+            glTexParameteri(textureDimensions, GL_TEXTURE_MAX_ANISOTROPY_EXT, samplerStates[WINED3DSAMP_MAXANISOTROPY]);
+            checkGLcall("glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT ...");
+        } else {
+            WARN("Unsupported in local OpenGL implementation: glTexParameteri GL_TEXTURE_MAX_ANISOTROPY_EXT\n");
+        }
+        This->baseTexture.states[WINED3DTEXSTA_MAXANISOTROPY] = samplerStates[WINED3DSAMP_MAXANISOTROPY];
     }
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7a9170a..3110ce2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -910,11 +910,6 @@
     MAX_WINETEXTURESTATES        = 13,
 } winetexturestates;
 
-typedef struct Wined3dTextureStateMap {
-    CONST int state;
-    int function;
-} Wined3dTextureStateMap;
-
 /*****************************************************************************
  * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl)
  */