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