diff --git a/reactos/subsystems/win32/win32k/include/pen.h b/reactos/subsystems/win32/win32k/include/pen.h index 558ddfa5994..bb6ad01c4d6 100644 --- a/reactos/subsystems/win32/win32k/include/pen.h +++ b/reactos/subsystems/win32/win32k/include/pen.h @@ -15,6 +15,5 @@ #define PENOBJ_UnlockPen(pPenObj) GDIOBJ_UnlockObjByPtr(GdiHandleTable, pPenObj) INT STDCALL PEN_GetObject(PGDIBRUSHOBJ hPen, INT Count, PLOGPEN Buffer); -BOOL INTERNAL_CALL EXTPEN_Cleanup(PVOID ObjectBody); #endif diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 1fc144a4121..da9b73afdff 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -46,6 +46,12 @@ BRUSH_Cleanup(PVOID ObjectBody) NtGdiDeleteObject(pBrush->hbmPattern); } + /* Free the kmode styles array of EXTPENS */ + if (pBrush->pStyle) + { + ExFreePool(pBrush->pStyle); + } + return TRUE; } diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index e04ae94e7bf..64f824e8475 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -75,11 +75,11 @@ GDI_OBJ_INFO ObjInfo[] = {GDI_OBJECT_TYPE_DC, sizeof(DC), DC_Cleanup}, {GDI_OBJECT_TYPE_PALETTE, sizeof(PALGDI), PALETTE_Cleanup}, {GDI_OBJECT_TYPE_BRUSH, sizeof(GDIBRUSHOBJ), BRUSH_Cleanup}, - {GDI_OBJECT_TYPE_PEN, sizeof(GDIBRUSHOBJ), GDI_CleanupDummy}, + {GDI_OBJECT_TYPE_PEN, sizeof(GDIBRUSHOBJ), BRUSH_Cleanup}, {GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ), GDI_CleanupDummy}, {GDI_OBJECT_TYPE_DIRECTDRAW, sizeof(DD_DIRECTDRAW), DD_Cleanup}, {GDI_OBJECT_TYPE_DD_SURFACE, sizeof(DD_SURFACE), DDSURF_Cleanup}, - {GDI_OBJECT_TYPE_EXTPEN, sizeof(GDIBRUSHOBJ), EXTPEN_Cleanup}, + {GDI_OBJECT_TYPE_EXTPEN, sizeof(GDIBRUSHOBJ), BRUSH_Cleanup}, /* FIXME do not use normal DC struct for this */ {GDI_OBJECT_TYPE_METADC, sizeof(DC), GDI_CleanupDummy}, {GDI_OBJECT_TYPE_METAFILE, sizeof(DC), GDI_CleanupDummy}, @@ -89,6 +89,51 @@ GDI_OBJ_INFO ObjInfo[] = #define OBJTYPE_COUNT (sizeof(ObjInfo) / sizeof(ObjInfo[0])) +typedef struct +{ + BOOL bUseLookaside; + ULONG_PTR ulBodySize; + ULONG Tag; + GDICLEANUPPROC CleanupProc; +} OBJ_TYPE_INFO, *POBJ_TYPE_INFO; + +static const +OBJ_TYPE_INFO ObjTypeInfo[] = +{ + {0, 0, 0, NULL}, /* 00 reserved entry */ + {1, sizeof(DC), GDI_OBJECT_TAG_DC, DC_Cleanup}, /* 01 DC */ + {1, sizeof(DD_DIRECTDRAW), GDI_OBJECT_TAG_DDRAW, DD_Cleanup}, /* 02 DD_DDRAW, should be moved away from gdi objects */ + {1, sizeof(DD_SURFACE), GDI_OBJECT_TAG_DDSURF, DDSURF_Cleanup}, /* 03 DD_SURFACE, should be moved away from gdi objects */ + {1, sizeof(ROSRGNDATA), GDI_OBJECT_TAG_REGION, RGNDATA_Cleanup}, /* 04 REGION */ + {1, sizeof(BITMAPOBJ), GDI_OBJECT_TAG_BITMAP, BITMAP_Cleanup}, /* 05 BITMAP */ + {0, sizeof(DC), GDI_OBJECT_TAG_CLIOBJ, GDI_CleanupDummy}, /* 06 CLIOBJ: METADC,... FIXME: don't use DC struct */ + {0, 0, GDI_OBJECT_TAG_PATH, NULL}, /* 07 PATH, unused */ + {1, sizeof(PALGDI), GDI_OBJECT_TAG_PALETTE, PALETTE_Cleanup}, /* 08 PALETTE */ + {0, 0, GDI_OBJECT_TAG_COLSPC, NULL}, /* 09 COLORSPACE, unused */ + {1, sizeof(TEXTOBJ), GDI_OBJECT_TAG_FONT, GDI_CleanupDummy}, /* 0a FONT */ + {0, 0, 0, NULL}, /* 0b RFONT, unused */ + {0, 0, 0, NULL}, /* 0c PFE, unused */ + {0, 0, 0, NULL}, /* 0d PFT, unused */ + {0, 0, 0, NULL}, /* 0e ICMCXF, unused */ + {0, 0, 0, NULL}, /* 0f ICMDLL, unused */ + {1, sizeof(GDIBRUSHOBJ), GDI_OBJECT_TAG_BRUSH, BRUSH_Cleanup}, /* 10 BRUSH, PEN, EXTPEN */ + {0, 0, 0, NULL}, /* 11 D3D_HANDLE, unused */ + {0, 0, 0, NULL}, /* 12 DD_VPORT, unused */ + {0, 0, 0, NULL}, /* 13 SPACE, unused */ + {0, 0, 0, NULL}, /* 14 DD_MOTION, unused */ + {0, 0, 0, NULL}, /* 15 META, unused */ + {0, 0, 0, NULL}, /* 16 ENUMFONT, unused */ + {0, 0, 0, NULL}, /* 18 VTFD, unused */ + {0, 0, 0, NULL}, /* 19 TTFD, unused */ + {0, 0, 0, NULL}, /* 1a RC, unused */ + {0, 0, 0, NULL}, /* 1b TEMP, unused */ + {0, 0, 0, NULL}, /* 1c DRVOBJ, unused */ + {0, 0, 0, NULL}, /* 1d DCIOBJ, unused */ + {0, 0, 0, NULL}, /* 1e SPOOL, unused */ +}; + +#define BASE_OBJTYPE_COUNT (sizeof(ObjTypeInfo) / sizeof(ObjTypeInfo[0])) + static LARGE_INTEGER ShortDelay; #define DelayExecution() \ diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index 8271a0d325c..3b03631af6e 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -201,19 +201,6 @@ PEN_GetObject(PGDIBRUSHOBJ pPenObject, INT cbCount, PLOGPEN pBuffer) return cbRetCount; } -BOOL INTERNAL_CALL -EXTPEN_Cleanup(PVOID ObjectBody) -{ - PGDIBRUSHOBJ pPenObject = (PGDIBRUSHOBJ)ObjectBody; - - /* Free the kmode Styles array */ - if (pPenObject->pStyle) - { - ExFreePool(pPenObject->pStyle); - } - return TRUE; -} - /* PUBLIC FUNCTIONS ***********************************************************/ HPEN STDCALL