Author: gschneider Date: Wed Jul 29 20:28:11 2009 New Revision: 42291
URL: http://svn.reactos.org/svn/reactos?rev=42291&view=rev Log: user32: - Restructure and simplify CreateCursorFromData - Call CreateIconFromResourceEx properly allowing it to create colored icons (although it doesn't care about that yet) - Fix some comment typos win32k: - Don't just copy the pointer to an XLATEOBJ, copy instead. The caller will free it, EngSetPointerShape will do so too (causing either double-frees or memory write errors)
Modified: trunk/reactos/dll/win32/user32/windows/bitmap.c trunk/reactos/dll/win32/user32/windows/icon.c trunk/reactos/subsystems/win32/win32k/eng/mouse.c
Modified: trunk/reactos/dll/win32/user32/windows/bitmap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/bi... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/bitmap.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/bitmap.c [iso-8859-1] Wed Jul 29 20:28:11 2009 @@ -56,7 +56,7 @@
#include "poppack.h"
-/* forward declerations... actually in user32\windows\icon.c but usful here */ +/* forward declarations... actually in user32\windows\icon.c but useful here */ HICON ICON_CreateIconFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot); CURSORICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width, int height, int colors); CURSORICONDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir, int width, int height, int colors); @@ -265,7 +265,7 @@ hIcon = CreateIconFromResourceEx((PBYTE)ResIcon, SizeofResource(hinst, hResInfo), Icon, 0x00030000, width, height, - fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + (fuLoad & (LR_DEFAULTSIZE | LR_SHARED)) | LR_DEFAULTCOLOR);
if (hIcon && 0 != (fuLoad & LR_SHARED)) {
Modified: trunk/reactos/dll/win32/user32/windows/icon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/ic... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/icon.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/icon.c [iso-8859-1] Wed Jul 29 20:28:11 2009 @@ -98,13 +98,25 @@ BITMAPINFO *bwBIH = (BITMAPINFO *)BitmapInfoBuffer; BITMAPINFO *orgBIH = (BITMAPINFO *)IconImage; ICONINFO IconInfo; - PVOID XORImageData = ImageData;
IconInfo.fIcon = FALSE; IconInfo.xHotspot = xHotspot; IconInfo.yHotspot = yHotspot;
- /* Create a BITMAPINFO header for the monochrome part of the icon */ + /* Handle the color part of the cursor */ + if (IconImage->icHeader.biBitCount == 1) + { + IconInfo.hbmColor = (HBITMAP)0; + } + else + { + FIXME("loading %d bpp color cursor\n", IconImage->icHeader.biBitCount); + IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, CBM_INIT, + ImageData, (BITMAPINFO*)IconImage, + DIB_RGB_COLORS); + } + + /* Create a BITMAPINFO header for the monochrome part of the cursor */ bwBIH->bmiHeader.biBitCount = 1; bwBIH->bmiHeader.biWidth = IconImage->icHeader.biWidth; bwBIH->bmiHeader.biHeight = IconImage->icHeader.biHeight; @@ -127,29 +139,13 @@ bwBIH->bmiColors[1].rgbRed = 0xff; bwBIH->bmiColors[1].rgbReserved = 0;
- /* Load the AND bitmap */ + /* Load the monochrome bitmap */ IconInfo.hbmMask = CreateDIBitmap(hDC, &bwBIH->bmiHeader, 0, - XORImageData, bwBIH, DIB_RGB_COLORS); + ImageData, bwBIH, DIB_RGB_COLORS); if (IconInfo.hbmMask) { SetDIBits(hDC, IconInfo.hbmMask, 0, IconImage->icHeader.biHeight, - XORImageData, orgBIH, DIB_RGB_COLORS); - } - - if (IconImage->icHeader.biBitCount == 1) - { - IconInfo.hbmColor = (HBITMAP)0; - } - else - { - /* Create the color part of the icon */ - IconInfo.hbmColor = CreateDIBitmap(hDC, &IconImage->icHeader, 0, - XORImageData, orgBIH, DIB_RGB_COLORS); - if (IconInfo.hbmColor) - { - SetDIBits(hDC, IconInfo.hbmColor, 0, IconImage->icHeader.biHeight, - XORImageData, orgBIH, DIB_RGB_COLORS); - } + ImageData, orgBIH, DIB_RGB_COLORS); }
/* Create the icon based on everything we have so far */
Modified: trunk/reactos/subsystems/win32/win32k/eng/mouse.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/eng... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/eng/mouse.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/eng/mouse.c [iso-8859-1] Wed Jul 29 20:28:11 2009 @@ -426,7 +426,8 @@ } else { - pgp->XlateObject = pxlo; + pgp->XlateObject = EngAllocMem(0, sizeof(XLATEOBJ), TAG_XLATEOBJ); + memcpy(pgp->XlateObject, pxlo, sizeof(XLATEOBJ)); }
/* Create surface for saving the pixels under the cursor. */