From 1c28feb238e68bd5c1fcf2e09bcde4bc0a8c13f1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 25 May 2014 14:41:33 +0000 Subject: [PATCH] [WIN32K] Remove obsolete patblt.c (all the code is in bitblt.c) svn path=/trunk/; revision=63444 --- reactos/win32ss/gdi/ntgdi/patblt.c | 972 ----------------------------- 1 file changed, 972 deletions(-) delete mode 100644 reactos/win32ss/gdi/ntgdi/patblt.c diff --git a/reactos/win32ss/gdi/ntgdi/patblt.c b/reactos/win32ss/gdi/ntgdi/patblt.c deleted file mode 100644 index b809395f3eb..00000000000 --- a/reactos/win32ss/gdi/ntgdi/patblt.c +++ /dev/null @@ -1,972 +0,0 @@ -/* - * COPYRIGHT: GNU GPL, See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Bit blit functions - * FILE: subsys/win32k/objects/bitblt.c - * PROGRAMER: Unknown - */ - -#include - -#define NDEBUG -#include - -#define ROP_USES_SOURCE(Rop) (((((Rop) & 0xCC0000) >> 2) != ((Rop) & 0x330000)) || ((((Rop) & 0xCC000000) >> 2) != ((Rop) & 0x33000000))) -#define ROP_USES_MASK(Rop) (((Rop) & 0xFF000000) != (((Rop) & 0xff0000) << 8)) - -#define FIXUP_ROP(Rop) if(((Rop) & 0xFF000000) == 0) Rop = MAKEROP4((Rop), (Rop)) -#define ROP_TO_ROP4(Rop) ((Rop) >> 16) - -BOOL APIENTRY -NtGdiAlphaBlend( - HDC hDCDest, - LONG XOriginDest, - LONG YOriginDest, - LONG WidthDest, - LONG HeightDest, - HDC hDCSrc, - LONG XOriginSrc, - LONG YOriginSrc, - LONG WidthSrc, - LONG HeightSrc, - BLENDFUNCTION BlendFunc, - HANDLE hcmXform) -{ - PDC DCDest; - PDC DCSrc; - HDC ahDC[2]; - PGDIOBJ apObj[2]; - SURFACE *BitmapDest, *BitmapSrc; - RECTL DestRect, SourceRect; - BOOL bResult; - EXLATEOBJ exlo; - BLENDOBJ BlendObj; - BlendObj.BlendFunction = BlendFunc; - - if (WidthDest < 0 || HeightDest < 0 || WidthSrc < 0 || HeightSrc < 0) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - DPRINT("Locking DCs\n"); - ahDC[0] = hDCDest; - ahDC[1] = hDCSrc ; - if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) - { - DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) - { - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - - DestRect.left = XOriginDest; - DestRect.top = YOriginDest; - DestRect.right = XOriginDest + WidthDest; - DestRect.bottom = YOriginDest + HeightDest; - IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); - - DestRect.left += DCDest->ptlDCOrig.x; - DestRect.top += DCDest->ptlDCOrig.y; - DestRect.right += DCDest->ptlDCOrig.x; - DestRect.bottom += DCDest->ptlDCOrig.y; - - SourceRect.left = XOriginSrc; - SourceRect.top = YOriginSrc; - SourceRect.right = XOriginSrc + WidthSrc; - SourceRect.bottom = YOriginSrc + HeightSrc; - IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2); - - SourceRect.left += DCSrc->ptlDCOrig.x; - SourceRect.top += DCSrc->ptlDCOrig.y; - SourceRect.right += DCSrc->ptlDCOrig.x; - SourceRect.bottom += DCSrc->ptlDCOrig.y; - - if (!DestRect.right || - !DestRect.bottom || - !SourceRect.right || - !SourceRect.bottom) - { - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - return TRUE; - } - - /* Prepare DCs for blit */ - DPRINT("Preparing DCs for blit\n"); - DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); - - /* Determine surfaces to be used in the bitblt */ - BitmapDest = DCDest->dclevel.pSurface; - if (!BitmapDest) - { - bResult = FALSE ; - goto leave ; - } - - BitmapSrc = DCSrc->dclevel.pSurface; - if (!BitmapSrc) - { - bResult = FALSE; - goto leave; - } - - /* Create the XLATEOBJ. */ - EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); - - /* Perform the alpha blend operation */ - DPRINT("Performing the alpha blend\n"); - bResult = IntEngAlphaBlend(&BitmapDest->SurfObj, - &BitmapSrc->SurfObj, - DCDest->rosdc.CombinedClip, - &exlo.xlo, - &DestRect, - &SourceRect, - &BlendObj); - - EXLATEOBJ_vCleanup(&exlo); -leave : - DPRINT("Finishing blit\n"); - DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - - return bResult; -} - -BOOL APIENTRY -NtGdiBitBlt( - HDC hDCDest, - INT XDest, - INT YDest, - INT Width, - INT Height, - HDC hDCSrc, - INT XSrc, - INT YSrc, - DWORD ROP, - IN DWORD crBackColor, - IN FLONG fl) -{ - /* Forward to NtGdiMaskBlt */ - // TODO: What's fl for? - return NtGdiMaskBlt(hDCDest, - XDest, - YDest, - Width, - Height, - hDCSrc, - XSrc, - YSrc, - NULL, - 0, - 0, - ROP, - crBackColor); -} - -BOOL APIENTRY -NtGdiTransparentBlt( - HDC hdcDst, - INT xDst, - INT yDst, - INT cxDst, - INT cyDst, - HDC hdcSrc, - INT xSrc, - INT ySrc, - INT cxSrc, - INT cySrc, - COLORREF TransColor) -{ - PDC DCDest, DCSrc; - HDC ahDC[2]; - PGDIOBJ apObj[2]; - RECTL rcDest, rcSrc; - SURFACE *BitmapDest, *BitmapSrc = NULL; - ULONG TransparentColor = 0; - BOOL Ret = FALSE; - EXLATEOBJ exlo; - - DPRINT("Locking DCs\n"); - ahDC[0] = hdcDst; - ahDC[1] = hdcSrc ; - if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) - { - DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDst, hdcSrc); - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - DCDest = apObj[0]; - DCSrc = apObj[1]; - - if (DCDest->dctype == DC_TYPE_INFO || DCDest->dctype == DCTYPE_INFO) - { - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - - rcDest.left = xDst; - rcDest.top = yDst; - rcDest.right = rcDest.left + cxDst; - rcDest.bottom = rcDest.top + cyDst; - IntLPtoDP(DCDest, (LPPOINT)&rcDest, 2); - - rcDest.left += DCDest->ptlDCOrig.x; - rcDest.top += DCDest->ptlDCOrig.y; - rcDest.right += DCDest->ptlDCOrig.x; - rcDest.bottom += DCDest->ptlDCOrig.y; - - rcSrc.left = xSrc; - rcSrc.top = ySrc; - rcSrc.right = rcSrc.left + cxSrc; - rcSrc.bottom = rcSrc.top + cySrc; - IntLPtoDP(DCSrc, (LPPOINT)&rcSrc, 2); - - rcSrc.left += DCSrc->ptlDCOrig.x; - rcSrc.top += DCSrc->ptlDCOrig.y; - rcSrc.right += DCSrc->ptlDCOrig.x; - rcSrc.bottom += DCSrc->ptlDCOrig.y; - - /* Prepare for blit */ - DC_vPrepareDCsForBlit(DCDest, rcDest, DCSrc, rcSrc); - - BitmapDest = DCDest->dclevel.pSurface; - if (!BitmapDest) - { - goto done; - } - - BitmapSrc = DCSrc->dclevel.pSurface; - if (!BitmapSrc) - { - goto done; - } - - /* Translate Transparent (RGB) Color to the source palette */ - EXLATEOBJ_vInitialize(&exlo, &gpalRGB, BitmapSrc->ppal, 0, 0, 0); - TransparentColor = XLATEOBJ_iXlate(&exlo.xlo, (ULONG)TransColor); - EXLATEOBJ_vCleanup(&exlo); - - EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); - - Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, - DCDest->rosdc.CombinedClip, &exlo.xlo, &rcDest, &rcSrc, - TransparentColor, 0); - - EXLATEOBJ_vCleanup(&exlo); - -done: - DC_vFinishBlit(DCDest, DCSrc); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - - return Ret; -} - -BOOL APIENTRY -NtGdiMaskBlt( - HDC hdcDest, - INT nXDest, - INT nYDest, - INT nWidth, - INT nHeight, - HDC hdcSrc, - INT nXSrc, - INT nYSrc, - HBITMAP hbmMask, - INT xMask, - INT yMask, - DWORD dwRop, - IN DWORD crBackColor) -{ - PDC DCDest; - PDC DCSrc = NULL; - HDC ahDC[2]; - PGDIOBJ apObj[2]; - PDC_ATTR pdcattr = NULL; - SURFACE *BitmapDest, *BitmapSrc = NULL, *psurfMask = NULL; - RECTL DestRect, SourceRect; - POINTL SourcePoint, MaskPoint; - BOOL Status = FALSE; - EXLATEOBJ exlo; - XLATEOBJ *XlateObj = NULL; - BOOL UsesSource = ROP_USES_SOURCE(dwRop); - BOOL UsesMask; - - FIXUP_ROP(dwRop); - - UsesMask = ROP_USES_MASK(dwRop); - - //DPRINT1("dwRop : 0x%08x\n", dwRop); - if (!hdcDest || (UsesSource && !hdcSrc)) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - /* Take care of mask bitmap */ - if(hbmMask) - { - psurfMask = SURFACE_ShareLockSurface(hbmMask); - if(!psurfMask) - { - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - } - - if(UsesMask) - { - if(!psurfMask) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - if(gajBitsPerFormat[psurfMask->SurfObj.iBitmapFormat] != 1) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - SURFACE_ShareUnlockSurface(psurfMask); - return FALSE; - } - } - else if(psurfMask) - { - DPRINT1("Getting Mask bitmap without needing it?\n"); - SURFACE_ShareUnlockSurface(psurfMask); - psurfMask = NULL; - } - MaskPoint.x = xMask; - MaskPoint.y = yMask; - - /* Take care of source and destination bitmap */ - DPRINT("Locking DCs\n"); - ahDC[0] = hdcDest; - ahDC[1] = UsesSource ? hdcSrc : NULL; - if (!GDIOBJ_bLockMultipleObjects(2, ahDC, apObj, GDIObjType_DC_TYPE)) - { - DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hdcDest, hdcSrc); - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - DCDest = apObj[0]; - DCSrc = apObj[1]; - - ASSERT(DCDest); - if (NULL == DCDest) - { - if(DCSrc) DC_UnlockDc(DCSrc); - DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hdcDest); - return FALSE; - } - - if (DCDest->dctype == DC_TYPE_INFO) - { - if(DCSrc) DC_UnlockDc(DCSrc); - DC_UnlockDc(DCDest); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - - if (UsesSource) - { - ASSERT(DCSrc); - if (DCSrc->dctype == DC_TYPE_INFO) - { - DC_UnlockDc(DCDest); - DC_UnlockDc(DCSrc); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - } - - pdcattr = DCDest->pdcattr; - - DestRect.left = nXDest; - DestRect.top = nYDest; - DestRect.right = nXDest + nWidth; - DestRect.bottom = nYDest + nHeight; - IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); - - DestRect.left += DCDest->ptlDCOrig.x; - DestRect.top += DCDest->ptlDCOrig.y; - DestRect.right += DCDest->ptlDCOrig.x; - DestRect.bottom += DCDest->ptlDCOrig.y; - - SourcePoint.x = nXSrc; - SourcePoint.y = nYSrc; - - if (UsesSource) - { - IntLPtoDP(DCSrc, (LPPOINT)&SourcePoint, 1); - - SourcePoint.x += DCSrc->ptlDCOrig.x; - SourcePoint.y += DCSrc->ptlDCOrig.y; - /* Calculate Source Rect */ - SourceRect.left = SourcePoint.x; - SourceRect.top = SourcePoint.y; - SourceRect.right = SourcePoint.x + DestRect.right - DestRect.left; - SourceRect.bottom = SourcePoint.y + DestRect.bottom - DestRect.top ; - } - - /* Prepare blit */ - DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); - - if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(DCDest); - - /* Determine surfaces to be used in the bitblt */ - BitmapDest = DCDest->dclevel.pSurface; - if (!BitmapDest) - goto cleanup; - - if (UsesSource) - { - { - BitmapSrc = DCSrc->dclevel.pSurface; - if (!BitmapSrc) - goto cleanup; - } - } - - /* Create the XLATEOBJ. */ - if (UsesSource) - { - EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); - XlateObj = &exlo.xlo; - } - - - /* Perform the bitblt operation */ - Status = IntEngBitBlt(&BitmapDest->SurfObj, - BitmapSrc ? &BitmapSrc->SurfObj : NULL, - psurfMask ? &psurfMask->SurfObj : NULL, - DCDest->rosdc.CombinedClip, - XlateObj, - &DestRect, - &SourcePoint, - &MaskPoint, - &DCDest->eboFill.BrushObject, - &DCDest->dclevel.pbrFill->ptOrigin, - ROP_TO_ROP4(dwRop)); - - if (UsesSource) - EXLATEOBJ_vCleanup(&exlo); -cleanup: - DC_vFinishBlit(DCDest, DCSrc); - if (UsesSource) - { - DC_UnlockDc(DCSrc); - } - DC_UnlockDc(DCDest); - if(psurfMask) SURFACE_ShareUnlockSurface(psurfMask); - - return Status; -} - -BOOL -APIENTRY -NtGdiPlgBlt( - IN HDC hdcTrg, - IN LPPOINT pptlTrg, - IN HDC hdcSrc, - IN INT xSrc, - IN INT ySrc, - IN INT cxSrc, - IN INT cySrc, - IN HBITMAP hbmMask, - IN INT xMask, - IN INT yMask, - IN DWORD crBackColor) -{ - UNIMPLEMENTED; - return FALSE; -} - -BOOL APIENTRY -GreStretchBltMask( - HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP, - IN DWORD dwBackColor, - HDC hDCMask, - INT XOriginMask, - INT YOriginMask) -{ - PDC DCDest; - PDC DCSrc = NULL; - PDC DCMask = NULL; - HDC ahDC[3]; - PGDIOBJ apObj[3]; - PDC_ATTR pdcattr; - SURFACE *BitmapDest, *BitmapSrc = NULL; - SURFACE *BitmapMask = NULL; - RECTL DestRect; - RECTL SourceRect; - POINTL MaskPoint; - BOOL Status = FALSE; - EXLATEOBJ exlo; - XLATEOBJ *XlateObj = NULL; - POINTL BrushOrigin; - BOOL UsesSource; - BOOL UsesMask; - - FIXUP_ROP(ROP); - UsesSource = ROP_USES_SOURCE(ROP); - UsesMask = ROP_USES_MASK(ROP); - - if (0 == WidthDest || 0 == HeightDest || 0 == WidthSrc || 0 == HeightSrc) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return TRUE; - } - - if (!hDCDest || (UsesSource && !hDCSrc) || (UsesMask && !hDCMask)) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - ahDC[0] = hDCDest; - ahDC[1] = UsesSource ? hDCSrc : NULL; - ahDC[2] = UsesMask ? hDCMask : NULL; - if (!GDIOBJ_bLockMultipleObjects(3, ahDC, apObj, GDIObjType_DC_TYPE)) - { - DPRINT1("Invalid dc handle (dest=0x%08x, src=0x%08x) passed to NtGdiAlphaBlend\n", hDCDest, hDCSrc); - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - DCDest = apObj[0]; - DCSrc = apObj[1]; - DCMask = apObj[2]; - - if (DCDest->dctype == DC_TYPE_INFO) - { - if(DCSrc) GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - - if (UsesSource) - { - if (DCSrc->dctype == DC_TYPE_INFO) - { - GDIOBJ_vUnlockObject(&DCDest->BaseObject); - GDIOBJ_vUnlockObject(&DCSrc->BaseObject); - if(DCMask) GDIOBJ_vUnlockObject(&DCMask->BaseObject); - /* Yes, Windows really returns TRUE in this case */ - return TRUE; - } - } - - pdcattr = DCDest->pdcattr; - - DestRect.left = XOriginDest; - DestRect.top = YOriginDest; - DestRect.right = XOriginDest+WidthDest; - DestRect.bottom = YOriginDest+HeightDest; - IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); - - DestRect.left += DCDest->ptlDCOrig.x; - DestRect.top += DCDest->ptlDCOrig.y; - DestRect.right += DCDest->ptlDCOrig.x; - DestRect.bottom += DCDest->ptlDCOrig.y; - - SourceRect.left = XOriginSrc; - SourceRect.top = YOriginSrc; - SourceRect.right = XOriginSrc+WidthSrc; - SourceRect.bottom = YOriginSrc+HeightSrc; - - if (UsesSource) - { - IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2); - - SourceRect.left += DCSrc->ptlDCOrig.x; - SourceRect.top += DCSrc->ptlDCOrig.y; - SourceRect.right += DCSrc->ptlDCOrig.x; - SourceRect.bottom += DCSrc->ptlDCOrig.y; - } - - BrushOrigin.x = 0; - BrushOrigin.y = 0; - - /* Only prepare Source and Dest, hdcMask represents a DIB */ - DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect); - - if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(DCDest); - - /* Determine surfaces to be used in the bitblt */ - BitmapDest = DCDest->dclevel.pSurface; - if (BitmapDest == NULL) - goto failed; - if (UsesSource) - { - BitmapSrc = DCSrc->dclevel.pSurface; - if (BitmapSrc == NULL) - goto failed; - - /* Create the XLATEOBJ. */ - EXLATEOBJ_vInitXlateFromDCs(&exlo, DCSrc, DCDest); - XlateObj = &exlo.xlo; - } - - /* Offset the brush */ - BrushOrigin.x += DCDest->ptlDCOrig.x; - BrushOrigin.y += DCDest->ptlDCOrig.y; - - /* Make mask surface for source surface */ - if (BitmapSrc && DCMask) - { - BitmapMask = DCMask->dclevel.pSurface; - if (BitmapMask && - (BitmapMask->SurfObj.sizlBitmap.cx < WidthSrc || - BitmapMask->SurfObj.sizlBitmap.cy < HeightSrc)) - { - DPRINT1("%dx%d mask is smaller than %dx%d bitmap\n", - BitmapMask->SurfObj.sizlBitmap.cx, BitmapMask->SurfObj.sizlBitmap.cy, - WidthSrc, HeightSrc); - EXLATEOBJ_vCleanup(&exlo); - goto failed; - } - /* Create mask offset point */ - MaskPoint.x = XOriginMask; - MaskPoint.y = YOriginMask; - IntLPtoDP(DCMask, &MaskPoint, 1); - MaskPoint.x += DCMask->ptlDCOrig.x; - MaskPoint.y += DCMask->ptlDCOrig.y; - } - - /* Perform the bitblt operation */ - Status = IntEngStretchBlt(&BitmapDest->SurfObj, - &BitmapSrc->SurfObj, - BitmapMask ? &BitmapMask->SurfObj : NULL, - DCDest->rosdc.CombinedClip, - XlateObj, - &DestRect, - &SourceRect, - BitmapMask ? &MaskPoint : NULL, - &DCDest->eboFill.BrushObject, - &BrushOrigin, - ROP_TO_ROP4(ROP)); - if (UsesSource) - { - EXLATEOBJ_vCleanup(&exlo); - } - -failed: - DC_vFinishBlit(DCDest, DCSrc); - if (UsesSource) - { - DC_UnlockDc(DCSrc); - } - if (DCMask) - { - DC_UnlockDc(DCMask); - } - DC_UnlockDc(DCDest); - - return Status; -} - - -BOOL APIENTRY -NtGdiStretchBlt( - HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP, - IN DWORD dwBackColor) -{ - return GreStretchBltMask( - hDCDest, - XOriginDest, - YOriginDest, - WidthDest, - HeightDest, - hDCSrc, - XOriginSrc, - YOriginSrc, - WidthSrc, - HeightSrc, - ROP, - dwBackColor, - NULL, - 0, - 0); -} - - -BOOL FASTCALL -IntPatBlt( - PDC pdc, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD dwRop, - PBRUSH pbrush) -{ - RECTL DestRect; - SURFACE *psurf; - EBRUSHOBJ eboFill ; - POINTL BrushOrigin; - BOOL ret; - - ASSERT(pbrush); - - FIXUP_ROP(dwRop); - - if (pbrush->flAttrs & GDIBRUSH_IS_NULL) - { - return TRUE; - } - - if (Width > 0) - { - DestRect.left = XLeft; - DestRect.right = XLeft + Width; - } - else - { - DestRect.left = XLeft + Width + 1; - DestRect.right = XLeft + 1; - } - - if (Height > 0) - { - DestRect.top = YLeft; - DestRect.bottom = YLeft + Height; - } - else - { - DestRect.top = YLeft + Height + 1; - DestRect.bottom = YLeft + 1; - } - - IntLPtoDP(pdc, (LPPOINT)&DestRect, 2); - - DestRect.left += pdc->ptlDCOrig.x; - DestRect.top += pdc->ptlDCOrig.y; - DestRect.right += pdc->ptlDCOrig.x; - DestRect.bottom += pdc->ptlDCOrig.y; -#ifdef _USE_DIBLIB_ - BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x + XLeft; - BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y + YLeft; -#else - BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x; - BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y; -#endif - - DC_vPrepareDCsForBlit(pdc, DestRect, NULL, DestRect); - - psurf = pdc->dclevel.pSurface; - - if (pdc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(pdc); - - EBRUSHOBJ_vInit(&eboFill, pbrush, pdc); - - ret = IntEngBitBlt( - &psurf->SurfObj, - NULL, - NULL, - pdc->rosdc.CombinedClip, - NULL, - &DestRect, - NULL, - NULL, - &eboFill.BrushObject, - &BrushOrigin, - ROP_TO_ROP4(dwRop)); - - DC_vFinishBlit(pdc, NULL); - - EBRUSHOBJ_vCleanup(&eboFill); - - return ret; -} - -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; -} - -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 -NtGdiPolyPatBlt( - HDC hDC, - DWORD dwRop, - IN PPOLYPATBLT pRects, - IN DWORD cRects, - IN DWORD Mode) -{ - PPATRECT rb = NULL; - NTSTATUS Status = STATUS_SUCCESS; - BOOL Ret; - - if (cRects > 0) - { - rb = ExAllocatePoolWithTag(PagedPool, sizeof(PATRECT) * cRects, GDITAG_PLGBLT_DATA); - if (!rb) - { - EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - _SEH2_TRY - { - ProbeForRead(pRects, - cRects * sizeof(PATRECT), - 1); - RtlCopyMemory(rb, - pRects, - cRects * sizeof(PATRECT)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - - if (!NT_SUCCESS(Status)) - { - ExFreePoolWithTag(rb, GDITAG_PLGBLT_DATA); - SetLastNtError(Status); - return FALSE; - } - } - - Ret = IntGdiPolyPatBlt(hDC, dwRop, rb, cRects, Mode); - - if (cRects > 0) - ExFreePoolWithTag(rb, GDITAG_PLGBLT_DATA); - - return Ret; -}