- Minimize the code differences between LoadIconImage and LoadCursorImage. - Use ICs instead of DCs. - Fix a DC leak. Modified: trunk/reactos/lib/user32/windows/bitmap.c _____
Modified: trunk/reactos/lib/user32/windows/bitmap.c --- trunk/reactos/lib/user32/windows/bitmap.c 2005-12-12 21:42:18 UTC (rev 20124) +++ trunk/reactos/lib/user32/windows/bitmap.c 2005-12-12 21:55:36 UTC (rev 20125) @@ -81,7 +81,7 @@
HANDLE hSection; CURSORICONDIR *IconDIR; HDC hScreenDc; - HANDLE hIcon; + HICON hIcon; ULONG HeaderSize; ULONG ColorCount; PVOID Data; @@ -104,7 +104,7 @@ if (fuLoad & LR_SHARED) { /* FIXME - pass size! */ - hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, 0, 0); + hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, 0, 0); if (hIcon) return hIcon; } @@ -117,13 +117,15 @@ if (IconResDir == NULL) return NULL;
- /* Find the best fitting in the IconResDir for this resolution. */ - id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE, - 32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + /* + * Find the best fitting in the IconResDir for this resolution + */
- h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id), - MAKEINTRESOURCEW(RT_CURSOR)); + id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE, 32, 32, + fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
+ h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id), MAKEINTRESOURCEW(RT_CURSOR)); + hResource = LoadResource(hinst, h2Resource); if (hResource == NULL) return NULL; @@ -132,9 +134,10 @@ if (ResIcon == NULL) return NULL;
- hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE)ResIcon, - SizeofResource(hinst, h2Resource), FALSE, 0x00030000, - 32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + hIcon = CreateIconFromResourceEx((PBYTE)ResIcon, + SizeofResource(hinst, h2Resource), + FALSE, 0x00030000, 32, 32, + fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); if (hIcon && 0 != (fuLoad & LR_SHARED)) { NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes, @@ -146,7 +149,7 @@
if (fuLoad & LR_SHARED) { - DbgPrint("FIXME: need LR_SHARED support loading cursor images from files\n"); + DbgPrint("FIXME: need LR_SHARED support for loading cursor images from files\n"); }
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL, @@ -175,7 +178,7 @@ * Get a handle to the screen dc, the icon we create is going to be * compatable with it. */ - hScreenDc = CreateCompatibleDC(NULL); + hScreenDc = CreateICW(NULL, NULL, NULL, NULL); if (hScreenDc == NULL) { UnmapViewOfFile(IconDIR); @@ -214,7 +217,7 @@ memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); UnmapViewOfFile(IconDIR);
- /* at this point we have a copy of the icon image to play with */ + /* At this point we have a copy of the icon image to play with. */
SafeIconImage->icHeader.biHeight = SafeIconImage->icHeader.biHeight /2;
@@ -232,7 +235,7 @@ HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); }
- /* make data point to the start of the XOR image data */ + /* Make data point to the start of the XOR image data. */ Data = (PBYTE)SafeIconImage + HeaderSize;
hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, 32, 32, dirEntry->Info.cursor.wXHotspot, dirEntry->Info.cursor.wYHotspot); @@ -251,7 +254,7 @@ HANDLE hfRes; HANDLE hFile; HANDLE hSection; - CURSORICONDIR* IconDIR; + CURSORICONDIR *IconDIR; HDC hScreenDc; HICON hIcon; ULONG HeaderSize; @@ -327,44 +330,44 @@
if (fuLoad & LR_SHARED) { - DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n"); + DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n"); }
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hFile == NULL) - return NULL; + return NULL;
hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(hFile); if (hSection == NULL) - return NULL; + return NULL;
IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0); CloseHandle(hSection); if (IconDIR == NULL) - return NULL; - + return NULL; + if (0 != IconDIR->idReserved || (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) { - UnmapViewOfFile(IconDIR); - return NULL; + UnmapViewOfFile(IconDIR); + return NULL; }
/* Pick the best size. */ dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, width, height, 1); if (!dirEntry) { - UnmapViewOfFile(IconDIR); - return NULL; + UnmapViewOfFile(IconDIR); + return NULL; }
SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes); if (SafeIconImage == NULL) { - UnmapViewOfFile(IconDIR); - return NULL; + UnmapViewOfFile(IconDIR); + return NULL; }
memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); @@ -393,7 +396,7 @@
/* Get a handle to the screen dc, the icon we create is going to be * compatable with this. */ - hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL); + hScreenDc = CreateICW(NULL, NULL, NULL, NULL); if (hScreenDc == NULL) { if (fuLoad & LR_LOADFROMFILE) @@ -403,6 +406,7 @@
hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2); RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); + DeleteDC(hScreenDc);
return hIcon; }