Stefan Dösinger : wined3d: Fix d3d8/9 style palettes.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 20 05:25:06 CST 2007


Module: wine
Branch: master
Commit: 7676462a3dd23c8b52d473e10190eb2debb3edb2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7676462a3dd23c8b52d473e10190eb2debb3edb2

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Feb 19 15:23:36 2007 +0100

wined3d: Fix d3d8/9 style palettes.

---

 dlls/wined3d/surface.c         |   25 +++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |    3 ++-
 2 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index b090366..562adcd 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -297,6 +297,8 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {
         }
         if(This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem(iface, NULL);
 
+        HeapFree(GetProcessHeap(), 0, This->palette9);
+
         IWineD3DResourceImpl_CleanUp((IWineD3DResource *)iface);
         if(iface == device->ddraw_primary)
             device->ddraw_primary = NULL;
@@ -1649,6 +1651,27 @@ void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES convert) {
     GL_EXTCALL(glColorTableEXT(GL_TEXTURE_2D,GL_RGBA,256,GL_RGBA,GL_UNSIGNED_BYTE, table));
 }
 
+static BOOL palette9_changed(IWineD3DSurfaceImpl *This) {
+    IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+
+    if(This->palette || (This->resource.format != WINED3DFMT_P8 && This->resource.format != WINED3DFMT_A8P8)) {
+        /* If a ddraw-style palette is attached assume no d3d9 palette change.
+         * Also the palette isn't interesting if the surface format isn't P8 or A8P8
+         */
+        return FALSE;
+    }
+
+    if(This->palette9) {
+        if(memcmp(This->palette9, &device->palettes[device->currentPalette], sizeof(PALETTEENTRY) * 256) == 0) {
+            return FALSE;
+        }
+    } else {
+        This->palette9 = (PALETTEENTRY *) HeapAlloc(GetProcessHeap(), 0, sizeof(PALETTEENTRY) * 256);
+    }
+    memcpy(This->palette9, &device->palettes[device->currentPalette], sizeof(PALETTEENTRY) * 256);
+    return TRUE;
+}
+
 static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface) {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
     GLenum format, internal, type;
@@ -1672,6 +1695,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface) {
                 (This->glCKey.dwColorSpaceLowValue != This->SrcBltCKey.dwColorSpaceLowValue) ||
                 (This->glCKey.dwColorSpaceHighValue != This->SrcBltCKey.dwColorSpaceHighValue)))) {
         TRACE("Reloading because of color keying\n");
+    } else if(palette9_changed(This)) {
+        TRACE("Reloading surface because the d3d8/9 palette was changed\n");
     } else {
         TRACE("surface isn't dirty\n");
         return WINED3D_OK;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9454a38..7fea727 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -973,7 +973,8 @@ struct IWineD3DSurfaceImpl
     /* IWineD3DSurface fields */
     IWineD3DBase              *container;
     WINED3DSURFACET_DESC      currentDesc;
-    IWineD3DPaletteImpl      *palette;
+    IWineD3DPaletteImpl       *palette; /* D3D7 style palette handling */
+    PALETTEENTRY              *palette9; /* D3D8/9 style palette handling */
 
     UINT                      bytesPerPixel;
 




More information about the wine-cvs mailing list