wined3d: Allow SetCursorProperties on existing cursor

Erich Hoover ehoover at mines.edu
Sat Mar 10 20:08:49 CST 2007


Skipped content of type multipart/alternative-------------- next part --------------
From b27ae021b3c52d6fc1bf918098219160dedefa5f Mon Sep 17 00:00:00 2001
From: Erich Hoover <ehoover at mediaserver.(none)>
Date: Sat, 10 Mar 2007 19:02:16 -0700
Subject: wined3d: Allow SetCursorProperties on existing cursor
---
 dlls/wined3d/device.c  |    8 +-------
 dlls/wined3d/texture.c |   23 ++++++++++++++---------
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0998eec..0339e8d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5207,13 +5207,6 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
     TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot);
 
     /* some basic validation checks */
-    if(This->cursorTexture) {
-        ENTER_GL();
-        glDeleteTextures(1, &This->cursorTexture);
-        LEAVE_GL();
-        This->cursorTexture = 0;
-    }
-
     if(pCursorBitmap) {
         /* MSDN: Cursor must be A8R8G8B8 */
         if (WINED3DFMT_A8R8G8B8 != pSur->resource.format) {
@@ -5243,6 +5236,7 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
         This->cursorWidth = pSur->currentDesc.Width;
         This->cursorHeight = pSur->currentDesc.Height;
         pSur->glDescription.textureName = 0; /* Prevent the texture from being changed or deleted */
+        /* NOTE: It is also important to keep the texture between SetCursorProperties calls */
     }
 
     This->xHotSpot = XHotSpot;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index e9a78cc..4c5cdd5 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -95,6 +95,7 @@ static void WINAPI IWineD3DTextureImpl_P
 
     /* Override the IWineD3DResource PreLoad method */
     unsigned int i;
+    BOOL loadPerformed = FALSE;
     BOOL setGlTextureDesc = FALSE;
     IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
 
@@ -104,22 +105,26 @@ static void WINAPI IWineD3DTextureImpl_P
 
     IWineD3DTexture_BindTexture(iface);
     ENTER_GL();
-        /* If were dirty then reload the surfaces */
-    if(This->baseTexture.dirty) {
 
-        for (i = 0; i < This->baseTexture.levels; i++) {
-            if(setGlTextureDesc)
+    for (i = 0; i < This->baseTexture.levels; i++) {
+        IWineD3DSurfaceImpl *pSur = (IWineD3DSurfaceImpl *) This->surfaces[i];
+        
+        /* If a texture is dirty, or a surface is forcing a load, then reload the surface */
+        if (This->baseTexture.dirty || pSur->Flags & SFLAG_FORCELOAD)
+        {
+            if(setGlTextureDesc || pSur->Flags & SFLAG_FORCELOAD)
                 IWineD3DSurface_SetGlTextureDesc(This->surfaces[i], This->baseTexture.textureName, IWineD3DTexture_GetTextureDimensions(iface));
             IWineD3DSurface_LoadTexture(This->surfaces[i]);
+            loadPerformed = TRUE;
         }
-
-        /* No longer dirty */
-        This->baseTexture.dirty = FALSE;
-    } else {
-        TRACE("(%p) Texture not dirty, nothing to do\n" , iface);
     }
+
+    /* No longer dirty */
+    This->baseTexture.dirty = FALSE;
     LEAVE_GL();
 
+    if(!loadPerformed)
+        TRACE("(%p) Texture not dirty, nothing to do\n" , iface);
     return ;
 }
 
-- 
1.4.1


More information about the wine-devel mailing list