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 = 0; 394 else if (Cmd == GdiBCExtTextOut) cjSize = 0; 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 414 /* Get the head of the entry */ 415 pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset); 416 417 /* Update Offset and batch count */ 418 pTeb->GdiTebBatch.Offset += cjSize; 419 pTeb->GdiBatchCount++; 420 421 /* Fill in the core fields */ 422 pHdr->Cmd = Cmd; 423 pHdr->Size = cjSize; 424 425 return pHdr; 426 } 427 428 FORCEINLINE 429 PDC_ATTR 430 GdiGetDcAttr(HDC hdc) 431 { 432 GDILOOBJTYPE eDcObjType; 433 PDC_ATTR pdcattr; 434 435 /* Check DC object type */ 436 eDcObjType = GDI_HANDLE_GET_TYPE(hdc); 437 if ((eDcObjType != GDILoObjType_LO_DC_TYPE) && 438 (eDcObjType != GDILoObjType_LO_ALTDC_TYPE)) 439 { 440 return NULL; 441 } 442 443 /* Get the DC attribute */ 444 if (!GdiGetHandleUserData((HGDIOBJ)hdc, eDcObjType, (PVOID*)&pdcattr)) 445 { 446 return NULL; 447 } 448 449 return pdcattr; 450 } 451 452 FORCEINLINE 453 PRGN_ATTR 454 GdiGetRgnAttr(HRGN hrgn) 455 { 456 PRGN_ATTR prgnattr; 457 458 /* Get the region attribute */ 459 if (!GdiGetHandleUserData(hrgn, GDILoObjType_LO_REGION_TYPE, (PVOID*)&prgnattr)) 460 { 461 return NULL; 462 } 463 464 return prgnattr; 465 } 466 467 #ifdef _M_IX86 468 FLOATL FASTCALL EFtoF(EFLOAT_S * efp); 469 #define FOtoF(pfo) EFtoF((EFLOAT_S*)pfo) 470 #else 471 #define FOtoF(pfo) (*(pfo)) 472 #endif 473 474 /* This is an inlined version of lrintf. */ 475 FORCEINLINE 476 int 477 _lrintf(float f) 478 { 479 #if defined(_M_IX86) && defined(__GNUC__) 480 int result; 481 __asm__ __volatile__ ("fistpl %0" : "=m" (result) : "t" (f) : "st"); 482 return result; 483 #elif defined(_M_IX86) && defined(_MSC_VER) 484 int result; 485 __asm 486 { 487 fld f; 488 fistp result; 489 } 490 #else 491 /* slow, but portable */ 492 return (int)(f >= 0 ? f+0.5 : f-0.5); 493 #endif 494 } 495 496 HBRUSH 497 WINAPI 498 GdiSelectBrush( 499 _In_ HDC hdc, 500 _In_ HBRUSH hbr); 501 502 HPEN 503 WINAPI 504 GdiSelectPen( 505 _In_ HDC hdc, 506 _In_ HPEN hpen); 507 508 HFONT 509 WINAPI 510 GdiSelectFont( 511 _In_ HDC hdc, 512 _In_ HFONT hfont); 513 514 HGDIOBJ 515 WINAPI 516 GdiCreateClientObj( 517 _In_ PVOID pvObject, 518 _In_ GDILOOBJTYPE eObjType); 519 520 PVOID 521 WINAPI 522 GdiDeleteClientObj( 523 _In_ HGDIOBJ hobj); 524 525 BOOL 526 WINAPI 527 GdiCreateClientObjLink( 528 _In_ HGDIOBJ hobj, 529 _In_ PVOID pvObject); 530 531 PVOID 532 WINAPI 533 GdiGetClientObjLink( 534 _In_ HGDIOBJ hobj); 535 536 PVOID 537 WINAPI 538 GdiRemoveClientObjLink( 539 _In_ HGDIOBJ hobj); 540 541 extern ULONG gcClientObj; 542 543 VOID 544 WINAPI 545 METADC_DeleteObject(HGDIOBJ hobj); 546 547 BOOL 548 WINAPI 549 METADC_DeleteDC( 550 _In_ HDC hdc); 551 552 INT 553 WINAPI 554 METADC16_Escape( 555 _In_ HDC hdc, 556 _In_ INT nEscape, 557 _In_ INT cbInput, 558 _In_ LPCSTR lpvInData, 559 _Out_ LPVOID lpvOutData); 560 561 BOOL 562 WINAPI 563 METADC_ExtTextOutW( 564 HDC hdc, 565 INT x, 566 INT y, 567 UINT fuOptions, 568 const RECT *lprc, 569 LPCWSTR lpString, 570 UINT cchString, 571 const INT *lpDx); 572 573 BOOL 574 WINAPI 575 METADC_PatBlt( 576 _In_ HDC hdc, 577 _In_ INT xLeft, 578 _In_ INT yTop, 579 _In_ INT nWidth, 580 _In_ INT nHeight, 581 _In_ DWORD dwRop); 582 583 584 /* The following METADC_* functions follow this pattern: */ 585 #define HANDLE_METADC0P(_RetType, _Func, dwError, hdc, ...) \ 586 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \ 587 { \ 588 DWORD_PTR dwResult; \ 589 if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc)) \ 590 { \ 591 return (_RetType)dwResult; \ 592 } \ 593 } 594 595 #define HANDLE_METADC(_RetType, _Func, dwError, hdc, ...) \ 596 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \ 597 { \ 598 DWORD_PTR dwResult = 1; \ 599 if (METADC_Dispatch(DCFUNC_##_Func, &dwResult, (DWORD_PTR)dwError, hdc, __VA_ARGS__)) \ 600 { \ 601 return (_RetType)dwResult; \ 602 } \ 603 } 604 605 606 typedef enum _DCFUNC 607 { 608 //DCFUNC_AbortDoc, 609 DCFUNC_AbortPath, 610 DCFUNC_AlphaBlend, // UNIMPLEMENTED 611 DCFUNC_AngleArc, // UNIMPLEMENTED 612 DCFUNC_Arc, 613 DCFUNC_ArcTo, // UNIMPLEMENTED 614 DCFUNC_BeginPath, 615 //DCFUNC_BitBlt, 616 DCFUNC_Chord, 617 DCFUNC_CloseFigure, 618 DCFUNC_Ellipse, 619 DCFUNC_EndPath, 620 DCFUNC_ExcludeClipRect, 621 DCFUNC_ExtEscape, 622 DCFUNC_ExtFloodFill, 623 DCFUNC_ExtSelectClipRgn, 624 DCFUNC_ExtTextOut, 625 DCFUNC_FillPath, 626 DCFUNC_FillRgn, 627 DCFUNC_FlattenPath, 628 DCFUNC_FrameRgn, 629 DCFUNC_GetDeviceCaps, 630 DCFUNC_GdiComment, 631 DCFUNC_GradientFill, // UNIMPLEMENTED 632 DCFUNC_IntersectClipRect, 633 DCFUNC_InvertRgn, 634 DCFUNC_LineTo, 635 DCFUNC_MaskBlt, // UNIMPLEMENTED 636 DCFUNC_ModifyWorldTransform, 637 DCFUNC_MoveTo, 638 DCFUNC_OffsetClipRgn, 639 DCFUNC_OffsetViewportOrgEx, 640 DCFUNC_OffsetWindowOrgEx, 641 DCFUNC_PathToRegion, // UNIMPLEMENTED 642 DCFUNC_PatBlt, 643 DCFUNC_Pie, 644 DCFUNC_PlgBlt, // UNIMPLEMENTED 645 DCFUNC_PolyBezier, 646 DCFUNC_PolyBezierTo, 647 DCFUNC_PolyDraw, 648 DCFUNC_Polygon, 649 DCFUNC_Polyline, 650 DCFUNC_PolylineTo, 651 DCFUNC_PolyPolygon, 652 DCFUNC_PolyPolyline, 653 DCFUNC_RealizePalette, 654 DCFUNC_Rectangle, 655 DCFUNC_RestoreDC, 656 DCFUNC_RoundRect, 657 DCFUNC_SaveDC, 658 DCFUNC_ScaleViewportExtEx, 659 DCFUNC_ScaleWindowExtEx, 660 DCFUNC_SelectBrush, 661 DCFUNC_SelectClipPath, 662 DCFUNC_SelectFont, 663 DCFUNC_SelectPalette, 664 DCFUNC_SelectPen, 665 DCFUNC_SetDCBrushColor, 666 DCFUNC_SetDCPenColor, 667 DCFUNC_SetDIBitsToDevice, 668 DCFUNC_SetBkColor, 669 DCFUNC_SetBkMode, 670 DCFUNC_SetLayout, 671 //DCFUNC_SetMapMode, 672 DCFUNC_SetPixel, 673 DCFUNC_SetPolyFillMode, 674 DCFUNC_SetROP2, 675 DCFUNC_SetStretchBltMode, 676 DCFUNC_SetTextAlign, 677 DCFUNC_SetTextCharacterExtra, 678 DCFUNC_SetTextColor, 679 DCFUNC_SetTextJustification, 680 DCFUNC_SetViewportExtEx, 681 DCFUNC_SetViewportOrgEx, 682 DCFUNC_SetWindowExtEx, 683 DCFUNC_SetWindowOrgEx, 684 DCFUNC_SetWorldTransform, 685 DCFUNC_StretchBlt, 686 DCFUNC_StrokeAndFillPath, 687 DCFUNC_StrokePath, 688 DCFUNC_TransparentBlt, // UNIMPLEMENTED 689 DCFUNC_WidenPath, 690 691 } DCFUNC; 692 693 BOOL 694 METADC_Dispatch( 695 _In_ DCFUNC eFunction, 696 _Out_ PDWORD_PTR pdwResult, 697 _In_ DWORD_PTR dwError, 698 _In_ HDC hdc, 699 ...); 700 701 #define HANDLE_METADC2(_RetType, _Func, hdc, ...) \ 702 if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_DC_TYPE) \ 703 { \ 704 _RetType result; \ 705 if (METADC_##_Func(&result, hdc, __VA_ARGS__)) \ 706 { \ 707 return result; \ 708 } \ 709 } 710 711 BOOL 712 WINAPI 713 METADC_GetAndSetDCDWord( 714 _Out_ PDWORD pdwResult, 715 _In_ HDC hdc, 716 _In_ UINT u, 717 _In_ DWORD dwIn, 718 _In_ ULONG ulMFId, 719 _In_ USHORT usMF16Id, 720 _In_ DWORD dwError); 721 722 /* EOF */ 723