[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