[PATCH] Add a GL specific RealizePalette which also updates the drawable.

Roderick Colenbrander thunderbird2k at gmx.net
Mon Feb 18 14:13:13 CST 2008


---
 dlls/wined3d/surface.c |   47 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 6a17949..8a4f31f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3528,6 +3528,51 @@ HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, D
     return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, Source, rsrc, trans);
 }
 
+HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) {
+    IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+    RGBQUAD col[256];
+    IWineD3DPaletteImpl *pal = This->palette;
+    unsigned int n;
+    TRACE("(%p)\n", This);
+
+    if(This->resource.format == WINED3DFMT_P8 ||
+       This->resource.format == WINED3DFMT_A8P8)
+    {
+        if(!(This->Flags & SFLAG_INSYSMEM)) {
+            TRACE("Palette changed with surface that does not have an up to date system memory copy\n");
+            IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
+        }
+        TRACE("Dirtifying surface\n");
+        IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
+    }
+
+    if(This->Flags & SFLAG_DIBSECTION) {
+        TRACE("(%p): Updating the hdc's palette\n", This);
+        for (n=0; n<256; n++) {
+            if(pal) {
+                col[n].rgbRed   = pal->palents[n].peRed;
+                col[n].rgbGreen = pal->palents[n].peGreen;
+                col[n].rgbBlue  = pal->palents[n].peBlue;
+            } else {
+                IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+                /* Use the default device palette */
+                col[n].rgbRed   = device->palettes[device->currentPalette][n].peRed;
+                col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen;
+                col[n].rgbBlue  = device->palettes[device->currentPalette][n].peBlue;
+            }
+            col[n].rgbReserved = 0;
+        }
+        SetDIBColorTable(This->hDC, 0, 256, col);
+    }
+
+    /* Propagate the changes to the drawable.
+     * TODO: in case of hardware p8 palettes we should only upload the palette. */
+    if(This->resource.usage & WINED3DUSAGE_RENDERTARGET)
+        IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, NULL);
+
+    return WINED3D_OK;
+}
+
 static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
     /** Check against the maximum texture sizes supported by the video card **/
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
@@ -4112,7 +4157,7 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
     IWineD3DSurfaceImpl_BltFast,
     IWineD3DBaseSurfaceImpl_GetPalette,
     IWineD3DBaseSurfaceImpl_SetPalette,
-    IWineD3DBaseSurfaceImpl_RealizePalette,
+    IWineD3DSurfaceImpl_RealizePalette,
     IWineD3DBaseSurfaceImpl_SetColorKey,
     IWineD3DBaseSurfaceImpl_GetPitch,
     IWineD3DSurfaceImpl_SetMem,
-- 
1.5.3.4


--========GMX20275120336788012071--



More information about the wine-patches mailing list