[PATCH 4/8] ddraw: Add a separate function for palette initialization.

Henri Verbeet hverbeet at codeweavers.com
Thu Aug 19 11:57:46 CDT 2010


---
 dlls/ddraw/ddraw.c         |   15 ++++++---------
 dlls/ddraw/ddraw_private.h |    4 +++-
 dlls/ddraw/palette.c       |   24 +++++++++++++++++++++++-
 3 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 920a365..c8cebcb 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -3952,7 +3952,8 @@ static HRESULT WINAPI ddraw7_CreatePalette(IDirectDraw7 *iface, DWORD Flags,
 {
     IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IDirectDrawPaletteImpl *object;
-    HRESULT hr = DDERR_GENERIC;
+    HRESULT hr;
+
     TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, ColorTable, Palette, pUnkOuter);
 
     EnterCriticalSection(&ddraw_cs);
@@ -3979,20 +3980,16 @@ static HRESULT WINAPI ddraw7_CreatePalette(IDirectDraw7 *iface, DWORD Flags,
         return E_OUTOFMEMORY;
     }
 
-    object->lpVtbl = &IDirectDrawPalette_Vtbl;
-    object->ref = 1;
-
-    hr = IWineD3DDevice_CreatePalette(This->wineD3DDevice, Flags,
-            ColorTable, &object->wineD3DPalette, (IUnknown *)object);
-    if(hr != DD_OK)
+    hr = ddraw_palette_init(object, This, Flags, ColorTable);
+    if (FAILED(hr))
     {
+        WARN("Failed to initialize palette, hr %#x.\n", hr);
         HeapFree(GetProcessHeap(), 0, object);
         LeaveCriticalSection(&ddraw_cs);
         return hr;
     }
 
-    IDirectDraw7_AddRef(iface);
-    object->ifaceToRelease = (IUnknown *) iface;
+    TRACE("Created palette %p.\n", object);
     *Palette = (IDirectDrawPalette *)object;
     LeaveCriticalSection(&ddraw_cs);
     return DD_OK;
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index bfca885..6be5016 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -477,7 +477,9 @@ struct IDirectDrawPaletteImpl
     /* IDirectDrawPalette fields */
     IUnknown                  *ifaceToRelease;
 };
-extern const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl DECLSPEC_HIDDEN;
+
+HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette,
+        IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN;
 
 /******************************************************************************
  * DirectDraw ClassFactory implementation - incomplete
diff --git a/dlls/ddraw/palette.c b/dlls/ddraw/palette.c
index 2937ec6..7b9dcc2 100644
--- a/dlls/ddraw/palette.c
+++ b/dlls/ddraw/palette.c
@@ -240,7 +240,7 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface,
     return hr;
 }
 
-const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl =
+static const struct IDirectDrawPaletteVtbl ddraw_palette_vtbl =
 {
     /*** IUnknown ***/
     IDirectDrawPaletteImpl_QueryInterface,
@@ -252,3 +252,25 @@ const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl =
     IDirectDrawPaletteImpl_Initialize,
     IDirectDrawPaletteImpl_SetEntries
 };
+
+HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette,
+        IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries)
+{
+    HRESULT hr;
+
+    palette->lpVtbl = &ddraw_palette_vtbl;
+    palette->ref = 1;
+
+    hr = IWineD3DDevice_CreatePalette(ddraw->wineD3DDevice, flags,
+            entries, &palette->wineD3DPalette, (IUnknown *)palette);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create wined3d palette, hr %#x.\n", hr);
+        return hr;
+    }
+
+    palette->ifaceToRelease = (IUnknown *)ddraw;
+    IUnknown_AddRef(palette->ifaceToRelease);
+
+    return DD_OK;
+}
-- 
1.7.1




More information about the wine-patches mailing list