From 0d27e3c0ed5743f35ba9af4f6dfeeb346258f6e2 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 11 Mar 2011 18:26:55 +0100 Subject: [PATCH] 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 e7da659fcc7..bdaab13b378 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 969d6607122..0bd7bdb95b3 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 aa9ba4bd237..db7fdc8a849 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 e94ed7b28a8..a60f34272e9 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); -- 2.11.4.GIT