1 #include <precomp.h> 2 3 4 /* 5 * @implemented 6 */ 7 BOOL 8 WINAPI 9 LineTo( 10 _In_ HDC hdc, 11 _In_ INT x, 12 _In_ INT y ) 13 { 14 HANDLE_METADC(BOOL, LineTo, FALSE, hdc, x, y); 15 16 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 17 18 return NtGdiLineTo(hdc, x, y); 19 } 20 21 22 BOOL 23 WINAPI 24 MoveToEx( 25 _In_ HDC hdc, 26 _In_ INT x, 27 _In_ INT y, 28 _Out_opt_ LPPOINT ppt) 29 { 30 PDC_ATTR pdcattr; 31 32 HANDLE_METADC(BOOL, MoveTo, FALSE, hdc, x, y); 33 34 /* Get the DC attribute */ 35 pdcattr = GdiGetDcAttr(hdc); 36 if (pdcattr == NULL) 37 { 38 SetLastError(ERROR_INVALID_PARAMETER); 39 return FALSE; 40 } 41 42 if (ppt) 43 { 44 if ( pdcattr->ulDirty_ & DIRTY_PTLCURRENT ) // Double hit! 45 { 46 ppt->x = pdcattr->ptfxCurrent.x; // ret prev before change. 47 ppt->y = pdcattr->ptfxCurrent.y; 48 DPtoLP (hdc, ppt, 1); // reconvert back. 49 } 50 else 51 { 52 ppt->x = pdcattr->ptlCurrent.x; 53 ppt->y = pdcattr->ptlCurrent.y; 54 } 55 } 56 57 pdcattr->ptlCurrent.x = x; 58 pdcattr->ptlCurrent.y = y; 59 60 pdcattr->ulDirty_ &= ~DIRTY_PTLCURRENT; 61 pdcattr->ulDirty_ |= ( DIRTY_PTFXCURRENT|DIRTY_STYLESTATE); // Set dirty 62 return TRUE; 63 } 64 65 66 /* 67 * @implemented 68 */ 69 BOOL 70 WINAPI 71 Ellipse( 72 _In_ HDC hdc, 73 _In_ INT left, 74 _In_ INT top, 75 _In_ INT right, 76 _In_ INT bottom) 77 { 78 HANDLE_METADC(BOOL, Ellipse, FALSE, hdc, left, top, right, bottom); 79 80 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 81 82 return NtGdiEllipse(hdc, left, top, right, bottom); 83 } 84 85 86 /* 87 * @implemented 88 */ 89 BOOL 90 WINAPI 91 Rectangle( 92 _In_ HDC hdc, 93 _In_ INT left, 94 _In_ INT top, 95 _In_ INT right, 96 _In_ INT bottom) 97 { 98 HANDLE_METADC(BOOL, Rectangle, FALSE, hdc, left, top, right, bottom); 99 100 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 101 102 return NtGdiRectangle(hdc, left, top, right, bottom); 103 } 104 105 106 /* 107 * @implemented 108 */ 109 BOOL 110 WINAPI 111 RoundRect( 112 _In_ HDC hdc, 113 _In_ INT left, 114 _In_ INT top, 115 _In_ INT right, 116 _In_ INT bottom, 117 _In_ INT width, 118 _In_ INT height) 119 { 120 HANDLE_METADC(BOOL, RoundRect, FALSE, hdc, left, top, right, bottom, width, height); 121 122 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 123 124 return NtGdiRoundRect(hdc, left, top, right, bottom, width, height); 125 } 126 127 128 /* 129 * @implemented 130 */ 131 COLORREF 132 WINAPI 133 GetPixel( 134 _In_ HDC hdc, 135 _In_ INT x, 136 _In_ INT y) 137 { 138 if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) return CLR_INVALID; 139 if (!GdiValidateHandle((HGDIOBJ) hdc)) return CLR_INVALID; 140 return NtGdiGetPixel(hdc, x, y); 141 } 142 143 144 /* 145 * @implemented 146 */ 147 COLORREF 148 WINAPI 149 SetPixel( 150 _In_ HDC hdc, 151 _In_ INT x, 152 _In_ INT y, 153 _In_ COLORREF crColor) 154 { 155 HANDLE_METADC(COLORREF, SetPixel, CLR_INVALID, hdc, x, y, crColor); 156 157 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 158 159 return NtGdiSetPixel(hdc, x, y, crColor); 160 } 161 162 163 /* 164 * @implemented 165 */ 166 BOOL 167 WINAPI 168 SetPixelV( 169 _In_ HDC hdc, 170 _In_ INT x, 171 _In_ INT y, 172 _In_ COLORREF crColor) 173 { 174 return SetPixel(hdc, x, y, crColor) != CLR_INVALID; 175 } 176 177 178 /* 179 * @implemented 180 */ 181 BOOL 182 WINAPI 183 FillRgn( 184 _In_ HDC hdc, 185 _In_ HRGN hrgn, 186 _In_ HBRUSH hbr) 187 { 188 189 if ((hrgn == NULL) || (hbr == NULL)) 190 return FALSE; 191 192 HANDLE_METADC(BOOL, FillRgn, FALSE, hdc, hrgn, hbr); 193 194 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 195 196 return NtGdiFillRgn(hdc, hrgn, hbr); 197 } 198 199 200 /* 201 * @implemented 202 */ 203 BOOL 204 WINAPI 205 FrameRgn( 206 _In_ HDC hdc, 207 _In_ HRGN hrgn, 208 _In_ HBRUSH hbr, 209 _In_ INT nWidth, 210 _In_ INT nHeight) 211 { 212 213 if ((hrgn == NULL) || (hbr == NULL)) 214 return FALSE; 215 216 HANDLE_METADC(BOOL, FrameRgn, FALSE, hdc, hrgn, hbr, nWidth, nHeight); 217 218 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 219 220 return NtGdiFrameRgn(hdc, hrgn, hbr, nWidth, nHeight); 221 } 222 223 224 /* 225 * @implemented 226 */ 227 BOOL 228 WINAPI 229 InvertRgn( 230 _In_ HDC hdc, 231 _In_ HRGN hrgn) 232 { 233 234 if (hrgn == NULL) 235 return FALSE; 236 237 HANDLE_METADC(BOOL, InvertRgn, FALSE, hdc, hrgn); 238 239 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 240 241 return NtGdiInvertRgn(hdc, hrgn); 242 } 243 244 245 /* 246 * @implemented 247 */ 248 BOOL 249 WINAPI 250 PaintRgn( 251 _In_ HDC hdc, 252 _In_ HRGN hrgn) 253 { 254 return FillRgn(hdc, hrgn, GetCurrentObject(hdc, OBJ_BRUSH)); 255 } 256 257 258 /* 259 * @implemented 260 */ 261 BOOL 262 WINAPI 263 PolyBezier( 264 _In_ HDC hdc, 265 _In_reads_(cpt) const POINT *apt, 266 _In_ DWORD cpt) 267 { 268 HANDLE_EMETAFDC(BOOL, PolyBezier, FALSE, hdc, apt, cpt); 269 270 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 271 272 return NtGdiPolyPolyDraw(hdc ,(PPOINT)apt, &cpt, 1, GdiPolyBezier); 273 } 274 275 276 /* 277 * @implemented 278 */ 279 BOOL 280 WINAPI 281 PolyBezierTo( 282 _In_ HDC hdc, 283 _In_reads_(cpt) const POINT *apt, 284 _In_ DWORD cpt) 285 { 286 HANDLE_EMETAFDC(BOOL, PolyBezierTo, FALSE, hdc, apt, cpt); 287 288 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 289 290 return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyBezierTo); 291 } 292 293 294 /* 295 * @implemented 296 */ 297 BOOL 298 WINAPI 299 PolyDraw( 300 _In_ HDC hdc, 301 _In_reads_(cpt) const POINT *apt, 302 _In_reads_(cpt) const BYTE *aj, 303 _In_ INT cpt) 304 { 305 HANDLE_EMETAFDC(BOOL, PolyDraw, FALSE, hdc, apt, aj, cpt); 306 307 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 308 309 return NtGdiPolyDraw(hdc, (PPOINT)apt, (PBYTE)aj, cpt); 310 } 311 312 313 /* 314 * @implemented 315 */ 316 BOOL 317 WINAPI 318 Polygon( 319 _In_ HDC hdc, 320 _In_reads_(cpt) const POINT *apt, 321 _In_ INT cpt) 322 { 323 HANDLE_METADC(BOOL, Polygon, FALSE, hdc, apt, cpt); 324 325 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 326 327 return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolygon); 328 } 329 330 331 /* 332 * @implemented 333 */ 334 BOOL 335 WINAPI 336 Polyline( 337 _In_ HDC hdc, 338 _In_reads_(cpt) const POINT *apt, 339 _In_ INT cpt) 340 { 341 HANDLE_METADC(BOOL, Polyline, FALSE, hdc, apt, cpt); 342 343 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 344 345 return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)&cpt, 1, GdiPolyPolyLine); 346 } 347 348 349 /* 350 * @implemented 351 */ 352 BOOL 353 WINAPI 354 PolylineTo( 355 _In_ HDC hdc, 356 _In_reads_(cpt) const POINT *apt, 357 _In_ DWORD cpt) 358 { 359 HANDLE_EMETAFDC(BOOL, PolylineTo, FALSE, hdc, apt, cpt); 360 361 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 362 363 return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, &cpt, 1, GdiPolyLineTo); 364 } 365 366 367 /* 368 * @implemented 369 */ 370 BOOL 371 WINAPI 372 PolyPolygon( 373 _In_ HDC hdc, 374 _In_ const POINT *apt, 375 _In_reads_(csz) const INT *asz, 376 _In_ INT csz) 377 { 378 HANDLE_METADC(BOOL, PolyPolygon, FALSE, hdc, apt, asz, csz); 379 380 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 381 382 return NtGdiPolyPolyDraw(hdc, (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolygon); 383 } 384 385 386 /* 387 * @implemented 388 */ 389 BOOL 390 WINAPI 391 PolyPolyline( 392 _In_ HDC hdc, 393 _In_ CONST POINT *apt, 394 _In_reads_(csz) CONST DWORD *asz, 395 _In_ DWORD csz) 396 { 397 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) 398 return FALSE; 399 400 HANDLE_EMETAFDC(BOOL, PolyPolyline, FALSE, hdc, apt, asz, csz); 401 402 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 403 404 return NtGdiPolyPolyDraw(hdc , (PPOINT)apt, (PULONG)asz, csz, GdiPolyPolyLine); 405 } 406 407 408 /* 409 * @implemented 410 */ 411 BOOL 412 WINAPI 413 ExtFloodFill( 414 _In_ HDC hdc, 415 _In_ INT xStart, 416 _In_ INT yStart, 417 _In_ COLORREF crFill, 418 _In_ UINT fuFillType) 419 { 420 HANDLE_METADC(BOOL, ExtFloodFill, FALSE, hdc, xStart, yStart, crFill, fuFillType); 421 422 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 423 424 return NtGdiExtFloodFill(hdc, xStart, yStart, crFill, fuFillType); 425 } 426 427 428 /* 429 * @implemented 430 */ 431 BOOL 432 WINAPI 433 FloodFill( 434 _In_ HDC hdc, 435 _In_ INT xStart, 436 _In_ INT yStart, 437 _In_ COLORREF crFill) 438 { 439 return ExtFloodFill(hdc, xStart, yStart, crFill, FLOODFILLBORDER); 440 } 441 442 /* 443 * @implemented 444 */ 445 BOOL 446 WINAPI 447 BitBlt( 448 _In_ HDC hdcDest, 449 _In_ INT xDest, 450 _In_ INT yDest, 451 _In_ INT cx, 452 _In_ INT cy, 453 _In_opt_ HDC hdcSrc, 454 _In_ INT xSrc, 455 _In_ INT ySrc, 456 _In_ DWORD dwRop) 457 { 458 /* Use PatBlt for no source blt, like windows does */ 459 if (!ROP_USES_SOURCE(dwRop)) 460 { 461 return PatBlt(hdcDest, xDest, yDest, cx, cy, dwRop); 462 } 463 464 /* For meta DCs we use StretchBlt via emfdc.c */ 465 HANDLE_METADC(BOOL, 466 BitBlt, 467 FALSE, 468 hdcDest, 469 xDest, 470 yDest, 471 cx, 472 cy, 473 hdcSrc, 474 xSrc, 475 ySrc, 476 dwRop); 477 478 if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE; 479 480 return NtGdiBitBlt(hdcDest, xDest, yDest, cx, cy, hdcSrc, xSrc, ySrc, dwRop, 0, 0); 481 } 482 483 BOOL 484 WINAPI 485 PatBlt( 486 _In_ HDC hdc, 487 _In_ INT nXLeft, 488 _In_ INT nYLeft, 489 _In_ INT nWidth, 490 _In_ INT nHeight, 491 _In_ DWORD dwRop) 492 { 493 PDC_ATTR pdcattr; 494 495 HANDLE_EMETAFDC(BOOL, PatBlt, FALSE, hdc, nXLeft, nYLeft, nWidth, nHeight, dwRop); 496 497 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 498 499 /* Get the DC attribute */ 500 pdcattr = GdiGetDcAttr(hdc); 501 if (pdcattr && !(pdcattr->ulDirty_ & DC_DIBSECTION)) 502 { 503 PGDIBSPATBLT pgO; 504 505 pgO = GdiAllocBatchCommand(hdc, GdiBCPatBlt); 506 if (pgO) 507 { 508 pdcattr->ulDirty_ |= DC_MODE_DIRTY; 509 pgO->nXLeft = nXLeft; 510 pgO->nYLeft = nYLeft; 511 pgO->nWidth = nWidth; 512 pgO->nHeight = nHeight; 513 pgO->dwRop = dwRop; 514 /* Snapshot attributes */ 515 pgO->hbrush = pdcattr->hbrush; 516 pgO->crForegroundClr = pdcattr->crForegroundClr; 517 pgO->crBackgroundClr = pdcattr->crBackgroundClr; 518 pgO->crBrushClr = pdcattr->crBrushClr; 519 pgO->ulForegroundClr = pdcattr->ulForegroundClr; 520 pgO->ulBackgroundClr = pdcattr->ulBackgroundClr; 521 pgO->ulBrushClr = pdcattr->ulBrushClr; 522 return TRUE; 523 } 524 } 525 return NtGdiPatBlt( hdc, nXLeft, nYLeft, nWidth, nHeight, dwRop); 526 } 527 528 BOOL 529 WINAPI 530 PolyPatBlt( 531 _In_ HDC hdc, 532 _In_ DWORD dwRop, 533 _In_ PPOLYPATBLT pPoly, 534 _In_ DWORD nCount, 535 _In_ DWORD dwMode) 536 { 537 UINT i; 538 BOOL bResult; 539 HBRUSH hbrOld; 540 PDC_ATTR pdcattr; 541 542 /* Handle meta DCs */ 543 if ((GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) || 544 (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_ALTDC_TYPE)) 545 { 546 if (!GdiValidateHandle(hdc)) 547 { 548 return FALSE; 549 } 550 551 /* Save the current DC brush */ 552 hbrOld = SelectObject(hdc, GetStockObject(DC_BRUSH)); 553 554 /* Assume success */ 555 bResult = TRUE; 556 557 /* Loop all rect */ 558 for (i = 0; i < nCount; i++) 559 { 560 /* Select the brush for this rect */ 561 SelectObject(hdc, pPoly[i].hBrush); 562 563 /* Do the PatBlt operation for this rect */ 564 bResult &= PatBlt(hdc, 565 pPoly[i].nXLeft, 566 pPoly[i].nYLeft, 567 pPoly[i].nWidth, 568 pPoly[i].nHeight, 569 dwRop); 570 } 571 572 /* Restore the old brush */ 573 SelectObject(hdc, hbrOld); 574 575 return bResult; 576 } 577 578 /* Get the DC attribute */ 579 pdcattr = GdiGetDcAttr(hdc); 580 if (nCount && pdcattr && !(pdcattr->ulDirty_ & DC_DIBSECTION)) 581 { 582 PGDIBSPPATBLT pgO; 583 PTEB pTeb = NtCurrentTeb(); 584 585 pgO = GdiAllocBatchCommand(hdc, GdiBCPolyPatBlt); 586 if (pgO) 587 { 588 USHORT cjSize = 0; 589 if (nCount > 1) cjSize = (nCount-1) * sizeof(PATRECT); 590 591 if ((pTeb->GdiTebBatch.Offset + cjSize) <= GDIBATCHBUFSIZE) 592 { 593 pdcattr->ulDirty_ |= DC_MODE_DIRTY; 594 pgO->Count = nCount; 595 pgO->Mode = dwMode; 596 pgO->rop4 = dwRop; 597 /* Snapshot attributes */ 598 pgO->crForegroundClr = pdcattr->crForegroundClr; 599 pgO->crBackgroundClr = pdcattr->crBackgroundClr; 600 pgO->crBrushClr = pdcattr->crBrushClr; 601 pgO->ulForegroundClr = pdcattr->ulForegroundClr; 602 pgO->ulBackgroundClr = pdcattr->ulBackgroundClr; 603 pgO->ulBrushClr = pdcattr->ulBrushClr; 604 RtlCopyMemory(pgO->pRect, pPoly, nCount * sizeof(PATRECT)); 605 // Recompute offset and return size, remember one is already accounted for in the structure. 606 pTeb->GdiTebBatch.Offset += cjSize; 607 ((PGDIBATCHHDR)pgO)->Size += cjSize; 608 return TRUE; 609 } 610 // Reset offset and count then fall through 611 pTeb->GdiTebBatch.Offset -= sizeof(GDIBSPPATBLT); 612 pTeb->GdiBatchCount--; 613 } 614 } 615 return NtGdiPolyPatBlt(hdc, dwRop, pPoly, nCount, dwMode); 616 } 617 618 /* 619 * @implemented 620 */ 621 BOOL 622 WINAPI 623 StretchBlt( 624 _In_ HDC hdcDest, 625 _In_ INT xDest, 626 _In_ INT yDest, 627 _In_ INT cxDest, 628 _In_ INT cyDest, 629 _In_opt_ HDC hdcSrc, 630 _In_ INT xSrc, 631 _In_ INT ySrc, 632 _In_ INT cxSrc, 633 _In_ INT cySrc, 634 _In_ DWORD dwRop) 635 { 636 HANDLE_METADC(BOOL, 637 StretchBlt, 638 FALSE, 639 hdcDest, 640 xDest, 641 yDest, 642 cxDest, 643 cyDest, 644 hdcSrc, 645 xSrc, 646 ySrc, 647 cxSrc, 648 cySrc, 649 dwRop); 650 651 if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE; 652 653 return NtGdiStretchBlt(hdcDest, 654 xDest, 655 yDest, 656 cxDest, 657 cyDest, 658 hdcSrc, 659 xSrc, 660 ySrc, 661 cxSrc, 662 cySrc, 663 dwRop, 664 0); 665 } 666 667 668 /* 669 * @implemented 670 */ 671 BOOL 672 WINAPI 673 MaskBlt( 674 _In_ HDC hdcDest, 675 _In_ INT xDest, 676 _In_ INT yDest, 677 _In_ INT cx, 678 _In_ INT cy, 679 _In_ HDC hdcSrc, 680 _In_ INT xSrc, 681 _In_ INT ySrc, 682 _In_ HBITMAP hbmMask, 683 _In_ INT xMask, 684 _In_ INT yMask, 685 _In_ DWORD dwRop) 686 { 687 HANDLE_EMETAFDC(BOOL, 688 MaskBlt, 689 FALSE, 690 hdcDest, 691 xDest, 692 yDest, 693 cx, 694 cy, 695 hdcSrc, 696 xSrc, 697 ySrc, 698 hbmMask, 699 xMask, 700 yMask, 701 dwRop); 702 703 if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE; 704 705 return NtGdiMaskBlt(hdcDest, 706 xDest, 707 yDest, 708 cx, 709 cy, 710 hdcSrc, 711 xSrc, 712 ySrc, 713 hbmMask, 714 xMask, 715 yMask, 716 dwRop, 717 GetBkColor(hdcSrc)); 718 } 719 720 721 /* 722 * @implemented 723 */ 724 BOOL 725 WINAPI 726 PlgBlt( 727 _In_ HDC hdcDest, 728 _In_reads_(3) const POINT * ppt, 729 _In_ HDC hdcSrc, 730 _In_ INT xSrc, 731 _In_ INT ySrc, 732 _In_ INT cx, 733 _In_ INT cy, 734 _In_opt_ HBITMAP hbmMask, 735 _In_ INT xMask, 736 _In_ INT yMask) 737 { 738 HANDLE_EMETAFDC(BOOL, 739 PlgBlt, 740 FALSE, 741 hdcDest, 742 ppt, 743 hdcSrc, 744 xSrc, 745 ySrc, 746 cx, 747 cy, 748 hbmMask, 749 xMask, 750 yMask); 751 752 if ( GdiConvertAndCheckDC(hdcDest) == NULL ) return FALSE; 753 754 return NtGdiPlgBlt(hdcDest, 755 (LPPOINT)ppt, 756 hdcSrc, 757 xSrc, 758 ySrc, 759 cx, 760 cy, 761 hbmMask, 762 xMask, 763 yMask, 764 GetBkColor(hdcSrc)); 765 } 766 767 BOOL 768 WINAPI 769 GdiAlphaBlend( 770 _In_ HDC hdcDst, 771 _In_ INT xDst, 772 _In_ INT yDst, 773 _In_ INT cxDst, 774 _In_ INT cyDst, 775 _In_ HDC hdcSrc, 776 _In_ INT xSrc, 777 _In_ INT ySrc, 778 _In_ INT cxSrc, 779 _In_ INT cySrc, 780 _In_ BLENDFUNCTION blendfn) 781 { 782 if (hdcSrc == NULL ) return FALSE; 783 784 if (GDI_HANDLE_GET_TYPE(hdcSrc) == GDI_OBJECT_TYPE_METADC) return FALSE; 785 786 HANDLE_EMETAFDC(BOOL, 787 AlphaBlend, 788 FALSE, 789 hdcDst, 790 xDst, 791 yDst, 792 cxDst, 793 cyDst, 794 hdcSrc, 795 xSrc, 796 ySrc, 797 cxSrc, 798 cySrc, 799 blendfn); 800 801 if ( GdiConvertAndCheckDC(hdcDst) == NULL ) return FALSE; 802 803 return NtGdiAlphaBlend(hdcDst, 804 xDst, 805 yDst, 806 cxDst, 807 cyDst, 808 hdcSrc, 809 xSrc, 810 ySrc, 811 cxSrc, 812 cySrc, 813 blendfn, 814 0); 815 } 816 817 818 /* 819 * @implemented 820 */ 821 BOOL 822 WINAPI 823 GdiTransparentBlt( 824 _In_ HDC hdcDst, 825 _In_ INT xDst, 826 _In_ INT yDst, 827 _In_ INT cxDst, 828 _In_ INT cyDst, 829 _In_ HDC hdcSrc, 830 _In_ INT xSrc, 831 _In_ INT ySrc, 832 _In_ INT cxSrc, 833 _In_ INT cySrc, 834 _In_ UINT crTransparent) 835 { 836 HANDLE_EMETAFDC(BOOL, 837 TransparentBlt, 838 FALSE, 839 hdcDst, 840 xDst, 841 yDst, 842 cxDst, 843 cyDst, 844 hdcSrc, 845 xSrc, 846 ySrc, 847 cxSrc, 848 cySrc, 849 crTransparent); 850 851 if ( GdiConvertAndCheckDC(hdcDst) == NULL ) return FALSE; 852 853 return NtGdiTransparentBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, crTransparent); 854 } 855 856 /* 857 * @implemented 858 */ 859 BOOL 860 WINAPI 861 GdiGradientFill( 862 _In_ HDC hdc, 863 _In_reads_(nVertex) PTRIVERTEX pVertex, 864 _In_ ULONG nVertex, 865 _In_ PVOID pMesh, 866 _In_ ULONG nCount, 867 _In_ ULONG ulMode) 868 { 869 if (GDI_HANDLE_GET_TYPE(hdc) == GDILoObjType_LO_METADC16_TYPE) return TRUE; 870 871 HANDLE_EMETAFDC(BOOL, GradientFill, FALSE, hdc, pVertex, nVertex, pMesh, nCount, ulMode); 872 873 if ( GdiConvertAndCheckDC(hdc) == NULL ) return FALSE; 874 875 return NtGdiGradientFill(hdc, pVertex, nVertex, pMesh, nCount, ulMode); 876 } 877