Author: tkreuzer Date: Thu Apr 26 09:42:46 2012 New Revision: 56428
URL: http://svn.reactos.org/svn/reactos?rev=56428&view=rev Log: [WIN32K] Fix NtGdiPatBlt: ROPs with a source are not allowed, the background ROP is simply ignored.
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitblt.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitblt.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/bitblt.c?... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] Thu Apr 26 09:42:46 2012 @@ -866,53 +866,60 @@ return TRUE; }
-BOOL APIENTRY +BOOL +APIENTRY NtGdiPatBlt( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP) -{ - 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) + _In_ HDC hdcDest, + _In_ INT x, + _In_ INT y, + _In_ INT cx, + _In_ INT cy, + _In_ DWORD rop4) +{ + BOOL bResult; + PDC pdc; + + /* Mask away everything except foreground rop index */ + rop4 = rop4 & 0x00FF0000; + rop4 |= rop4 << 8; + + /* Check if the rop uses a source */ + if (ROP_USES_SOURCE(rop4)) + { + /* This is not possible */ + return 0; + } + + /* Lock the DC */ + pdc = DC_LockDc(hdcDest); + if (pdc == 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 */ + + /* 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; }
- pdcattr = dc->pdcattr; - - if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(dc); - - ret = IntPatBlt(dc, XLeft, YLeft, Width, Height, ROP, &dc->eboFill); - - DC_UnlockDc(dc); - - return ret; -} - -BOOL APIENTRY + /* Update the fill brush, if neccessary */ + if (pdc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) + DC_vUpdateFillBrush(pdc); + + /* Call the internal function */ + bResult = IntPatBlt(pdc, x, y, cx, cy, rop4, &pdc->eboFill); + + /* Unlock the DC and return the result */ + DC_UnlockDc(pdc); + return bResult; +} + +BOOL +APIENTRY NtGdiPolyPatBlt( HDC hDC, DWORD dwRop,