- 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

@ -49,24 +49,25 @@ LoadImageA(HINSTANCE hinst,
int cyDesired, int cyDesired,
UINT fuLoad) UINT fuLoad)
{ {
LPWSTR lpszWName; LPWSTR lpszWName;
HANDLE Handle; HANDLE Handle;
UNICODE_STRING NameString; UNICODE_STRING NameString;
if (HIWORD(lpszName)) if (HIWORD(lpszName))
{ {
RtlCreateUnicodeStringFromAsciiz(&NameString, (LPSTR)lpszName); RtlCreateUnicodeStringFromAsciiz(&NameString, (LPSTR)lpszName);
lpszWName = NameString.Buffer; lpszWName = NameString.Buffer;
Handle = LoadImageW(hinst, lpszWName, uType, cxDesired, Handle = LoadImageW(hinst, lpszWName, uType, cxDesired,
cyDesired, fuLoad); cyDesired, fuLoad);
RtlFreeUnicodeString(&NameString); RtlFreeUnicodeString(&NameString);
} }
else else
{ {
Handle = LoadImageW(hinst, (LPCWSTR)lpszName, uType, cxDesired, Handle = LoadImageW(hinst, (LPCWSTR)lpszName, uType, cxDesired,
cyDesired, fuLoad); cyDesired, fuLoad);
} }
return(Handle);
return Handle;
} }
@ -94,35 +95,27 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
if (!(fuLoad & LR_LOADFROMFILE)) if (!(fuLoad & LR_LOADFROMFILE))
{ {
if (hinst == NULL) if (hinst == NULL)
{ hinst = User32Instance;
hinst = GetModuleHandleW(L"USER32");
}
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR); hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR);
if (hResource == NULL) if (hResource == NULL)
{
return NULL; return NULL;
}
if (fuLoad & LR_SHARED) if (fuLoad & LR_SHARED)
{ {
/* FIXME - pass size! */ /* FIXME - pass size! */
hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, 0, 0); hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, 0, 0);
if (hIcon) if (hIcon)
{
return hIcon; return hIcon;
}
} }
hResource = LoadResource(hinst, hResource); hResource = LoadResource(hinst, hResource);
if (hResource == NULL) if (hResource == NULL)
{
return NULL; return NULL;
}
IconResDir = LockResource(hResource); IconResDir = LockResource(hResource);
if (IconResDir == NULL) if (IconResDir == NULL)
{
return NULL; return NULL;
}
/* Find the best fitting in the IconResDir for this resolution. */ /* Find the best fitting in the IconResDir for this resolution. */
id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE, id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE,
@ -133,15 +126,11 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
hResource = LoadResource(hinst, h2Resource); hResource = LoadResource(hinst, h2Resource);
if (hResource == NULL) if (hResource == NULL)
{
return NULL; return NULL;
}
ResIcon = LockResource(hResource); ResIcon = LockResource(hResource);
if (ResIcon == NULL) if (ResIcon == NULL)
{
return NULL; return NULL;
}
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE)ResIcon, hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE)ResIcon,
SizeofResource(hinst, h2Resource), FALSE, 0x00030000, SizeofResource(hinst, h2Resource), FALSE, 0x00030000,
@ -161,25 +150,19 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
} }
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL, hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL); OPEN_EXISTING, 0, NULL);
if (hFile == NULL) if (hFile == NULL)
{
return NULL; return NULL;
}
hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
CloseHandle(hFile); CloseHandle(hFile);
if (hSection == NULL) if (hSection == NULL)
{
return NULL; return NULL;
}
IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0); IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hSection); CloseHandle(hSection);
if (IconDIR == NULL) if (IconDIR == NULL)
{
return NULL; return NULL;
}
if (0 != IconDIR->idReserved || if (0 != IconDIR->idReserved ||
(IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) (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 * Get a handle to the screen dc, the icon we create is going to be
* compatable with it. * compatable with it.
*/ */
hScreenDc = CreateCompatibleDC(0); hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL) if (hScreenDc == NULL)
{ {
UnmapViewOfFile(IconDIR); UnmapViewOfFile(IconDIR);
@ -245,9 +228,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
{ {
ColorCount = SafeIconImage->icHeader.biClrUsed; ColorCount = SafeIconImage->icHeader.biClrUsed;
if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8)
{ ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); 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); hIcon = ICON_CreateCursorFromData(hScreenDc, Data, SafeIconImage, 32, 32, dirEntry->Info.cursor.wXHotspot, dirEntry->Info.cursor.wYHotspot);
DeleteDC(hScreenDc); DeleteDC(hScreenDc);
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
return hIcon; return hIcon;
} }
@ -264,390 +246,316 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
static HANDLE static HANDLE
LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuLoad) LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuLoad)
{ {
HANDLE hResource; HANDLE hResource;
HANDLE h2Resource; HANDLE h2Resource;
HANDLE hfRes; HANDLE hfRes;
HANDLE hFile; HANDLE hFile;
HANDLE hSection; HANDLE hSection;
CURSORICONDIR* IconDIR; CURSORICONDIR* IconDIR;
HDC hScreenDc; HDC hScreenDc;
HANDLE hIcon; HICON hIcon;
ULONG HeaderSize; ULONG HeaderSize;
ULONG ColorCount; ULONG ColorCount;
PVOID Data; PVOID Data;
CURSORICONDIRENTRY* dirEntry; CURSORICONDIRENTRY* dirEntry;
ICONIMAGE* SafeIconImage; ICONIMAGE* SafeIconImage;
GRPCURSORICONDIR* IconResDir; GRPCURSORICONDIR* IconResDir;
INT id; INT id;
ICONIMAGE *ResIcon; ICONIMAGE *ResIcon;
if (!(fuLoad & LR_LOADFROMFILE)) if (!(fuLoad & LR_LOADFROMFILE))
{ {
if (hinst == NULL) if (hinst == NULL)
{ hinst = User32Instance;
hinst = GetModuleHandleW(L"USER32");
}
hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_ICON); hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_ICON);
if (hResource == NULL) if (hResource == NULL)
{ return NULL;
return(NULL);
}
if (fuLoad & LR_SHARED) if (fuLoad & LR_SHARED)
{ {
hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height); hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height);
if(hIcon) if (hIcon)
return hIcon; return hIcon;
} }
hResource = LoadResource(hinst, hResource); hResource = LoadResource(hinst, hResource);
if (hResource == NULL) if (hResource == NULL)
{ return NULL;
return(NULL);
}
IconResDir = LockResource(hResource); IconResDir = LockResource(hResource);
if (IconResDir == NULL) if (IconResDir == NULL)
{ return NULL;
return(NULL);
}
//find the best fitting in the IconResDir for this resolution /*
id = LookupIconIdFromDirectoryEx((PBYTE) IconResDir, TRUE, * Find the best fitting in the IconResDir for this resolution
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); */
h2Resource = FindResourceW(hinst, id = LookupIconIdFromDirectoryEx((PBYTE)IconResDir, TRUE, width, height,
MAKEINTRESOURCEW(id), fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
MAKEINTRESOURCEW(RT_ICON));
h2Resource = FindResourceW(hinst, MAKEINTRESOURCEW(id), MAKEINTRESOURCEW(RT_ICON));
hResource = LoadResource(hinst, h2Resource); hResource = LoadResource(hinst, h2Resource);
if (hResource == NULL) if (hResource == NULL)
{ return NULL;
return(NULL);
}
ResIcon = LockResource(hResource); ResIcon = LockResource(hResource);
if (ResIcon == NULL) if (ResIcon == NULL)
{ return NULL;
return(NULL);
} hIcon = CreateIconFromResourceEx((PBYTE)ResIcon,
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon, SizeofResource(hinst, h2Resource),
SizeofResource(hinst, h2Resource), TRUE, 0x00030000, TRUE, 0x00030000, width, height,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
if (hIcon && 0 != (fuLoad & LR_SHARED)) if (hIcon && 0 != (fuLoad & LR_SHARED))
{ {
NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes, NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
(HRSRC)NULL); (HRSRC)NULL);
} }
return hIcon; 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
* CURSORICONFILEDIR, but we treat them like CURSORICONDIR. In Wine
* this is solved by creating a fake cursor/icon directory in memory
* and passing that to CURSORICON_FindBestIcon.
*/
if (fuLoad & LR_SHARED) /*
{ * FIXME: This code is incorrect and is likely to crash in many cases.
DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n"); * In the file the cursor/icon directory records are stored like
} * CURSORICONFILEDIR, but we treat them like CURSORICONDIR. In Wine
* this is solved by creating a fake cursor/icon directory in memory
* and passing that to CURSORICON_FindBestIcon.
*/
hFile = CreateFileW(lpszName, if (fuLoad & LR_SHARED)
GENERIC_READ, {
FILE_SHARE_READ, DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n");
NULL, }
OPEN_EXISTING,
0,
NULL);
if (hFile == NULL)
{
return NULL;
}
hSection = CreateFileMappingW(hFile, hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
NULL, OPEN_EXISTING, 0, NULL);
PAGE_READONLY, if (hFile == NULL)
0, return NULL;
0,
NULL);
CloseHandle(hFile); hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hSection == NULL) CloseHandle(hFile);
{ if (hSection == NULL)
return NULL; return NULL;
}
IconDIR = MapViewOfFile(hSection, IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
FILE_MAP_READ, CloseHandle(hSection);
0, if (IconDIR == NULL)
0, return NULL;
0);
CloseHandle(hSection); if (0 != IconDIR->idReserved ||
if (IconDIR == NULL) (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType))
{ {
return NULL; UnmapViewOfFile(IconDIR);
} return NULL;
}
if (0 != IconDIR->idReserved ||
(IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType))
{
UnmapViewOfFile(IconDIR);
return NULL;
}
//pick the best size. /* Pick the best size. */
dirEntry = (CURSORICONDIRENTRY *) CURSORICON_FindBestIcon( IconDIR, width, height, 1); dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, width, height, 1);
if (!dirEntry) if (!dirEntry)
{ {
UnmapViewOfFile(IconDIR); UnmapViewOfFile(IconDIR);
return NULL; return NULL;
} }
SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes); SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
if (SafeIconImage == NULL)
{
UnmapViewOfFile(IconDIR);
return NULL;
}
memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes);
UnmapViewOfFile(IconDIR); 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; SafeIconImage->icHeader.biHeight = SafeIconImage->icHeader.biHeight /2;
if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER)) if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER))
{ {
BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)SafeIconImage; BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)SafeIconImage;
ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0;
HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE); HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE);
} }
else else
{ {
ColorCount = SafeIconImage->icHeader.biClrUsed; ColorCount = SafeIconImage->icHeader.biClrUsed;
if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8) if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8)
{ ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); 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; Data = (PBYTE)SafeIconImage + HeaderSize;
/* Get a handle to the screen dc, the icon we create is going to be
//get a handle to the screen dc, the icon we create is going to be compatable with this * compatable with this. */
hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL); hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
if (hScreenDc == NULL) if (hScreenDc == NULL)
{ {
if (fuLoad & LR_LOADFROMFILE) if (fuLoad & LR_LOADFROMFILE)
{
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
} return NULL;
return(NULL); }
}
hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2); hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2);
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
return hIcon;
return hIcon;
} }
static HANDLE static HANDLE
LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad) LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
{ {
HANDLE hResource; HANDLE hResource;
HANDLE hFile; HANDLE hFile;
HANDLE hSection; HANDLE hSection;
BITMAPINFO* BitmapInfo; LPBITMAPINFO BitmapInfo;
BITMAPINFO* PrivateInfo; LPBITMAPINFO PrivateInfo;
HDC hScreenDc; HDC hScreenDc;
HANDLE hBitmap; HANDLE hBitmap;
ULONG HeaderSize; ULONG HeaderSize;
ULONG ColorCount; ULONG ColorCount;
PVOID Data; PVOID Data;
if (!(fuLoad & LR_LOADFROMFILE)) if (!(fuLoad & LR_LOADFROMFILE))
{ {
if (hInstance == NULL) if (hInstance == NULL)
{ hInstance = User32Instance;
hInstance = GetModuleHandleW(L"USER32");
}
hResource = FindResourceW(hInstance, lpszName, RT_BITMAP); hResource = FindResourceW(hInstance, lpszName, RT_BITMAP);
if (hResource == NULL) if (hResource == NULL)
{ return NULL;
return(NULL);
}
hResource = LoadResource(hInstance, hResource); hResource = LoadResource(hInstance, hResource);
if (hResource == NULL) if (hResource == NULL)
{ return NULL;
return(NULL);
}
BitmapInfo = LockResource(hResource); BitmapInfo = LockResource(hResource);
if (BitmapInfo == NULL) if (BitmapInfo == NULL)
{ return NULL;
return(NULL); }
} else
} {
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) if (hFile == NULL)
{ return NULL;
return(NULL);
} hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
hSection = CreateFileMappingW(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
CloseHandle(hFile); CloseHandle(hFile);
if (hSection == NULL) if (hSection == NULL)
{ return NULL;
return(NULL);
} BitmapInfo = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
BitmapInfo = MapViewOfFile(hSection,
FILE_MAP_READ,
0,
0,
0);
CloseHandle(hSection); CloseHandle(hSection);
if (BitmapInfo == NULL) if (BitmapInfo == NULL)
{ return 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);
}
if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) BitmapInfo = (LPBITMAPINFO)((ULONG_PTR)BitmapInfo + sizeof(BITMAPFILEHEADER));
{ }
if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
{
BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)BitmapInfo; BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)BitmapInfo;
ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0; ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0;
HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE); HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE);
} }
else else
{ {
ColorCount = BitmapInfo->bmiHeader.biClrUsed; ColorCount = BitmapInfo->bmiHeader.biClrUsed;
if (ColorCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8) if (ColorCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8)
{ ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount;
ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD); HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
} }
Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize); Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize);
PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize); PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize);
if (PrivateInfo == NULL) if (PrivateInfo == NULL)
{ {
if (fuLoad & LR_LOADFROMFILE) if (fuLoad & LR_LOADFROMFILE)
{ UnmapViewOfFile(BitmapInfo);
UnmapViewOfFile(BitmapInfo); return NULL;
} }
return(NULL); memcpy(PrivateInfo, BitmapInfo, HeaderSize);
}
memcpy(PrivateInfo, BitmapInfo, HeaderSize);
/* FIXME: Handle color conversion and transparency. */ /* FIXME: Handle color conversion and transparency. */
hScreenDc = CreateCompatibleDC(NULL); hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL) if (hScreenDc == NULL)
{ {
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo); RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
if (fuLoad & LR_LOADFROMFILE) if (fuLoad & LR_LOADFROMFILE)
{ UnmapViewOfFile(BitmapInfo);
UnmapViewOfFile(BitmapInfo); return NULL;
} }
return(NULL);
}
if (fuLoad & LR_CREATEDIBSECTION) if (fuLoad & LR_CREATEDIBSECTION)
{ {
DIBSECTION Dib; DIBSECTION Dib;
hBitmap = CreateDIBSection(hScreenDc, PrivateInfo, DIB_RGB_COLORS, NULL, hBitmap = CreateDIBSection(hScreenDc, PrivateInfo, DIB_RGB_COLORS, NULL,
0, 0); 0, 0);
GetObjectA(hBitmap, sizeof(DIBSECTION), &Dib); GetObjectA(hBitmap, sizeof(DIBSECTION), &Dib);
SetDIBits(hScreenDc, hBitmap, 0, Dib.dsBm.bmHeight, Data, BitmapInfo, SetDIBits(hScreenDc, hBitmap, 0, Dib.dsBm.bmHeight, Data, BitmapInfo,
DIB_RGB_COLORS); DIB_RGB_COLORS);
} }
else else
{ {
hBitmap = CreateDIBitmap(hScreenDc, &PrivateInfo->bmiHeader, CBM_INIT, hBitmap = CreateDIBitmap(hScreenDc, &PrivateInfo->bmiHeader, CBM_INIT,
Data, PrivateInfo, DIB_RGB_COLORS); Data, PrivateInfo, DIB_RGB_COLORS);
} }
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo); RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
DeleteDC(hScreenDc); DeleteDC(hScreenDc);
if (fuLoad & LR_LOADFROMFILE) if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo); UnmapViewOfFile(BitmapInfo);
}
return(hBitmap); return hBitmap;
} }
HANDLE STDCALL HANDLE STDCALL
LoadImageW(HINSTANCE hinst, LoadImageW(
LPCWSTR lpszName, IN HINSTANCE hinst,
UINT uType, IN LPCWSTR lpszName,
int cxDesired, IN UINT uType,
int cyDesired, IN INT cxDesired,
UINT fuLoad) IN INT cyDesired,
IN UINT fuLoad)
{ {
if (fuLoad & LR_DEFAULTSIZE) if (fuLoad & LR_DEFAULTSIZE)
{ {
if (uType == IMAGE_ICON) if (uType == IMAGE_ICON)
{ {
if (cxDesired == 0) if (cxDesired == 0)
{ cxDesired = GetSystemMetrics(SM_CXICON);
cxDesired = GetSystemMetrics(SM_CXICON); if (cyDesired == 0)
} cyDesired = GetSystemMetrics(SM_CYICON);
if (cyDesired == 0) }
{
cyDesired = GetSystemMetrics(SM_CYICON);
}
}
else if (uType == IMAGE_CURSOR) else if (uType == IMAGE_CURSOR)
{ {
if (cxDesired == 0) if (cxDesired == 0)
{ cxDesired = GetSystemMetrics(SM_CXCURSOR);
cxDesired = GetSystemMetrics(SM_CXCURSOR); if (cyDesired == 0)
} cyDesired = GetSystemMetrics(SM_CYCURSOR);
if (cyDesired == 0) }
{ }
cyDesired = GetSystemMetrics(SM_CYCURSOR);
}
}
}
switch (uType) switch (uType)
{ {
case IMAGE_BITMAP: case IMAGE_BITMAP:
{ return LoadBitmapImage(hinst, lpszName, fuLoad);
return(LoadBitmapImage(hinst, lpszName, fuLoad)); case IMAGE_CURSOR:
} return LoadCursorImage(hinst, lpszName, fuLoad);
case IMAGE_CURSOR: case IMAGE_ICON:
{ return LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad);
return(LoadCursorImage(hinst, lpszName, fuLoad)); default:
} break;
case IMAGE_ICON: }
{
return(LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad)); return NULL;
}
default:
DbgBreakPoint();
break;
}
return(NULL);
} }
@ -657,7 +565,7 @@ LoadImageW(HINSTANCE hinst,
HBITMAP STDCALL HBITMAP STDCALL
LoadBitmapA(HINSTANCE hInstance, LPCSTR lpBitmapName) 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 HBITMAP STDCALL
LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName) LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName)
{ {
return(LoadImageW(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0)); return LoadImageW(hInstance, lpBitmapName, IMAGE_BITMAP, 0, 0, 0);
} }
@ -675,56 +583,67 @@ LoadBitmapW(HINSTANCE hInstance, LPCWSTR lpBitmapName)
* @unimplemented * @unimplemented
*/ */
HANDLE WINAPI 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; HBITMAP res;
BITMAP bm; BITMAP bm;
switch (type) switch (type)
{ {
case IMAGE_BITMAP: case IMAGE_BITMAP:
{ {
DbgPrint("WARNING: Incomplete implementation of CopyImage!\n"); DbgPrint("WARNING: Incomplete implementation of CopyImage!\n");
/* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE, /*
LR_COPYRETURNORG, LR_CREATEDIBSECTION, * FIXME: Support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE,
and LR_MONOCHROME; */ * LR_COPYRETURNORG, LR_CREATEDIBSECTION and LR_MONOCHROME.
*/
if (!GetObjectW(hnd, sizeof(bm), &bm))
return NULL;
bm.bmBits = NULL;
if ((res = CreateBitmapIndirect(&bm)))
{
char *buf = HeapAlloc(GetProcessHeap(), 0, bm.bmWidthBytes * bm.bmHeight);
if (buf == NULL)
{
DeleteObject(res);
return NULL;
}
GetBitmapBits(hnd, bm.bmWidthBytes * bm.bmHeight, buf);
SetBitmapBits(res, bm.bmWidthBytes * bm.bmHeight, buf);
HeapFree(GetProcessHeap(), 0, buf);
}
return res;
}
if (!GetObjectW(hnd, sizeof(bm), &bm)) return 0; case IMAGE_ICON:
bm.bmBits = NULL; {
if ((res = CreateBitmapIndirect(&bm))) static BOOL IconMsgDisplayed = FALSE;
{ /* FIXME: support loading the image as shared from an instance */
char *buf = HeapAlloc(GetProcessHeap(), 0, bm.bmWidthBytes * bm.bmHeight); if (!IconMsgDisplayed)
if (buf == NULL) {
{ DbgPrint("FIXME: CopyImage doesn't support IMAGE_ICON correctly!\n");
DeleteObject(res); IconMsgDisplayed = TRUE;
return NULL; }
} return CopyIcon(hnd);
GetBitmapBits(hnd, bm.bmWidthBytes * bm.bmHeight, buf); }
SetBitmapBits(res, bm.bmWidthBytes * bm.bmHeight, buf);
HeapFree(GetProcessHeap(), 0, buf); case IMAGE_CURSOR:
} {
return res; static BOOL IconMsgDisplayed = FALSE;
} /* FIXME: support loading the image as shared from an instance */
case IMAGE_ICON: if (!IconMsgDisplayed)
{ {
static BOOL IconMsgDisplayed = FALSE; DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n");
/* FIXME: support loading the image as shared from an instance */ IconMsgDisplayed = TRUE;
if (!IconMsgDisplayed) { }
DbgPrint("FIXME: CopyImage doesn't support IMAGE_ICON correctly!\n"); return CopyCursor(hnd);
IconMsgDisplayed = TRUE; }
} }
return CopyIcon(hnd);
} return NULL;
case IMAGE_CURSOR:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
if (!IconMsgDisplayed) {
DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n");
IconMsgDisplayed = TRUE;
}
return CopyCursor(hnd);
}
}
return 0;
} }