Alexandre Julliard : gdi32: Add null driver entry points for the palette functions.

Alexandre Julliard julliard at winehq.org
Mon Mar 14 14:29:32 CDT 2011


Module: wine
Branch: master
Commit: 0d27e3c0ed5743f35ba9af4f6dfeeb346258f6e2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d27e3c0ed5743f35ba9af4f6dfeeb346258f6e2

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Mar 11 18:26:55 2011 +0100

gdi32: Add null driver entry points for the palette functions.

---

 dlls/gdi32/dc.c          |    3 +-
 dlls/gdi32/driver.c      |   24 ++++++++++--
 dlls/gdi32/gdi_private.h |    1 +
 dlls/gdi32/palette.c     |   93 +++++++++++++++++++++-------------------------
 4 files changed, 65 insertions(+), 56 deletions(-)

diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index e7da659..bdaab13 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -274,7 +274,8 @@ static BOOL DC_DeleteObject( HGDIOBJ handle )
  */
 void DC_InitDC( DC* dc )
 {
-    if (dc->funcs->pRealizeDefaultPalette) dc->funcs->pRealizeDefaultPalette( dc->physDev );
+    PHYSDEV physdev = GET_DC_PHYSDEV( dc, pRealizeDefaultPalette );
+    physdev->funcs->pRealizeDefaultPalette( physdev );
     SetTextColor( dc->hSelf, dc->textColor );
     SetBkColor( dc->hSelf, dc->backgroundColor );
     SelectObject( dc->hSelf, dc->hPen );
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 969d660..0bd7bdb 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -413,6 +413,12 @@ static INT CDECL nulldrv_GetPixelFormat( PHYSDEV dev )
     return 0;
 }
 
+static UINT CDECL nulldrv_GetSystemPaletteEntries( PHYSDEV dev, UINT start,
+                                                   UINT count, PALETTEENTRY *entries )
+{
+    return 0;
+}
+
 static BOOL CDECL nulldrv_LineTo( PHYSDEV dev, INT x, INT y )
 {
     return TRUE;
@@ -456,6 +462,16 @@ static BOOL CDECL nulldrv_Polyline( PHYSDEV dev, const POINT *points, INT count
     return TRUE;
 }
 
+static UINT CDECL nulldrv_RealizeDefaultPalette( PHYSDEV dev )
+{
+    return 0;
+}
+
+static UINT CDECL nulldrv_RealizePalette( PHYSDEV dev, HPALETTE palette, BOOL primary )
+{
+    return 0;
+}
+
 static BOOL CDECL nulldrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
 {
     return TRUE;
@@ -706,10 +722,10 @@ const DC_FUNCTIONS null_driver =
     NULL,                               /* pGetDeviceCaps */
     nulldrv_GetDeviceGammaRamp,         /* pGetDeviceGammaRamp */
     nulldrv_GetICMProfile,              /* pGetICMProfile */
-    NULL,                               /* pGetNearestColor */
+    nulldrv_GetNearestColor,            /* pGetNearestColor */
     nulldrv_GetPixel,                   /* pGetPixel */
     nulldrv_GetPixelFormat,             /* pGetPixelFormat */
-    NULL,                               /* pGetSystemPaletteEntries */
+    nulldrv_GetSystemPaletteEntries,    /* pGetSystemPaletteEntries */
     NULL,                               /* pGetTextExtentExPoint */
     NULL,                               /* pGetTextMetrics */
     nulldrv_IntersectClipRect,          /* pIntersectClipRect */
@@ -731,8 +747,8 @@ const DC_FUNCTIONS null_driver =
     nulldrv_Polygon,                    /* pPolygon */
     nulldrv_Polyline,                   /* pPolyline */
     nulldrv_PolylineTo,                 /* pPolylineTo */
-    NULL,                               /* pRealizeDefaultPalette */
-    NULL,                               /* pRealizePalette */
+    nulldrv_RealizeDefaultPalette,      /* pRealizeDefaultPalette */
+    nulldrv_RealizePalette,             /* pRealizePalette */
     nulldrv_Rectangle,                  /* pRectangle */
     NULL,                               /* pResetDC */
     NULL,                               /* pRestoreDC */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index aa9ba4b..db7fdc8 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -520,6 +520,7 @@ extern INT  CDECL nulldrv_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT r
 extern INT  CDECL nulldrv_ExtSelectClipRgn( PHYSDEV dev, HRGN rgn, INT mode ) DECLSPEC_HIDDEN;
 extern BOOL CDECL nulldrv_FillRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush ) DECLSPEC_HIDDEN;
 extern BOOL CDECL nulldrv_FrameRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush, INT width, INT height ) DECLSPEC_HIDDEN;
+extern COLORREF CDECL nulldrv_GetNearestColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
 extern INT  CDECL nulldrv_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL CDECL nulldrv_InvertRgn( PHYSDEV dev, HRGN rgn ) DECLSPEC_HIDDEN;
 extern INT  CDECL nulldrv_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index e94ed7b..a60f342 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -513,8 +513,8 @@ UINT WINAPI GetSystemPaletteEntries(
 
     if ((dc = get_dc_ptr( hdc )))
     {
-        if (dc->funcs->pGetSystemPaletteEntries)
-            ret = dc->funcs->pGetSystemPaletteEntries( dc->physDev, start, count, entries );
+        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pGetSystemPaletteEntries );
+        ret = physdev->funcs->pGetSystemPaletteEntries( physdev, start, count, entries );
         release_dc_ptr( dc );
     }
     return ret;
