Author: fireball Date: Thu Jul 30 11:52:21 2009 New Revision: 42299
URL: http://svn.reactos.org/svn/reactos?rev=42299&view=rev Log: - Bring in a modified GetIconInfo implementation to get rid of a graphics driver api change.
Modified: branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c
Modified: branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winent... ============================================================================== --- branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c [iso-8859-1] (original) +++ branches/arwinss/reactos/dll/win32/winent.drv/userdrv.c [iso-8859-1] Thu Jul 30 11:52:21 2009 @@ -171,29 +171,100 @@ return -1; }
-void CDECL RosDrv_SetCursor( HCURSOR hCursor ) +/*********************************************************************** + * get_bitmap_width_bytes + * + * Return number of bytes taken by a scanline of 16-bit aligned Windows DDB + * data. + * from user32/cursoricon.c:168 + */ +static int get_bitmap_width_bytes( int width, int bpp ) +{ + switch(bpp) + { + case 1: + return 2 * ((width+15) / 16); + case 4: + return 2 * ((width+3) / 4); + case 24: + width *= 3; + /* fall through */ + case 8: + return width + (width & 1); + case 16: + case 15: + return width * 2; + case 32: + return width * 4; + default: + WARN("Unknown depth %d, please report.\n", bpp ); + } + return -1; +} + +VOID CDECL RosDrv_GetIconInfo(CURSORICONINFO *ciconinfo, PICONINFO iconinfo) +{ + INT height; + BITMAP bitmap; + static const WORD ICON_HOTSPOT = 0x4242; /* From user32/cursoricon.c:128 */ + + TRACE("%p => %dx%d, %d bpp\n", ciconinfo, + ciconinfo->nWidth, ciconinfo->nHeight, ciconinfo->bBitsPerPixel); + + if ( (ciconinfo->ptHotSpot.x == ICON_HOTSPOT) && + (ciconinfo->ptHotSpot.y == ICON_HOTSPOT) ) + { + iconinfo->fIcon = TRUE; + iconinfo->xHotspot = ciconinfo->nWidth / 2; + iconinfo->yHotspot = ciconinfo->nHeight / 2; + } + else + { + iconinfo->fIcon = FALSE; + iconinfo->xHotspot = ciconinfo->ptHotSpot.x; + iconinfo->yHotspot = ciconinfo->ptHotSpot.y; + } + + height = ciconinfo->nHeight; + + if (ciconinfo->bBitsPerPixel > 1) + { + iconinfo->hbmColor = CreateBitmap( ciconinfo->nWidth, ciconinfo->nHeight, + ciconinfo->bPlanes, ciconinfo->bBitsPerPixel, + (char *)(ciconinfo + 1) + + ciconinfo->nHeight * + get_bitmap_width_bytes (ciconinfo->nWidth,1) ); + if( GetObjectW(iconinfo->hbmColor, sizeof(bitmap), &bitmap)) + RosGdiCreateBitmap(NULL, iconinfo->hbmColor, &bitmap, bitmap.bmBits); + } + else + { + iconinfo->hbmColor = 0; + height *= 2; + } + + /* Create the mask bitmap */ + iconinfo->hbmMask = CreateBitmap ( ciconinfo->nWidth, height, + 1, 1, ciconinfo + 1); + if( GetObjectW(iconinfo->hbmMask, sizeof(bitmap), &bitmap)) + RosGdiCreateBitmap(NULL, iconinfo->hbmMask, &bitmap, bitmap.bmBits); +} + +void CDECL RosDrv_SetCursor( CURSORICONINFO *lpCursor ) { ICONINFO IconInfo; - BITMAP bitmap; - - if (hCursor == NULL) + + if (lpCursor == NULL) { RosUserSetCursor(NULL); } else { - if( GetIconInfo(hCursor, &IconInfo) ) - { - /* Create handle mappings for IconInfo.hbmMask and - IconInfo.hbmColor in kernel mode */ - if( GetObjectW(IconInfo.hbmMask, sizeof(bitmap), &bitmap)) - RosGdiCreateBitmap(NULL, IconInfo.hbmMask, &bitmap, bitmap.bmBits); - - if( GetObjectW(IconInfo.hbmColor, sizeof(bitmap), &bitmap)) - RosGdiCreateBitmap(NULL, IconInfo.hbmColor, &bitmap, bitmap.bmBits); - - RosUserSetCursor( &IconInfo ); - } + /* Create cursor bitmaps */ + RosDrv_GetIconInfo( lpCursor, &IconInfo ); + + /* Set the cursor */ + RosUserSetCursor( &IconInfo ); } }
@@ -485,8 +556,6 @@ void CDECL RosDrv_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ) { DWORD changed; - RECT rcWnd, rcClient; - INT x,y,cx,cy;
if (hwnd == GetDesktopWindow()) return; changed = style->styleNew ^ style->styleOld;