* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: bitmap.c,v 1.31 2004/07/14 20:52:13 navaraf Exp $
+/* $Id$
*
* PROJECT: ReactOS user32.dll
* FILE: lib/user32/windows/input.c
/* INCLUDES ******************************************************************/
-#include <string.h>
-#include <windows.h>
#include <user32.h>
-#include <debug.h>
-#include <stdlib.h>
-#define NTOS_MODE_USER
-#include <ntos.h>
/*forward declerations... actualy in user32\windows\icon.c but usful here****/
HICON ICON_CreateCursorFromData(HDC hDC, PVOID ImageData, ICONIMAGE* IconImage, int cxDesired, int cyDesired, int xHotspot, int yHotspot);
UNICODE_STRING NameString;
if (HIWORD(lpszName))
- {
+ {
RtlCreateUnicodeStringFromAsciiz(&NameString, (LPSTR)lpszName);
lpszWName = NameString.Buffer;
Handle = LoadImageW(hinst, lpszWName, uType, cxDesired,
}
-HANDLE STATIC
+static HANDLE
LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad)
{
HANDLE hResource;
INT id;
ICONIMAGE *ResIcon;
UINT ColorBits;
-
+
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
return NULL;
}
-
+
if (fuLoad & LR_SHARED)
{
/* FIXME - pass size! */
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE)ResIcon,
SizeofResource(hinst, h2Resource), FALSE, 0x00030000,
32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
- if (hIcon)
+ if (hIcon && 0 != (fuLoad & LR_SHARED))
{
- NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
+ NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
(HRSRC)NULL);
}
return hIcon;
}
- else
+
+ if (fuLoad & LR_SHARED)
{
- if (fuLoad & LR_SHARED)
- {
- DbgPrint("FIXME: need LR_SHARED support loading cursor images from files\n");
- }
-
- hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, 0, NULL);
- if (hFile == NULL)
- {
- return NULL;
- }
+ DbgPrint("FIXME: need LR_SHARED support loading cursor images from files\n");
+ }
- hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
- CloseHandle(hFile);
- if (hSection == NULL)
- {
- return NULL;
- }
+ hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (hFile == NULL)
+ {
+ return NULL;
+ }
- IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
- CloseHandle(hSection);
- if (IconDIR == NULL)
- {
- return NULL;
- }
+ hSection = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
+ CloseHandle(hFile);
+ if (hSection == NULL)
+ {
+ return NULL;
+ }
- /*
- * Get a handle to the screen dc, the icon we create is going to be
- * compatable with it.
- */
- hScreenDc = CreateCompatibleDC(0);
- if (hScreenDc == NULL)
- {
- UnmapViewOfFile(IconDIR);
- return NULL;
- }
+ IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0);
+ CloseHandle(hSection);
+ if (IconDIR == NULL)
+ {
+ return NULL;
+ }
- if (fuLoad & LR_MONOCHROME)
- {
- ColorBits = 1;
- }
- else
- {
- ColorBits = GetDeviceCaps(hScreenDc, BITSPIXEL);
- /*
- * FIXME:
- * Remove this after proper support for alpha icons will be finished.
- */
- if (ColorBits > 8)
- ColorBits = 8;
- }
+ 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, 32, 32, ColorBits);
- if (!dirEntry)
- {
- UnmapViewOfFile(IconDIR);
- return(NULL);
- }
+ /*
+ * Get a handle to the screen dc, the icon we create is going to be
+ * compatable with it.
+ */
+ hScreenDc = CreateCompatibleDC(0);
+ if (hScreenDc == NULL)
+ {
+ UnmapViewOfFile(IconDIR);
+ return NULL;
+ }
- SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
- memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes);
+ if (fuLoad & LR_MONOCHROME)
+ {
+ ColorBits = 1;
+ }
+ else
+ {
+ ColorBits = GetDeviceCaps(hScreenDc, BITSPIXEL);
+ /*
+ * FIXME:
+ * Remove this after proper support for alpha icons will be finished.
+ */
+ if (ColorBits > 8)
+ ColorBits = 8;
}
- //at this point we have a copy of the icon image to play with
+ /* Pick the best size. */
+ dirEntry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon(IconDIR, 32, 32, ColorBits);
+ if (!dirEntry)
+ {
+ UnmapViewOfFile(IconDIR);
+ return NULL;
+ }
- SafeIconImage->icHeader.biHeight = SafeIconImage->icHeader.biHeight /2;
+ SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
+ if (SafeIconImage == NULL)
+ {
+ UnmapViewOfFile(IconDIR);
+ return NULL;
+ }
+ memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes);
+ UnmapViewOfFile(IconDIR);
- if (SafeIconImage->icHeader.biSize == sizeof(BITMAPCOREHEADER))
- {
+ /* at this point we have a copy of the icon image to play with */
+
+ SafeIconImage->icHeader.biHeight = SafeIconImage->icHeader.biHeight /2;
+
+ 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;
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
- }
-
- //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);
- DeleteDC(hScreenDc);
- RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
- return hIcon;
+ /* 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);
+ DeleteDC(hScreenDc);
+ RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
+ return hIcon;
}
-HANDLE STATIC
+static HANDLE
LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuLoad)
{
HANDLE hResource;
GRPCURSORICONDIR* IconResDir;
INT id;
ICONIMAGE *ResIcon;
-
+
if (!(fuLoad & LR_LOADFROMFILE))
{
if (hinst == NULL)
{
return(NULL);
}
-
+
if (fuLoad & LR_SHARED)
{
hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes, width, height);
hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon,
SizeofResource(hinst, h2Resource), TRUE, 0x00030000,
width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME));
- if(hIcon)
+ if (hIcon && 0 != (fuLoad & LR_SHARED))
{
- NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes,
+ 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.
+ * 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
{
DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n");
}
-
+
hFile = CreateFileW(lpszName,
GENERIC_READ,
FILE_SHARE_READ,
0,
NULL);
if (hFile == NULL)
- {
- return(NULL);
- }
+ {
+ return NULL;
+ }
hSection = CreateFileMappingW(hFile,
NULL,
0,
NULL);
+ CloseHandle(hFile);
if (hSection == NULL)
- {
- CloseHandle(hFile);
- return(NULL);
- }
+ {
+ return NULL;
+ }
+
IconDIR = MapViewOfFile(hSection,
FILE_MAP_READ,
0,
0,
0);
-
+ CloseHandle(hSection);
if (IconDIR == NULL)
- {
- CloseHandle(hFile);
- CloseHandle(hSection);
- return(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)
- {
- CloseHandle(hFile);
- CloseHandle(hSection);
- UnmapViewOfFile(IconDIR);
- return(NULL);
- }
+ {
+ UnmapViewOfFile(IconDIR);
+ return NULL;
+ }
- SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
+ SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes);
-
- CloseHandle(hFile);
- CloseHandle(hSection);
+ UnmapViewOfFile(IconDIR);
}
//at this point we have a copy of the icon image to play with
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
-
+
//make data point to the start of the XOR image data
Data = (PBYTE)SafeIconImage + HeaderSize;
if (hScreenDc == NULL)
{
if (fuLoad & LR_LOADFROMFILE)
- {
- RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
- UnmapViewOfFile(IconDIR);
- }
+ {
+ RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage);
+ }
return(NULL);
}
}
-HANDLE STATIC
+static HANDLE
LoadBitmapImage(HINSTANCE hInstance, LPCWSTR lpszName, UINT fuLoad)
{
HANDLE hResource;
NULL);
CloseHandle(hFile);
if (hSection == NULL)
- {
+ {
return(NULL);
}
BitmapInfo = MapViewOfFile(hSection,
}
HeaderSize = sizeof(BITMAPINFOHEADER) + ColorCount * sizeof(RGBQUAD);
}
- Data = (PVOID)BitmapInfo + HeaderSize;
+ Data = (PVOID)((ULONG_PTR)BitmapInfo + HeaderSize);
PrivateInfo = RtlAllocateHeap(GetProcessHeap(), 0, HeaderSize);
if (PrivateInfo == NULL)
/* FIXME: Handle color conversion and transparency. */
- hScreenDc = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
+ hScreenDc = CreateCompatibleDC(NULL);
if (hScreenDc == NULL)
{
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
{
DIBSECTION Dib;
- hBitmap = CreateDIBSection(hScreenDc, PrivateInfo, DIB_RGB_COLORS, NULL,
+ hBitmap = CreateDIBSection(hScreenDc, PrivateInfo, DIB_RGB_COLORS, NULL,
0, 0);
GetObjectA(hBitmap, sizeof(DIBSECTION), &Dib);
SetDIBits(hScreenDc, hBitmap, 0, Dib.dsBm.bmHeight, Data, BitmapInfo,
}
RtlFreeHeap(GetProcessHeap(), 0, PrivateInfo);
- /*DeleteDC(hScreenDc);*/
+ DeleteDC(hScreenDc);
if (fuLoad & LR_LOADFROMFILE)
{
UnmapViewOfFile(BitmapInfo);
int cxDesired,
int cyDesired,
UINT fuLoad)
-{
+{
if (fuLoad & LR_DEFAULTSIZE)
{
if (uType == IMAGE_ICON)
HANDLE WINAPI
CopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
{
+ HBITMAP res;
+ BITMAP bm;
+
switch (type)
{
case IMAGE_BITMAP:
/* FIXME: support flags LR_COPYDELETEORG, LR_COPYFROMRESOURCE,
LR_COPYRETURNORG, LR_CREATEDIBSECTION,
and LR_MONOCHROME; */
- HBITMAP res;
- BITMAP bm;
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:
+ case IMAGE_ICON:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */
}
return CopyIcon(hnd);
}
- case IMAGE_CURSOR:
+ case IMAGE_CURSOR:
{
static BOOL IconMsgDisplayed = FALSE;
/* FIXME: support loading the image as shared from an instance */