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