[PATCH 2/5] ddraw: Keep a reference to the palette in the surface.

Henri Verbeet hverbeet at codeweavers.com
Thu Dec 12 03:23:30 CST 2013


---
 dlls/ddraw/ddraw_private.h     |    1 +
 dlls/ddraw/palette.c           |    4 +-
 dlls/ddraw/surface.c           |  105 ++++++++++++----------------------------
 dlls/wined3d/palette.c         |   18 ++-----
 dlls/wined3d/wined3d.spec      |    3 +-
 dlls/wined3d/wined3d_private.h |    1 -
 include/wine/wined3d.h         |    3 +-
 7 files changed, 40 insertions(+), 95 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 74e11db..ce08db7 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -178,6 +178,7 @@ struct ddraw_surface
 
     /* Clipper objects */
     struct ddraw_clipper *clipper;
+    struct ddraw_palette *palette;
 
     /* For the ddraw surface list */
     struct list             surface_list_entry;
diff --git a/dlls/ddraw/palette.c b/dlls/ddraw/palette.c
index 7d879ad..5e53af5 100644
--- a/dlls/ddraw/palette.c
+++ b/dlls/ddraw/palette.c
@@ -258,9 +258,7 @@ HRESULT ddraw_palette_init(struct ddraw_palette *palette,
     palette->IDirectDrawPalette_iface.lpVtbl = &ddraw_palette_vtbl;
     palette->ref = 1;
 
-    hr = wined3d_palette_create(ddraw->wined3d_device, flags,
-            entries, palette, &palette->wineD3DPalette);
-    if (FAILED(hr))
+    if (FAILED(hr = wined3d_palette_create(ddraw->wined3d_device, flags, entries, &palette->wineD3DPalette)))
     {
         WARN("Failed to create wined3d palette, hr %#x.\n", hr);
         return hr;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 78746ac..6ed335e 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -4463,46 +4463,28 @@ static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface,
             surface_desc ? &surface_desc2 : NULL, flags);
 }
 
-/*****************************************************************************
- * IDirectDrawSurface7::GetPalette
- *
- * Returns the IDirectDrawPalette interface of the palette currently assigned
- * to the surface
- *
- * Params:
- *  Pal: Address to write the interface pointer to
- *
- * Returns:
- *  DD_OK on success
- *  DDERR_INVALIDPARAMS if Pal is NULL
- *
- *****************************************************************************/
-static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **Pal)
+static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **palette)
 {
     struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
-    struct wined3d_palette *wined3d_palette;
     struct ddraw_palette *palette_impl;
     HRESULT hr = DD_OK;
 
-    TRACE("iface %p, palette %p.\n", iface, Pal);
+    TRACE("iface %p, palette %p.\n", iface, palette);
 
-    if(!Pal)
+    if (!palette)
         return DDERR_INVALIDPARAMS;
 
     wined3d_mutex_lock();
-    wined3d_palette = wined3d_surface_get_palette(surface->wined3d_surface);
-    if (wined3d_palette)
+    if ((palette_impl = surface->palette))
     {
-        palette_impl = wined3d_palette_get_parent(wined3d_palette);
-        *Pal = &palette_impl->IDirectDrawPalette_iface;
-        IDirectDrawPalette_AddRef(*Pal);
+        *palette = &palette_impl->IDirectDrawPalette_iface;
+        IDirectDrawPalette_AddRef(*palette);
     }
     else
     {
-        *Pal = NULL;
+        *palette = NULL;
         hr = DDERR_NOPALETTEATTACHED;
     }
-
     wined3d_mutex_unlock();
 
     return hr;
@@ -4708,86 +4690,61 @@ static HRESULT WINAPI ddraw_surface1_SetColorKey(IDirectDrawSurface *iface, DWOR
     return ddraw_surface7_SetColorKey(&surface->IDirectDrawSurface7_iface, flags, color_key);
 }
 
-/*****************************************************************************
- * IDirectDrawSurface7::SetPalette
- *
- * Assigns a DirectDrawPalette object to the surface
- *
- * Params:
- *  Pal: Interface to the palette to set
- *
- * Returns:
- *  DD_OK on success
- *
- *****************************************************************************/
-static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *Pal)
+static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *palette)
 {
-    struct ddraw_surface *This = impl_from_IDirectDrawSurface7(iface);
-    struct ddraw_palette *palette_impl = unsafe_impl_from_IDirectDrawPalette(Pal);
-    IDirectDrawPalette *oldPal;
-    struct ddraw_surface *surf;
+    struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
+    struct ddraw_palette *palette_impl = unsafe_impl_from_IDirectDrawPalette(palette);
+    struct ddraw_palette *prev;
     HRESULT hr;
 
-    TRACE("iface %p, palette %p.\n", iface, Pal);
+    TRACE("iface %p, palette %p.\n", iface, palette);
 
-    if (!(This->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 |
-            DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8))) {
+    if (!(surface->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2
+            | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8)))
         return DDERR_INVALIDPIXELFORMAT;
