From: Gregor Schneider Date: Tue, 29 Dec 2009 18:21:00 +0000 (+0000) Subject: [win32k] X-Git-Tag: backups/aicom-network-stable@46924~138 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=b13b720381052c8a0b115b98fb70f7702e664f14 [win32k] - Add mask offset coordinates to GreStretchBltMask parameters, add code to handle a mask offset - Only fail if the mask is smaller than the color bitmap, print sizes in this case - Adapt callers to GreStretchBltMask changes - DrawIcon: use new features to combine mask and color images - Mouse control panel now shows cursors again (masks still need some work), fixes ~15 user32:cursoricon tests svn path=/trunk/; revision=44803 --- diff --git a/reactos/subsystems/win32/win32k/include/intgdi.h b/reactos/subsystems/win32/win32k/include/intgdi.h index 5f3612a7c42..d5e63c9b641 100644 --- a/reactos/subsystems/win32/win32k/include/intgdi.h +++ b/reactos/subsystems/win32/win32k/include/intgdi.h @@ -258,7 +258,9 @@ GreStretchBltMask(IN HDC hdcDst, IN INT cySrc, IN DWORD dwRop, IN DWORD dwBackColor, - IN HDC hdcMask); + IN HDC hdcMask, + IN INT xMask, + IN INT yMask); #endif /* _WIN32K_INTGDI_H */ diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index b9372591ec9..40b6c68e4e7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -1362,13 +1362,14 @@ UserDrawIconEx( cyHeight, hdcImage ? hdcImage : hdcMask, 0, - ((diFlags & DI_MASK && !(diFlags & DI_IMAGE)) || - (diFlags & DI_IMAGE && hbmColor) ? 0 : IconSize.cy), + 0, IconSize.cx, IconSize.cy, SRCCOPY, 0, - hdcImage ? hdcMask : NULL); + hdcMask, + 0, + hdcImage ? 0 : IconSize.cy); } if (hOldMask) NtGdiSelectBitmap(hdcMask, hOldMask); diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index 61942aa58d3..a02d652ce1e 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -703,7 +703,9 @@ GreStretchBltMask( INT HeightSrc, DWORD ROP, IN DWORD dwBackColor, - HDC hDCMask) + HDC hDCMask, + INT XOriginMask, + INT YOriginMask) { PDC DCDest; PDC DCSrc = NULL; @@ -713,6 +715,7 @@ GreStretchBltMask( SURFACE *BitmapMask = NULL; RECTL DestRect; RECTL SourceRect; + POINTL MaskPoint; BOOL Status = FALSE; EXLATEOBJ exlo; XLATEOBJ *XlateObj = NULL; @@ -827,12 +830,20 @@ GreStretchBltMask( { BitmapMask = DCMask->dclevel.pSurface; if (BitmapMask && - (BitmapMask->SurfObj.sizlBitmap.cx != WidthSrc || - BitmapMask->SurfObj.sizlBitmap.cy != HeightSrc)) + (BitmapMask->SurfObj.sizlBitmap.cx < WidthSrc || + BitmapMask->SurfObj.sizlBitmap.cy < HeightSrc)) { - DPRINT1("Mask and bitmap sizes don't match!\n"); + DPRINT1("%dx%d mask is smaller than %dx%d bitmap\n", + BitmapMask->SurfObj.sizlBitmap.cx, BitmapMask->SurfObj.sizlBitmap.cy, + WidthSrc, HeightSrc); 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.x; } } @@ -844,7 +855,7 @@ GreStretchBltMask( XlateObj, &DestRect, &SourceRect, - NULL, + BitmapMask ? &MaskPoint : NULL, &DCDest->eboFill.BrushObject, &BrushOrigin, ROP3_TO_ROP4(ROP)); @@ -896,7 +907,9 @@ NtGdiStretchBlt( HeightSrc, ROP, dwBackColor, - NULL); + NULL, + 0, + 0); }