xref: /reactos/win32ss/gdi/gdi32/include/gdi32p.h (revision 8a978a17)
1 /*
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)
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 typedef BOOL
31 (WINAPI* LPKETO)(
32     HDC hdc,
33     int x,
34     int y,
35     UINT fuOptions,
36     const RECT *lprc,
37     LPCWSTR lpString,
38     UINT uCount,
39     const INT *lpDx,
40     INT unknown
41 );
42 
43 typedef DWORD
44 (WINAPI* LPKGCP)(
45     HDC hdc,
46     LPCWSTR lpString,
47     INT uCount,
48     INT nMaxExtent,
49     LPGCP_RESULTSW lpResults,
50     DWORD dwFlags,
51     DWORD dwUnused
52 );
53 
54 typedef BOOL
55 (WINAPI* LPKGTEP)(
56     HDC hdc,
57     LPCWSTR lpString,
58     INT cString,
59     INT nMaxExtent,
60     LPINT lpnFit,
61     LPINT lpnDx,
62     LPSIZE lpSize,
63     DWORD dwUnused,
64     int unknown
65 );
66 
67 extern HINSTANCE hLpk;
68 extern LPKETO LpkExtTextOut;
69 extern LPKGCP LpkGetCharacterPlacement;
70 extern LPKGTEP LpkGetTextExtentExPoint;
71 
72 /* DEFINES *******************************************************************/
73 
74 #define HANDLE_LIST_INC 20
75 
76 #define METAFILE_MEMORY 1
77 #define METAFILE_DISK   2
78 
79 #define SAPCALLBACKDELAY 244
80 
81 #define LPK_INIT 1
82 #define LPK_ETO  2
83 #define LPK_GCP  3
84 #define LPK_GTEP 4
85 
86 /* MACRO ********************************************************************/
87 
88 #define ROP_USES_SOURCE(Rop)   (((Rop) << 2 ^ Rop) & 0xCC0000)
89 #define RCAST(_Type, _Value)   (*((_Type*)&_Value))
90 
91 
92 /* TYPES *********************************************************************/
93 
94 // Based on wmfapi.h and Wine.
95 typedef struct tagMETAFILEDC
96 {
97     PVOID       pvMetaBuffer;
98     HANDLE      hFile;
99     DWORD       Size;
100     DWORD       dwWritten;
101     METAHEADER  mh;
102     WORD        reserved;
103     HLOCAL      MFObjList;
104     HPEN        hPen;
105     HBRUSH      hBrush;
106     HDC         hDc;
107     HGDIOBJ     hMetaDc;
108     HPALETTE    hPalette;
109     HFONT       hFont;
110     HBITMAP     hBitmap;
111     HRGN        hRegion;
112     HGDIOBJ     hMetafile;
113     HGDIOBJ     hMemDc;
114     HPEN        hExtPen;
115     HGDIOBJ     hEnhMetaDc;
116     HGDIOBJ     hEnhMetaFile;
117     HCOLORSPACE hColorSpace;
118     WCHAR       Filename[MAX_PATH+2];
119 } METAFILEDC,*PMETAFILEDC;
120 
121 // Metafile Entry handle
122 typedef struct tagMF_ENTRY
123 {
124     LIST_ENTRY   List;
125     HGDIOBJ      hmDC;             // Handle return from NtGdiCreateClientObj.
126     PMETAFILEDC pmfDC;
127 } MF_ENTRY, *PMF_ENTRY;
128 
129 typedef struct tagENHMETAFILE
130 {
131     PVOID      pvMetaBuffer;
132     HANDLE     hFile;      /* Handle for disk based MetaFile */
133     DWORD      Size;
134     INT        iType;
135     PENHMETAHEADER emf;
136     UINT       handles_size, cur_handles;
137     HGDIOBJ   *handles;
138     INT        horzres, vertres;
139     INT        horzsize, vertsize;
140     INT        logpixelsx, logpixelsy;
141     INT        bitspixel;
142     INT        textcaps;
143     INT        rastercaps;
144     INT        technology;
145     INT        planes;
146 } ENHMETAFILE,*PENHMETAFILE;
147 
148 
149 #define PDEV_UMPD_ID  0xFEDCBA98
150 // UMPDEV flags
151 #define UMPDEV_NO_ESCAPE      0x0002
152 #define UMPDEV_SUPPORT_ESCAPE 0x0004
153 typedef struct _UMPDEV
154 {
155     DWORD_PTR       Sig;            // Init with PDEV_UMPD_ID
156     struct _UMPDEV *pumpdNext;
157     PDRIVER_INFO_5W pdi5Info;
158     HMODULE         hModule;
159     DWORD           dwFlags;
160     DWORD           dwDriverAttributes;
161     DWORD           dwConfigVersion; // Number of times the configuration
162     // file for this driver has been upgraded
163     // or downgraded since the last spooler restart.
164     DWORD           dwDriverCount;   // After init should be 2
165     DWORD           WOW64_UMPDev;
166     DWORD           WOW64_hMod;
167     DWORD           Unknown;
168     PVOID           apfn[INDEX_LAST]; // Print Driver pfn
169 } UMPDEV, *PUMPDEV;
170 
171 #define LOCALFONT_COUNT 10
172 typedef struct _LOCALFONT
173 {
174     FONT_ATTR  lfa[LOCALFONT_COUNT];
175 } LOCALFONT, *PLOCALFONT;
176 
177 // sdk/winspool.h
178 typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE);
179 typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE);
180 typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
181 typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
182 typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
183 typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE);
184 typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE);
185 typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
186 typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
187 typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8
188 typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t);
189 typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
190 typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
191 typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
192 typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *);
193 typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
194 typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE);
195 // ddk/winsplp.h
196 typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
197 typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
198 // Same as ddk/winsplp.h DriverUnloadComplete?
199 typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
200 // Driver support:
201 // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
202 typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
203 // DrvQueryColorProfile
204 typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
205 // Unknown:
206 typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
207 typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
208 
209 extern CLOSEPRINTER fpClosePrinter;
210 extern OPENPRINTERW fpOpenPrinterW;
211 
212 /* FUNCTIONS *****************************************************************/
213 
214 PVOID
215 HEAP_alloc(DWORD len);
216 
217 NTSTATUS
218 HEAP_strdupA2W(
219     LPWSTR* ppszW,
220     LPCSTR lpszA
221 );
222 
223 VOID
224 HEAP_free(LPVOID memory);
225 
226 VOID
227 FASTCALL
228 FONT_TextMetricWToA(
229     const TEXTMETRICW *ptmW,
230     LPTEXTMETRICA ptmA
231 );
232 
233 VOID
234 FASTCALL
235 NewTextMetricW2A(
236     NEWTEXTMETRICA *tma,
237     NEWTEXTMETRICW *tmw
238 );
239 
240 VOID
241 FASTCALL
242 NewTextMetricExW2A(
243     NEWTEXTMETRICEXA *tma,
244     NEWTEXTMETRICEXW *tmw
245 );
246 
247 BOOL
248 FASTCALL
249 DeleteRegion( HRGN );
250 
251 BOOL
252 WINAPI
253 GdiValidateHandle(HGDIOBJ);
254 
255 BOOL
256 GdiGetHandleUserData(
257     HGDIOBJ hGdiObj,
258     DWORD ObjectType,
259     PVOID *UserData
260 );
261 
262 PLDC
263 FASTCALL
264 GdiGetLDC(HDC hDC);
265 
266 BOOL
267 FASTCALL
268 GdiSetLDC(HDC hdc, PVOID pvLDC);
269 
270 HGDIOBJ
271 WINAPI
272 GdiFixUpHandle(HGDIOBJ hGO);
273 
274 BOOL
275 WINAPI
276 CalculateColorTableSize(
277     CONST BITMAPINFOHEADER *BitmapInfoHeader,
278     UINT *ColorSpec,
279     UINT *ColorTableSize
280 );
281 
282 LPBITMAPINFO
283 WINAPI
284 ConvertBitmapInfo(
285     CONST BITMAPINFO *BitmapInfo,
286     UINT ColorSpec,
287     UINT *BitmapInfoSize,
288     BOOL FollowedByData
289 );
290 
291 DWORD
292 WINAPI
293 GetAndSetDCDWord(
294     _In_ HDC hdc,
295     _In_ UINT u,
296     _In_ DWORD dwIn,
297     _In_ ULONG ulMFId,
298     _In_ USHORT usMF16Id,
299     _In_ DWORD dwError);
300 
301 DWORD
302 WINAPI
303 GetDCDWord(
304     _In_ HDC hdc,
305     _In_ UINT u,
306     _In_ DWORD dwError);
307 
308 HGDIOBJ
309 WINAPI
310 GetDCObject( HDC, INT);
311 
312 VOID
313 NTAPI
314 LogFontA2W(
315     LPLOGFONTW pW,
316     CONST LOGFONTA *pA
317 );
318 
319 VOID
320 NTAPI
321 LogFontW2A(
322     LPLOGFONTA pA,
323     CONST LOGFONTW *pW
324 );
325 
326 VOID
327 WINAPI
328 EnumLogFontExW2A(
329     LPENUMLOGFONTEXA fontA,
330     CONST ENUMLOGFONTEXW *fontW );
331 
332 BOOL
333 WINAPI
334 LoadLPK(
335     INT LpkFunctionID
336 );
337 
338 VOID
339 WINAPI
340 GdiInitializeLanguagePack(
341     _In_ DWORD InitParam);
342 
343 VOID
344 WINAPI
345 InitializeLpkHooks(
346     _In_ FARPROC *hookfuncs);
347 
348 BOOL
349 WINAPI
350 GetETM(HDC hdc,
351        EXTTEXTMETRIC *petm);
352 
353 /* FIXME: Put in some public header */
354 UINT
355 WINAPI
356 UserRealizePalette(HDC hDC);
357 
358 int
359 WINAPI
360 GdiAddFontResourceW(LPCWSTR lpszFilename,FLONG fl,DESIGNVECTOR *pdv);
361 
362 VOID
363 WINAPI
364 GdiSetLastError( DWORD dwErrCode );
365 
366 DWORD WINAPI GdiGetCodePage(HDC);
367 
368 int
369 WINAPI
370 GdiGetBitmapBitsSize(BITMAPINFO *lpbmi);
371 
372 VOID GdiSAPCallback(PLDC pldc);
373 HGDIOBJ FASTCALL hGetPEBHandle(HANDLECACHETYPE,COLORREF);
374 
375 int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
376 BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE);
377 BOOL FASTCALL LoadTheSpoolerDrv(VOID);
378 
379 FORCEINLINE
380 PVOID
381 GdiAllocBatchCommand(
382     HDC hdc,
383     USHORT Cmd)
384 {
385     PTEB pTeb;
386     USHORT cjSize;
387     PGDIBATCHHDR pHdr;
388 
389     /* Get a pointer to the TEB */
390     pTeb = NtCurrentTeb();
391 
392     /* Check if we have a valid environment */
393     if (!pTeb || !pTeb->Win32ThreadInfo) return NULL;
394 
395     /* Get the size of the entry */
396     if      (Cmd == GdiBCPatBlt) cjSize = sizeof(GDIBSPATBLT);
397     else if (Cmd == GdiBCPolyPatBlt) cjSize = sizeof(GDIBSPPATBLT);
398     else if (Cmd == GdiBCTextOut) cjSize = sizeof(GDIBSTEXTOUT);
399     else if (Cmd == GdiBCExtTextOut) cjSize = sizeof(GDIBSEXTTEXTOUT);
400     else if (Cmd == GdiBCSetBrushOrg) cjSize = sizeof(GDIBSSETBRHORG);
401     else if (Cmd == GdiBCExtSelClipRgn) cjSize = sizeof(GDIBSEXTSELCLPRGN);
402     else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT);
403     else if (Cmd == GdiBCDelRgn) cjSize = sizeof(GDIBSOBJECT);
404     else if (Cmd == GdiBCDelObj) cjSize = sizeof(GDIBSOBJECT);
405     else cjSize = 0;
406 
407     /* Unsupported operation */
408     if (cjSize == 0) return NULL;
409 
410     /* Do we use a DC? */
411     if (hdc)
412     {
413         /* If the batch DC is NULL, we set this one as the new one */
414         if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
415 
416         /* If not, check if the batch DC equal to our DC */
417         else if (pTeb->GdiTebBatch.HDC != hdc) return NULL;
418     }
419 
420     /* Check if the buffer is full */
421     if ((pTeb->GdiBatchCount >= GDI_BatchLimit) ||
422         ((pTeb->GdiTebBatch.Offset + cjSize) > GDIBATCHBUFSIZE))
423     {
424         /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
425            the current batch */
426         NtGdiFlush();
427 
428         // If Flushed, lose the hDC for this batch job! See CORE-15839.
429         if (hdc)
430         {
431             if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc;
432         }
433     }
434 
435     /* Get the head of the entry */
436     pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset);
437 
438     /* Update Offset and batch count */
439     pTeb->GdiTebBatch.Offset += cjSize;
440     pTeb->GdiBatchCount++;
441 
442     /* Fill in the core fields */
443     pHdr->Cmd = Cmd;
444     pHdr->Size = cjSize;
445 
446     return pHdr;
447 }
448 
449 FORCEINLINE
450 PDC_ATTR
451 GdiGetDcAttr(HDC hdc)
452 {
453     GDILOOBJTYPE eDcObjType;
454     PDC_ATTR pdcattr;
455 
456     /* Check DC object type */
457     eDcObjType = GDI_HANDLE_GET_TYPE(hdc);
458     if ((eDcObjType != GDILoObjType_LO_DC_TYPE) &&
459         (eDcObjType != GDILoObjType_LO_ALTDC_TYPE))
460     {
461         return NULL;
462     }
463 
464     /* Get the DC attribute */
465     if (!GdiGetHandleUserData((HGDIOBJ)hdc, eDcObjType, (PVOID*)&pdcattr))
466     {
467         return NULL;
468     }
469 
470     return pdcattr;
471 }
472 
473 FORCEINLINE
474 PRGN_ATTR
475 GdiGetRgnAttr(HRGN hrgn)
476 {
477     PRGN_ATTR prgnattr;
478 
479     /* Get the region attribute */
480     if (!GdiGetHandleUserData(hrgn, GDILoObjType_LO_REGION_TYPE, (PVOID*)&prgnattr))
481     {
482         return NULL;
483     }
484 
485     return prgnattr;
486 }
487 
488 #ifdef _M_IX86
489 FLOATL FASTCALL EFtoF(EFLOAT_S * efp);
490 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo)
491 #else
492 #define FOtoF(pfo) (*(pfo))
493 #endif
494 
495 /* This is an inlined version of lrintf. */
496 FORCEINLINE
497 int
498 _lrintf(float f)
499 {
500 #if defined(_M_IX86) && defined(__GNUC__)
501     int result;
502     __asm__ __volatile__ ("fistpl %0" : "=m" (result) : "t" (f) : "st");
503     return result;
504 #elif defined(_M_IX86) && defined(_MSC_VER)
505     int result;
506     __asm
507     {
508         fld f;
509         fistp result;
510     }
511 #else
512     /* slow, but portable */
513     return (int)(f >= 0 ? f+0.5 : f-0.5);
514 #endif
515 }
516 
517 HBRUSH
518 WINAPI
519 GdiSelectBrush(
520     _In_ HDC hdc,
521     _In_ HBRUSH hbr);
522 
523 HPEN
524 WINAPI
525 GdiSelectPen(
526     _In_ HDC hdc,
527     _In_ HPEN hpen);
528 
529 HFONT
530 WINAPI
531 GdiSelectFont(
532     _In_ HDC hdc,
533     _In_ HFONT hfont);
534 
535 HGDIOBJ
536 WINAPI
537 GdiCreateClientObj(
538     _In_ PVOID pvObject,
539     _In_ GDILOOBJTYPE eObjType);
540 
541 PVOID
542 WINAPI
543 GdiDeleteClientObj(
544     _In_ HGDIOBJ hobj);
545 
546 BOOL
547 WINAPI
548 GdiCreateClientObjLink(
549     _In_ HGDIOBJ hobj,
550     _In_ PVOID pvObject);
551 
552 PVOID
553 WINAPI
554 GdiGetClientObjLink(
555     _In_ HGDIOBJ hobj);
556 
557 PVOID
558 WINAPI
559 GdiRemoveClientObjLink(
560     _In_ HGDIOBJ hobj);
561 
562 extern ULONG gcClientObj;
563 
564 VOID
565 WINAPI
566 METADC_DeleteObject(HGDIOBJ hobj);
567 
568 BOOL
569 WINAPI
570 METADC_DeleteDC(
571     _In_ HDC hdc);
572 
573 INT
574 WINAPI
575 METADC16_Escape(
576     _In_ HDC hdc,
577     _In_ INT nEscape,
578     _In_ INT cbInput,
579     _In_ LPCSTR lpvInData,
580     _Out_ LPVOID lpvOutData);
581 
582 BOOL
583 WINAPI
584 METADC_ExtTextOutW(
585     HDC hdc,
586     INT x,
587     INT y,
588     UINT fuOptions,
589     const RECT *lprc,
590     LPCWSTR lpString,
591     UINT cchString,
592     const INT *lpDx);
593 
594 BOOL
595 WINAPI
596 METADC_PatBlt(
597     _In_ HDC hdc,
598     _In_ INT xLeft,
599     _In_ INT yTop,
600     _In_ INT nWidth,
601     _In_ INT nHeight,
602     _In_ DWORD dwRop);
603 
604 
605 /* The following METADC_* functions follow this pattern: */
606 #define HANDLE_METADC0P(_RetType, _Func, dwError, hdc, ...) \
607     if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
608     { \
609         DWORD_PTR dwResult; \
610         if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc)) \
611         { \
612             return (_RetType)dwResult; \
613         } \
614     }
615 
616 #define HANDLE_METADC(_RetType, _Func, dwError, hdc, ...) \
617     if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
618     { \
619         DWORD_PTR dwResult = 1; \
620         if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc, __VA_ARGS__)) \
621         { \
622             return (_RetType)dwResult; \
623         } \
624     }
625 
626 
627 typedef enum _DCFUNC
628 {
629     //DCFUNC_AbortDoc,
630     DCFUNC_AbortPath,
631     DCFUNC_AlphaBlend, // UNIMPLEMENTED
632     DCFUNC_AngleArc, // UNIMPLEMENTED
633     DCFUNC_Arc,
634     DCFUNC_ArcTo, // UNIMPLEMENTED
635     DCFUNC_BeginPath,
636     //DCFUNC_BitBlt,
637     DCFUNC_Chord,
638     DCFUNC_CloseFigure,
639     DCFUNC_Ellipse,
640     DCFUNC_EndPath,
641     DCFUNC_ExcludeClipRect,
642     DCFUNC_ExtEscape,
643     DCFUNC_ExtFloodFill,
644     DCFUNC_ExtSelectClipRgn,
645     DCFUNC_ExtTextOut,
646     DCFUNC_FillPath,
647     DCFUNC_FillRgn,
648     DCFUNC_FlattenPath,
649     DCFUNC_FrameRgn,
650     DCFUNC_GetDeviceCaps,
651     DCFUNC_GdiComment,
652     DCFUNC_GradientFill, // UNIMPLEMENTED
653     DCFUNC_IntersectClipRect,
654     DCFUNC_InvertRgn,
655     DCFUNC_LineTo,
656     DCFUNC_MaskBlt, // UNIMPLEMENTED
657     DCFUNC_ModifyWorldTransform,
658     DCFUNC_MoveTo,
659     DCFUNC_OffsetClipRgn,
660     DCFUNC_OffsetViewportOrgEx,
661     DCFUNC_OffsetWindowOrgEx,
662     DCFUNC_PathToRegion, // UNIMPLEMENTED
663     DCFUNC_PatBlt,
664     DCFUNC_Pie,
665     DCFUNC_PlgBlt, // UNIMPLEMENTED
666     DCFUNC_PolyBezier,
667     DCFUNC_PolyBezierTo,
668     DCFUNC_PolyDraw,
669     DCFUNC_Polygon,
670     DCFUNC_Polyline,
671     DCFUNC_PolylineTo,
672     DCFUNC_PolyPolygon,
673     DCFUNC_PolyPolyline,
674     DCFUNC_RealizePalette,
675     DCFUNC_Rectangle,
676     DCFUNC_RestoreDC,
677     DCFUNC_RoundRect,
678     DCFUNC_SaveDC,
679     DCFUNC_ScaleViewportExtEx,
680     DCFUNC_ScaleWindowExtEx,
681     DCFUNC_SelectBrush,
682     DCFUNC_SelectClipPath,
683     DCFUNC_SelectFont,
684     DCFUNC_SelectPalette,
685     DCFUNC_SelectPen,
686     DCFUNC_SetDCBrushColor,
687     DCFUNC_SetDCPenColor,
688     DCFUNC_SetDIBitsToDevice,
689     DCFUNC_SetBkColor,
690     DCFUNC_SetBkMode,
691     DCFUNC_SetLayout,
692     //DCFUNC_SetMapMode,
693     DCFUNC_SetPixel,
694     DCFUNC_SetPolyFillMode,
695     DCFUNC_SetROP2,
696     DCFUNC_SetStretchBltMode,
697     DCFUNC_SetTextAlign,
698     DCFUNC_SetTextCharacterExtra,
699     DCFUNC_SetTextColor,
700     DCFUNC_SetTextJustification,
701     DCFUNC_SetViewportExtEx,
702     DCFUNC_SetViewportOrgEx,
703     DCFUNC_SetWindowExtEx,
704     DCFUNC_SetWindowOrgEx,
705     DCFUNC_SetWorldTransform,
706     DCFUNC_StretchBlt,
707     DCFUNC_StrokeAndFillPath,
708     DCFUNC_StrokePath,
709     DCFUNC_TransparentBlt, // UNIMPLEMENTED
710     DCFUNC_WidenPath,
711 
712 } DCFUNC;
713 
714 BOOL
715 METADC_Dispatch(
716     _In_ DCFUNC eFunction,
717     _Out_ PDWORD_PTR pdwResult,
718     _In_ DWORD_PTR dwError,
719     _In_ HDC hdc,
720     ...);
721 
722 #define HANDLE_METADC2(_RetType, _Func, hdc, ...) \
723     if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
724     { \
725         _RetType result; \
726         if (METADC_##_Func(&result, hdc, __VA_ARGS__)) \
727         { \
728             return result; \
729         } \
730     }
731 
732 BOOL
733 WINAPI
734 METADC_GetAndSetDCDWord(
735     _Out_ PDWORD pdwResult,
736     _In_ HDC hdc,
737     _In_ UINT u,
738     _In_ DWORD dwIn,
739     _In_ ULONG ulMFId,
740     _In_ USHORT usMF16Id,
741     _In_ DWORD dwError);
742 
743 HDC WINAPI GdiConvertAndCheckDC(HDC hdc);
744 
745 /* EOF */
746