Module: wine Branch: master Commit: 5e7afb8c3bda9cff32d698220d9511b1e90892de URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e7afb8c3bda9cff32d698220d...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Nov 17 14:38:43 2006 +0100
winex11.drv: Store the palette mapping in an X context instead of the GDI object.
---
dlls/winex11.drv/palette.c | 59 +++++++++++++++++++++++++------------ dlls/winex11.drv/winex11.drv.spec | 1 + 2 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c index 026b28c..7ccfed7 100644 --- a/dlls/winex11.drv/palette.c +++ b/dlls/winex11.drv/palette.c @@ -20,11 +20,12 @@
#include "config.h"
+#include <stdarg.h> #include <stdlib.h> #include <string.h>
-#include "gdi.h" #include "windef.h" +#include "winbase.h" #include "winreg.h" #include "x11drv.h" #include "wine/debug.h" @@ -48,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(palette); * http://premium.microsoft.com/msdn/library/techart/f30/f34/f40/d4d/sa942.htm */
+#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */ + #define PC_SYS_USED 0x80 /* palentry is used (both system and logical) */ #define PC_SYS_RESERVED 0x40 /* system palentry is not to be mapped to */
@@ -81,6 +84,8 @@ static int palette_size; static int X11DRV_PALETTE_firstFree = 0; static unsigned char X11DRV_PALETTE_freeList[256];
+static XContext palette_context; /* X context to associate a color mapping to a palette */ + /**********************************************************************/
/* Map an EGA index (0..15) to a pixel value in the system color space. */ @@ -114,14 +119,11 @@ static int X11DRV_PALETTE_LookupSystemXP */ static int *palette_get_mapping( HPALETTE hpal ) { - int *mapping = NULL; - PALETTEOBJ *ptr; + int *mapping;
- if ((ptr = GDI_GetObjPtr( hpal, PALETTE_MAGIC ))) - { - mapping = ptr->mapping; - GDI_ReleaseObj( hpal ); - } + wine_tsx11_lock(); + if (XFindContext( gdi_display, (XID)hpal, palette_context, (char **)&mapping )) mapping = NULL; + wine_tsx11_unlock(); return mapping; }
@@ -129,18 +131,11 @@ static int *palette_get_mapping( HPALETT /*********************************************************************** * palette_set_mapping */ -static int *palette_set_mapping( HPALETTE hpal, int *mapping ) +static void palette_set_mapping( HPALETTE hpal, int *mapping ) { - int *old_mapping = NULL; - PALETTEOBJ *ptr; - - if ((ptr = GDI_GetObjPtr( hpal, PALETTE_MAGIC ))) - { - old_mapping = ptr->mapping; - ptr->mapping = mapping; - GDI_ReleaseObj( hpal ); - } - return old_mapping; + wine_tsx11_lock(); + XSaveContext( gdi_display, (XID)hpal, palette_context, (char *)mapping ); + wine_tsx11_unlock(); }
@@ -153,10 +148,14 @@ int X11DRV_PALETTE_Init(void) { int mask, white, black; int monoPlane; + int *mapping; PALETTEENTRY sys_pal_template[NB_RESERVED_COLORS];
TRACE("initializing palette manager...\n");
+ wine_tsx11_lock(); + palette_context = XUniqueContext(); + wine_tsx11_unlock(); white = WhitePixel( gdi_display, DefaultScreen(gdi_display) ); black = BlackPixel( gdi_display, DefaultScreen(gdi_display) ); monoPlane = 1; @@ -244,6 +243,9 @@ int X11DRV_PALETTE_Init(void)
GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, NB_RESERVED_COLORS, sys_pal_template );
+ if ((mapping = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * NB_RESERVED_COLORS ))) + palette_set_mapping( GetStockObject(DEFAULT_PALETTE), mapping ); + if( X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL ) { palette_size = 0; @@ -1195,6 +1197,25 @@ UINT X11DRV_RealizePalette( X11DRV_PDEVI return iRemapped; }
+ +/*********************************************************************** + * UnrealizePalette (X11DRV.@) + */ +BOOL X11DRV_UnrealizePalette( HPALETTE hpal ) +{ + int *mapping = palette_get_mapping( hpal ); + + if (mapping) + { + wine_tsx11_lock(); + XDeleteContext( gdi_display, (XID)hpal, palette_context ); + wine_tsx11_unlock(); + HeapFree( GetProcessHeap(), 0, mapping ); + } + return TRUE; +} + + /*********************************************************************** * GetSystemPaletteEntries (X11DRV.@) */ diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec index e6dc141..92756a6 100644 --- a/dlls/winex11.drv/winex11.drv.spec +++ b/dlls/winex11.drv/winex11.drv.spec @@ -59,6 +59,7 @@ @ cdecl SetTextColor(ptr long) X11DRV_SetTextColor @ cdecl StretchBlt(ptr long long long long ptr long long long long long) X11DRV_StretchBlt @ cdecl SwapBuffers(ptr) X11DRV_SwapBuffers +@ cdecl UnrealizePalette(long) X11DRV_UnrealizePalette
# USER driver