From 2cc421f59d0e25a69dd876fd0438af2b2aba4a03 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 18 Sep 2013 10:57:11 +0200 Subject: [PATCH] ddraw: Verify that surfaces with an indexed format have a palette attached in d3d_device_set_render_target(). --- dlls/ddraw/device.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 9f537c1c941..3f3cb18aa45 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -1796,6 +1796,15 @@ static HRESULT WINAPI d3d_device2_GetCurrentViewport(IDirect3DDevice2 *iface, ID (IDirect3DViewport3 **)viewport); } +static BOOL validate_surface_palette(struct ddraw_surface *surface) +{ + return !(surface->surface_desc.u4.ddpfPixelFormat.dwFlags + & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 + | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 + | DDPF_PALETTEINDEXEDTO8)) + || wined3d_surface_get_palette(surface->wined3d_surface); +} + static HRESULT d3d_device_set_render_target(struct d3d_device *device, struct ddraw_surface *target, IUnknown *rt_iface) { @@ -1803,6 +1812,13 @@ static HRESULT d3d_device_set_render_target(struct d3d_device *device, wined3d_mutex_lock(); + if (!validate_surface_palette(target)) + { + WARN("Surface %p has an indexed pixel format, but no palette.\n", target); + wined3d_mutex_unlock(); + return DDERR_INVALIDCAPS; + } + if (device->rt_iface == rt_iface) { TRACE("No-op SetRenderTarget operation, not doing anything\n"); @@ -6752,11 +6768,7 @@ HRESULT d3d_device_create(struct ddraw *ddraw, struct ddraw_surface *target, IUn return DDERR_INVALIDCAPS; } - if ((target->surface_desc.u4.ddpfPixelFormat.dwFlags - & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 - | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 - | DDPF_PALETTEINDEXEDTO8)) - && !wined3d_surface_get_palette(target->wined3d_surface)) + if (!validate_surface_palette(target)) { WARN("Surface %p has an indexed pixel format, but no palette.\n", target); return DDERR_NOPALETTEATTACHED;