From bf93490beba1129d2772c2396f293bfe7ea06ec9 Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Sun, 11 Mar 2007 14:04:51 -0600 Subject: wined3d: Allow SetCursorProperties on existing cursor --- dlls/wined3d/device.c | 35 +++++++++++++++++++++++++++++++++-- 1 files changed, 33 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0998eec..46efb1a 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5239,10 +5239,41 @@ static HRESULT WINAPI IWineD3DDeviceIm * it after setting the cursor image. Windows doesn't addref the set surface, so we can't * do this either without creating circular refcount dependencies. Copy out the gl texture instead. */ - This->cursorTexture = pSur->glDescription.textureName; This->cursorWidth = pSur->currentDesc.Width; This->cursorHeight = pSur->currentDesc.Height; - pSur->glDescription.textureName = 0; /* Prevent the texture from being changed or deleted */ + if (pSur->glDescription.textureName && pSur->glDescription.level == 0 + && pSur->glDescription.target == GL_TEXTURE_2D) { + BOOL texEnabled = glIsEnabled(GL_TEXTURE_2D); + GLint format = pSur->glDescription.glFormat; + GLint type = pSur->glDescription.glType; + INT width = This->cursorWidth; + INT height = This->cursorHeight; + void *mem; + + mem = HeapAlloc(GetProcessHeap(), 0, width * height * 4); + ENTER_GL(); + glEnable(GL_TEXTURE_2D); + /* Copy the surface texture into memory */ + glGetTexImage(GL_TEXTURE_2D, 0, format, type, mem); + checkGLcall("glGetTexImage"); + /* Create a new cursor texture */ + glGenTextures(1, &This->cursorTexture); + checkGLcall("glGenTextures"); + glBindTexture(GL_TEXTURE_2D, This->cursorTexture); + checkGLcall("glBindTexture"); + /* Copy the memory (surface texture copy) into the cursor texture */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, type, mem); + checkGLcall("glTexImage2D"); + if(!texEnabled) + glDisable(GL_TEXTURE_2D); + LEAVE_GL(); + HeapFree(GetProcessHeap(), 0, mem); + } + else + { + FIXME("A cursor texture was not returned.\n"); + This->cursorTexture = 0; + } } This->xHotSpot = XHotSpot; -- 1.4.1