DirectDraw -> WineD3D patch

Peter Beutner p.beutner at gmx.net
Fri Mar 3 08:57:18 CST 2006


Stefan Dösinger schrieb:
> Hi,
> I've brought my DirectDraw over WineD3D patch in a form where I want to show 
> it to the public for review. I've uploaded it to 
> http://stud4.tuwien.ac.at/~e0526822/, where it is described in detail(below 
> the game list).

nice work :).

I just looked a bit into the palette issue( aka lost text color etc):

from IWineD3DDeviceImpl_CreatePalette:
+    memset(&palVersion, 0, sizeof(LOGPALETTE));
+    object->hpal = CreatePalette(&palVersion);
+    memcpy(&object->palVersion, &palVersion, sizeof(LOGPALETTE));
+    /* FIXME Using the palVersion member from IWineD3DPaletteImpl for CreatePalette
+     * directly causes a heap corruption. Why? In original ddraw this was a WORD,
+     * which failed too. Confused ...
+     */
+    object->palNumEntries = IWineD3DPaletteImpl_Size(Flags);

That can't really work. This only creates a palette with zero entries.
You need to set palNumEntries before calling CreatePalette.
Attached patch( applies on top of yours ) should fix it( i.e. do it the same way 
it is done in the current implementation). 
But the text colors in AoE are still lacking :/.
Needs some more investigation ...

Peter
-------------- next part --------------
b0a1e06bddc2bbc17bf7b5d991236a4cd76f0d1a
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index f224c2c..9b0e468 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1660,12 +1660,11 @@ HRESULT WINAPI IWineD3DDeviceImpl_Create
 HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DWORD Flags, PALETTEENTRY *PalEnt, IWineD3DPalette **Palette, IUnknown *Parent) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     IWineD3DPaletteImpl *object;
-    LOGPALETTE palVersion;
     HRESULT hr;
     FIXME("(%p)->(%lx, %p, %p, %p)\n", This, Flags, PalEnt, Palette, Parent);
 
     /* Create the new object */
-    object = HeapAlloc(GetProcessHeap(), 0, sizeof(IWineD3DPaletteImpl));
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DPaletteImpl));
     if(!object) {
         ERR("Out of memory when allocating memory for a IWineD3DPalette implementation\n");
         return DDERR_OUTOFVIDEOMEMORY;
@@ -1676,15 +1675,14 @@ HRESULT WINAPI IWineD3DDeviceImpl_Create
     object->Flags = Flags;
     object->parent = Parent;
     object->wineD3DDevice = This;
-
-    memset(&palVersion, 0, sizeof(LOGPALETTE));
-    object->hpal = CreatePalette(&palVersion);
-    memcpy(&object->palVersion, &palVersion, sizeof(LOGPALETTE));
-    /* FIXME Using the palVersion member from IWineD3DPaletteImpl for CreatePalette
-     * directly causes a heap corruption. Why? In original ddraw this was a WORD,
-     * which failed too. Confused ...
-     */
     object->palNumEntries = IWineD3DPaletteImpl_Size(Flags);
+	
+    object->hpal = CreatePalette((const LOGPALETTE*)&(object->palVersion));
+
+    if(!object->hpal) {
+        HeapFree( GetProcessHeap(), 0, object);
+        return DDERR_OUTOFMEMORY;  /* only reason why CreatePalette could have failed */
+    }
 
     hr = IWineD3DPalette_SetEntries((IWineD3DPalette *) object, 0, 0, IWineD3DPaletteImpl_Size(Flags), PalEnt);
     if(FAILED(hr)) {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 86b10bb..626154a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1309,9 +1309,9 @@ struct IWineD3DPaletteImpl {
 
     /* IWineD3DPalette */
     HPALETTE                   hpal;
-    LOGPALETTE                 palVersion;
-    WORD                       palNumEntries;
-    PALETTEENTRY               palents[256];
+    WORD                       palVersion;     /*|               */
+    WORD                       palNumEntries;  /*|  LOGPALETTE   */
+    PALETTEENTRY               palents[256];   /*|               */
     /* This is to store the palette in 'screen format' */
     int                        screen_palents[256];
     DWORD                      Flags;


More information about the wine-devel mailing list