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)
11 /* DATA **********************************************************************/
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
;
24 (CALLBACK
* EMFPLAYPROC
)(
30 /* DEFINES *******************************************************************/
32 #define HANDLE_LIST_INC 20
34 #define METAFILE_MEMORY 1
35 #define METAFILE_DISK 2
37 #define SAPCALLBACKDELAY 244
39 /* MACRO ********************************************************************/
41 #define ROP_USES_SOURCE(Rop) (((Rop) << 2 ^ Rop) & 0xCC0000)
43 /* TYPES *********************************************************************/
45 // Based on wmfapi.h and Wine.
46 typedef struct tagMETAFILEDC
68 HCOLORSPACE hColorSpace
;
69 WCHAR Filename
[MAX_PATH
+2];
70 } METAFILEDC
,*PMETAFILEDC
;
72 // Metafile Entry handle
73 typedef struct tagMF_ENTRY
76 HGDIOBJ hmDC
; // Handle return from NtGdiCreateClientObj.
78 } MF_ENTRY
, *PMF_ENTRY
;
80 typedef struct tagENHMETAFILE
83 HANDLE hFile
; /* Handle for disk based MetaFile */
87 UINT handles_size
, cur_handles
;
90 INT horzsize
, vertsize
;
91 INT logpixelsx
, logpixelsy
;
97 } ENHMETAFILE
,*PENHMETAFILE
;
100 #define PDEV_UMPD_ID 0xFEDCBA98
102 #define UMPDEV_NO_ESCAPE 0x0002
103 #define UMPDEV_SUPPORT_ESCAPE 0x0004
104 typedef struct _UMPDEV
106 DWORD Sig
; // Init with PDEV_UMPD_ID
107 struct _UMPDEV
*pumpdNext
;
108 PDRIVER_INFO_5W pdi5Info
;
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
119 PVOID apfn
[INDEX_LAST
]; // Print Driver pfn
122 #define LOCALFONT_COUNT 10
123 typedef struct _LOCALFONT
125 FONT_ATTR lfa
[LOCALFONT_COUNT
];
126 } LOCALFONT
, *PLOCALFONT
;
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
);
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
);
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
);
157 typedef DWORD (WINAPI
*QUERYSPOOLMODE
) (HANDLE
,DWORD
,DWORD
);
158 typedef DWORD (WINAPI
*QUERYREMOTEFONTS
) (DWORD
,DWORD
,DWORD
);
160 extern CLOSEPRINTER fpClosePrinter
;
161 extern OPENPRINTERW fpOpenPrinterW
;
163 /* FUNCTIONS *****************************************************************/
166 HEAP_alloc(DWORD len
);
175 HEAP_free(LPVOID memory
);
180 const TEXTMETRICW
*ptmW
,
194 NEWTEXTMETRICEXA
*tma
,
195 NEWTEXTMETRICEXW
*tmw
200 DeleteRegion( HRGN
);
203 GdiIsHandleValid(HGDIOBJ hGdiObj
);
206 GdiGetHandleUserData(
218 GdiFixUpHandle(HGDIOBJ hGO
);
222 CalculateColorTableSize(
223 CONST BITMAPINFOHEADER
*BitmapInfoHeader
,
231 CONST BITMAPINFO
*BitmapInfo
,
233 UINT
*BitmapInfoSize
,
239 GetAndSetDCDWord( HDC
, INT
, DWORD
, DWORD
, DWORD
, DWORD
);
243 GetDCDWord( HDC
, INT
, DWORD
);
247 GetDCObject( HDC
, INT
);
266 LPENUMLOGFONTEXA fontA
,
267 CONST ENUMLOGFONTEXW
*fontW
);
269 /* FIXME: Put in some public header */
272 UserRealizePalette(HDC hDC
);
276 GdiAddFontResourceW(LPCWSTR lpszFilename
,FLONG fl
,DESIGNVECTOR
*pdv
);
280 GdiSetLastError( DWORD dwErrCode
);
282 DWORD WINAPI
GdiGetCodePage(HDC
);
286 GdiGetBitmapBitsSize(BITMAPINFO
*lpbmi
);
288 VOID
GdiSAPCallback(PLDC pldc
);
289 HGDIOBJ FASTCALL
hGetPEBHandle(HANDLECACHETYPE
,COLORREF
);
291 int FASTCALL
DocumentEventEx(PVOID
,HANDLE
,HDC
,int,ULONG
,PVOID
,ULONG
,PVOID
);
292 BOOL FASTCALL
EndPagePrinterEx(PVOID
,HANDLE
);
293 BOOL FASTCALL
LoadTheSpoolerDrv(VOID
);
297 GdiAllocBatchCommand(
305 /* Get a pointer to the TEB */
306 pTeb
= NtCurrentTeb();
308 /* Check if we have a valid environment */
309 if (!pTeb
|| !pTeb
->Win32ThreadInfo
) return NULL
;
311 /* Do we use a DC? */
314 /* If the batch DC is NULL, we set this one as the new one */
315 if (!pTeb
->GdiTebBatch
.HDC
) pTeb
->GdiTebBatch
.HDC
= hdc
;
317 /* If not, check if the batch DC equal to our DC */
318 else if (pTeb
->GdiTebBatch
.HDC
!= hdc
) return NULL
;
321 /* Get the size of the entry */
322 if (Cmd
== GdiBCPatBlt
) cjSize
= 0;
323 else if (Cmd
== GdiBCPolyPatBlt
) cjSize
= 0;
324 else if (Cmd
== GdiBCTextOut
) cjSize
= 0;
325 else if (Cmd
== GdiBCExtTextOut
) cjSize
= 0;
326 else if (Cmd
== GdiBCSetBrushOrg
) cjSize
= 0;
327 else if (Cmd
== GdiBCExtSelClipRgn
) cjSize
= 0;
328 else if (Cmd
== GdiBCSelObj
) cjSize
= sizeof(GDIBSOBJECT
);
329 else if (Cmd
== GdiBCDelRgn
) cjSize
= sizeof(GDIBSOBJECT
);
330 else if (Cmd
== GdiBCDelObj
) cjSize
= sizeof(GDIBSOBJECT
);
333 /* Unsupported operation */
334 if (cjSize
== 0) return NULL
;
336 /* Check if the buffer is full */
337 if ((pTeb
->GdiBatchCount
>= GDI_BatchLimit
) ||
338 ((pTeb
->GdiTebBatch
.Offset
+ cjSize
) > GDIBATCHBUFSIZE
))
340 /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
345 /* Get the head of the entry */
346 pHdr
= (PVOID
)((PUCHAR
)pTeb
->GdiTebBatch
.Buffer
+ pTeb
->GdiTebBatch
.Offset
);
348 /* Update Offset and batch count */
349 pTeb
->GdiTebBatch
.Offset
+= cjSize
;
350 pTeb
->GdiBatchCount
++;
352 /* Fill in the core fields */
361 GdiGetDcAttr(HDC hdc
)
365 if (!GdiGetHandleUserData((HGDIOBJ
)hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
*)&pdcattr
)) return NULL
;
370 FLOATL FASTCALL
EFtoF(EFLOAT_S
* efp
);
371 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo)
373 #define FOtoF(pfo) (*(pfo))
376 /* This is an inlined version of lrintf. */
381 #if defined(_M_IX86) && defined(__GNUC__)
383 __asm__
__volatile__ ("fistpl %0" : "=m" (result
) : "t" (f
) : "st");
385 #elif defined(_M_IX86) && defined(_MSC_VER)
393 /* slow, but portable */
394 return (int)(f
>= 0 ? f
+0.5 : f
-0.5);