xref: /reactos/win32ss/include/ntgdihdl.h (revision 7353af1e)
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 OBJ Types */
123 #define DC_TYPE_DIRECT 0  /* normal device context */
124 #define DC_TYPE_MEMORY 1  /* memory device context */
125 #define DC_TYPE_INFO   2  /* information context */
126 
127 /* DC OBJ Flags */
128 #define DC_FLAG_DISPLAY            0x0001
129 #define DC_FLAG_DIRECT             0x0002
130 #define DC_FLAG_CANCELLED          0x0004
131 #define DC_FLAG_PERMANENT          0x0008
132 #define DC_FLAG_DIRTY_RAO          0x0010
133 #define DC_FLAG_ACCUM_WMGR         0x0020
134 #define DC_FLAG_ACCUM_APP          0x0040
135 #define DC_FLAG_RESET              0x0080
136 #define DC_FLAG_SYNCHRONIZEACCESS  0x0100
137 #define DC_FLAG_EPSPRINTINGESCAPE  0x0200
138 #define DC_FLAG_TEMPINFODC         0x0400
139 #define DC_FLAG_FULLSCREEN         0x0800
140 #define DC_FLAG_IN_CLONEPDEV       0x1000
141 #define DC_FLAG_REDIRECTION        0x2000
142 #define DC_FLAG_SHAREACCESS        0x4000
143 
144 /* DC_ATTR Dirty Flags */
145 #define DIRTY_FILL                          0x00000001
146 #define DIRTY_LINE                          0x00000002
147 #define DIRTY_TEXT                          0x00000004
148 #define DIRTY_BACKGROUND                    0x00000008
149 #define DIRTY_CHARSET                       0x00000010
150 #define SLOW_WIDTHS                         0x00000020
151 #define DC_CACHED_TM_VALID                  0x00000040
152 #define DISPLAY_DC                          0x00000080
153 #define DIRTY_PTLCURRENT                    0x00000100
154 #define DIRTY_PTFXCURRENT                   0x00000200
155 #define DIRTY_STYLESTATE                    0x00000400
156 #define DC_PLAYMETAFILE                     0x00000800
157 #define DC_BRUSH_DIRTY                      0x00001000
158 #define DC_PEN_DIRTY                        0x00002000
159 #define DC_DIBSECTION                       0x00004000
160 #define DC_LAST_CLIPRGN_VALID               0x00008000
161 #define DC_PRIMARY_DISPLAY                  0x00010000
162 #define DC_ICM_NOT_CALIBRATED               0x00020000
163 #define DC_ICM_BRUSH_DIRTY                  0x00040000
164 #define DC_ICM_PEN_DIRTY                    0x00080000
165 #define DC_ICM_NOT_SET                      0x00100000
166 #define DC_MODE_DIRTY                       0x00200000
167 #define DC_FONTTEXT_DIRTY                   0x00400000
168 
169 /* DC_ATTR LCD Flags */
170 #define LDC_LDC           0x00000001 /* (init) local DC other than a normal DC */
171 #define LDC_EMFLDC        0x00000002 /* Enhance Meta File local DC */
172 #define LDC_SAPCALLBACK   0x00000020
173 #define LDC_INIT_DOCUMENT 0x00000040
174 #define LDC_INIT_PAGE     0x00000080
175 #define LDC_STARTPAGE     0x00000100
176 #define LDC_NEXTBAND      0x00000200
177 #define LDC_FONTHASH      0x00001000
178 #define LDC_CLOCKWISE     0x00002000
179 #define LDC_NEWFONT       0x00008000
180 #define LDC_KILL_DOCUMENT 0x00010000
181 #define LDC_META_PRINT    0x00020000
182 #define LDC_DIRECT        0x00040000
183 #define LDC_RESET_BANDING 0x00080000
184 #define LDC_DOWNLOADFONTS 0x00100000
185 #define LDC_RESETDC       0x00200000
186 #define LDC_UFIMAP        0x00400000
187 #define LDC_INFODC        0x01000000 /* If CreateIC was passed. */
188 #define LDC_DEVCAPS       0x02000000
189 #define LDC_XPS_PASS      0x08000000 // Guessing, not sure.
190 #define LDC_ATENDPAGE     0x10000000
191 #define LDC_COLORPAGE     0x20000000
192 
193 #define UFIHASHTABLESIZE  64
194 
195 /* DC_ATTR Xform Flags */
196 #define METAFILE_TO_WORLD_IDENTITY          0x00000001
197 #define WORLD_TO_PAGE_IDENTITY              0x00000002
198 #define DEVICE_TO_PAGE_INVALID              0x00000008
199 #define DEVICE_TO_WORLD_INVALID             0x00000010
200 #define WORLD_TRANSFORM_SET                 0x00000020
201 #define POSITIVE_Y_IS_UP                    0x00000040
202 #define INVALIDATE_ATTRIBUTES               0x00000080
203 #define PTOD_EFM11_NEGATIVE                 0x00000100
204 #define PTOD_EFM22_NEGATIVE                 0x00000200
205 #define ISO_OR_ANISO_MAP_MODE               0x00000400
206 #define PAGE_TO_DEVICE_IDENTITY             0x00000800
207 #define PAGE_TO_DEVICE_SCALE_IDENTITY       0x00001000
208 #define PAGE_XLATE_CHANGED                  0x00002000
209 #define PAGE_EXTENTS_CHANGED                0x00004000
210 #define WORLD_XFORM_CHANGED                 0x00008000
211 
212 /* BRUSH/RGN_ATTR Flags */
213 #define ATTR_CACHED                         0x00000001
214 #define ATTR_TO_BE_DELETED                  0x00000002
215 #define ATTR_NEW_COLOR                      0x00000004
216 #define ATTR_CANT_SELECT                    0x00000008
217 #define ATTR_RGN_VALID                      0x00000010
218 #define ATTR_RGN_DIRTY                      0x00000020
219 
220 /* Set/Clear Bitmap/Brush Stock Attribute */
221 #define SC_BB_STOCKOBJ 1
222 
223 /* TYPES *********************************************************************/
224 
225 typedef struct _GDI_TABLE_ENTRY
226 {
227     PVOID KernelData; /* Points to the kernel mode structure */
228     DWORD ProcessId;  /* process id that created the object, 0 for stock objects */
229     union{            /* temp union structure. */
230     LONG  Type;       /* the first 16 bit is the object type including the stock obj flag, the last 16 bits is just the object type */
231     struct{
232     USHORT FullUnique; /* unique */
233     UCHAR  ObjectType; /* objt */
234     UCHAR  Flags;      /* Flags */
235     };};
236     PVOID UserData;   /* pUser Points to the user mode structure, usually NULL though */
237 } GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY;
238 
239 typedef struct _ENTRY
240 {
241     union _EINFO
242     {
243         struct _BASEOBJECT *pobj;
244         HGDIOBJ hFree;
245     } einfo;
246 
247     union _OBJECTOWNER
248     {
249         struct _OBJECTOWNER_S
250         {
251             unsigned Lock:1;
252             unsigned Pid_Shifted:31;
253         } Share;
254         ULONG ulObj;
255     } ObjectOwner;
256 
257     USHORT FullUnique;
258     UCHAR Objt;
259     UCHAR Flags;
260     PVOID pUser;
261 } ENTRY, *PENTRY;
262 
263 /*
264  * User space only structure!
265  */
266 typedef struct __GDI_SHARED_HANDLE_TABLE /* Must match win32k/include/gdiobj.h */
267 {
268     GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT]; /* Handle table. */
269     DEVCAPS         DevCaps;                   /* Shared device capabilities. */
270     FLONG           flDeviceUniq;              /* Device settings uniqueness. */
271     PVOID           pvLangPack;                /* Lanuage Pack. */
272     CFONT           cfPublic[GDI_CFONT_MAX];   /* Public Fonts. */
273     DWORD           dwCFCount;
274 } GDI_SHARED_HANDLE_TABLE, *PGDI_SHARED_HANDLE_TABLE;
275 
276 typedef struct _RGN_ATTR
277 {
278     ULONG AttrFlags;
279     ULONG iComplexity;     /* Clipping region's complexity. NULL, SIMPLE & COMPLEXREGION */
280     RECTL Rect;
281 } RGN_ATTR,*PRGN_ATTR;
282 
283 /* Local DC structure (_DC_ATTR) PVOID pvLDC; */
284 typedef struct _LDC
285 {
286     HDC hDC;
287     ULONG Flags;
288     INT iType;
289     PVOID pvEmfDC;        /* Pointer to ENHMETAFILE structure */
290     LPWSTR pwszPort;
291     ABORTPROC pAbortProc; /* AbortProc for Printing */
292     DWORD CallBackTick;
293     HANDLE hPrinter;      /* Local or Remote Printer driver */
294     PDEVMODEW pdm;
295     PVOID pUMPDev;        /* Ptr to User Mode Printer Device structure */
296     PUMDHPDEV pUMdhpdev;  /* Ptr to Combined UMPD and DHPDEV structure */
297     PVOID UFIHashTable[3];
298     UNIVERSAL_FONT_ID ufi;
299     PVOID pvEMFSpoolData;
300     ULONG cjSize;
301     LIST_ENTRY leRecords;
302     DEVCAPS DevCaps;
303     HBRUSH BrushColor;
304     HPEN PenColor;
305     // wine data
306     DWORD dwData[5];
307 } LDC, *PLDC;
308 
309 typedef struct _DC_ATTR
310 {
311     PVOID pvLDC;
312     ULONG ulDirty_;
313     HANDLE hbrush;
314     HANDLE hpen;
315     COLORREF crBackgroundClr;
316     ULONG ulBackgroundClr;
317     COLORREF crForegroundClr;
318     ULONG ulForegroundClr;
319     COLORREF crBrushClr;
320     ULONG ulBrushClr;
321     COLORREF crPenClr;
322     ULONG ulPenClr;
323     DWORD iCS_CP;
324     INT iGraphicsMode;
325     BYTE jROP2;
326     BYTE jBkMode;
327     BYTE jFillMode;
328     BYTE jStretchBltMode;
329     POINTL ptlCurrent;
330     POINTL ptfxCurrent;
331     LONG lBkMode;
332     LONG lFillMode;
333     LONG lStretchBltMode;
334     FLONG flFontMapper;
335     LONG lIcmMode;
336     HANDLE hcmXform;
337     HCOLORSPACE hColorSpace;
338     FLONG flIcmFlags;
339     INT IcmBrushColor;
340     INT IcmPenColor;
341     PVOID pvLIcm;
342     FLONG flTextAlign;
343     LONG lTextAlign;
344     LONG lTextExtra;
345     LONG lRelAbs;
346     LONG lBreakExtra;
347     LONG cBreak;
348     HANDLE hlfntNew;
349     MATRIX mxWorldToDevice;
350     MATRIX mxDeviceToWorld;
351     MATRIX mxWorldToPage;
352     FLOATOBJ efM11PtoD;
353     FLOATOBJ efM22PtoD;
354     FLOATOBJ efDxPtoD;
355     FLOATOBJ efDyPtoD;
356     INT iMapMode;
357     DWORD dwLayout;
358     LONG lWindowOrgx;
359     POINTL ptlWindowOrg;
360     SIZEL szlWindowExt;
361     POINTL ptlViewportOrg;
362     SIZEL szlViewportExt;
363     FLONG flXform;
364     SIZEL szlVirtualDevicePixel;
365     SIZEL szlVirtualDeviceMm;
366     SIZEL szlVirtualDeviceSize;
367     POINTL ptlBrushOrigin;
368     RGN_ATTR VisRectRegion;
369 } DC_ATTR, *PDC_ATTR;
370 
371 typedef struct _BRUSH_ATTR /* Used with pen too. */
372 {
373     FLONG    AttrFlags;
374     COLORREF lbColor;
375 } BRUSH_ATTR, *PBRUSH_ATTR;
376 
377 typedef struct _FONT_ATTR
378 {
379     BOOL    bSlowWidths;
380     PCFONT  pCharWidthData;
381 } FONT_ATTR, *PFONT_ATTR;
382 
383 
384 #endif
385