Sync with trunk r65656.
[reactos.git] / win32ss / gdi / gdi32 / include / gdi32p.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
4 * FILE: lib/gdi32/include/gdi32p.h
5 * PURPOSE: User-Mode Win32 GDI Library Private Header
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
7 */
8
9 #pragma once
10
11 /* DATA **********************************************************************/
12
13 extern PGDI_TABLE_ENTRY GdiHandleTable;
14 extern PGDI_SHARED_HANDLE_TABLE GdiSharedHandleTable;
15 extern HANDLE hProcessHeap;
16 extern HANDLE CurrentProcessId;
17 extern DWORD GDI_BatchLimit;
18 extern PDEVCAPS GdiDevCaps;
19 extern BOOL gbLpk; // Global bool LanguagePack
20 extern HANDLE ghSpooler;
21 extern RTL_CRITICAL_SECTION semLocal;
22
23 typedef INT
24 (CALLBACK* EMFPLAYPROC)(
25 HDC hdc,
26 INT iFunction,
27 HANDLE hPageQuery
28 );
29
30 /* DEFINES *******************************************************************/
31
32 #define HANDLE_LIST_INC 20
33
34 #define METAFILE_MEMORY 1
35 #define METAFILE_DISK 2
36
37 #define SAPCALLBACKDELAY 244
38
39 /* MACRO ********************************************************************/
40
41 #define ROP_USES_SOURCE(Rop) (((Rop) << 2 ^ Rop) & 0xCC0000)
42
43 /* TYPES *********************************************************************/
44
45 // Based on wmfapi.h and Wine.
46 typedef struct tagMETAFILEDC
47 {
48 PVOID pvMetaBuffer;
49 HANDLE hFile;
50 DWORD Size;
51 DWORD dwWritten;
52 METAHEADER mh;
53 WORD reserved;
54 HLOCAL MFObjList;
55 HPEN hPen;
56 HBRUSH hBrush;
57 HDC hDc;
58 HGDIOBJ hMetaDc;
59 HPALETTE hPalette;
60 HFONT hFont;
61 HBITMAP hBitmap;
62 HRGN hRegion;
63 HGDIOBJ hMetafile;
64 HGDIOBJ hMemDc;
65 HPEN hExtPen;
66 HGDIOBJ hEnhMetaDc;
67 HGDIOBJ hEnhMetaFile;
68 HCOLORSPACE hColorSpace;
69 WCHAR Filename[MAX_PATH+2];
70 } METAFILEDC,*PMETAFILEDC;
71
72 // Metafile Entry handle
73 typedef struct tagMF_ENTRY
74 {
75 LIST_ENTRY List;
76 HGDIOBJ hmDC; // Handle return from NtGdiCreateClientObj.
77 PMETAFILEDC pmfDC;
78 } MF_ENTRY, *PMF_ENTRY;
79
80 typedef struct tagENHMETAFILE
81 {
82 PVOID pvMetaBuffer;
83 HANDLE hFile; /* Handle for disk based MetaFile */
84 DWORD Size;
85 INT iType;
86 PENHMETAHEADER emf;
87 UINT handles_size, cur_handles;
88 HGDIOBJ *handles;
89 INT horzres, vertres;
90 INT horzsize, vertsize;
91 INT logpixelsx, logpixelsy;
92 INT bitspixel;
93 INT textcaps;
94 INT rastercaps;
95 INT technology;
96 INT planes;
97 } ENHMETAFILE,*PENHMETAFILE;
98
99
100 #define PDEV_UMPD_ID 0xFEDCBA98
101 // UMPDEV flags
102 #define UMPDEV_NO_ESCAPE 0x0002
103 #define UMPDEV_SUPPORT_ESCAPE 0x0004
104 typedef struct _UMPDEV
105 {
106 DWORD Sig; // Init with PDEV_UMPD_ID
107 struct _UMPDEV *pumpdNext;
108 PDRIVER_INFO_5W pdi5Info;
109 HMODULE hModule;
110 DWORD dwFlags;
111 DWORD dwDriverAttributes;
112 DWORD dwConfigVersion; // Number of times the configuration
113 // file for this driver has been upgraded
114 // or downgraded since the last spooler restart.
115 DWORD dwDriverCount; // After init should be 2
116 DWORD WOW64_UMPDev;
117 DWORD WOW64_hMod;
118 DWORD Unknown;
119 PVOID apfn[INDEX_LAST]; // Print Driver pfn
120 } UMPDEV, *PUMPDEV;
121
122 #define LOCALFONT_COUNT 10
123 typedef struct _LOCALFONT
124 {
125 FONT_ATTR lfa[LOCALFONT_COUNT];
126 } LOCALFONT, *PLOCALFONT;
127
128 // sdk/winspool.h
129 typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE);
130 typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE);
131 typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
132 typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
133 typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
134 typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE);
135 typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE);
136 typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
137 typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
138 typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8
139 typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t);
140 typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
141 typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
142 typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
143 typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *);
144 typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
145 typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
146 // ddk/winsplp.h
147 typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
148 typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
149 // Same as ddk/winsplp.h DriverUnloadComplete?
150 typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
151 // Driver support:
152 // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
153 typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
154 // DrvQueryColorProfile
155 typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
156 // Unknown:
157 typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
158 typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
159
160 extern CLOSEPRINTER fpClosePrinter;
161 extern OPENPRINTERW fpOpenPrinterW;
162
163 /* FUNCTIONS *****************************************************************/
164
165 PVOID
166 HEAP_alloc(DWORD len);
167
168 NTSTATUS
169 HEAP_strdupA2W(
170 LPWSTR* ppszW,
171 LPCSTR lpszA
172 );
173
174 VOID
175 HEAP_free(LPVOID memory);
176
177 VOID
178 FASTCALL
179 FONT_TextMetricWToA(
180 const TEXTMETRICW *ptmW,
181 LPTEXTMETRICA ptmA
182 );
183
184 VOID
185 FASTCALL
186 NewTextMetricW2A(
187 NEWTEXTMETRICA *tma,
188 NEWTEXTMETRICW *tmw
189 );
190
191 VOID
192 FASTCALL
193 NewTextMetricExW2A(
194 NEWTEXTMETRICEXA *tma,
195 NEWTEXTMETRICEXW *tmw
196 );
197
198 BOOL
199 FASTCALL
200 DeleteRegion( HRGN );
201
202 BOOL
203 GdiIsHandleValid(HGDIOBJ hGdiObj);
204
205 BOOL
206 GdiGetHandleUserData(
207 HGDIOBJ hGdiObj,
208 DWORD ObjectType,
209 PVOID *UserData
210 );
211
212 PLDC
213 FASTCALL
214 GdiGetLDC(HDC hDC);
215
216 BOOL
217 FASTCALL
218 GdiSetLDC(HDC hdc, PVOID pvLDC);
219
220 HGDIOBJ
221 WINAPI
222 GdiFixUpHandle(HGDIOBJ hGO);
223
224 BOOL
225 WINAPI
226 CalculateColorTableSize(
227 CONST BITMAPINFOHEADER *BitmapInfoHeader,
228 UINT *ColorSpec,
229 UINT *ColorTableSize
230 );
231
232 LPBITMAPINFO
233 WINAPI
234 ConvertBitmapInfo(
235 CONST BITMAPINFO *BitmapInfo,
236 UINT ColorSpec,
237 UINT *BitmapInfoSize,
238 BOOL FollowedByData
239 );
240
241 DWORD
242 WINAPI
243 GetAndSetDCDWord(
244 _In_ HDC hdc,
245 _In_ UINT u,
246 _In_ DWORD dwIn,
247 _In_ ULONG ulMFId,
248 _In_ USHORT usMF16Id,
249 _In_ DWORD dwError);
250
251 DWORD
252 WINAPI
253 GetDCDWord(
254 _In_ HDC hdc,
255 _In_ UINT u,
256 _In_ DWORD dwError);
257
258 HGDIOBJ
259 WINAPI
260 GetDCObject( HDC, INT);
261
262 VOID
263 NTAPI
264 LogFontA2W(
265 LPLOGFONTW pW,
266 CONST LOGFONTA *pA
267 );
268
269 VOID
270 NTAPI
271 LogFontW2A(
272 LPLOGFONTA pA,
273 CONST LOGFONTW *pW
274 );
275
276 VOID
277 WINAPI
278 EnumLogFontExW2A(
279 LPENUMLOGFONTEXA fontA,
280 CONST ENUMLOGFONTEXW *fontW );
281
282 BOOL
283 WINAPI
284 GetETM(HDC hdc,
285 EXTTEXTMETRIC *petm);
286
287 /* FIXME: Put in some public header */
288 UINT
289 WINAPI
290 UserRealizePalette(HDC hDC);
291
292 int
293 WINAPI
294 GdiAddFontResourceW(LPCWSTR lpszFilename,FLONG fl,DESIGNVECTOR *pdv);
295
296 VOID
297 WINAPI
298 GdiSetLastError( DWORD dwErrCode );
299
300 DWORD WINAPI GdiGetCodePage(HDC);
301
302 int
303 WINAPI
304 GdiGetBitmapBitsSize(BITMAPINFO *lpbmi);
305
306 VOID GdiSAPCallback(PLDC pldc);
307 HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE,COLORREF);
308
309 int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
310 BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE);
311 BOOL FASTCALL LoadTheSpoolerDrv(VOID);
312
313 FORCEINLINE
314 PVOID
315 GdiAllocBatchCommand(
316 HDC hdc,
317 USHORT Cmd)
318 {
319 PTEB pTeb;
320 USHORT cjSize;
321 PGDIBATCHHDR pHdr;
322
323 /* Get a pointer to the TEB */
324 pTeb = NtCurrentTeb();
325
326 /* Check if we have a valid environment */
327 if (!pTeb || !pTeb->Win32ThreadInfo) return NULL;
328
329 /* Do we use a DC? */
330 if (hdc)
331 {
332 /* If the batch DC is NULL, we set this one as the new one */
333 if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
334
335 /* If not, check if the batch DC equal to our DC */
336 else if (pTeb->GdiTebBatch.HDC != hdc) return NULL;
337 }
338
339 /* Get the size of the entry */
340 if (Cmd == GdiBCPatBlt) cjSize = 0;
341 else if (Cmd == GdiBCPolyPatBlt) cjSize = 0;
342 else if (Cmd == GdiBCTextOut) cjSize = 0;
343 else if (Cmd == GdiBCExtTextOut) cjSize = 0;
344 else if (Cmd == GdiBCSetBrushOrg) cjSize = sizeof(GDIBSSETBRHORG);
345 else if (Cmd == GdiBCExtSelClipRgn) cjSize = 0;
346 else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT);
347 else if (Cmd == GdiBCDelRgn) cjSize = sizeof(GDIBSOBJECT);
348 else if (Cmd == GdiBCDelObj) cjSize = sizeof(GDIBSOBJECT);
349 else cjSize = 0;
350
351 /* Unsupported operation */
352 if (cjSize == 0) return NULL;
353
354 /* Check if the buffer is full */
355 if ((pTeb->GdiBatchCount >= GDI_BatchLimit) ||
356 ((pTeb->GdiTebBatch.Offset + cjSize) > GDIBATCHBUFSIZE))
357 {
358 /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
359 the current batch */
360 NtGdiFlush();
361 }
362
363 /* Get the head of the entry */
364 pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset);
365
366 /* Update Offset and batch count */
367 pTeb->GdiTebBatch.Offset += cjSize;
368 pTeb->GdiBatchCount++;
369
370 /* Fill in the core fields */
371 pHdr->Cmd = Cmd;
372 pHdr->Size = cjSize;
373
374 return pHdr;
375 }
376
377 FORCEINLINE
378 PDC_ATTR
379 GdiGetDcAttr(HDC hdc)
380 {
381 GDILOOBJTYPE eDcObjType;
382 PDC_ATTR pdcattr;
383
384 /* Check DC object type */
385 eDcObjType = GDI_HANDLE_GET_TYPE(hdc);
386 if ((eDcObjType != GDILoObjType_LO_DC_TYPE) &&
387 (eDcObjType != GDILoObjType_LO_ALTDC_TYPE))
388 {
389 return NULL;
390 }
391
392 /* Get the DC attribute */
393 if (!GdiGetHandleUserData((HGDIOBJ)hdc, eDcObjType, (PVOID*)&pdcattr))
394 {
395 return NULL;
396 }
397
398 return pdcattr;
399 }
400
401 #ifdef _M_IX86
402 FLOATL FASTCALL EFtoF(EFLOAT_S * efp);
403 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo)
404 #else
405 #define FOtoF(pfo) (*(pfo))
406 #endif
407
408 /* This is an inlined version of lrintf. */
409 FORCEINLINE
410 int
411 _lrintf(float f)
412 {
413 #if defined(_M_IX86) && defined(__GNUC__)
414 int result;
415 __asm__ __volatile__ ("fistpl %0" : "=m" (result) : "t" (f) : "st");
416 return result;
417 #elif defined(_M_IX86) && defined(_MSC_VER)
418 int result;
419 __asm
420 {
421 fld f;
422 fistp result;
423 }
424 #else
425 /* slow, but portable */
426 return (int)(f >= 0 ? f+0.5 : f-0.5);
427 #endif
428 }
429
430 HGDIOBJ
431 WINAPI
432 GdiInsertClientObj(
433 _In_ PVOID pvObject,
434 _In_ GDILOOBJTYPE eObjType);
435
436 PVOID
437 WINAPI
438 GdiGetClientObject(
439 _In_ HGDIOBJ hobj);
440
441 PVOID
442 WINAPI
443 GdiRemoveClientObject(
444 _In_ HGDIOBJ hobj);
445
446 /* EOF */