- 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,
UINT fuLoad)
{
LPWSTR lpszWName;
HANDLE Handle;
UNICODE_STRING NameString;
LPWSTR lpszWName;
HANDLE Handle;
UNICODE_STRING NameString;
if (HIWORD(lpszName))
{
if (HIWORD(lpszName))
{
RtlCreateUnicodeStringFromAsciiz(&NameString, (LPSTR)lpszName);
lpszWName = NameString.Buffer;
Handle = LoadImageW(hinst, lpszWName, uType, cxDesired,
cyDesired, fuLoad);
RtlFreeUnicodeString(&NameString);
}
else
{
}
else
{
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,
@ -161,25 +150,19 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
}
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, 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;
}
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;
}
@ -264,390 +246,316 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
static HANDLE
LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuLoad)
{
HANDLE hResource;
HANDLE h2Resource;
HANDLE hfRes;
HANDLE hFile;
HANDLE hSection;
CURSORICONDIR* IconDIR;
HDC hScreenDc;
HANDLE hIcon;
ULONG HeaderSize;
ULONG ColorCount;
PVOID Data;
CURSORICONDIRENTRY* dirEntry;
ICONIMAGE* SafeIconImage;
GRPCURSORICONDIR* IconResDir;
INT id;
ICONIMAGE *ResIcon;
HANDLE hResource;
HANDLE h2Resource;
HANDLE hfRes;
HANDLE hFile;
HANDLE hSection;
CURSORICONDIR* IconDIR;
HDC hScreenDc;
HICON hIcon;
ULONG HeaderSize;
ULONG ColorCount;
PVOID Data;
CURSORICONDIRENTRY* dirEntry;
ICONIMAGE* SafeIconImage;
GRPCURSORICONDIR* IconResDir;
INT id;
ICONIMAGE *ResIcon;
if (!(fuLoad & LR_LOADFROMFILE))
{
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)
return hIcon;
}
{
hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height);
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);
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
* 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)
{
DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n");
}
/*
* 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.
*/
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hFile == NULL)
{
return NULL;
}
if (fuLoad & LR_SHARED)
{
DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n");
}
hSection = CreateFileMappingW(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile == NULL)
return NULL;
CloseHandle(hFile);
if (hSection == 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))
{
UnmapViewOfFile(IconDIR);
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))
{
UnmapViewOfFile(IconDIR);
return NULL;
}
//pick the best size.
dirEntry = (CURSORICONDIRENTRY *) CURSORICON_FindBestIcon( IconDIR, width, height, 1);
if (!dirEntry)
{
UnmapViewOfFile(IconDIR);
return NULL;
}
/* Pick the best size. */
dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, width, height, 1);
if (!dirEntry)
{
UnmapViewOfFile(IconDIR);
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);
UnmapViewOfFile(IconDIR);
}
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;
SafeIconImage->icHeader.biHeight = SafeIconImage->icHeader.biHeight /2;
if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER))
{
if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER))
{
BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)SafeIconImage;
ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0;
HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE);
}
else
{
}
else
{
ColorCount = SafeIconImage->icHeader.biClrUsed;
if (ColorCount == 0 && SafeIconImage->icHeader.biBitCount <= 8)
{
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
}
ColorCount = 1 << SafeIconImage->icHeader.biBitCount;
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
}
//make data point to the start of the XOR image data
Data = (PBYTE)SafeIconImage + HeaderSize;
/* 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
hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
if (hScreenDc == NULL)
{
/* 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;
hIcon = ICON_CreateIconFromData(hScreenDc, Data, SafeIconImage, width, height, width/2, height/2);
RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
return hIcon;
}
static HANDLE
LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
{
HANDLE hResource;
HANDLE hFile;
HANDLE hSection;
BITMAPINFO* BitmapInfo;
BITMAPINFO* PrivateInfo;
HDC hScreenDc;
HANDLE hBitmap;
ULONG HeaderSize;
ULONG ColorCount;
PVOID Data;
HANDLE hResource;
HANDLE hFile;
HANDLE hSection;
LPBITMAPINFO BitmapInfo;
LPBITMAPINFO PrivateInfo;
HDC hScreenDc;
HANDLE hBitmap;
ULONG HeaderSize;
ULONG ColorCount;
PVOID Data;
if (!(fuLoad & LR_LOADFROMFILE))
{
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);
}
}
else
{
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
return NULL;
}
else
{
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;
if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
{
BitmapInfo = (LPBITMAPINFO)((ULONG_PTR)BitmapInfo + sizeof(BITMAPFILEHEADER));
}
if (BitmapInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
{
BITMAPCOREHEADER* Core = (BITMAPCOREHEADER*)BitmapInfo;
ColorCount = (Core->bcBitCount <= 8) ? (1 << Core->bcBitCount) : 0;
HeaderSize = sizeof(BITMAPCOREHEADER) + ColorCount * sizeof(RGBTRIPLE);
}
else
{
}
else
{
ColorCount = BitmapInfo->bmiHeader.biClrUsed;
if (ColorCount == 0 && BitmapInfo->bmiHeader.biBitCount <= 8)
{
ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount;
}
ColorCount = 1 << BitmapInfo->bmiHeader.biBitCount;
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize);
}
Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize);
PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize);
if (PrivateInfo == NULL)
{
PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize);
if (PrivateInfo == NULL)
{
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
}
return(NULL);
}
memcpy(PrivateInfo, BitmapInfo, HeaderSize);
UnmapViewOfFile(BitmapInfo);
return NULL;
}
memcpy(PrivateInfo, BitmapInfo, HeaderSize);
/* FIXME: Handle color conversion and transparency. */
/* FIXME: Handle color conversion and transparency. */
hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL)
{
hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL)
{
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
}
return(NULL);
}
UnmapViewOfFile(BitmapInfo);
return NULL;
}
if (fuLoad & LR_CREATEDIBSECTION)
{
if (fuLoad & LR_CREATEDIBSECTION)
{
DIBSECTION Dib;
hBitmap = CreateDIBSection(hScreenDc, PrivateInfo, DIB_RGB_COLORS, NULL,
0, 0);
0, 0);
GetObjectA(hBitmap, sizeof(DIBSECTION), &Dib);
SetDIBits(hScreenDc, hBitmap, 0, Dib.dsBm.bmHeight, Data, BitmapInfo,
DIB_RGB_COLORS);
}
else
{
DIB_RGB_COLORS);
}
else
{
hBitmap = CreateDIBitmap(hScreenDc, &PrivateInfo->bmiHeader, CBM_INIT,
Data, PrivateInfo, DIB_RGB_COLORS);
}
Data, PrivateInfo, DIB_RGB_COLORS);
}
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
DeleteDC(hScreenDc);
if (fuLoad & LR_LOADFROMFILE)
{
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 (fuLoad & LR_DEFAULTSIZE)
{
if (uType == IMAGE_ICON)
{
if (cxDesired == 0)
{
cxDesired = GetSystemMetrics(SM_CXICON);
}
if (cyDesired == 0)
{
cyDesired = GetSystemMetrics(SM_CYICON);
}
}
{
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);
}
}
}
{
if (cxDesired == 0)
cxDesired = GetSystemMetrics(SM_CXCURSOR);
if (cyDesired == 0)
cyDesired = GetSystemMetrics(SM_CYCURSOR);
}
}
switch (uType)
{
case IMAGE_BITMAP:
{
return(LoadBitmapImage(hinst, lpszName, fuLoad));
}
case IMAGE_CURSOR:
{
return(LoadCursorImage(hinst, lpszName, fuLoad));
}
case IMAGE_ICON:
{
return(LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad));
}
default:
DbgBreakPoint();
break;
}
return(NULL);
switch (uType)
{
case IMAGE_BITMAP:
return LoadBitmapImage(hinst, lpszName, fuLoad);
case IMAGE_CURSOR:
return LoadCursorImage(hinst, lpszName, fuLoad);
case IMAGE_ICON:
return LoadIconImage(hinst, lpszName, cxDesired, cyDesired, fuLoad);
default:
break;
}
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,56 +583,67 @@ 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;
HBITMAP res;
BITMAP bm;
switch (type)
{
case IMAGE_BITMAP:
{
DbgPrint("WARNING: Incomplete implementation of CopyImage!\n");
/* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE,
LR_COPYRETURNORG, LR_CREATEDIBSECTION,
and LR_MONOCHROME; */
switch (type)
{
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 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;
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;
}
case IMAGE_ICON:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
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) {
DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n");
IconMsgDisplayed = TRUE;
}
return CopyCursor(hnd);
}
}
return 0;
case IMAGE_ICON:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
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)
{
DbgPrint("FIXME: CopyImage doesn't support IMAGE_CURSOR correctly!\n");
IconMsgDisplayed = TRUE;
}
return CopyCursor(hnd);
}
}
return NULL;
}