2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
4 * FILE: win32ss/gdi/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
)(
49 LPGCP_RESULTSW lpResults
,
54 extern HINSTANCE hLpk
;
55 extern LPKETO LpkExtTextOut
;
56 extern LPKGCP LpkGetCharacterPlacement
;
58 /* DEFINES *******************************************************************/
60 #define HANDLE_LIST_INC 20
62 #define METAFILE_MEMORY 1
63 #define METAFILE_DISK 2
65 #define SAPCALLBACKDELAY 244
71 /* MACRO ********************************************************************/
73 #define ROP_USES_SOURCE(Rop) (((Rop) << 2 ^ Rop) & 0xCC0000)
74 #define RCAST(_Type, _Value) (*((_Type*)&_Value))
77 /* TYPES *********************************************************************/
79 // Based on wmfapi.h and Wine.
80 typedef struct tagMETAFILEDC
101 HGDIOBJ hEnhMetaFile
;
102 HCOLORSPACE hColorSpace
;
103 WCHAR Filename
[MAX_PATH
+2];
104 } METAFILEDC
,*PMETAFILEDC
;
106 // Metafile Entry handle
107 typedef struct tagMF_ENTRY
110 HGDIOBJ hmDC
; // Handle return from NtGdiCreateClientObj.
112 } MF_ENTRY
, *PMF_ENTRY
;
114 typedef struct tagENHMETAFILE
117 HANDLE hFile
; /* Handle for disk based MetaFile */
121 UINT handles_size
, cur_handles
;
123 INT horzres
, vertres
;
124 INT horzsize
, vertsize
;
125 INT logpixelsx
, logpixelsy
;
131 } ENHMETAFILE
,*PENHMETAFILE
;
134 #define PDEV_UMPD_ID 0xFEDCBA98
136 #define UMPDEV_NO_ESCAPE 0x0002
137 #define UMPDEV_SUPPORT_ESCAPE 0x0004
138 typedef struct _UMPDEV
140 DWORD_PTR Sig
; // Init with PDEV_UMPD_ID
141 struct _UMPDEV
*pumpdNext
;
142 PDRIVER_INFO_5W pdi5Info
;
145 DWORD dwDriverAttributes
;
146 DWORD dwConfigVersion
; // Number of times the configuration
147 // file for this driver has been upgraded
148 // or downgraded since the last spooler restart.
149 DWORD dwDriverCount
; // After init should be 2
153 PVOID apfn
[INDEX_LAST
]; // Print Driver pfn
156 #define LOCALFONT_COUNT 10
157 typedef struct _LOCALFONT
159 FONT_ATTR lfa
[LOCALFONT_COUNT
];
160 } LOCALFONT
, *PLOCALFONT
;
163 typedef BOOL (WINAPI
*ABORTPRINTER
) (HANDLE
);
164 typedef BOOL (WINAPI
*CLOSEPRINTER
) (HANDLE
);
165 typedef BOOL (WINAPI
*CLOSESPOOLFILEHANDLE
) (HANDLE
, HANDLE
); // W2k8
166 typedef HANDLE (WINAPI
*COMMITSPOOLDATA
) (HANDLE
,HANDLE
,DWORD
); // W2k8
167 typedef LONG (WINAPI
*DOCUMENTPROPERTIESW
) (HWND
,HANDLE
,LPWSTR
,PDEVMODEW
,PDEVMODEW
,DWORD
);
168 typedef BOOL (WINAPI
*ENDDOCPRINTER
) (HANDLE
);
169 typedef BOOL (WINAPI
*ENDPAGEPRINTER
) (HANDLE
);
170 typedef BOOL (WINAPI
*GETPRINTERW
) (HANDLE
,DWORD
,LPBYTE
,DWORD
,LPDWORD
);
171 typedef BOOL (WINAPI
*GETPRINTERDRIVERW
) (HANDLE
,LPWSTR
,DWORD
,LPBYTE
,DWORD
,LPDWORD
);
172 typedef HANDLE (WINAPI
*GETSPOOLFILEHANDLE
) (HANDLE
); // W2k8
173 typedef BOOL (WINAPI
*ISVALIDDEVMODEW
) (PDEVMODEW
,size_t);
174 typedef BOOL (WINAPI
*OPENPRINTERW
) (LPWSTR
,PHANDLE
,LPPRINTER_DEFAULTSW
);
175 typedef BOOL (WINAPI
*READPRINTER
) (HANDLE
,PVOID
,DWORD
,PDWORD
);
176 typedef BOOL (WINAPI
*RESETPRINTERW
) (HANDLE
,LPPRINTER_DEFAULTSW
);
177 typedef LPWSTR (WINAPI
*STARTDOCDLGW
) (HANDLE
,DOCINFOW
*);
178 typedef DWORD (WINAPI
*STARTDOCPRINTERW
) (HANDLE
,DWORD
,PBYTE
);
179 typedef BOOL (WINAPI
*STARTPAGEPRINTER
) (HANDLE
);
181 typedef BOOL (WINAPI
*SEEKPRINTER
) (HANDLE
,LARGE_INTEGER
,PLARGE_INTEGER
,DWORD
,BOOL
);
182 typedef BOOL (WINAPI
*SPLREADPRINTER
) (HANDLE
,LPBYTE
*,DWORD
);
183 // Same as ddk/winsplp.h DriverUnloadComplete?
184 typedef BOOL (WINAPI
*SPLDRIVERUNLOADCOMPLETE
) (LPWSTR
);
186 // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
187 typedef INT (WINAPI
*DOCUMENTEVENT
) (HANDLE
,HDC
,INT
,ULONG
,PVOID
,ULONG
,PVOID
);
188 // DrvQueryColorProfile
189 typedef BOOL (WINAPI
*QUERYCOLORPROFILE
) (HANDLE
,PDEVMODEW
,ULONG
,VOID
*,ULONG
,FLONG
);
191 typedef DWORD (WINAPI
*QUERYSPOOLMODE
) (HANDLE
,DWORD
,DWORD
);
192 typedef DWORD (WINAPI
*QUERYREMOTEFONTS
) (DWORD
,DWORD
,DWORD
);
194 extern CLOSEPRINTER fpClosePrinter
;
195 extern OPENPRINTERW fpOpenPrinterW
;
197 /* FUNCTIONS *****************************************************************/
200 HEAP_alloc(DWORD len
);
209 HEAP_free(LPVOID memory
);
214 const TEXTMETRICW
*ptmW
,
228 NEWTEXTMETRICEXA
*tma
,
229 NEWTEXTMETRICEXW
*tmw
234 DeleteRegion( HRGN
);
238 GdiValidateHandle(HGDIOBJ
);
241 GdiGetHandleUserData(
253 GdiSetLDC(HDC hdc
, PVOID pvLDC
);
257 GdiFixUpHandle(HGDIOBJ hGO
);
261 CalculateColorTableSize(
262 CONST BITMAPINFOHEADER
*BitmapInfoHeader
,
270 CONST BITMAPINFO
*BitmapInfo
,
272 UINT
*BitmapInfoSize
,
283 _In_ USHORT usMF16Id
,
295 GetDCObject( HDC
, INT
);
314 LPENUMLOGFONTEXA fontA
,
315 CONST ENUMLOGFONTEXW
*fontW
);
325 GdiInitializeLanguagePack(
326 _In_ DWORD InitParam
);
331 _In_ FARPROC
*hookfuncs
);
336 EXTTEXTMETRIC
*petm
);
338 /* FIXME: Put in some public header */
341 UserRealizePalette(HDC hDC
);
345 GdiAddFontResourceW(LPCWSTR lpszFilename
,FLONG fl
,DESIGNVECTOR
*pdv
);
349 GdiSetLastError( DWORD dwErrCode
);
351 DWORD WINAPI
GdiGetCodePage(HDC
);
355 GdiGetBitmapBitsSize(BITMAPINFO
*lpbmi
);
357 VOID
GdiSAPCallback(PLDC pldc
);
358 HGDIOBJ FASTCALL
hGetPEBHandle(HANDLECACHETYPE
,COLORREF
);
360 int FASTCALL
DocumentEventEx(PVOID
,HANDLE
,HDC
,int,ULONG
,PVOID
,ULONG
,PVOID
);
361 BOOL FASTCALL
EndPagePrinterEx(PVOID
,HANDLE
);
362 BOOL FASTCALL
LoadTheSpoolerDrv(VOID
);
366 GdiAllocBatchCommand(
374 /* Get a pointer to the TEB */
375 pTeb
= NtCurrentTeb();
377 /* Check if we have a valid environment */
378 if (!pTeb
|| !pTeb
->Win32ThreadInfo
) return NULL
;
380 /* Do we use a DC? */
383 /* If the batch DC is NULL, we set this one as the new one */
384 if (!pTeb
->GdiTebBatch
.HDC
) pTeb
->GdiTebBatch
.HDC
= hdc
;
386 /* If not, check if the batch DC equal to our DC */
387 else if (pTeb
->GdiTebBatch
.HDC
!= hdc
) return NULL
;
390 /* Get the size of the entry */
391 if (Cmd
== GdiBCPatBlt
) cjSize
= sizeof(GDIBSPATBLT
);
392 else if (Cmd
== GdiBCPolyPatBlt
) cjSize
= sizeof(GDIBSPPATBLT
);
393 else if (Cmd
== GdiBCTextOut
) cjSize
= sizeof(GDIBSTEXTOUT
);
394 else if (Cmd
== GdiBCExtTextOut
) cjSize
= sizeof(GDIBSEXTTEXTOUT
);
395 else if (Cmd
== GdiBCSetBrushOrg
) cjSize
= sizeof(GDIBSSETBRHORG
);
396 else if (Cmd
== GdiBCExtSelClipRgn
) cjSize
= 0;
397 else if (Cmd
== GdiBCSelObj
) cjSize
= sizeof(GDIBSOBJECT
);
398 else if (Cmd
== GdiBCDelRgn
) cjSize
= sizeof(GDIBSOBJECT
);
399 else if (Cmd
== GdiBCDelObj
) cjSize
= sizeof(GDIBSOBJECT
);
402 /* Unsupported operation */
403 if (cjSize
== 0) return NULL
;
405 /* Check if the buffer is full */
406 if ((pTeb
->GdiBatchCount
>= GDI_BatchLimit
) ||
407 ((pTeb
->GdiTebBatch
.Offset
+ cjSize
) > GDIBATCHBUFSIZE
))
409 /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
413 // If Flushed, lose the hDC for this batch job! See CORE-15839.
416 if (!pTeb
->GdiTebBatch
.HDC
) pTeb
->GdiTebBatch
.HDC
= hdc
;
420 /* Get the head of the entry */
421 pHdr
= (PVOID
)((PUCHAR
)pTeb
->GdiTebBatch
.Buffer
+ pTeb
->GdiTebBatch
.Offset
);
423 /* Update Offset and batch count */
424 pTeb
->GdiTebBatch
.Offset
+= cjSize
;
425 pTeb
->GdiBatchCount
++;
427 /* Fill in the core fields */
436 GdiGetDcAttr(HDC hdc
)
438 GDILOOBJTYPE eDcObjType
;
441 /* Check DC object type */
442 eDcObjType
= GDI_HANDLE_GET_TYPE(hdc
);
443 if ((eDcObjType
!= GDILoObjType_LO_DC_TYPE
) &&
444 (eDcObjType
!= GDILoObjType_LO_ALTDC_TYPE
))
449 /* Get the DC attribute */
450 if (!GdiGetHandleUserData((HGDIOBJ
)hdc
, eDcObjType
, (PVOID
*)&pdcattr
))
460 GdiGetRgnAttr(HRGN hrgn
)
464 /* Get the region attribute */
465 if (!GdiGetHandleUserData(hrgn
, GDILoObjType_LO_REGION_TYPE
, (PVOID
*)&prgnattr
))
474 FLOATL FASTCALL
EFtoF(EFLOAT_S
* efp
);
475 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo)
477 #define FOtoF(pfo) (*(pfo))
480 /* This is an inlined version of lrintf. */
485 #if defined(_M_IX86) && defined(__GNUC__)
487 __asm__
__volatile__ ("fistpl %0" : "=m" (result
) : "t" (f
) : "st");
489 #elif defined(_M_IX86) && defined(_MSC_VER)
497 /* slow, but portable */
498 return (int)(f
>= 0 ? f
+0.5 : f
-0.5);
524 _In_ GDILOOBJTYPE eObjType
);
533 GdiCreateClientObjLink(
535 _In_ PVOID pvObject
);
544 GdiRemoveClientObjLink(
547 extern ULONG gcClientObj
;
551 METADC_DeleteObject(HGDIOBJ hobj
);
564 _In_ LPCSTR lpvInData
,
565 _Out_ LPVOID lpvOutData
);
590 /* The following METADC_* functions follow this pattern: */
591 #define HANDLE_METADC0P(_RetType, _Func, dwError, hdc, ...) \
592 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
594 DWORD_PTR dwResult; \
595 if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc)) \
597 return (_RetType)dwResult; \
601 #define HANDLE_METADC(_RetType, _Func, dwError, hdc, ...) \
602 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
604 DWORD_PTR dwResult = 1; \
605 if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc, __VA_ARGS__)) \
607 return (_RetType)dwResult; \
616 DCFUNC_AlphaBlend
, // UNIMPLEMENTED
617 DCFUNC_AngleArc
, // UNIMPLEMENTED
619 DCFUNC_ArcTo
, // UNIMPLEMENTED
626 DCFUNC_ExcludeClipRect
,
629 DCFUNC_ExtSelectClipRgn
,
635 DCFUNC_GetDeviceCaps
,
637 DCFUNC_GradientFill
, // UNIMPLEMENTED
638 DCFUNC_IntersectClipRect
,
641 DCFUNC_MaskBlt
, // UNIMPLEMENTED
642 DCFUNC_ModifyWorldTransform
,
644 DCFUNC_OffsetClipRgn
,
645 DCFUNC_OffsetViewportOrgEx
,
646 DCFUNC_OffsetWindowOrgEx
,
647 DCFUNC_PathToRegion
, // UNIMPLEMENTED
650 DCFUNC_PlgBlt
, // UNIMPLEMENTED
659 DCFUNC_RealizePalette
,
664 DCFUNC_ScaleViewportExtEx
,
665 DCFUNC_ScaleWindowExtEx
,
667 DCFUNC_SelectClipPath
,
669 DCFUNC_SelectPalette
,
671 DCFUNC_SetDCBrushColor
,
672 DCFUNC_SetDCPenColor
,
673 DCFUNC_SetDIBitsToDevice
,
679 DCFUNC_SetPolyFillMode
,
681 DCFUNC_SetStretchBltMode
,
683 DCFUNC_SetTextCharacterExtra
,
685 DCFUNC_SetTextJustification
,
686 DCFUNC_SetViewportExtEx
,
687 DCFUNC_SetViewportOrgEx
,
688 DCFUNC_SetWindowExtEx
,
689 DCFUNC_SetWindowOrgEx
,
690 DCFUNC_SetWorldTransform
,
692 DCFUNC_StrokeAndFillPath
,
694 DCFUNC_TransparentBlt
, // UNIMPLEMENTED
701 _In_ DCFUNC eFunction
,
702 _Out_ PDWORD_PTR pdwResult
,
703 _In_ DWORD_PTR dwError
,
707 #define HANDLE_METADC2(_RetType, _Func, hdc, ...) \
708 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
711 if (METADC_##_Func(&result, hdc, __VA_ARGS__)) \
719 METADC_GetAndSetDCDWord(
720 _Out_ PDWORD pdwResult
,
725 _In_ USHORT usMF16Id
,