1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Win32 Graphical Subsystem (WIN32K) 4 * FILE: win32ss/include/ntgdihdl.h 5 * PURPOSE: Win32 Shared GDI Handle/Object Types 6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net) 7 */ 8 9 /* INCLUDES ******************************************************************/ 10 11 #ifndef _NTGDIHDL_ 12 #define _NTGDIHDL_ 13 14 #include <winddi.h> 15 16 /* DEFINES *******************************************************************/ 17 18 /* GDI handle table can hold 0x10000 handles */ 19 #define GDI_HANDLE_COUNT 0x10000 20 #define GDI_CFONT_MAX 16 21 22 /* Handle Masks and shifts */ 23 #define GDI_HANDLE_INDEX_MASK (GDI_HANDLE_COUNT - 1) 24 #define GDI_HANDLE_TYPE_MASK 0x007f0000 25 #define GDI_HANDLE_BASETYPE_MASK 0x001f0000 26 #define GDI_HANDLE_EXTYPE_MASK 0x00600000 27 #define GDI_HANDLE_STOCK_MASK 0x00800000 28 #define GDI_HANDLE_REUSE_MASK 0xff000000 29 #define GDI_HANDLE_UPPER_MASK (GDI_HANDLE_TYPE_MASK|GDI_HANDLE_STOCK_MASK|GDI_HANDLE_REUSE_MASK) 30 #define GDI_HANDLE_REUSECNT_SHIFT 24 31 #define GDI_HANDLE_BASETYPE_SHIFT 16 32 33 #define GDI_ENTRY_STOCK_MASK 0x00000080 34 #define GDI_ENTRY_BASETYPE_MASK 0x001f0000 35 #define GDI_ENTRY_UPPER_SHIFT 16 36 37 /* GDI Entry Flags */ 38 #define GDI_ENTRY_UNDELETABLE 1 /* Mark Object as nonremovable */ 39 #define GDI_ENTRY_DELETING 2 /* Used when deleting Font Objects */ 40 #define GDI_ENTRY_VALIDATE_VIS 4 /* Validating Visible region data */ 41 #define GDI_ENTRY_ALLOCATE_LAL 0x80 /* Object Allocated with Look aside List */ 42 43 /*! \defgroup GDI object types 44 * 45 * GDI object types 46 * 47 */ 48 /*@{*/ 49 #define GDI_OBJECT_TYPE_DC 0x00010000 50 #define GDI_OBJECT_TYPE_DD_SURFACE 0x00030000 /* Should be moved away from gdi objects */ 51 #define GDI_OBJECT_TYPE_REGION 0x00040000 52 #define GDI_OBJECT_TYPE_BITMAP 0x00050000 53 #define GDI_OBJECT_TYPE_CLIOBJ 0x00060000 54 #define GDI_OBJECT_TYPE_PATH 0x00070000 55 #define GDI_OBJECT_TYPE_PALETTE 0x00080000 56 #define GDI_OBJECT_TYPE_COLORSPACE 0x00090000 57 #define GDI_OBJECT_TYPE_FONT 0x000a0000 58 59 #define GDI_OBJECT_TYPE_BRUSH 0x00100000 60 #define GDI_OBJECT_TYPE_DD_VIDEOPORT 0x00120000 /* Should be moved away from gdi objects */ 61 #define GDI_OBJECT_TYPE_DD_MOTIONCOMP 0x00140000 /* Should be moved away from gdi objects */ 62 #define GDI_OBJECT_TYPE_ENUMFONT 0x00160000 63 #define GDI_OBJECT_TYPE_DRIVEROBJ 0x001C0000 64 65 /* Confrim on XP value is taken from NtGdiCreateDirectDrawObject */ 66 #define GDI_OBJECT_TYPE_DIRECTDRAW 0x00200000 67 68 /* Following object types are derived types from the above base types 69 use 0x001f0000 as mask to get the base type */ 70 #define GDI_OBJECT_TYPE_EMF 0x00210000 71 72 #define GDI_OBJECT_TYPE_METAFILE 0x00260000 73 #define GDI_OBJECT_TYPE_ENHMETAFILE 0x00460000 74 #define GDI_OBJECT_TYPE_PEN 0x00300000 75 #define GDI_OBJECT_TYPE_EXTPEN 0x00500000 76 #define GDI_OBJECT_TYPE_METADC 0x00660000 77 /*#define GDI_OBJECT_TYPE_DD_PALETTE 0x00630000 unused at the moment, other value required */ 78 /*#define GDI_OBJECT_TYPE_DD_CLIPPER 0x00640000 unused at the moment, other value required */ 79 80 /* Following object types made up for ROS */ 81 #define GDI_OBJECT_TYPE_DONTCARE 0x007f0000 82 /** Not really an object type. Forces GDI_FreeObj to be silent. */ 83 #define GDI_OBJECT_TYPE_SILENT 0x80000000 84 /*@}*/ 85 86 /* Handle macros */ 87 #define GDI_HANDLE_CREATE(i, t) \ 88 ((HANDLE)(((i) & GDI_HANDLE_INDEX_MASK) | ((t) & GDI_HANDLE_TYPE_MASK))) 89 90 #define GDI_HANDLE_GET_INDEX(h) \ 91 (((ULONG_PTR)(h)) & GDI_HANDLE_INDEX_MASK) 92 93 #define GDI_HANDLE_GET_TYPE(h) \ 94 (((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK) 95 96 #define GDI_HANDLE_IS_TYPE(h, t) \ 97 ((t) == (((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK)) 98 99 #define GDI_HANDLE_IS_STOCKOBJ(h) \ 100 (0 != (((ULONG_PTR)(h)) & GDI_HANDLE_STOCK_MASK)) 101 102 #define GDI_HANDLE_SET_STOCKOBJ(h) \ 103 ((h) = (HANDLE)(((ULONG_PTR)(h)) | GDI_HANDLE_STOCK_MASK)) 104 105 #define GDI_HANDLE_GET_UPPER(h) \ 106 (((ULONG_PTR)(h)) & GDI_HANDLE_UPPER_MASK) 107 108 #define GDI_HANDLE_GET_REUSECNT(h) \ 109 (((ULONG_PTR)(h)) >> GDI_HANDLE_REUSECNT_SHIFT) 110 111 #define GDI_OBJECT_GET_TYPE_INDEX(t) \ 112 ((t & GDI_HANDLE_BASETYPE_MASK) >> GDI_HANDLE_BASETYPE_SHIFT) 113 114 /* Gdi Object Handle Managment Pid lock masking sets. */ 115 /* Ref: used with DxEngSetDCOwner */ 116 #define GDI_OBJ_HMGR_PUBLIC 0 /* Public owner, Open access? */ 117 #define GDI_OBJ_HMGR_POWNED 0x80000002 /* Set to current owner. */ 118 #define GDI_OBJ_HMGR_NONE 0x80000012 /* No owner, Open access? */ 119 #define GDI_OBJ_HMGR_RESTRICTED 0x80000022 /* Restricted? */ 120 121 122 /* DC_ATTR Dirty Flags */ 123 #define DIRTY_FILL 0x00000001 124 #define DIRTY_LINE 0x00000002 125 #define DIRTY_TEXT 0x00000004 126 #define DIRTY_BACKGROUND 0x00000008 127 #define DIRTY_CHARSET 0x00000010 128 #define SLOW_WIDTHS 0x00000020 129 #define DC_CACHED_TM_VALID 0x00000040 130 #define DISPLAY_DC 0x00000080 131 #define DIRTY_PTLCURRENT 0x00000100 132 #define DIRTY_PTFXCURRENT 0x00000200 133 #define DIRTY_STYLESTATE 0x00000400 134 #define DC_PLAYMETAFILE 0x00000800 135 #define DC_BRUSH_DIRTY 0x00001000 136 #define DC_PEN_DIRTY 0x00002000 137 #define DC_DIBSECTION 0x00004000 138 #define DC_LAST_CLIPRGN_VALID 0x00008000 139 #define DC_PRIMARY_DISPLAY 0x00010000 140 #define DC_ICM_NOT_CALIBRATED 0x00020000 141 #define DC_ICM_BRUSH_DIRTY 0x00040000 142 #define DC_ICM_PEN_DIRTY 0x00080000 143 #define DC_ICM_NOT_SET 0x00100000 144 #define DC_MODE_DIRTY 0x00200000 145 #define DC_FONTTEXT_DIRTY 0x00400000 146 147 /* DC_ATTR LCD Flags */ 148 #define LDC_LDC 0x00000001 /* (init) local DC other than a normal DC */ 149 #define LDC_EMFLDC 0x00000002 /* Enhance Meta File local DC */ 150 #define LDC_SAPCALLBACK 0x00000020 151 #define LDC_INIT_DOCUMENT 0x00000040 152 #define LDC_INIT_PAGE 0x00000080 153 #define LDC_STARTPAGE 0x00000100 154 #define LDC_NEXTBAND 0x00000200 155 #define LDC_FONTHASH 0x00001000 156 #define LDC_CLOCKWISE 0x00002000 157 #define LDC_NEWFONT 0x00008000 158 #define LDC_KILL_DOCUMENT 0x00010000 159 #define LDC_META_PRINT 0x00020000 160 #define LDC_DIRECT 0x00040000 161 #define LDC_RESET_BANDING 0x00080000 162 #define LDC_DOWNLOADFONTS 0x00100000 163 #define LDC_RESETDC 0x00200000 164 #define LDC_UFIMAP 0x00400000 165 #define LDC_INFODC 0x01000000 /* If CreateIC was passed. */ 166 #define LDC_DEVCAPS 0x02000000 167 #define LDC_XPS_PASS 0x08000000 // Guessing, not sure. 168 #define LDC_ATENDPAGE 0x10000000 169 #define LDC_COLORPAGE 0x20000000 170 171 #define UFIHASHTABLESIZE 64 172 173 /* DC_ATTR Xform Flags */ 174 #define METAFILE_TO_WORLD_IDENTITY 0x00000001 175 #define WORLD_TO_PAGE_IDENTITY 0x00000002 176 #define DEVICE_TO_PAGE_INVALID 0x00000008 177 #define DEVICE_TO_WORLD_INVALID 0x00000010 178 #define WORLD_TRANSFORM_SET 0x00000020 179 #define POSITIVE_Y_IS_UP 0x00000040 180 #define INVALIDATE_ATTRIBUTES 0x00000080 181 #define PTOD_EFM11_NEGATIVE 0x00000100 182 #define PTOD_EFM22_NEGATIVE 0x00000200 183 #define ISO_OR_ANISO_MAP_MODE 0x00000400 184 #define PAGE_TO_DEVICE_IDENTITY 0x00000800 185 #define PAGE_TO_DEVICE_SCALE_IDENTITY 0x00001000 186 #define PAGE_XLATE_CHANGED 0x00002000 187 #define PAGE_EXTENTS_CHANGED 0x00004000 188 #define WORLD_XFORM_CHANGED 0x00008000 189 190 /* BRUSH/RGN_ATTR Flags */ 191 #define ATTR_CACHED 0x00000001 192 #define ATTR_TO_BE_DELETED 0x00000002 193 #define ATTR_NEW_COLOR 0x00000004 194 #define ATTR_CANT_SELECT 0x00000008 195 #define ATTR_RGN_VALID 0x00000010 196 #define ATTR_RGN_DIRTY 0x00000020 197 198 /* Set/Clear Bitmap/Brush Stock Attribute */ 199 #define SC_BB_STOCKOBJ 1 200 201 /* TYPES *********************************************************************/ 202 203 typedef struct _GDI_TABLE_ENTRY 204 { 205 PVOID KernelData; /* Points to the kernel mode structure */ 206 DWORD ProcessId; /* process id that created the object, 0 for stock objects */ 207 union{ /* temp union structure. */ 208 LONG Type; /* the first 16 bit is the object type including the stock obj flag, the last 16 bits is just the object type */ 209 struct{ 210 USHORT FullUnique; /* unique */ 211 UCHAR ObjectType; /* objt */ 212 UCHAR Flags; /* Flags */ 213 };}; 214 PVOID UserData; /* pUser Points to the user mode structure, usually NULL though */ 215 } GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY; 216 217 typedef struct _ENTRY 218 { 219 union _EINFO 220 { 221 struct _BASEOBJECT *pobj; 222 HGDIOBJ hFree; 223 } einfo; 224 225 union _OBJECTOWNER 226 { 227 struct _OBJECTOWNER_S 228 { 229 unsigned Lock:1; 230 unsigned Pid_Shifted:31; 231 } Share; 232 ULONG ulObj; 233 } ObjectOwner; 234 235 USHORT FullUnique; 236 UCHAR Objt; 237 UCHAR Flags; 238 PVOID pUser; 239 } ENTRY, *PENTRY; 240 241 /* 242 * User space only structure! 243 */ 244 typedef struct __GDI_SHARED_HANDLE_TABLE /* Must match win32k/include/gdiobj.h */ 245 { 246 GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT]; /* Handle table. */ 247 DEVCAPS DevCaps; /* Shared device capabilities. */ 248 FLONG flDeviceUniq; /* Device settings uniqueness. */ 249 PVOID pvLangPack; /* Lanuage Pack. */ 250 CFONT cfPublic[GDI_CFONT_MAX]; /* Public Fonts. */ 251 DWORD dwCFCount; 252 } GDI_SHARED_HANDLE_TABLE, *PGDI_SHARED_HANDLE_TABLE; 253 254 typedef struct _RGN_ATTR 255 { 256 ULONG AttrFlags; 257 ULONG iComplexity; /* Clipping region's complexity. NULL, SIMPLE & COMPLEXREGION */ 258 RECTL Rect; 259 } RGN_ATTR,*PRGN_ATTR; 260 261 /* Local DC structure (_DC_ATTR) PVOID pvLDC; */ 262 typedef struct _LDC 263 { 264 HDC hDC; 265 ULONG Flags; 266 INT iType; 267 PVOID pvEmfDC; /* Pointer to ENHMETAFILE structure */ 268 LPWSTR pwszPort; 269 ABORTPROC pAbortProc; /* AbortProc for Printing */ 270 DWORD CallBackTick; 271 HANDLE hPrinter; /* Local or Remote Printer driver */ 272 PDEVMODEW pdm; 273 PVOID pUMPDev; /* Ptr to User Mode Printer Device structure */ 274 PUMDHPDEV pUMdhpdev; /* Ptr to Combined UMPD and DHPDEV structure */ 275 PVOID UFIHashTable[3]; 276 UNIVERSAL_FONT_ID ufi; 277 PVOID pvEMFSpoolData; 278 ULONG cjSize; 279 LIST_ENTRY leRecords; 280 DEVCAPS DevCaps; 281 HBRUSH BrushColor; 282 HPEN PenColor; 283 // wine data 284 DWORD dwData[5]; 285 } LDC, *PLDC; 286 287 typedef struct _DC_ATTR 288 { 289 PVOID pvLDC; 290 ULONG ulDirty_; 291 HANDLE hbrush; 292 HANDLE hpen; 293 COLORREF crBackgroundClr; 294 ULONG ulBackgroundClr; 295 COLORREF crForegroundClr; 296 ULONG ulForegroundClr; 297 COLORREF crBrushClr; 298 ULONG ulBrushClr; 299 COLORREF crPenClr; 300 ULONG ulPenClr; 301 DWORD iCS_CP; 302 INT iGraphicsMode; 303 BYTE jROP2; 304 BYTE jBkMode; 305 BYTE jFillMode; 306 BYTE jStretchBltMode; 307 POINTL ptlCurrent; 308 POINTL ptfxCurrent; 309 LONG lBkMode; 310 LONG lFillMode; 311 LONG lStretchBltMode; 312 FLONG flFontMapper; 313 LONG lIcmMode; 314 HANDLE hcmXform; 315 HCOLORSPACE hColorSpace; 316 FLONG flIcmFlags; 317 INT IcmBrushColor; 318 INT IcmPenColor; 319 PVOID pvLIcm; 320 FLONG flTextAlign; 321 LONG lTextAlign; 322 LONG lTextExtra; 323 LONG lRelAbs; 324 LONG lBreakExtra; 325 LONG cBreak; 326 HANDLE hlfntNew; 327 MATRIX mxWorldToDevice; 328 MATRIX mxDeviceToWorld; 329 MATRIX mxWorldToPage; 330 FLOATOBJ efM11PtoD; 331 FLOATOBJ efM22PtoD; 332 FLOATOBJ efDxPtoD; 333 FLOATOBJ efDyPtoD; 334 INT iMapMode; 335 DWORD dwLayout; 336 LONG lWindowOrgx; 337 POINTL ptlWindowOrg; 338 SIZEL szlWindowExt; 339 POINTL ptlViewportOrg; 340 SIZEL szlViewportExt; 341 FLONG flXform; 342 SIZEL szlVirtualDevicePixel; 343 SIZEL szlVirtualDeviceMm; 344 SIZEL szlVirtualDeviceSize; 345 POINTL ptlBrushOrigin; 346 RGN_ATTR VisRectRegion; 347 } DC_ATTR, *PDC_ATTR; 348 349 typedef struct _BRUSH_ATTR /* Used with pen too. */ 350 { 351 FLONG AttrFlags; 352 COLORREF lbColor; 353 } BRUSH_ATTR, *PBRUSH_ATTR; 354 355 typedef struct _FONT_ATTR 356 { 357 BOOL bSlowWidths; 358 PCFONT pCharWidthData; 359 } FONT_ATTR, *PFONT_ATTR; 360 361 362 #endif 363