Stefan Dösinger : wined3d: Implement WineD3DSurface palette methods.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 10 05:22:35 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 275a0c2f2d26c73eda5844edfd9ad8d252a52f7b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=275a0c2f2d26c73eda5844edfd9ad8d252a52f7b

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue May  9 20:28:23 2006 +0200

wined3d: Implement WineD3DSurface palette methods.

---

 dlls/wined3d/surface.c |   62 +++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 254d225..5c95a7e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1759,18 +1759,68 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetPi
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD3DPalette **Pal) {
-    FIXME("This is unimplemented for now(d3d7 merge)\n");
-    return WINED3DERR_INVALIDCALL;
+    IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+    TRACE("(%p)->(%p)\n", This, Pal);
+
+    *Pal = (IWineD3DPalette *) This->palette;
+    return DD_OK;
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) {
-    FIXME("This is unimplemented for now(d3d7 merge)\n");
-    return WINED3DERR_INVALIDCALL;
+    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)
+    {
+        TRACE("Dirtifying surface\n");
+        This->Flags |= SFLAG_DIRTY;
+    }
+
+    TRACE("(%p): Updating the palette\n", This);
+    for (n=0; n<256; n++) {
+        col[n].rgbRed   = pal->palents[n].peRed;
+        col[n].rgbGreen = pal->palents[n].peGreen;
+        col[n].rgbBlue  = pal->palents[n].peBlue;
+        col[n].rgbReserved = 0;
+    }
+    SetDIBColorTable(This->hDC, 0, 256, col);
+
+    return WINED3D_OK;
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal) {
-    FIXME("This is unimplemented for now(d3d7 merge)\n");
-    return WINED3DERR_INVALIDCALL;
+    IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+    IWineD3DPaletteImpl *PalImpl = (IWineD3DPaletteImpl *) Pal;
+    TRACE("(%p)->(%p)\n", This, Pal);
+
+    if(This->palette != NULL) 
+        if(This->resource.usage & WINED3DUSAGE_RENDERTARGET)
+            This->palette->Flags &= ~DDPCAPS_PRIMARYSURFACE;
+
+    if(PalImpl != NULL) {
+        if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
+            /* Set the device's main palette if the palette
+             * wasn't a primary palette before
+             */
+            if(!(PalImpl->Flags & DDPCAPS_PRIMARYSURFACE)) {
+                IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+                unsigned int i;
+
+                for(i=0; i < 256; i++) {
+                    device->palettes[device->currentPalette][i] = PalImpl->palents[i];
+                }
+            }
+
+            (PalImpl)->Flags |= DDPCAPS_PRIMARYSURFACE;
+        }
+    }
+    This->palette = PalImpl;
+
+    return IWineD3DSurface_RealizePalette(iface);
 }
 
 HRESULT WINAPI IWineD3DSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, DDCOLORKEY *CKey) {




More information about the wine-cvs mailing list