@@ -563,47 +563,22 @@ UINT WINAPI GetNearestPaletteIndex(
 }
 
 
-/***********************************************************************
- * GetNearestColor [GDI32.@]
- *
- * Gets a system color to match.
- *
- * RETURNS
- *    Success: Color from system palette that corresponds to given color
- *    Failure: CLR_INVALID
- */
-COLORREF WINAPI GetNearestColor(
-    HDC hdc,      /* [in] Handle of device context */
-    COLORREF color) /* [in] Color to be matched */
+/* null driver fallback implementation for GetNearestColor */
+COLORREF CDECL nulldrv_GetNearestColor( PHYSDEV dev, COLORREF color )
 {
     unsigned char spec_type;
-    COLORREF nearest;
-    DC 		*dc;
 
-    if (!(dc = get_dc_ptr( hdc ))) return CLR_INVALID;
-
-    if (dc->funcs->pGetNearestColor)
-    {
-        nearest = dc->funcs->pGetNearestColor( dc->physDev, color );
-        release_dc_ptr( dc );
-        return nearest;
-    }
-
-    if (!(GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE))
-    {
-        release_dc_ptr( dc );
-        return color;
-    }
+    if (!(GetDeviceCaps( dev->hdc, RASTERCAPS ) & RC_PALETTE)) return color;
 
     spec_type = color >> 24;
     if (spec_type == 1 || spec_type == 2)
     {
         /* we need logical palette for PALETTERGB and PALETTEINDEX colorrefs */
-
         UINT index;
         PALETTEENTRY entry;
-        HPALETTE hpal = dc->hPalette ? dc->hPalette : GetStockObject( DEFAULT_PALETTE );
+        HPALETTE hpal = GetCurrentObject( dev->hdc, OBJ_PAL );
 
+        if (!hpal) hpal = GetStockObject( DEFAULT_PALETTE );
         if (spec_type == 2) /* PALETTERGB */
             index = GetNearestPaletteIndex( hpal, color );
         else  /* PALETTEINDEX */
@@ -612,18 +587,36 @@ COLORREF WINAPI GetNearestColor(
         if (!GetPaletteEntries( hpal, index, 1, &entry ))
         {
             WARN("RGB(%x) : idx %d is out of bounds, assuming NULL\n", color, index );
-            if (!GetPaletteEntries( hpal, 0, 1, &entry ))
-            {
-                release_dc_ptr( dc );
-                return CLR_INVALID;
-            }
+            if (!GetPaletteEntries( hpal, 0, 1, &entry )) return CLR_INVALID;
         }
         color = RGB( entry.peRed, entry.peGreen, entry.peBlue );
     }
-    nearest = color & 0x00ffffff;
-    release_dc_ptr( dc );
+    return color & 0x00ffffff;
+}
+
 
-    TRACE("(%06x): returning %06x\n", color, nearest );
+/***********************************************************************
+ * GetNearestColor [GDI32.@]
+ *
+ * Gets a system color to match.
+ *
+ * RETURNS
+ *    Success: Color from system palette that corresponds to given color
+ *    Failure: CLR_INVALID
+ */
+COLORREF WINAPI GetNearestColor(
+    HDC hdc,      /* [in] Handle of device context */
+    COLORREF color) /* [in] Color to be matched */
+{
+    COLORREF nearest = CLR_INVALID;
+    DC *dc;
+
+    if ((dc = get_dc_ptr( hdc )))
+    {
+        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pGetNearestColor );
+        nearest = physdev->funcs->pGetNearestColor( physdev, color );
+        release_dc_ptr( dc );
+    }
     return nearest;
 }
 
@@ -729,21 +722,19 @@ UINT WINAPI GDIRealizePalette( HDC hdc )
 
     if( dc->hPalette == GetStockObject( DEFAULT_PALETTE ))
     {
-        if (dc->funcs->pRealizeDefaultPalette)
-            realized = dc->funcs->pRealizeDefaultPalette( dc->physDev );
+        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pRealizeDefaultPalette );
+        realized = physdev->funcs->pRealizeDefaultPalette( physdev );
     }
     else if (InterlockedExchangePointer( (void **)&hLastRealizedPalette, dc->hPalette ) != dc->hPalette)
     {
-        if (dc->funcs->pRealizePalette)
+        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pRealizePalette );
+        PALETTEOBJ *palPtr = GDI_GetObjPtr( dc->hPalette, OBJ_PAL );
+        if (palPtr)
         {
-            PALETTEOBJ *palPtr = GDI_GetObjPtr( dc->hPalette, OBJ_PAL );
-            if (palPtr)
-            {
-                realized = dc->funcs->pRealizePalette( dc->physDev, dc->hPalette,
-                                                       (dc->hPalette == hPrimaryPalette) );
-                palPtr->funcs = dc->funcs;
-                GDI_ReleaseObj( dc->hPalette );
-            }
+            realized = physdev->funcs->pRealizePalette( physdev, dc->hPalette,
+                                                        (dc->hPalette == hPrimaryPalette) );
+            palPtr->funcs = dc->funcs;
+            GDI_ReleaseObj( dc->hPalette );
         }
     }
     else TRACE("  skipping (hLastRealizedPalette = %p)\n", hLastRealizedPalette);




More information about the wine-cvs mailing list