Author: gschneider Date: Tue Dec 29 19:21:00 2009 New Revision: 44803
URL: http://svn.reactos.org/svn/reactos?rev=44803&view=rev Log: [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
Modified: trunk/reactos/subsystems/win32/win32k/include/intgdi.h trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c trunk/reactos/subsystems/win32/win32k/objects/bitblt.c
Modified: trunk/reactos/subsystems/win32/win32k/include/intgdi.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/intgdi.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/intgdi.h [iso-8859-1] Tue Dec 29 19:21:00 2009 @@ -258,7 +258,9 @@ 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 */
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] Tue Dec 29 19:21:00 2009 @@ -1362,13 +1362,14 @@ 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);
Modified: trunk/reactos/subsystems/win32/win32k/objects/bitblt.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] Tue Dec 29 19:21:00 2009 @@ -703,7 +703,9 @@ INT HeightSrc, DWORD ROP, IN DWORD dwBackColor, - HDC hDCMask) + HDC hDCMask, + INT XOriginMask, + INT YOriginMask) { PDC DCDest; PDC DCSrc = NULL; @@ -713,6 +715,7 @@ SURFACE *BitmapMask = NULL; RECTL DestRect; RECTL SourceRect; + POINTL MaskPoint; BOOL Status = FALSE; EXLATEOBJ exlo; XLATEOBJ *XlateObj = NULL; @@ -827,12 +830,20 @@ { 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 @@ XlateObj, &DestRect, &SourceRect, - NULL, + BitmapMask ? &MaskPoint : NULL, &DCDest->eboFill.BrushObject, &BrushOrigin, ROP3_TO_ROP4(ROP)); @@ -896,7 +907,9 @@ HeightSrc, ROP, dwBackColor, - NULL); + NULL, + 0, + 0); }