From cfe10b7a75ee9981318fc58070f9d84bb48eab02 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Fri, 22 Sep 2006 20:19:49 +0000 Subject: [PATCH] Implement BRUSH_GetObject it is not perfect, it return wrong color in some case. But we get down from 20 to 11 fails in wine test. Wine say GetObject (HANDLE obj, INT Count, PVOID * Buffer) if Buffer is NULL return the requeuer size in bytes svn path=/trunk/; revision=24229 --- reactos/subsystems/win32/win32k/include/brush.h | 2 ++ reactos/subsystems/win32/win32k/objects/brush.c | 13 +++++++++++++ reactos/subsystems/win32/win32k/objects/dc.c | 8 +++++--- reactos/subsystems/win32/win32k/objects/text.c | 15 +++++++++------ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index 54b2a4b7369..c1e854ab02a 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -72,6 +72,8 @@ typedef struct #define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH) #define BRUSHOBJ_LockBrush(hBrush) ((PGDIBRUSHOBJ)GDIOBJ_LockObj(GdiHandleTable, (HGDIOBJ)hBrush, GDI_OBJECT_TYPE_BRUSH)) #define BRUSHOBJ_UnlockBrush(pBrush) GDIOBJ_UnlockObjByPtr(GdiHandleTable, pBrush) + +INT FASTCALL BRUSH_GetObject (PGDIBRUSHOBJ GdiObject, INT Count, BRUSHOBJ * Buffer); BOOL INTERNAL_CALL BRUSH_Cleanup(PVOID ObjectBody); #endif diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index ca2dbdea09c..426a05774ad 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -49,6 +49,19 @@ BRUSH_Cleanup(PVOID ObjectBody) return TRUE; } +INT FASTCALL +BRUSH_GetObject (PGDIBRUSHOBJ BrushObj, INT Count, BRUSHOBJ * Buffer) +{ + if (Buffer) + { + Buffer->iSolidColor = BrushObj->BrushAttr.lbColor; + Buffer->pvRbrush = BrushObj->ulRealization; + Buffer->flColorType = 0; + } + return sizeof(BRUSHOBJ); +} + + XLATEOBJ* FASTCALL IntGdiCreateBrushXlate(PDC Dc, GDIBRUSHOBJ *BrushObj, BOOLEAN *Failed) { diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index f3a43d4607e..4fd4a2bf545 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -1716,6 +1716,7 @@ NtGdiGetDeviceCaps(HDC hDC, DC_GET_VAL( INT, NtGdiGetMapMode, w.MapMode ) DC_GET_VAL( INT, NtGdiGetPolyFillMode, w.polyFillMode ) + INT FASTCALL IntGdiGetObject(HANDLE Handle, INT Count, LPVOID Buffer) { @@ -1737,10 +1738,11 @@ IntGdiGetObject(HANDLE Handle, INT Count, LPVOID Buffer) case GDI_OBJECT_TYPE_PEN: Result = PEN_GetObject((PENOBJ *) GdiObject, Count, Buffer); break; - case GDI_OBJECT_TYPE_BRUSH: - Result = BRUSH_GetObject((BRUSHOBJ *) GdiObject, Count, Buffer); - break; #endif + case GDI_OBJECT_TYPE_BRUSH: + Result = BRUSH_GetObject((PGDIBRUSHOBJ ) GdiObject, Count, (BRUSHOBJ *)Buffer); + break; + case GDI_OBJECT_TYPE_BITMAP: Result = BITMAP_GetObject((BITMAPOBJ *) GdiObject, Count, Buffer); break; diff --git a/reactos/subsystems/win32/win32k/objects/text.c b/reactos/subsystems/win32/win32k/objects/text.c index 9e5549c0022..84229a78d9c 100644 --- a/reactos/subsystems/win32/win32k/objects/text.c +++ b/reactos/subsystems/win32/win32k/objects/text.c @@ -3917,13 +3917,16 @@ TextIntRealizeFont(HFONT FontHandle) INT FASTCALL FontGetObject(PTEXTOBJ Font, INT Count, PVOID Buffer) { - if (Count < sizeof(LOGFONTW)) - { - SetLastWin32Error(ERROR_BUFFER_OVERFLOW); - return 0; - } + if (Buffer) + { + if (Count < sizeof(LOGFONTW)) + { + SetLastWin32Error(ERROR_BUFFER_OVERFLOW); + return 0; + } - RtlCopyMemory(Buffer, &Font->logfont, sizeof(LOGFONTW)); + RtlCopyMemory(Buffer, &Font->logfont, sizeof(LOGFONTW)); + } return sizeof(LOGFONTW); }