-    }
 
-    if (This->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_MIPMAPSUBLEVEL)
-    {
+    if (surface->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_MIPMAPSUBLEVEL)
         return DDERR_NOTONMIPMAPSUBLEVEL;
-    }
 
-    /* Find the old palette */
     wined3d_mutex_lock();
-    hr = IDirectDrawSurface_GetPalette(iface, &oldPal);
-    if(hr != DD_OK && hr != DDERR_NOPALETTEATTACHED)
-    {
-        wined3d_mutex_unlock();
-        return hr;
-    }
-    if(oldPal) IDirectDrawPalette_Release(oldPal);  /* For the GetPalette */
 
-    /* Set the new Palette */
-    wined3d_surface_set_palette(This->wined3d_surface, palette_impl ? palette_impl->wineD3DPalette : NULL);
-    /* AddRef the Palette */
-    if(Pal) IDirectDrawPalette_AddRef(Pal);
-
-    /* Release the old palette */
-    if(oldPal) IDirectDrawPalette_Release(oldPal);
+    prev = surface->palette;
+    if (palette_impl)
+        IDirectDrawPalette_AddRef(&palette_impl->IDirectDrawPalette_iface);
+    if (prev)
+        IDirectDrawPalette_Release(&prev->IDirectDrawPalette_iface);
+    surface->palette = palette_impl;
+    wined3d_surface_set_palette(surface->wined3d_surface, palette_impl ? palette_impl->wineD3DPalette : NULL);
 
     /* Update the wined3d frontbuffer if this is the primary. */
-    if ((This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && This->ddraw->wined3d_frontbuffer)
-        wined3d_surface_set_palette(This->ddraw->wined3d_frontbuffer,
+    if ((surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && surface->ddraw->wined3d_frontbuffer)
+        wined3d_surface_set_palette(surface->ddraw->wined3d_frontbuffer,
                 palette_impl ? palette_impl->wineD3DPalette : NULL);
 
     /* If this is a front buffer, also update the back buffers
-     * TODO: How do things work for palettized cube textures?
-     */
-    if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER)
+     * TODO: How do things work for palettized cube textures? */
+    if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER)
     {
         /* For primary surfaces the tree is just a list, so the simpler scheme fits too */
         DDSCAPS2 caps2 = { DDSCAPS_FLIP, 0, 0, 0 };
+        struct ddraw_surface *current = surface;
 
-        surf = This;
         for (;;)
         {
             IDirectDrawSurface7 *attach;
 
-            if (FAILED(hr = ddraw_surface7_GetAttachedSurface(&surf->IDirectDrawSurface7_iface, &caps2, &attach)))
+            if (FAILED(hr = ddraw_surface7_GetAttachedSurface(&current->IDirectDrawSurface7_iface, &caps2, &attach)))
                 break;
 
-            surf = impl_from_IDirectDrawSurface7(attach);
-            if (surf == This)
+            current = impl_from_IDirectDrawSurface7(attach);
+            if (current == surface)
             {
                 ddraw_surface7_Release(attach);
                 break;
             }
 
             TRACE("Setting palette on %p.\n", attach);
-            ddraw_surface7_SetPalette(attach, Pal);
+            ddraw_surface7_SetPalette(attach, palette);
             ddraw_surface7_Release(attach);
         }
     }
diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index 417b3ac..20ff3f9 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -152,20 +152,12 @@ DWORD CDECL wined3d_palette_get_flags(const struct wined3d_palette *palette)
     return palette->flags;
 }
 
