Alexandre Julliard : gdi32:
Get rid of the palette mapping handling and leave it up to the driver.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 17 11:49:01 CST 2006
Module: wine
Branch: master
Commit: bb51f96907fc3c6eb7691aa8eaf650b9e71e61fc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb51f96907fc3c6eb7691aa8eaf650b9e71e61fc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Nov 17 14:38:11 2006 +0100
gdi32: Get rid of the palette mapping handling and leave it up to the driver.
---
dlls/gdi32/driver.c | 1 +
dlls/gdi32/enhmfdrv/init.c | 1 +
dlls/gdi32/gdi_private.h | 1 +
dlls/gdi32/mfdrv/init.c | 1 +
dlls/gdi32/palette.c | 82 ++++++++++++++++----------------------------
include/gdi.h | 9 -----
6 files changed, 34 insertions(+), 61 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index f5ff9af..f08141c 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -193,6 +193,7 @@ static struct graphics_driver *create_dr
GET_FUNC(StrokeAndFillPath);
GET_FUNC(StrokePath);
GET_FUNC(SwapBuffers);
+ GET_FUNC(UnrealizePalette);
GET_FUNC(WidenPath);
/* OpenGL32 */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 119bf76..1191c72 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -152,6 +152,7 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
EMFDRV_StrokeAndFillPath, /* pStrokeAndFillPath */
EMFDRV_StrokePath, /* pStrokePath */
NULL, /* pSwapBuffers */
+ NULL, /* pUnrealizePalette */
EMFDRV_WidenPath /* pWidenPath */
};
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 0d3f1d0..31130a6 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -181,6 +181,7 @@ typedef struct tagDC_FUNCS
BOOL (*pStrokeAndFillPath)(PHYSDEV);
BOOL (*pStrokePath)(PHYSDEV);
BOOL (*pSwapBuffers)(PHYSDEV);
+ BOOL (*pUnrealizePalette)(HPALETTE);
BOOL (*pWidenPath)(PHYSDEV);
/* OpenGL32 */
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 82fe4ce..ab3ec3e 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -152,6 +152,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
MFDRV_StrokeAndFillPath, /* pStrokeAndFillPath */
MFDRV_StrokePath, /* pStrokePath */
NULL, /* pSwapBuffers */
+ NULL, /* pUnrealizePalette */
MFDRV_WidenPath /* pWidenPath */
};
diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index c136656..98d6a69 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -39,6 +39,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(palette);
+typedef struct tagPALETTEOBJ
+{
+ GDIOBJHDR header;
+ const DC_FUNCTIONS *funcs; /* DC function table */
+ LOGPALETTE logpalette; /* _MUST_ be the last field */
+} PALETTEOBJ;
+
static INT PALETTE_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static BOOL PALETTE_UnrealizeObject( HGDIOBJ handle, void *obj );
static BOOL PALETTE_DeleteObject( HGDIOBJ handle, void *obj );
@@ -62,7 +69,6 @@ static UINT SystemPaletteUse = SYSPAL_ST
static HPALETTE hPrimaryPalette = 0; /* used for WM_PALETTECHANGED */
static HPALETTE hLastRealizedPalette = 0; /* UnrealizeObject() needs it */
-static const DC_FUNCTIONS *pLastRealizedDC;
static const PALETTEENTRY sys_pal_template[NB_RESERVED_COLORS] =
{
@@ -106,7 +112,6 @@ HPALETTE PALETTE_Init(void)
{
HPALETTE hpalette;
LOGPALETTE * palPtr;
- PALETTEOBJ* palObj;
/* create default palette (20 system colors) */
@@ -119,14 +124,6 @@ HPALETTE PALETTE_Init(void)
memcpy( palPtr->palPalEntry, sys_pal_template, sizeof(sys_pal_template) );
hpalette = CreatePalette( palPtr );
HeapFree( GetProcessHeap(), 0, palPtr );
-
- palObj = (PALETTEOBJ*) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
- if (palObj)
- {
- if (!(palObj->mapping = HeapAlloc( GetProcessHeap(), 0, sizeof(int) * NB_RESERVED_COLORS )))
- ERR("Cannot create palette mapping -- out of memory!\n");
- GDI_ReleaseObj( hpalette );
- }
return hpalette;
}
@@ -156,7 +153,7 @@ HPALETTE WINAPI CreatePalette(
PALETTE_MAGIC, (HGDIOBJ *)&hpalette,
&palette_funcs ))) return 0;
memcpy( &palettePtr->logpalette, palette, size );
- palettePtr->mapping = NULL;
+ palettePtr->funcs = NULL;
GDI_ReleaseObj( hpalette );
TRACE(" returning %p\n", hpalette);
@@ -368,7 +365,6 @@ BOOL WINAPI ResizePalette(
PALETTEOBJ * palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
UINT cPrevEnt, prevVer;
int prevsize, size = sizeof(LOGPALETTE) + (cEntries - 1) * sizeof(PALETTEENTRY);
- int* mapping = NULL;
TRACE("hpal = %p, prev = %i, new = %i\n",
hPal, palPtr ? palPtr->logpalette.palNumEntries : -1, cEntries );
@@ -378,28 +374,12 @@ BOOL WINAPI ResizePalette(
prevsize = sizeof(LOGPALETTE) + (cPrevEnt - 1) * sizeof(PALETTEENTRY) +
sizeof(int*) + sizeof(GDIOBJHDR);
size += sizeof(int*) + sizeof(GDIOBJHDR);
- mapping = palPtr->mapping;
if (!(palPtr = GDI_ReallocObject( size, hPal, palPtr ))) return FALSE;
- if( mapping )
- {
- int *newMap = HeapReAlloc(GetProcessHeap(), 0, mapping, cEntries * sizeof(int) );
- if(newMap == NULL)
- {
- ERR("Cannot resize mapping -- out of memory!\n");
- GDI_ReleaseObj( hPal );
- return FALSE;
- }
- palPtr->mapping = newMap;
- }
+ PALETTE_UnrealizeObject( hPal, palPtr );
- if( cEntries > cPrevEnt )
- {
- if( mapping )
- memset(palPtr->mapping + cPrevEnt, 0, (cEntries - cPrevEnt)*sizeof(int));
- memset( (BYTE*)palPtr + prevsize, 0, size - prevsize );
- }
+ if( cEntries > cPrevEnt ) memset( (BYTE*)palPtr + prevsize, 0, size - prevsize );
palPtr->logpalette.palNumEntries = cEntries;
palPtr->logpalette.palVersion = prevVer;
GDI_ReleaseObj( hPal );
@@ -458,14 +438,10 @@ BOOL WINAPI AnimatePalette(
TRACE("Not animating entry %d -- not PC_RESERVED\n", StartIndex);
}
}
-
- GDI_ReleaseObj( hPal );
-
- TRACE("pLastRealizedDC %p -- pLastRealizedDC->pRealizePalette %p\n",
- pLastRealizedDC, pLastRealizedDC ? pLastRealizedDC->pRealizePalette : 0);
+ if (palPtr->funcs && palPtr->funcs->pRealizePalette)
+ palPtr->funcs->pRealizePalette( NULL, hPal, hPal == hPrimaryPalette );
- if (pLastRealizedDC && pLastRealizedDC->pRealizePalette)
- pLastRealizedDC->pRealizePalette( NULL, hPal, hPal == hPrimaryPalette );
+ GDI_ReleaseObj( hPal );
}
return TRUE;
}
@@ -678,14 +654,17 @@ static BOOL PALETTE_UnrealizeObject( HGD
{
PALETTEOBJ *palette = obj;
- HeapFree( GetProcessHeap(), 0, palette->mapping );
- palette->mapping = NULL;
+ if (palette->funcs)
+ {
+ if (palette->funcs->pUnrealizePalette)
+ palette->funcs->pUnrealizePalette( handle );
+ palette->funcs = NULL;
+ }
if (hLastRealizedPalette == handle)
{
TRACE("unrealizing palette %p\n", handle);
hLastRealizedPalette = 0;
- pLastRealizedDC = NULL;
}
return TRUE;
}
@@ -696,15 +675,7 @@ static BOOL PALETTE_UnrealizeObject( HGD
*/
static BOOL PALETTE_DeleteObject( HGDIOBJ handle, void *obj )
{
- PALETTEOBJ *palette = obj;
-
- HeapFree( GetProcessHeap(), 0, palette->mapping );
- if (hLastRealizedPalette == handle)
- {
- TRACE("unrealizing palette %p\n", handle);
- hLastRealizedPalette = 0;
- pLastRealizedDC = NULL;
- }
+ PALETTE_UnrealizeObject( handle, obj );
return GDI_FreeObject( handle, obj );
}
@@ -758,10 +729,17 @@ UINT WINAPI GDIRealizePalette( HDC hdc )
else if(dc->hPalette != hLastRealizedPalette )
{
if (dc->funcs->pRealizePalette)
- realized = dc->funcs->pRealizePalette( dc->physDev, dc->hPalette,
- (dc->hPalette == hPrimaryPalette) );
+ {
+ PALETTEOBJ *palPtr = GDI_GetObjPtr( dc->hPalette, PALETTE_MAGIC );
+ if (palPtr)
+ {
+ realized = dc->funcs->pRealizePalette( dc->physDev, dc->hPalette,
+ (dc->hPalette == hPrimaryPalette) );
+ palPtr->funcs = dc->funcs;
+ GDI_ReleaseObj( dc->hPalette );
+ }
+ }
hLastRealizedPalette = dc->hPalette;
- pLastRealizedDC = dc->funcs;
}
else TRACE(" skipping (hLastRealizedPalette = %p)\n", hLastRealizedPalette);
diff --git a/include/gdi.h b/include/gdi.h
index 49b231f..487e78c 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -66,17 +66,8 @@ typedef struct tagGDIOBJHDR
struct hdc_list *hdcs;
} GDIOBJHDR;
-/* palette object */
-
#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */
-typedef struct tagPALETTEOBJ
-{
- GDIOBJHDR header;
- int *mapping;
- LOGPALETTE logpalette; /* _MUST_ be the last field */
-} PALETTEOBJ;
-
/* GDI local heap */
extern void *GDI_GetObjPtr( HGDIOBJ, WORD );
More information about the wine-cvs
mailing list