BOOL FASTCALL IntGdiPolyPatBlt( HDC hDC, DWORD dwRop, PPATRECT pRects, INT cRects, ULONG Reserved) { INT i; PBRUSH pbrush; PDC pdc; EBRUSHOBJ eboFill; pdc = DC_LockDc(hDC); if (!pdc) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pdc->dctype == DC_TYPE_INFO) { DC_UnlockDc(pdc); /* Yes, Windows really returns TRUE in this case */ return TRUE; } for (i = 0; i < cRects; i++) { pbrush = BRUSH_ShareLockBrush(pRects->hBrush); /* Check if we could lock the brush */ if (pbrush != NULL) { /* Initialize a brush object */ EBRUSHOBJ_vInitFromDC(&eboFill, pbrush, pdc); IntPatBlt( pdc, pRects->r.left, pRects->r.top, pRects->r.right, pRects->r.bottom, dwRop, &eboFill); /* Cleanup the brush object and unlock the brush */ EBRUSHOBJ_vCleanup(&eboFill); BRUSH_ShareUnlockBrush(pbrush); } pRects++; } DC_UnlockDc(pdc); return TRUE; }
BOOL APIENTRY NtGdiPatBlt( HDC hDC, INT XLeft, INT YLeft, INT Width, INT Height, DWORD ROP) { PBRUSH pbrush; DC *dc; PDC_ATTR pdcattr; BOOL ret; BOOL UsesSource = ROP_USES_SOURCE(ROP); if (UsesSource) { /* In this case we call on GdiMaskBlt */ return NtGdiMaskBlt(hDC, XLeft, YLeft, Width, Height, 0,0,0,0,0,0,ROP,0); } dc = DC_LockDc(hDC); if (dc == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (dc->dctype == DC_TYPE_INFO) { DC_UnlockDc(dc); DPRINT1("NtGdiPatBlt on info DC!\n"); /* Yes, Windows really returns TRUE in this case */ return TRUE; } pdcattr = dc->pdcattr; if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) DC_vUpdateFillBrush(dc); pbrush = BRUSH_ShareLockBrush(pdcattr->hbrush); if (pbrush == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); DC_UnlockDc(dc); return FALSE; } ret = IntPatBlt(dc, XLeft, YLeft, Width, Height, ROP, pbrush); BRUSH_ShareUnlockBrush(pbrush); DC_UnlockDc(dc); return ret; }
BOOL APIENTRY NtGdiPatBlt( _In_ HDC hdcDest, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_ DWORD dwRop) { BOOL bResult; PDC pdc; /* Mask away everything except foreground rop index */ dwRop = dwRop & 0x00FF0000; dwRop |= dwRop << 8; /* Check if the rop uses a source */ if (ROP_USES_SOURCE(dwRop)) { /* This is not possible */ return 0; } /* Lock the DC */ pdc = DC_LockDc(hdcDest); if (pdc == NULL) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } /* Check if the DC has no surface (empty mem or info DC) */ if (pdc->dclevel.pSurface == NULL) { /* Nothing to do, Windows returns TRUE! */ DC_UnlockDc(pdc); return TRUE; } /* Update the fill brush, if necessary */ if (pdc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) DC_vUpdateFillBrush(pdc); /* Call the internal function */ bResult = IntPatBlt(pdc, x, y, cx, cy, dwRop, &pdc->eboFill); /* Unlock the DC and return the result */ DC_UnlockDc(pdc); return bResult; }
BOOL FASTCALL IntGdiPolyPatBlt( HDC hDC, DWORD dwRop, PPATRECT pRects, INT cRects, ULONG Reserved) { INT i; PBRUSH pbrush; PDC pdc; pdc = DC_LockDc(hDC); if (!pdc) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pdc->dctype == DC_TYPE_INFO) { DC_UnlockDc(pdc); /* Yes, Windows really returns TRUE in this case */ return TRUE; } for (i = 0; i < cRects; i++) { pbrush = BRUSH_ShareLockBrush(pRects->hBrush); if(pbrush != NULL) { IntPatBlt( pdc, pRects->r.left, pRects->r.top, pRects->r.right, pRects->r.bottom, dwRop, pbrush); BRUSH_ShareUnlockBrush(pbrush); } pRects++; } DC_UnlockDc(pdc); return TRUE; }