-void * CDECL wined3d_palette_get_parent(const struct wined3d_palette *palette)
-{
-    TRACE("palette %p.\n", palette);
-
-    return palette->parent;
-}
-
 static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wined3d_device *device,
-        DWORD flags, const PALETTEENTRY *entries, void *parent)
+        DWORD flags, const PALETTEENTRY *entries)
 {
     HRESULT hr;
 
     palette->ref = 1;
-    palette->parent = parent;
     palette->device = device;
     palette->flags = flags;
 
@@ -189,19 +181,19 @@ static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wine
 }
 
 HRESULT CDECL wined3d_palette_create(struct wined3d_device *device, DWORD flags,
-        const PALETTEENTRY *entries, void *parent, struct wined3d_palette **palette)
+        const PALETTEENTRY *entries, struct wined3d_palette **palette)
 {
     struct wined3d_palette *object;
     HRESULT hr;
 
-    TRACE("device %p, flags %#x, entries %p, palette %p, parent %p.\n",
-            device, flags, entries, palette, parent);
+    TRACE("device %p, flags %#x, entries %p, palette %p.\n",
+            device, flags, entries, palette);
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
     if (!object)
         return E_OUTOFMEMORY;
 
-    hr = wined3d_palette_init(object, device, flags, entries, parent);
+    hr = wined3d_palette_init(object, device, flags, entries);
     if (FAILED(hr))
     {
         WARN("Failed to initialize palette, hr %#x.\n", hr);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 245a51e..c3bf2d1 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -156,11 +156,10 @@
 @ cdecl wined3d_device_update_texture(ptr ptr ptr)
 @ cdecl wined3d_device_validate_device(ptr ptr)
 
-@ cdecl wined3d_palette_create(ptr long ptr ptr ptr)
+@ cdecl wined3d_palette_create(ptr long ptr ptr)
 @ cdecl wined3d_palette_decref(ptr)
 @ cdecl wined3d_palette_get_entries(ptr long long long ptr)
 @ cdecl wined3d_palette_get_flags(ptr)
-@ cdecl wined3d_palette_get_parent(ptr)
 @ cdecl wined3d_palette_incref(ptr)
 @ cdecl wined3d_palette_set_entries(ptr long long long ptr)
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ea0637b..d0a8624 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2944,7 +2944,6 @@ struct ps_np2fixup_info {
 struct wined3d_palette
 {
     LONG ref;
-    void *parent;
     struct wined3d_device *device;
 
     HPALETTE                   hpal;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 96e7f17..bd41e8a 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2235,12 +2235,11 @@ HRESULT __cdecl wined3d_device_update_texture(struct wined3d_device *device,
 HRESULT __cdecl wined3d_device_validate_device(const struct wined3d_device *device, DWORD *num_passes);
 
 HRESULT __cdecl wined3d_palette_create(struct wined3d_device *device, DWORD flags,
-        const PALETTEENTRY *entries, void *parent, struct wined3d_palette **palette);
+        const PALETTEENTRY *entries, struct wined3d_palette **palette);
 ULONG __cdecl wined3d_palette_decref(struct wined3d_palette *palette);
 HRESULT __cdecl wined3d_palette_get_entries(const struct wined3d_palette *palette,
         DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries);
 DWORD __cdecl wined3d_palette_get_flags(const struct wined3d_palette *palette);
-void * __cdecl wined3d_palette_get_parent(const struct wined3d_palette *palette);
 ULONG __cdecl wined3d_palette_incref(struct wined3d_palette *palette);
 HRESULT __cdecl wined3d_palette_set_entries(struct wined3d_palette *palette,
         DWORD flags, DWORD start, DWORD count, const PALETTEENTRY *entries);
-- 
1.7.10.4




More information about the wine-patches mailing list