mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:26:17 +00:00
[WIN32K]
- Make brush structure definition C++ compatible - Add delete callback for GDI objects and use if for brushes. - Make IntGdiSetSolidBrushColor NTAPI instead of FASTCALL svn path=/trunk/; revision=66891
This commit is contained in:
parent
20d7540340
commit
0f8766d749
4 changed files with 93 additions and 20 deletions
|
@ -154,6 +154,16 @@ BRUSH_vCleanup(PVOID ObjectBody)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
BRUSH_vDeleteObject(
|
||||||
|
PVOID pvObject)
|
||||||
|
{
|
||||||
|
BRUSH_vCleanup(pvObject);
|
||||||
|
ExFreePoolWithTag(pvObject, GDITAG_HMGR_BRUSH_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
INT
|
INT
|
||||||
FASTCALL
|
FASTCALL
|
||||||
BRUSH_GetObject(PBRUSH pbrush, INT cjSize, LPLOGBRUSH plogbrush)
|
BRUSH_GetObject(PBRUSH pbrush, INT cjSize, LPLOGBRUSH plogbrush)
|
||||||
|
@ -385,7 +395,7 @@ IntGdiCreateNullBrush(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
NTAPI
|
||||||
IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color)
|
IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color)
|
||||||
{
|
{
|
||||||
PBRUSH pbrush;
|
PBRUSH pbrush;
|
||||||
|
|
|
@ -11,12 +11,8 @@
|
||||||
* DON'T MODIFY THIS STRUCTURE UNLESS REALLY NEEDED AND EVEN THEN ASK ON
|
* DON'T MODIFY THIS STRUCTURE UNLESS REALLY NEEDED AND EVEN THEN ASK ON
|
||||||
* A MAILING LIST FIRST.
|
* 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!
|
ULONG iHatch; // This is not the brush style, but the hatch style!
|
||||||
HBITMAP hbmPattern;
|
HBITMAP hbmPattern;
|
||||||
HBITMAP hbmClient;
|
HBITMAP hbmClient;
|
||||||
|
@ -34,6 +30,8 @@ typedef struct _BRUSH
|
||||||
PVOID pvRBrush;
|
PVOID pvRBrush;
|
||||||
HDEV hdev;
|
HDEV hdev;
|
||||||
//DWORD unk054;
|
//DWORD unk054;
|
||||||
|
|
||||||
|
/* The following members are for PENs only */
|
||||||
LONG lWidth;
|
LONG lWidth;
|
||||||
FLOAT eWidth;
|
FLOAT eWidth;
|
||||||
ULONG ulPenStyle;
|
ULONG ulPenStyle;
|
||||||
|
@ -47,7 +45,21 @@ typedef struct _BRUSH
|
||||||
//DWORD unk078; // 0x078
|
//DWORD unk078; // 0x078
|
||||||
DWORD unk07c; // 0x07c
|
DWORD unk07c; // 0x07c
|
||||||
LIST_ENTRY ListHead; // 0x080
|
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;
|
} BRUSH, *PBRUSH;
|
||||||
|
#else
|
||||||
|
class BRUSH;
|
||||||
|
typedef class BRUSH *PBRUSH;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _EBRUSHOBJ
|
typedef struct _EBRUSHOBJ
|
||||||
{
|
{
|
||||||
|
@ -68,7 +80,7 @@ typedef struct _EBRUSHOBJ
|
||||||
struct _PALETTE * ppalDC;
|
struct _PALETTE * ppalDC;
|
||||||
struct _PALETTE * ppalDIB;
|
struct _PALETTE * ppalDIB;
|
||||||
// DWORD dwUnknown44;
|
// DWORD dwUnknown44;
|
||||||
BRUSH * pbrush;
|
PBRUSH pbrush;
|
||||||
FLONG flattrs;
|
FLONG flattrs;
|
||||||
DWORD ulUnique;
|
DWORD ulUnique;
|
||||||
// DWORD dwUnknown54;
|
// DWORD dwUnknown54;
|
||||||
|
@ -109,8 +121,8 @@ BRUSH_GetObject(
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
BRUSH_vCleanup(
|
BRUSH_vDeleteObject(
|
||||||
PVOID ObjectBody);
|
PVOID pvObject);
|
||||||
|
|
||||||
extern HSURF gahsurfHatch[HS_DDI_MAX];
|
extern HSURF gahsurfHatch[HS_DDI_MAX];
|
||||||
|
|
||||||
|
@ -188,5 +200,8 @@ IntGdiCreateSolidBrush(
|
||||||
HBRUSH APIENTRY
|
HBRUSH APIENTRY
|
||||||
IntGdiCreateNullBrush(VOID);
|
IntGdiCreateNullBrush(VOID);
|
||||||
|
|
||||||
VOID FASTCALL
|
VOID
|
||||||
IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color);
|
NTAPI
|
||||||
|
IntGdiSetSolidBrushColor(
|
||||||
|
_In_ HBRUSH hbr,
|
||||||
|
_In_ COLORREF crColor);
|
||||||
|
|
|
@ -159,7 +159,7 @@ apfnCleanup[] =
|
||||||
NULL, /* 0d GDIObjType_PFT_TYPE, unused */
|
NULL, /* 0d GDIObjType_PFT_TYPE, unused */
|
||||||
GDIOBJ_vCleanup, /* 0e GDIObjType_ICMCXF_TYPE */
|
GDIOBJ_vCleanup, /* 0e GDIObjType_ICMCXF_TYPE */
|
||||||
NULL, /* 0f GDIObjType_SPRITE_TYPE, unused */
|
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, /* 11 GDIObjType_UMPD_TYPE, unused */
|
||||||
NULL, /* 12 GDIObjType_UNUSED4_TYPE */
|
NULL, /* 12 GDIObjType_UNUSED4_TYPE */
|
||||||
NULL, /* 13 GDIObjType_SPACE_TYPE, unused */
|
NULL, /* 13 GDIObjType_SPACE_TYPE, unused */
|
||||||
|
@ -177,6 +177,44 @@ apfnCleanup[] =
|
||||||
NULL, /* 1f reserved entry */
|
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 ********************************************************/
|
/* INTERNAL FUNCTIONS ********************************************************/
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -547,18 +585,27 @@ GDIOBJ_vFreeObject(POBJ pobj)
|
||||||
/* Get the object type */
|
/* Get the object type */
|
||||||
objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0x1f;
|
objt = ((ULONG_PTR)pobj->hHmgr >> 16) & 0x1f;
|
||||||
|
|
||||||
/* Call the cleanup procedure */
|
/* Check if we have a delete procedure (for C++ based objects) */
|
||||||
ASSERT(apfnCleanup[objt]);
|
if (apfnDelete[objt] != NULL)
|
||||||
apfnCleanup[objt](pobj);
|
|
||||||
|
|
||||||
/* Check if the object is allocated from a lookaside list */
|
|
||||||
if (pobj->BaseFlags & BASEFLAG_LOOKASIDE)
|
|
||||||
{
|
{
|
||||||
ExFreeToPagedLookasideList(&gpaLookasideList[objt], pobj);
|
/* Invoke the delete procedure */
|
||||||
|
apfnDelete[objt](pobj);
|
||||||
}
|
}
|
||||||
else
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ extern PGDI_HANDLE_TABLE GdiHandleTable;
|
||||||
typedef PVOID PGDIOBJ;
|
typedef PVOID PGDIOBJ;
|
||||||
|
|
||||||
typedef VOID (NTAPI *GDICLEANUPPROC)(PVOID ObjectBody);
|
typedef VOID (NTAPI *GDICLEANUPPROC)(PVOID ObjectBody);
|
||||||
|
typedef VOID (NTAPI *GDIOBJDELETEPROC)(PVOID ObjectBody);
|
||||||
|
|
||||||
/* Every GDI Object must have this standard type of header.
|
/* Every GDI Object must have this standard type of header.
|
||||||
* It's for thread locking. */
|
* It's for thread locking. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue