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
GdiAllocBatchCommand(HDC hdc,USHORT Cmd)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
GdiGetDcAttr(HDC hdc)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
GdiGetRgnAttr(HRGN hrgn)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
_lrintf(float f)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_RosGlueDeleteObject(HGDIOBJ hobj);
567
568 BOOL
569 WINAPI
570 METADC_RosGlueDeleteDC(
571 _In_ HDC hdc);
572
573 BOOL METADC_DeleteDC( HDC hdc );
574
575 BOOL
576 WINAPI
577 METADC_ExtTextOutW(
578 HDC hdc,
579 INT x,
580 INT y,
581 UINT fuOptions,
582 const RECT *lprc,
583 LPCWSTR lpString,
584 UINT cchString,
585 const INT *lpDx);
586
587
588 /* The following METADC_* functions follow this pattern: */
589 #define HANDLE_METADC(_RetType, _Func, dwError, hdc, ...) \
590 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
591 { \
592 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) \
593 { \
594 return (_RetType)METADC_##_Func(hdc, __VA_ARGS__); \
595 } \
596 else \
597 { \
598 PLDC pLDC = GdiGetLDC(hdc); \
599 _RetType _Ret = dwError; \
600 if ( !pLDC ) \
601 { \
602 SetLastError(ERROR_INVALID_HANDLE); \
603 return (_RetType)_Ret; \
604 } \
605 if ( pLDC->iType == LDC_EMFLDC && !(EMFDC_##_Func(pLDC, __VA_ARGS__)) ) \
606 { \
607 return (_RetType)_Ret; \
608 } \
609 /* Fall through to support information DC's.*/ \
610 } \
611 }
612
613 #define HANDLE_METADC16(_RetType, _Func, dwError, hdc, ...) \
614 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
615 { \
616 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) \
617 { \
618 return METADC_##_Func(hdc, __VA_ARGS__); \
619 } \
620 }
621
622 #define HANDLE_METADC0P(_RetType, _Func, dwError, hdc, ...) \
623 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
624 { \
625 PLDC pLDC = NULL; \
626 _RetType _Ret = dwError; \
627 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) \
628 { \
629 return (_RetType)_Ret; \
630 } \
631 pLDC = GdiGetLDC(hdc); \
632 if ( !pLDC ) \
633 { \
634 SetLastError(ERROR_INVALID_HANDLE); \
635 return (_RetType)_Ret; \
636 } \
637 if ( pLDC->iType == LDC_EMFLDC && !(EMFDC_##_Func(pLDC)) ) \
638 { \
639 return (_RetType)_Ret; \
640 } \
641 /* Fall through to support information DC's.*/ \
642 }
643
644 #define HANDLE_EMETAFDC(_RetType, _Func, dwError, hdc, ...) \
645 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
646 { \
647 PLDC pLDC = NULL; \
648 _RetType _Ret = dwError; \
649 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) \
650 { \
651 return (_RetType)_Ret; \
652 } \
653 pLDC = GdiGetLDC(hdc); \
654 if ( !pLDC ) \
655 { \
656 SetLastError(ERROR_INVALID_HANDLE); \
657 return (_RetType)_Ret; \
658 } \
659 if ( pLDC->iType == LDC_EMFLDC && !(EMFDC_##_Func(pLDC, __VA_ARGS__)) ) \
660 { \
661 return (_RetType)_Ret; \
662 } \
663 /* Fall through to support information DC's.*/ \
664 }
665
666 #define HANDLE_METADC1P(_RetType, _Func, dwError, hdc, ...) \
667 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \
668 { \
669 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) \
670 { \
671 return (_RetType)METADC_##_Func(hdc); \
672 } \
673 else \
674 { \
675 PLDC pLDC = GdiGetLDC(hdc); \
676 _RetType _Ret = dwError; \
677 if ( !pLDC ) \
678 { \
679 SetLastError(ERROR_INVALID_HANDLE); \
680 return (_RetType)_Ret; \
681 } \
682 if ( pLDC->iType == LDC_EMFLDC && !(EMFDC_##_Func(pLDC)) ) \
683 { \
684 return (_RetType)_Ret; \
685 } \
686 /* Fall through to support information DC's.*/ \
687 } \
688 }
689
690
691 BOOL WINAPI METADC_SetD(_In_ HDC hdc,_In_ DWORD dwIn,_In_ USHORT usMF16Id);
692 BOOL WINAPI EMFDC_SetD(_In_ PLDC pldc,_In_ DWORD dwIn,_In_ ULONG ulMFId);
693
694 HDC WINAPI GdiConvertAndCheckDC(HDC hdc);
695
696 HENHMETAFILE WINAPI SetEnhMetaFileBitsAlt( PDWORD pdw, LPWSTR FilePart, HANDLE hFile, LARGE_INTEGER li);
697
698 /* meta dc files */
699 extern BOOL METADC_Arc( HDC hdc, INT left, INT top, INT right, INT bottom,
700 INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
701 extern BOOL METADC_BitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height,
702 HDC hdc_src, INT x_src, INT y_src, DWORD rop );
703 extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart,
704 INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
705 extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
706 extern BOOL METADC_ExcludeClipRect( HDC hdc, INT left, INT top, INT right,
707 INT bottom ) DECLSPEC_HIDDEN;
708 extern BOOL METADC_ExtEscape( HDC hdc, INT escape, INT input_size, LPCSTR input, INT output_size, LPVOID output ) DECLSPEC_HIDDEN;
709 extern BOOL METADC_ExtFloodFill( HDC hdc, INT x, INT y, COLORREF color,
710 UINT fill_type ) DECLSPEC_HIDDEN;
711 extern BOOL METADC_ExtSelectClipRgn( HDC hdc, HRGN hrgn, INT mode ) DECLSPEC_HIDDEN;
712 extern BOOL METADC_ExtTextOut( HDC hdc, INT x, INT y, UINT flags, const RECT *rect,
713 const WCHAR *str, UINT count, const INT *dx ) DECLSPEC_HIDDEN;
714 extern BOOL METADC_FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;
715 extern BOOL METADC_FrameRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush, INT x, INT y ) DECLSPEC_HIDDEN;
716 extern INT METADC_GetDeviceCaps( HDC hdc, INT cap );
717 extern BOOL METADC_IntersectClipRect( HDC hdc, INT left, INT top, INT right,
718 INT bottom ) DECLSPEC_HIDDEN;
719 extern BOOL METADC_InvertRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN;
720 extern BOOL METADC_LineTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
721 extern BOOL METADC_MoveTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
722 extern BOOL METADC_OffsetClipRgn( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
723 extern BOOL METADC_OffsetViewportOrgEx( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
724 extern BOOL METADC_OffsetWindowOrgEx( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
725 extern BOOL METADC_PaintRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN;
726 extern BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop );
727 extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom,
728 INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
729 extern BOOL METADC_PolyPolygon( HDC hdc, const POINT *points, const INT *counts,
730 UINT polygons ) DECLSPEC_HIDDEN;
731 extern BOOL METADC_Polygon( HDC hdc, const POINT *points, INT count ) DECLSPEC_HIDDEN;
732 extern BOOL METADC_Polyline( HDC hdc, const POINT *points,INT count) DECLSPEC_HIDDEN;
733 extern BOOL METADC_RealizePalette( HDC hdc ) DECLSPEC_HIDDEN;
734 extern BOOL METADC_Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN;
735 extern BOOL METADC_RestoreDC( HDC hdc, INT level ) DECLSPEC_HIDDEN;
736 extern BOOL METADC_RoundRect( HDC hdc, INT left, INT top, INT right, INT bottom,
737 INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
738 extern BOOL METADC_SaveDC( HDC hdc ) DECLSPEC_HIDDEN;
739 extern BOOL METADC_ScaleViewportExtEx( HDC hdc, INT x_num, INT x_denom, INT y_num,
740 INT y_denom ) DECLSPEC_HIDDEN;
741 extern BOOL METADC_ScaleWindowExtEx( HDC hdc, INT x_num, INT x_denom, INT y_num,
742 INT y_denom ) DECLSPEC_HIDDEN;
743 extern HGDIOBJ METADC_SelectObject( HDC hdc, HGDIOBJ obj ) DECLSPEC_HIDDEN;
744 extern BOOL METADC_SelectPalette( HDC hdc, HPALETTE palette ) DECLSPEC_HIDDEN;
745 extern BOOL METADC_SetBkColor( HDC hdc, COLORREF color ) DECLSPEC_HIDDEN;
746 extern BOOL METADC_SetBkMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
747 extern INT METADC_SetDIBitsToDevice( HDC hdc, INT x_dest, INT y_dest, DWORD width, DWORD height,
748 INT x_src, INT y_src, UINT startscan, UINT lines,
749 const void *bits, const BITMAPINFO *info,
750 UINT coloruse ) DECLSPEC_HIDDEN;
751 extern BOOL METADC_SetLayout( HDC hdc, DWORD layout ) DECLSPEC_HIDDEN;
752 extern BOOL METADC_SetTextCharacterExtra( HDC hdc, INT extra ) DECLSPEC_HIDDEN;
753 extern BOOL METADC_SetMapMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
754 extern BOOL METADC_SetMapperFlags( HDC hdc, DWORD flags ) DECLSPEC_HIDDEN;
755 extern BOOL METADC_SetPixel( HDC hdc, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
756 extern BOOL METADC_SetPolyFillMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
757 extern BOOL METADC_SetRelAbs( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
758 extern BOOL METADC_SetROP2( HDC hdc, INT rop ) DECLSPEC_HIDDEN;
759 extern BOOL METADC_SetStretchBltMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
760 extern BOOL METADC_SetTextAlign( HDC hdc, UINT align ) DECLSPEC_HIDDEN;
761 extern BOOL METADC_SetTextColor( HDC hdc, COLORREF color ) DECLSPEC_HIDDEN;
762 extern BOOL METADC_SetTextJustification( HDC hdc, INT extra, INT breaks ) DECLSPEC_HIDDEN;
763 extern BOOL METADC_SetViewportExtEx( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
764 extern BOOL METADC_SetViewportOrgEx( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
765 extern BOOL METADC_SetWindowExtEx( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
766 extern BOOL METADC_SetWindowOrgEx( HDC, INT x, INT y ) DECLSPEC_HIDDEN;
767 extern BOOL METADC_StretchBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
768 HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src,
769 DWORD rop );
770 extern BOOL METADC_StretchDIBits( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
771 INT x_src, INT y_src, INT width_src, INT height_src,
772 const void *bits, const BITMAPINFO *info, UINT coloruse,
773 DWORD rop ) DECLSPEC_HIDDEN;
774 /* enhanced metafiles */
775 extern BOOL EMFDC_AbortPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
776 extern BOOL EMFDC_AlphaBlend( LDC *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
777 HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src,
778 BLENDFUNCTION blend_function );
779 extern BOOL EMFDC_AngleArc( LDC *dc_attr, INT x, INT y, DWORD radius, FLOAT start,
780 FLOAT sweep ) DECLSPEC_HIDDEN;
781 extern BOOL EMFDC_ArcChordPie( LDC *dc_attr, INT left, INT top, INT right,
782 INT bottom, INT xstart, INT ystart, INT xend,
783 INT yend, DWORD type ) DECLSPEC_HIDDEN;
784 extern BOOL EMFDC_BeginPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
785 extern BOOL EMFDC_BitBlt( LDC *dc_attr, INT x_dst, INT y_dst, INT width, INT height,
786 HDC hdc_src, INT x_src, INT y_src, DWORD rop );
787 extern BOOL EMFDC_CloseFigure( LDC *dc_attr ) DECLSPEC_HIDDEN;
788 extern BOOL EMFDC_DeleteDC( LDC *dc_attr ) DECLSPEC_HIDDEN;
789 extern BOOL EMFDC_Ellipse( LDC *dc_attr, INT left, INT top, INT right,
790 INT bottom ) DECLSPEC_HIDDEN;
791 extern BOOL EMFDC_EndPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
792 extern BOOL EMFDC_ExcludeClipRect( LDC *dc_attr, INT left, INT top, INT right,
793 INT bottom ) DECLSPEC_HIDDEN;
794 extern BOOL EMFDC_ExtFloodFill( LDC *dc_attr, INT x, INT y, COLORREF color,
795 UINT fill_type ) DECLSPEC_HIDDEN;
796 extern BOOL EMFDC_ExtSelectClipRgn( LDC *dc_attr, HRGN hrgn, INT mode ) DECLSPEC_HIDDEN;
797 extern BOOL EMFDC_ExtTextOut( LDC *dc_attr, INT x, INT y, UINT flags, const RECT *rect,
798 const WCHAR *str, UINT count, const INT *dx ) DECLSPEC_HIDDEN;
799 extern BOOL EMFDC_FillPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
800 extern BOOL EMFDC_FillRgn( LDC *dc_attr, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;
801 extern BOOL EMFDC_FlattenPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
802 extern BOOL EMFDC_FrameRgn( LDC *dc_attr, HRGN hrgn, HBRUSH hbrush, INT width,
803 INT height ) DECLSPEC_HIDDEN;
804 extern BOOL EMFDC_GradientFill( LDC *dc_attr, TRIVERTEX *vert_array, ULONG nvert,
805 void *grad_array, ULONG ngrad, ULONG mode ) DECLSPEC_HIDDEN;
806 extern BOOL EMFDC_IntersectClipRect( LDC *dc_attr, INT left, INT top, INT right,
807 INT bottom ) DECLSPEC_HIDDEN;
808 extern BOOL EMFDC_InvertRgn( LDC *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
809 extern BOOL EMFDC_LineTo( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
810 extern BOOL EMFDC_ModifyWorldTransform( LDC *dc_attr, const XFORM *xform,
811 DWORD mode ) DECLSPEC_HIDDEN;
812 extern BOOL EMFDC_MoveTo( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
813 extern BOOL EMFDC_OffsetClipRgn( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
814 extern BOOL EMFDC_PaintRgn( LDC *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
815 extern BOOL EMFDC_PatBlt( LDC *dc_attr, INT left, INT top, INT width, INT height, DWORD rop );
816 extern BOOL EMFDC_PolyBezier( LDC *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
817 extern BOOL EMFDC_PolyBezierTo( LDC *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
818 extern BOOL EMFDC_PolyDraw( LDC *dc_attr, const POINT *points, const BYTE *types,
819 DWORD count ) DECLSPEC_HIDDEN;
820 extern BOOL EMFDC_PolyPolyline( LDC *dc_attr, const POINT *points, const DWORD *counts,
821 DWORD polys ) DECLSPEC_HIDDEN;
822 extern BOOL EMFDC_PolyPolygon( LDC *dc_attr, const POINT *points, const INT *counts,
823 UINT polys ) DECLSPEC_HIDDEN;
824 extern BOOL EMFDC_Polygon( LDC *dc_attr, const POINT *points, INT count ) DECLSPEC_HIDDEN;
825 extern BOOL EMFDC_Polyline( LDC *dc_attr, const POINT *points, INT count) DECLSPEC_HIDDEN;
826 extern BOOL EMFDC_PolylineTo( LDC *dc_attr, const POINT *points, INT count ) DECLSPEC_HIDDEN;
827 extern BOOL EMFDC_Rectangle( LDC *dc_attr, INT left, INT top, INT right,
828 INT bottom) DECLSPEC_HIDDEN;
829 extern BOOL EMFDC_RestoreDC( LDC *dc_attr, INT level ) DECLSPEC_HIDDEN;
830 extern BOOL EMFDC_RoundRect( LDC *dc_attr, INT left, INT top, INT right, INT bottom,
831 INT ell_width, INT ell_height ) DECLSPEC_HIDDEN;
832 extern BOOL EMFDC_SaveDC( LDC *dc_attr ) DECLSPEC_HIDDEN;
833 extern BOOL EMFDC_ScaleViewportExtEx( LDC *dc_attr, INT x_num, INT x_denom, INT y_num,
834 INT y_denom ) DECLSPEC_HIDDEN;
835 extern BOOL EMFDC_ScaleWindowExtEx( LDC *dc_attr, INT x_num, INT x_denom, INT y_num,
836 INT y_denom ) DECLSPEC_HIDDEN;
837 extern BOOL EMFDC_SelectClipPath( LDC *dc_attr, INT mode ) DECLSPEC_HIDDEN;
838 extern BOOL EMFDC_SelectObject( LDC *dc_attr, HGDIOBJ obj ) DECLSPEC_HIDDEN;
839 extern BOOL EMFDC_SelectPalette( LDC *dc_attr, HPALETTE palette ) DECLSPEC_HIDDEN;
840 extern BOOL EMFDC_SetArcDirection( LDC *dc_attr, INT dir ) DECLSPEC_HIDDEN;
841 extern BOOL EMFDC_SetBkColor( LDC *dc_attr, COLORREF color ) DECLSPEC_HIDDEN;
842 extern BOOL EMFDC_SetBkMode( LDC *dc_attr, INT mode ) DECLSPEC_HIDDEN;
843 extern BOOL EMFDC_SetDCBrushColor( LDC *dc_attr, COLORREF color ) DECLSPEC_HIDDEN;
844 extern BOOL EMFDC_SetDCPenColor( LDC *dc_attr, COLORREF color ) DECLSPEC_HIDDEN;
845 extern BOOL EMFDC_SetDIBitsToDevice( LDC *dc_attr, INT x_dest, INT y_dest, DWORD width,
846 DWORD height, INT x_src, INT y_src, UINT startscan,
847 UINT lines, const void *bits, const BITMAPINFO *info,
848 UINT coloruse ) DECLSPEC_HIDDEN;
849 extern BOOL EMFDC_SetLayout( LDC *dc_attr, DWORD layout ) DECLSPEC_HIDDEN;
850 extern BOOL EMFDC_SetMapMode( LDC *dc_attr, INT mode ) DECLSPEC_HIDDEN;
851 extern BOOL EMFDC_SetMapperFlags( LDC *dc_attr, DWORD flags ) DECLSPEC_HIDDEN;
852 extern BOOL EMFDC_SetPixel( LDC *dc_attr, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
853 extern BOOL EMFDC_SetPolyFillMode( LDC *dc_attr, INT mode ) DECLSPEC_HIDDEN;
854 extern BOOL EMFDC_SetROP2( LDC *dc_attr, INT rop ) DECLSPEC_HIDDEN;
855 extern BOOL EMFDC_SetStretchBltMode( LDC *dc_attr, INT mode ) DECLSPEC_HIDDEN;
856 extern BOOL EMFDC_SetTextAlign( LDC *dc_attr, UINT align ) DECLSPEC_HIDDEN;
857 extern BOOL EMFDC_SetTextColor( LDC *dc_attr, COLORREF color ) DECLSPEC_HIDDEN;
858 extern BOOL EMFDC_SetTextJustification( LDC *dc_attr, INT extra, INT breaks ) DECLSPEC_HIDDEN;
859 extern BOOL EMFDC_SetViewportExtEx( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
860 extern BOOL EMFDC_SetViewportOrgEx( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
861 extern BOOL EMFDC_SetWindowExtEx( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
862 extern BOOL EMFDC_SetWindowOrgEx( LDC *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
863 extern BOOL EMFDC_SetWorldTransform( LDC *dc_attr, const XFORM *xform ) DECLSPEC_HIDDEN;
864 extern BOOL EMFDC_StretchBlt( LDC *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
865 HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src,
866 DWORD rop );
867 extern BOOL EMFDC_StretchDIBits( LDC *dc_attr, INT x_dst, INT y_dst, INT width_dst,
868 INT height_dst, INT x_src, INT y_src, INT width_src,
869 INT height_src, const void *bits, const BITMAPINFO *info,
870 UINT coloruse, DWORD rop ) DECLSPEC_HIDDEN;
871 extern BOOL EMFDC_StrokeAndFillPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
872 extern BOOL EMFDC_StrokePath( LDC *dc_attr ) DECLSPEC_HIDDEN;
873 extern BOOL EMFDC_WidenPath( LDC *dc_attr ) DECLSPEC_HIDDEN;
874
875
876 BOOL EMFDC_MaskBlt( LDC *dc_attr, INT xDest, INT yDest, INT cx, INT cy, HDC hdcSrc, INT xSrc, INT ySrc, HBITMAP hbmMask, INT xMask, INT yMask, DWORD dwRop);
877 BOOL EMFDC_PlgBlt( LDC *dc_attr, const POINT * ppt, HDC hdcSrc, INT xSrc, INT ySrc, INT cx, INT cy, HBITMAP hbmMask, INT xMask, INT yMask);
878 BOOL EMFDC_TransparentBlt( LDC *dc_attr, INT xDst, INT yDst, INT cxDst, INT cyDst, HDC hdcSrc, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, UINT crTransparent);
879 BOOL EMFDC_SetBrushOrg( LDC *dc_attr, INT x, INT y);
880 BOOL EMFDC_SetMetaRgn( LDC *dc_attr );
881 BOOL EMFDC_WriteNamedEscape( LDC *dc_attr, PWCHAR pDriver, INT nEscape, INT cbInput, LPCSTR lpszInData);
882 BOOL EMFDC_WriteEscape( LDC *dc_attr, INT nEscape, INT cbInput, LPSTR lpszInData, DWORD emrType);
883
884
EMFDC_Arc(PLDC dc_attr,INT left,INT top,INT right,INT bottom,INT xstart,INT ystart,INT xend,INT yend)885 FORCEINLINE BOOL EMFDC_Arc( PLDC dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend )
886 {
887 return EMFDC_ArcChordPie( dc_attr, left, top, right, bottom, xstart, ystart, xend, yend, EMR_ARC );
888 }
889
EMFDC_ArcTo(PLDC dc_attr,INT left,INT top,INT right,INT bottom,INT xstart,INT ystart,INT xend,INT yend)890 FORCEINLINE BOOL EMFDC_ArcTo( PLDC dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend )
891 {
892 return EMFDC_ArcChordPie( dc_attr, left, top, right, bottom, xstart, ystart, xend, yend, EMR_ARCTO );
893 }
EMFDC_Chord(PLDC dc_attr,INT left,INT top,INT right,INT bottom,INT xstart,INT ystart,INT xend,INT yend)894 FORCEINLINE BOOL EMFDC_Chord( PLDC dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend )
895 {
896 return EMFDC_ArcChordPie( dc_attr, left, top, right, bottom, xstart, ystart, xend, yend, EMR_CHORD );
897 }
898
EMFDC_Pie(PLDC dc_attr,INT left,INT top,INT right,INT bottom,INT xstart,INT ystart,INT xend,INT yend)899 FORCEINLINE BOOL EMFDC_Pie( PLDC dc_attr, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend )
900 {
901 return EMFDC_ArcChordPie( dc_attr, left, top, right, bottom, xstart, ystart, xend, yend, EMR_PIE );
902 }
903
904 BOOL WINAPI EMFDC_GdiComment( HDC hdc, UINT bytes, const BYTE *buffer );
905
906 /* EOF */
907