[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