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