- Make the file at least slightly readable (the mixed TABs and spaces were way too annoying).

- Replace GetModuleHandleW(L"user32.dll") with User32Instance.
- Fix one more allocation check.

svn path=/trunk/; revision=20121
This commit is contained in:
Filip Navara 2005-12-12 21:31:19 +00:00
parent e5b6313286
commit fca11cd62d

View file

@ -66,7 +66,8 @@ LoadImageA(HINSTANCE hinst,
Handle = LoadImageW(hinst, (LPCWSTR)lpszName, uType, cxDesired,
cyDesired, fuLoad);
}
return(Handle);
return Handle;
}
@ -94,35 +95,27 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
hinst = GetModuleHandleW(L"USER32");
}
hinst = User32Instance;
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR);
if (hResource == NULL)
{
return NULL;
}
if (fuLoad & LR_SHARED)
{
/* FIXME - pass size! */
hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, 0, 0);
if (hIcon)
{
return hIcon;
}
}
hResource = LoadResource(hinst, hResource);
if (hResource == NULL)
{
return NULL;
}
IconResDir = LockResource(hResource);
if (IconResDir == NULL)
{
return NULL;
}
/* Find the best fitting in the IconResDir for this resolution. */
id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE,
@ -133,15 +126,11 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
hResource = LoadResource(hinst, h2Resource);
if (hResource == NULL)
{
return NULL;
}
ResIcon = LockResource(hResource);
if (ResIcon == NULL)
{
return NULL;
}
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE)ResIcon,
SizeofResource(hinst, h2Resource), FALSE, 0x00030000,
@ -163,23 +152,17 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile == NULL)
{
return NULL;
}
hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
CloseHandle(hFile);
if (hSection == NULL)
{
return NULL;
}
IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hSection);
if (IconDIR == NULL)
{
return NULL;
}
if (0 != IconDIR->idReserved ||
(IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType))
@ -192,7 +175,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
* Get a handle to the screen dc, the icon we create is going to be
* compatable with it.
*/
hScreenDc = CreateCompatibleDC(0);
hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL)
{
UnmapViewOfFile(IconDIR);
@ -245,9 +228,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
{
ColorCount = SafeIconImage->icHeader.biClrUsed;
if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8)
{
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
@ -257,6 +238,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, 32, 32, dirEntry->Info.cursor.wXHotspot, dirEntry->Info.cursor.wYHotspot);
DeleteDC(hScreenDc);
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
return hIcon;
}
@ -271,7 +253,7 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
HANDLE hSection;
CURSORICONDIR* IconDIR;
HDC hScreenDc;
HANDLE hIcon;
HICON hIcon;
ULONG HeaderSize;
ULONG ColorCount;
PVOID Data;
@ -284,64 +266,57 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
hinst = GetModuleHandleW(L"USER32");
}
hinst = User32Instance;
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_ICON);
if (hResource == NULL)
{
return(NULL);
}
return NULL;
if (fuLoad & LR_SHARED)
{
hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height);
if(hIcon)
if (hIcon)
return hIcon;
}
hResource = LoadResource(hinst, hResource);
if (hResource == NULL)
{
return(NULL);
}
return NULL;
IconResDir = LockResource(hResource);
if (IconResDir == NULL)
{
return(NULL);
}
return NULL;
//find the best fitting in the IconResDir for this resolution
id = LookupIconIdFromDirectoryEx((PBYTE) IconResDir, TRUE,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
/*
* Find the best fitting in the IconResDir for this resolution
*/
h2Resource = FindResourceW(hinst,
MAKEINTRESOURCEW(id),
MAKEINTRESOURCEW(RT_ICON));
id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE, width, height,
fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id), MAKEINTRESOURCEW(RT_ICON));
hResource = LoadResource(hinst, h2Resource);
if (hResource == NULL)
{
return(NULL);
}
return NULL;
ResIcon = LockResource(hResource);
if (ResIcon == NULL)
{
return(NULL);
}
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), TRUE, 0x00030000,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
return NULL;
hIcon = CreateIconFromResourceEx((PBYTE)ResIcon,
SizeofResource(hinst, h2Resource),
TRUE, 0x00030000, width, height,
fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
if (hIcon && 0 != (fuLoad & LR_SHARED))
{
NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
(HRSRC)NULL);
}
return hIcon;
}
else
{
/*
* FIXME: This code is incorrect and is likely to crash in many cases.
* In the file the cursor/icon directory records are stored like
@ -355,41 +330,20 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
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);
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile == NULL)
{
return NULL;
}
hSection = CreateFileMappingW(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
CloseHandle(hFile);
if (hSection == NULL)
{
return NULL;
}
IconDIR = MapViewOfFile(hSection,
FILE_MAP_READ,
0,
0,
0);
IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hSection);
if (IconDIR == NULL)
{
return NULL;
}
if (0 != IconDIR->idReserved ||
(IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType))
@ -398,8 +352,8 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
return NULL;
}
//pick the best size.
dirEntry = (CURSORICONDIRENTRY *) CURSORICON_FindBestIcon( IconDIR, width, height, 1);
/* Pick the best size. */
dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, width, height, 1);
if (!dirEntry)
{
UnmapViewOfFile(IconDIR);
@ -407,12 +361,16 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
}
SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
if (SafeIconImage == NULL)
{
UnmapViewOfFile(IconDIR);
return NULL;
}
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;
@ -426,29 +384,26 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL
{
ColorCount = SafeIconImage->icHeader.biClrUsed;
if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8)
{
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
}
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;
//get a handle to the screen dc, the icon we create is going to be compatable with this
/* 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);
if (hScreenDc == NULL)
{
if (fuLoad & LR_LOADFROMFILE)
{
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
}
return(NULL);
return NULL;
}
hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2);
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
return hIcon;
}
@ -459,8 +414,8 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
HANDLE hResource;
HANDLE hFile;
HANDLE hSection;
BITMAPINFO* BitmapInfo;
BITMAPINFO* PrivateInfo;
LPBITMAPINFO BitmapInfo;
LPBITMAPINFO PrivateInfo;
HDC hScreenDc;
HANDLE hBitmap;
ULONG HeaderSize;
@ -470,63 +425,36 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hInstance == NULL)
{
hInstance = GetModuleHandleW(L"USER32");
}
hInstance = User32Instance;
hResource = FindResourceW(hInstance, lpszName, RT_BITMAP);
if (hResource == NULL)
{
return(NULL);
}
return NULL;
hResource = LoadResource(hInstance, hResource);
if (hResource == NULL)
{
return(NULL);
}
return NULL;
BitmapInfo = LockResource(hResource);
if (BitmapInfo == NULL)
{
return(NULL);
}
return NULL;
}
else
{
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile == NULL)
{
return(NULL);
}
hSection = CreateFileMappingW(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
return NULL;
hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
CloseHandle(hFile);
if (hSection == NULL)
{
return(NULL);
}
BitmapInfo = MapViewOfFile(hSection,
FILE_MAP_READ,
0,
0,
0);
return NULL;
BitmapInfo = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hSection);
if (BitmapInfo == NULL)
{
return(NULL);
}
/* offset BitmapInfo by 14 bytes to acount for the size of BITMAPFILEHEADER
unfortunatly sizeof(BITMAPFILEHEADER) = 16, but the acutal size should be 14!
*/
BitmapInfo = (BITMAPINFO*)(((PBYTE)BitmapInfo) + 14);
return NULL;
BitmapInfo = (LPBITMAPINFO)((ULONG_PTR)BitmapInfo + sizeof(BITMAPFILEHEADER));
}
if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
@ -539,9 +467,7 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
{
ColorCount = BitmapInfo->bmiHeader.biClrUsed;
if (ColorCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8)
{
ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize);
@ -550,10 +476,8 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
if (PrivateInfo == NULL)
{
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
}
return(NULL);
return NULL;
}
memcpy(PrivateInfo, BitmapInfo, HeaderSize);
@ -564,10 +488,8 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
{
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
}
return(NULL);
return NULL;
}
if (fuLoad & LR_CREATEDIBSECTION)
@ -589,65 +511,51 @@ LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
DeleteDC(hScreenDc);
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
}
return(hBitmap);
return hBitmap;
}
HANDLE STDCALL
LoadImageW(HINSTANCE hinst,
LPCWSTR lpszName,
UINT uType,
int cxDesired,
int cyDesired,
UINT fuLoad)
LoadImageW(
IN HINSTANCE hinst,
IN LPCWSTR lpszName,
IN UINT uType,
IN INT cxDesired,
IN INT cyDesired,
IN UINT fuLoad)
{
if (fuLoad & LR_DEFAULTSIZE)
{
if (uType == IMAGE_ICON)
{
if (cxDesired == 0)
{
cxDesired = GetSystemMetrics(SM_CXICON);
}
if (cyDesired == 0)
{
cyDesired = GetSystemMetrics(SM_CYICON);
}
}
else if (uType == IMAGE_CURSOR)
{
if (cxDesired == 0)
{
cxDesired = GetSystemMetrics(SM_CXCURSOR);
}
if (cyDesired == 0)
{
cyDesired = GetSystemMetrics(SM_CYCURSOR);
}
}
}
switch (uType)
{
case IMAGE_BITMAP:
{
return(LoadBitmapImage(hinst, lpszName, fuLoad));
}
return LoadBitmapImage(hinst, lpszName, fuLoad);
case IMAGE_CURSOR:
{
return(LoadCursorImage(hinst, lpszName, fuLoad));
}
return LoadCursorImage(hinst, lpszName, fuLoad);
case IMAGE_ICON:
{
return(LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad));
}
return LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad);
default:
DbgBreakPoint();
break;
}
return(NULL);
return NULL;
}
@ -657,7 +565,7 @@ LoadImageW(HINSTANCE hinst,
HBITMAP STDCALL
LoadBitmapA(HINSTANCE hInstance, LPCSTR lpBitmapName)
{
return(LoadImageA(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0));
return LoadImageA(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0);
}
@ -667,7 +575,7 @@ LoadBitmapA(HINSTANCE hInstance, LPCSTR lpBitmapName)
HBITMAP STDCALL
LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName)
{
return(LoadImageW(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0));
return LoadImageW(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0);
}
@ -675,7 +583,12 @@ LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName)
* @unimplemented
*/
HANDLE WINAPI
CopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
CopyImage(
IN HANDLE hnd,
IN UINT type,
IN INT desiredx,
IN INT desiredy,
IN UINT flags)
{
HBITMAP res;
BITMAP bm;
@ -685,11 +598,12 @@ CopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
case IMAGE_BITMAP:
{
DbgPrint("WARNING: Incomplete implementation of CopyImage!\n");
/* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE,
LR_COPYRETURNORG, LR_CREATEDIBSECTION,
and LR_MONOCHROME; */
if (!GetObjectW(hnd, sizeof(bm), &bm)) return 0;
/*
* FIXME: Support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE,
* LR_COPYRETURNORG, LR_CREATEDIBSECTION and LR_MONOCHROME.
*/
if (!GetObjectW(hnd, sizeof(bm), &bm))
return NULL;
bm.bmBits = NULL;
if ((res = CreateBitmapIndirect(&bm)))
{
@ -705,26 +619,31 @@ CopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
}
return res;
}
case IMAGE_ICON:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
if (!IconMsgDisplayed) {
if (!IconMsgDisplayed)
{
DbgPrint("FIXME: CopyImage doesn't support IMAGE_ICON correctly!\n");
IconMsgDisplayed = TRUE;
}
return CopyIcon(hnd);
}
case IMAGE_CURSOR:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
if (!IconMsgDisplayed) {
if (!IconMsgDisplayed)
{
DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n");
IconMsgDisplayed = TRUE;
}
return CopyCursor(hnd);
}
}
return 0;
return NULL;
}