[PATCH 4/5] wined3d: Explicitly pass the palette size to wined3d_palette_create().

Henri Verbeet hverbeet at codeweavers.com
Fri Dec 13 02:07:48 CST 2013


---
 dlls/ddraw/palette.c      |   27 ++++++++++++++++++++++++++-
 dlls/wined3d/palette.c    |   33 ++++++++-------------------------
 dlls/wined3d/wined3d.spec |    2 +-
 include/wine/wined3d.h    |    2 +-
 4 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/dlls/ddraw/palette.c b/dlls/ddraw/palette.c
index f35531e..214c912 100644
--- a/dlls/ddraw/palette.c
+++ b/dlls/ddraw/palette.c
@@ -236,16 +236,41 @@ struct ddraw_palette *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *if
     return CONTAINING_RECORD(iface, struct ddraw_palette, IDirectDrawPalette_iface);
 }
 
+static unsigned int palette_size(DWORD flags)
+{
+    switch (flags & (DDPCAPS_1BIT | DDPCAPS_2BIT | DDPCAPS_4BIT | DDPCAPS_8BIT))
+    {
+        case DDPCAPS_1BIT:
+            return 2;
+        case DDPCAPS_2BIT:
+            return 4;
+        case DDPCAPS_4BIT:
+            return 16;
+        case DDPCAPS_8BIT:
+            return 256;
+        default:
+            return ~0u;
+    }
+}
+
 HRESULT ddraw_palette_init(struct ddraw_palette *palette,
         struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries)
 {
+    unsigned int entry_count;
     HRESULT hr;
 
+    if ((entry_count = palette_size(flags)) == ~0u)
+    {
+        WARN("Invalid flags %#x.\n", flags);
+        return DDERR_INVALIDPARAMS;
+    }
+
     palette->IDirectDrawPalette_iface.lpVtbl = &ddraw_palette_vtbl;
     palette->ref = 1;
     palette->flags = flags;
 
-    if (FAILED(hr = wined3d_palette_create(ddraw->wined3d_device, flags, entries, &palette->wineD3DPalette)))
+    if (FAILED(hr = wined3d_palette_create(ddraw->wined3d_device,
+            flags, entry_count, entries, &palette->wineD3DPalette)))
     {
         WARN("Failed to create wined3d palette, hr %#x.\n", hr);
         return hr;
diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index 555a962..27e6b24 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -29,8 +29,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
-#define SIZE_BITS (WINEDDPCAPS_1BIT | WINEDDPCAPS_2BIT | WINEDDPCAPS_4BIT | WINEDDPCAPS_8BIT)
-
 ULONG CDECL wined3d_palette_incref(struct wined3d_palette *palette)
 {
     ULONG refcount = InterlockedIncrement(&palette->ref);
@@ -55,28 +53,15 @@ ULONG CDECL wined3d_palette_decref(struct wined3d_palette *palette)
     return refcount;
 }
 
-static WORD wined3d_palette_size(DWORD flags)
-{
-    switch (flags & SIZE_BITS)
-    {
-        case WINEDDPCAPS_1BIT: return 2;
-        case WINEDDPCAPS_2BIT: return 4;
-        case WINEDDPCAPS_4BIT: return 16;
-        case WINEDDPCAPS_8BIT: return 256;
-        default:
-            FIXME("Unhandled size bits %#x.\n", flags & SIZE_BITS);
-            return 256;
-    }
-}
-
 HRESULT CDECL wined3d_palette_get_entries(const struct wined3d_palette *palette,
         DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries)
 {
     TRACE("palette %p, flags %#x, start %u, count %u, entries %p.\n",
             palette, flags, start, count, entries);
 
-    if (flags) return WINED3DERR_INVALIDCALL; /* unchecked */
-    if (start + count > wined3d_palette_size(palette->flags))
+    if (flags)
+        return WINED3DERR_INVALIDCALL; /* unchecked */
+    if (start > palette->palNumEntries || count > palette->palNumEntries - start)
         return WINED3DERR_INVALIDCALL;
 
     if (palette->flags & WINEDDPCAPS_8BITENTRIES)
@@ -146,7 +131,7 @@ HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette,
 }
 
 static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wined3d_device *device,
-        DWORD flags, const PALETTEENTRY *entries)
+        DWORD flags, unsigned int entry_count, const PALETTEENTRY *entries)
 {
     HRESULT hr;
 
@@ -154,7 +139,7 @@ static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wine
     palette->device = device;
     palette->flags = flags;
 
-    palette->palNumEntries = wined3d_palette_size(flags);
+    palette->palNumEntries = entry_count;
     palette->hpal = CreatePalette((const LOGPALETTE *)&palette->palVersion);
     if (!palette->hpal)
     {
@@ -162,8 +147,7 @@ static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wine
         return E_FAIL;
     }
 
-    hr = wined3d_palette_set_entries(palette, 0, 0, wined3d_palette_size(flags), entries);
-    if (FAILED(hr))
+    if (FAILED(hr = wined3d_palette_set_entries(palette, 0, 0, entry_count, entries)))
     {
         WARN("Failed to set palette entries, hr %#x.\n", hr);
         DeleteObject(palette->hpal);
@@ -174,7 +158,7 @@ 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, struct wined3d_palette **palette)
+        unsigned int entry_count, const PALETTEENTRY *entries, struct wined3d_palette **palette)
 {
     struct wined3d_palette *object;
     HRESULT hr;
@@ -186,8 +170,7 @@ HRESULT CDECL wined3d_palette_create(struct wined3d_device *device, DWORD flags,
     if (!object)
         return E_OUTOFMEMORY;
 
-    hr = wined3d_palette_init(object, device, flags, entries);
-    if (FAILED(hr))
+    if (FAILED(hr = wined3d_palette_init(object, device, flags, entry_count, entries)))
     {
         WARN("Failed to initialize palette, hr %#x.\n", hr);
         HeapFree(GetProcessHeap(), 0, object);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index bbd5775..a1a99d9 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -156,7 +156,7 @@
 @ cdecl wined3d_device_update_texture(ptr ptr ptr)
 @ cdecl wined3d_device_validate_device(ptr ptr)
 
-@ cdecl wined3d_palette_create(ptr long ptr ptr)
+@ cdecl wined3d_palette_create(ptr long long ptr ptr)
 @ cdecl wined3d_palette_decref(ptr)
 @ cdecl wined3d_palette_get_entries(ptr long long long ptr)
 @ cdecl wined3d_palette_incref(ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 4599678..52f8e52 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2234,7 +2234,7 @@ 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, struct wined3d_palette **palette);
+        unsigned int entry_count, 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);
-- 
1.7.10.4




More information about the wine-patches mailing list