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