[D3D] Fix palette deletion problem.

Lionel Ulmer lionel.ulmer at free.fr
Fri Jan 30 11:58:19 CST 2004


Flushing the in-flight patches :-)

Changelog:
 - fix palette deletion issue seen in DungeonKeeper

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/ddraw/main.c	2003-12-21 22:35:51.000000000 +0100
+++ dlls/ddraw/ddraw/main.c	2004-01-29 16:08:46.000000000 +0100
@@ -1307,6 +1307,8 @@
 void Main_DirectDraw_RemovePalette(IDirectDrawImpl* This,
 				   IDirectDrawPaletteImpl* palette)
 {
+    IDirectDrawSurfaceImpl *surf;
+
     assert(palette->ddraw_owner == This);
 
     if (This->palettes == palette)
@@ -1316,6 +1318,17 @@
 	palette->next_ddraw->prev_ddraw = palette->prev_ddraw;
     if (palette->prev_ddraw)
 	palette->prev_ddraw->next_ddraw = palette->next_ddraw;
+
+    /* Here we need also to remove tha palette from any surface which has it as the
+     * current palette (checked on Windows)
+     */
+    for (surf = This->surfaces; surf != NULL; surf = surf->next_ddraw) {
+	if (surf->palette == palette) {
+	    TRACE("Palette %p attached to surface %p.\n", palette, surf);
+	    surf->palette = NULL;
+	    surf->set_palette(surf, NULL);
+	}
+    }
 }
 
 static void Main_DirectDraw_DeletePalettes(IDirectDrawImpl* This)
--- dlls/ddraw_CVS/dsurface/main.c	2003-12-21 22:35:51.000000000 +0100
+++ dlls/ddraw/dsurface/main.c	2004-01-29 16:12:32.000000000 +0100
@@ -1211,6 +1211,7 @@
 				  LPDIRECTDRAWPALETTE pPalette)
 {
     ICOM_THIS(IDirectDrawSurfaceImpl, iface);
+    IDirectDrawPalette *pal_to_rel = NULL;
 
     TRACE("(%p)->(%p)\n",This,pPalette);
     if (pPalette == ICOM_INTERFACE(This->palette, IDirectDrawPalette))
@@ -1219,8 +1220,7 @@
     if (This->palette != NULL) {
 	if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
 	    This->palette->global.dwFlags &= ~DDPCAPS_PRIMARYSURFACE;
-	IDirectDrawPalette_Release(ICOM_INTERFACE(This->palette,
-						  IDirectDrawPalette));
+	pal_to_rel = ICOM_INTERFACE(This->palette, IDirectDrawPalette);
     }
 
     This->palette = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette,
@@ -1233,6 +1233,12 @@
 
     This->set_palette(This, This->palette);
 
+    /* Do the palette release at the end to prevent doing some 'loop' when removing
+     * the surface maintaining the last reference on a palette.
+     */
+    if (pal_to_rel != NULL)
+	IDirectDrawPalette_Release(pal_to_rel);
+
     return DD_OK;
 }
 


More information about the wine-patches mailing list