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