Module: wine Branch: master Commit: 590582e6bc1d7f901be9d559a0e9f501c08ece4e URL: http://source.winehq.org/git/wine.git/?a=commit;h=590582e6bc1d7f901be9d559a0...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu Apr 24 14:36:09 2014 +0200
ddraw: Only ddraw7 disallows SetPalette on sublevels.
---
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); }
/**********************************************************