diff --git a/reactos/win32ss/gdi/ntgdi/brush.c b/reactos/win32ss/gdi/ntgdi/brush.c index 53d331713d7..7d8bb6d1207 100644 --- a/reactos/win32ss/gdi/ntgdi/brush.c +++ b/reactos/win32ss/gdi/ntgdi/brush.c @@ -154,6 +154,16 @@ BRUSH_vCleanup(PVOID ObjectBody) } } +VOID +NTAPI +BRUSH_vDeleteObject( + PVOID pvObject) +{ + BRUSH_vCleanup(pvObject); + ExFreePoolWithTag(pvObject, GDITAG_HMGR_BRUSH_TYPE); +} + + INT FASTCALL BRUSH_GetObject(PBRUSH pbrush, INT cjSize, LPLOGBRUSH plogbrush) @@ -385,7 +395,7 @@ IntGdiCreateNullBrush(VOID) } VOID -FASTCALL +NTAPI IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color) { PBRUSH pbrush; diff --git a/reactos/win32ss/gdi/ntgdi/brush.h b/reactos/win32ss/gdi/ntgdi/brush.h index 79ffd968193..ec1759b5870 100644 --- a/reactos/win32ss/gdi/ntgdi/brush.h +++ b/reactos/win32ss/gdi/ntgdi/brush.h @@ -11,12 +11,8 @@ * DON'T MODIFY THIS STRUCTURE UNLESS REALLY NEEDED AND EVEN THEN ASK ON * A MAILING LIST FIRST. */ -typedef struct _BRUSH +typedef struct _BRUSHBODY { - /* Header for all gdi objects in the handle table. - Do not (re)move this. */ - BASEOBJECT BaseObject; - ULONG iHatch; // This is not the brush style, but the hatch style! HBITMAP hbmPattern; HBITMAP hbmClient; @@ -34,6 +30,8 @@ typedef struct _BRUSH PVOID pvRBrush; HDEV hdev; //DWORD unk054; + + /* The following members are for PENs only */ LONG lWidth; FLOAT eWidth; ULONG ulPenStyle; @@ -47,7 +45,21 @@ typedef struct _BRUSH //DWORD unk078; // 0x078 DWORD unk07c; // 0x07c LIST_ENTRY ListHead; // 0x080 +} BRUSHBODY; + +#ifndef __cplusplus +typedef struct _BRUSH +{ + /* Header for all gdi objects in the handle table. + Do not (re)move this. */ + BASEOBJECT BaseObject; + + BRUSHBODY; } BRUSH, *PBRUSH; +#else +class BRUSH; +typedef class BRUSH *PBRUSH; +#endif typedef struct _EBRUSHOBJ { @@ -68,7 +80,7 @@ typedef struct _EBRUSHOBJ struct _PALETTE * ppalDC; struct _PALETTE * ppalDIB; // DWORD dwUnknown44; - BRUSH * pbrush; + PBRUSH pbrush; FLONG flattrs; DWORD ulUnique; // DWORD dwUnknown54; @@ -109,8 +121,8 @@ BRUSH_GetObject( VOID NTAPI -BRUSH_vCleanup( - PVOID ObjectBody); +BRUSH_vDeleteObject( + PVOID pvObject); extern HSURF gahsurfHatch[HS_DDI_MAX]; @@ -188,5 +200,8 @@ IntGdiCreateSolidBrush( HBRUSH APIENTRY IntGdiCreateNullBrush(VOID); -VOID FASTCALL -IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color); +VOID +NTAPI +IntGdiSetSolidBrushColor( + _In_ HBRUSH hbr, + _In_ COLORREF crColor); diff --git a/reactos/win32ss/gdi/ntgdi/gdiobj.c b/reactos/win32ss/gdi/ntgdi/gdiobj.c index a6a4e747190..594f14b9985 100644 --- a/reactos/win32ss/gdi/ntgdi/gdiobj.c +++ b/reactos/win32ss/gdi/ntgdi/gdiobj.c @@ -159,7 +159,7 @@ apfnCleanup[] = NULL, /* 0d GDIObjType_PFT_TYPE, unused */ GDIOBJ_vCleanup, /* 0e GDIObjType_ICMCXF_TYPE */ NULL, /* 0f GDIObjType_SPRITE_TYPE, unused */ - BRUSH_vCleanup, /* 10 GDIObjType_BRUSH_TYPE, BRUSH, PEN, EXTPEN */ + NULL, /* 10 GDIObjType_BRUSH_TYPE, BRUSH, PEN, EXTPEN */ NULL, /* 11 GDIObjType_UMPD_TYPE, unused */ NULL, /* 12 GDIObjType_UNUSED4_TYPE */ NULL, /* 13 GDIObjType_SPACE_TYPE, unused */ @@ -177,6 +177,44 @@ apfnCleanup[] = NULL, /* 1f reserved entry */ }; +static const +GDIOBJDELETEPROC +apfnDelete[] = +{ + NULL, /* 00 GDIObjType_DEF_TYPE */ + NULL, /* 01 GDIObjType_DC_TYPE */ + NULL, /* 02 GDIObjType_UNUSED1_TYPE */ + NULL, /* 03 GDIObjType_UNUSED2_TYPE */ + NULL, /* 04 GDIObjType_RGN_TYPE */ + NULL, /* 05 GDIObjType_SURF_TYPE */ + NULL, /* 06 GDIObjType_CLIENTOBJ_TYPE */ + NULL, /* 07 GDIObjType_PATH_TYPE */ + NULL, /* 08 GDIObjType_PAL_TYPE */ + NULL, /* 09 GDIObjType_ICMLCS_TYPE */ + NULL, /* 0a GDIObjType_LFONT_TYPE */ + NULL, /* 0b GDIObjType_RFONT_TYPE, unused */ + NULL, /* 0c GDIObjType_PFE_TYPE, unused */ + NULL, /* 0d GDIObjType_PFT_TYPE, unused */ + NULL, /* 0e GDIObjType_ICMCXF_TYPE */ + NULL, /* 0f GDIObjType_SPRITE_TYPE, unused */ + BRUSH_vDeleteObject, /* 10 GDIObjType_BRUSH_TYPE, BRUSH, PEN, EXTPEN */ + NULL, /* 11 GDIObjType_UMPD_TYPE, unused */ + NULL, /* 12 GDIObjType_UNUSED4_TYPE */ + NULL, /* 13 GDIObjType_SPACE_TYPE, unused */ + NULL, /* 14 GDIObjType_UNUSED5_TYPE */ + NULL, /* 15 GDIObjType_META_TYPE, unused */ + NULL, /* 16 GDIObjType_EFSTATE_TYPE, unused */ + NULL, /* 17 GDIObjType_BMFD_TYPE, unused */ + NULL, /* 18 GDIObjType_VTFD_TYPE, unused */ + NULL, /* 19 GDIObjType_TTFD_TYPE, unused */ + NULL, /* 1a GDIObjType_RC_TYPE, unused */ + NULL, /* 1b GDIObjType_TEMP_TYPE, unused */ + NULL, /* 1c GDIObjType_DRVOBJ_TYPE */ + NULL, /* 1d GDIObjType_DCIOBJ_TYPE, unused */ + NULL, /* 1e GDIObjType_SPOOL_TYPE, unused */ + NULL, /* 1f reserved entry */ +}; + /* INTERNAL FUNCTIONS ********************************************************/ static @@ -547,18 +585,27 @@ GDIOBJ_vFreeObject(POBJ pobj) /* Get the object type */ objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0x1f; - /* Call the cleanup procedure */ - ASSERT(apfnCleanup[objt]); - apfnCleanup[objt](pobj); - - /* Check if the object is allocated from a lookaside list */ - if (pobj->BaseFlags & BASEFLAG_LOOKASIDE) + /* Check if we have a delete procedure (for C++ based objects) */ + if (apfnDelete[objt] != NULL) { - ExFreeToPagedLookasideList(&gpaLookasideList[objt], pobj); + /* Invoke the delete procedure */ + apfnDelete[objt](pobj); } else { - ExFreePoolWithTag(pobj, GDIOBJ_POOL_TAG(objt)); + /* Call the cleanup procedure */ + NT_ASSERT(apfnCleanup[objt]); + apfnCleanup[objt](pobj); + + /* Check if the object is allocated from a lookaside list */ + if (pobj->BaseFlags & BASEFLAG_LOOKASIDE) + { + ExFreeToPagedLookasideList(&gpaLookasideList[objt], pobj); + } + else + { + ExFreePoolWithTag(pobj, GDIOBJ_POOL_TAG(objt)); + } } } diff --git a/reactos/win32ss/gdi/ntgdi/gdiobj.h b/reactos/win32ss/gdi/ntgdi/gdiobj.h index 82146b5226c..5a475f379df 100644 --- a/reactos/win32ss/gdi/ntgdi/gdiobj.h +++ b/reactos/win32ss/gdi/ntgdi/gdiobj.h @@ -31,6 +31,7 @@ extern PGDI_HANDLE_TABLE GdiHandleTable; typedef PVOID PGDIOBJ; typedef VOID (NTAPI *GDICLEANUPPROC)(PVOID ObjectBody); +typedef VOID (NTAPI *GDIOBJDELETEPROC)(PVOID ObjectBody); /* Every GDI Object must have this standard type of header. * It's for thread locking. */