Module: wine Branch: master Commit: 3dcb5db47f6f5b35443386cbd64bb614b672eb1a URL: https://source.winehq.org/git/wine.git/?a=commit;h=3dcb5db47f6f5b35443386cbd...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 5 13:40:00 2021 +0200
gdi32: Reimplement GetObjectA on top of GetObjectW.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/bitmap.c | 1 - dlls/gdi32/brush.c | 1 - dlls/gdi32/dc.c | 1 - dlls/gdi32/dib.c | 1 - dlls/gdi32/font.c | 22 ---------------------- dlls/gdi32/gdi_private.h | 1 - dlls/gdi32/gdiobj.c | 31 ------------------------------- dlls/gdi32/objects.c | 29 +++++++++++++++++++++++++++++ dlls/gdi32/palette.c | 1 - dlls/gdi32/pen.c | 1 - dlls/gdi32/region.c | 1 - 11 files changed, 29 insertions(+), 61 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c index d1805beb99c..aaad76dce36 100644 --- a/dlls/gdi32/bitmap.c +++ b/dlls/gdi32/bitmap.c @@ -37,7 +37,6 @@ static BOOL BITMAP_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs bitmap_funcs = { - BITMAP_GetObject, /* pGetObjectA */ BITMAP_GetObject, /* pGetObjectW */ NULL, /* pUnrealizeObject */ BITMAP_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c index c7b80479594..1d4e45952c9 100644 --- a/dlls/gdi32/brush.c +++ b/dlls/gdi32/brush.c @@ -44,7 +44,6 @@ static BOOL BRUSH_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs brush_funcs = { - BRUSH_GetObject, /* pGetObjectA */ BRUSH_GetObject, /* pGetObjectW */ NULL, /* pUnrealizeObject */ BRUSH_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index d96285c6520..861bc97a78e 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -38,7 +38,6 @@ static BOOL DC_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs dc_funcs = { - NULL, /* pGetObjectA */ NULL, /* pGetObjectW */ NULL, /* pUnrealizeObject */ DC_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index 069b9e77a28..e8d99ac415d 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -83,7 +83,6 @@ static BOOL DIB_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs dib_funcs = { - DIB_GetObject, /* pGetObjectA */ DIB_GetObject, /* pGetObjectW */ NULL, /* pUnrealizeObject */ DIB_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 2a51e3f7411..39f2a76255a 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -180,13 +180,11 @@ static inline WCHAR *strdupW( const WCHAR *p ) return ret; }
-static INT FONT_GetObjectA( HGDIOBJ handle, INT count, LPVOID buffer ); static INT FONT_GetObjectW( HGDIOBJ handle, INT count, LPVOID buffer ); static BOOL FONT_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs fontobj_funcs = { - FONT_GetObjectA, /* pGetObjectA */ FONT_GetObjectW, /* pGetObjectW */ NULL, /* pUnrealizeObject */ FONT_DeleteObject /* pDeleteObject */ @@ -4567,26 +4565,6 @@ HGDIOBJ WINAPI NtGdiSelectFont( HDC hdc, HGDIOBJ handle ) }
-/*********************************************************************** - * FONT_GetObjectA - */ -static INT FONT_GetObjectA( HGDIOBJ handle, INT count, LPVOID buffer ) -{ - FONTOBJ *font = GDI_GetObjPtr( handle, OBJ_FONT ); - LOGFONTA lfA; - - if (!font) return 0; - if (buffer) - { - FONT_LogFontWToA( &font->logfont, &lfA ); - if (count > sizeof(lfA)) count = sizeof(lfA); - memcpy( buffer, &lfA, count ); - } - else count = sizeof(lfA); - GDI_ReleaseObj( handle ); - return count; -} - /*********************************************************************** * FONT_GetObjectW */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index a4bc141811f..02e4c9d26b0 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -50,7 +50,6 @@ typedef struct {
struct gdi_obj_funcs { - INT (*pGetObjectA)( HGDIOBJ handle, INT count, LPVOID buffer ); INT (*pGetObjectW)( HGDIOBJ handle, INT count, LPVOID buffer ); BOOL (*pUnrealizeObject)( HGDIOBJ handle ); BOOL (*pDeleteObject)( HGDIOBJ handle ); diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c index 67c2ddc19e6..af74071aa6d 100644 --- a/dlls/gdi32/gdiobj.c +++ b/dlls/gdi32/gdiobj.c @@ -1028,37 +1028,6 @@ HGDIOBJ WINAPI GetStockObject( INT obj ) }
-/*********************************************************************** - * GetObjectA (GDI32.@) - */ -INT WINAPI GetObjectA( HGDIOBJ handle, INT count, LPVOID buffer ) -{ - GDI_HANDLE_ENTRY *entry; - const struct gdi_obj_funcs *funcs = NULL; - INT result = 0; - - TRACE("%p %d %p\n", handle, count, buffer ); - - EnterCriticalSection( &gdi_section ); - if ((entry = handle_entry( handle ))) - { - funcs = entry_obj( entry )->funcs; - handle = entry_to_handle( entry ); /* make it a full handle */ - } - LeaveCriticalSection( &gdi_section ); - - if (funcs) - { - if (!funcs->pGetObjectA) - SetLastError( ERROR_INVALID_HANDLE ); - else if (buffer && ((ULONG_PTR)buffer >> 16) == 0) /* catch apps getting argument order wrong */ - SetLastError( ERROR_NOACCESS ); - else - result = funcs->pGetObjectA( handle, count, buffer ); - } - return result; -} - /*********************************************************************** * NtGdiExtGetObjectW (win32u.@) */ diff --git a/dlls/gdi32/objects.c b/dlls/gdi32/objects.c index af1e2a19f06..664dcf4f043 100644 --- a/dlls/gdi32/objects.c +++ b/dlls/gdi32/objects.c @@ -23,6 +23,7 @@
#include "windef.h" #include "winbase.h" +#include "winnls.h" #include "ntgdi.h" #include "winternl.h"
@@ -140,3 +141,31 @@ INT WINAPI GetObjectW( HGDIOBJ handle, INT count, void *buffer ) } return result; } + +/*********************************************************************** + * GetObjectA (GDI32.@) + */ +INT WINAPI GetObjectA( HGDIOBJ handle, INT count, void *buffer ) +{ + TRACE("%p %d %p\n", handle, count, buffer ); + + if (get_object_type( handle ) == OBJ_FONT) + { + LOGFONTA *lfA = buffer; + LOGFONTW lf; + + if (!buffer) return sizeof(*lfA); + if (!GetObjectW( handle, sizeof(lf), &lf )) return 0; + if (count > sizeof(*lfA)) count = sizeof(*lfA); + memcpy( lfA, &lf, min( count, FIELD_OFFSET(LOGFONTA, lfFaceName) )); + if (count > FIELD_OFFSET(LOGFONTA, lfFaceName)) + { + WideCharToMultiByte( CP_ACP, 0, lf.lfFaceName, -1, lfA->lfFaceName, + count - FIELD_OFFSET(LOGFONTA, lfFaceName), NULL, NULL ); + if (count == sizeof(*lfA)) lfA->lfFaceName[LF_FACESIZE - 1] = 0; + } + return count; + } + + return GetObjectW( handle, count, buffer ); +} diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c index f9d5851d20e..8584011bda8 100644 --- a/dlls/gdi32/palette.c +++ b/dlls/gdi32/palette.c @@ -55,7 +55,6 @@ static BOOL PALETTE_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs palette_funcs = { - PALETTE_GetObject, /* pGetObjectA */ PALETTE_GetObject, /* pGetObjectW */ PALETTE_UnrealizeObject, /* pUnrealizeObject */ PALETTE_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/pen.c b/dlls/gdi32/pen.c index 0cc242ead5a..8a01125b390 100644 --- a/dlls/gdi32/pen.c +++ b/dlls/gdi32/pen.c @@ -45,7 +45,6 @@ static BOOL PEN_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs pen_funcs = { - PEN_GetObject, /* pGetObjectA */ PEN_GetObject, /* pGetObjectW */ NULL, /* pUnrealizeObject */ PEN_DeleteObject /* pDeleteObject */ diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c index 3d0f9cfc211..2e90e82180e 100644 --- a/dlls/gdi32/region.c +++ b/dlls/gdi32/region.c @@ -111,7 +111,6 @@ static BOOL REGION_DeleteObject( HGDIOBJ handle );
static const struct gdi_obj_funcs region_funcs = { - NULL, /* pGetObjectA */ NULL, /* pGetObjectW */ NULL, /* pUnrealizeObject */ REGION_DeleteObject /* pDeleteObject */