[PATCH 1/5] ddraw: Only ddraw7 disallows SetPalette on sublevels.
Stefan Dösinger
stefan at codeweavers.com
Thu Apr 24 05:10:11 CDT 2014
Note that SetPalette is allowed on cube texture surfaces that are
neither mipmap sublevels nor the root surface. See tests/dsurface.c
CubeTestPaletteEnum. I assume the same is true for SetColorKey, but
without an application that needs this I don't think we have to change
this.
---
dlls/ddraw/surface.c | 78 +++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 35 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 13458f6..b561af4 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -447,6 +447,43 @@ static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
return IUnknown_AddRef(surface->texture_outer);
}
+static HRESULT WINAPI ddraw_surface_set_palette(struct ddraw_surface *surface, IDirectDrawPalette *palette)
+{
+ struct ddraw_palette *palette_impl = unsafe_impl_from_IDirectDrawPalette(palette);
+ struct ddraw_palette *prev;
+
+ TRACE("iface %p, palette %p.\n", surface, palette);
+
+ if (!(surface->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2
+ | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8)))
+ return DDERR_INVALIDPIXELFORMAT;
+
+ wined3d_mutex_lock();
+
+ prev = surface->palette;
+ if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
+ {
+ if (prev)
+ prev->flags &= ~DDPCAPS_PRIMARYSURFACE;
+ if (palette_impl)
+ palette_impl->flags |= DDPCAPS_PRIMARYSURFACE;
+ /* Update the wined3d frontbuffer if this is the primary. */
+ if (surface->ddraw->wined3d_frontbuffer)
+ wined3d_surface_set_palette(surface->ddraw->wined3d_frontbuffer,
+ palette_impl ? palette_impl->wineD3DPalette : NULL);
+ }
+ 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);
+
+ wined3d_mutex_unlock();
+
+ return DD_OK;
+}
+
static void ddraw_surface_cleanup(struct ddraw_surface *surface)
{
struct ddraw_surface *surf;
@@ -456,7 +493,7 @@ static void ddraw_surface_cleanup(struct ddraw_surface *surface)
/* The refcount test shows that the palette is detached when the surface
* is destroyed. */
- IDirectDrawSurface7_SetPalette(&surface->IDirectDrawSurface7_iface, NULL);
+ ddraw_surface_set_palette(surface, NULL);
/* Loop through all complex attached surfaces and destroy them.
*
@@ -4640,42 +4677,13 @@ static HRESULT WINAPI ddraw_surface1_SetColorKey(IDirectDrawSurface *iface, DWOR
static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *palette)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
- struct ddraw_palette *palette_impl = unsafe_impl_from_IDirectDrawPalette(palette);
- struct ddraw_palette *prev;
TRACE("iface %p, palette %p.\n", iface, palette);
- if (!(surface->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2
- | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8)))
- return DDERR_INVALIDPIXELFORMAT;
-
if (surface->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_MIPMAPSUBLEVEL)
return DDERR_NOTONMIPMAPSUBLEVEL;
- wined3d_mutex_lock();
-
- prev = surface->palette;
- if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
- {
- if (prev)
- prev->flags &= ~DDPCAPS_PRIMARYSURFACE;
- if (palette_impl)
- palette_impl->flags |= DDPCAPS_PRIMARYSURFACE;
- /* Update the wined3d frontbuffer if this is the primary. */
- if (surface->ddraw->wined3d_frontbuffer)
- wined3d_surface_set_palette(surface->ddraw->wined3d_frontbuffer,
- palette_impl ? palette_impl->wineD3DPalette : NULL);
- }
- 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);
-
- wined3d_mutex_unlock();
-
- return DD_OK;
+ return ddraw_surface_set_palette(surface, palette);
}
static HRESULT WINAPI ddraw_surface4_SetPalette(IDirectDrawSurface4 *iface, IDirectDrawPalette *palette)
@@ -4684,7 +4692,7 @@ static HRESULT WINAPI ddraw_surface4_SetPalette(IDirectDrawSurface4 *iface, IDir
TRACE("iface %p, palette %p.\n", iface, palette);
- return ddraw_surface7_SetPalette(&surface->IDirectDrawSurface7_iface, palette);
+ return ddraw_surface_set_palette(surface, palette);
}
static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette *palette)
@@ -4693,7 +4701,7 @@ static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDir
TRACE("iface %p, palette %p.\n", iface, palette);
- return ddraw_surface7_SetPalette(&surface->IDirectDrawSurface7_iface, palette);
+ return ddraw_surface_set_palette(surface, palette);
}
static HRESULT WINAPI ddraw_surface2_SetPalette(IDirectDrawSurface2 *iface, IDirectDrawPalette *palette)
@@ -4702,7 +4710,7 @@ static HRESULT WINAPI ddraw_surface2_SetPalette(IDirectDrawSurface2 *iface, IDir
TRACE("iface %p, palette %p.\n", iface, palette);
- return ddraw_surface7_SetPalette(&surface->IDirectDrawSurface7_iface, palette);
+ return ddraw_surface_set_palette(surface, palette);
}
static HRESULT WINAPI ddraw_surface1_SetPalette(IDirectDrawSurface *iface, IDirectDrawPalette *palette)
@@ -4711,7 +4719,7 @@ static HRESULT WINAPI ddraw_surface1_SetPalette(IDirectDrawSurface *iface, IDire
TRACE("iface %p, palette %p.\n", iface, palette);
- return ddraw_surface7_SetPalette(&surface->IDirectDrawSurface7_iface, palette);
+ return ddraw_surface_set_palette(surface, palette);
}
/**********************************************************
--
1.8.3.2
More information about the wine-patches
mailing list