Moved LoadImage and related functions to cursoricon.c.
diff --git a/include/bitmap.h b/include/bitmap.h
index 3b25e45..9c699dc 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -50,7 +50,6 @@
extern INT BITMAP_GetObject( BITMAPOBJ * bmp, INT count, LPVOID buffer );
extern BOOL BITMAP_DeleteObject( HBITMAP16 hbitmap, BITMAPOBJ * bitmap );
extern INT BITMAP_GetWidthBytes( INT width, INT depth );
-extern HBITMAP BITMAP_Load( HINSTANCE instance, LPCWSTR name, UINT loadflags );
extern HBITMAP BITMAP_CopyBitmap( HBITMAP hbitmap );
/* objects/dib.c */
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 82c745f..8f74c7f 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -370,99 +370,6 @@
return ret;
}
-/***********************************************************************
- * LoadImage16 [USER.389]
- *
- */
-HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type,
- INT16 desiredx, INT16 desiredy, UINT16 loadflags)
-{
- LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
- return LoadImageA( hinst, nameStr, type,
- desiredx, desiredy, loadflags );
-}
-
-/**********************************************************************
- * LoadImageA (USER32.365)
- *
- * FIXME: implementation lacks some features, see LR_ defines in windows.h
- */
-
-HANDLE WINAPI LoadImageA( HINSTANCE hinst, LPCSTR name, UINT type,
- INT desiredx, INT desiredy, UINT loadflags)
-{
- HANDLE res;
- LPWSTR u_name;
-
- if (HIWORD(name)) u_name = HEAP_strdupAtoW(GetProcessHeap(), 0, name);
- else u_name=(LPWSTR)name;
- res = LoadImageW(hinst, u_name, type, desiredx, desiredy, loadflags);
- if (HIWORD(name)) HeapFree(GetProcessHeap(), 0, u_name);
- return res;
-}
-
-
-/******************************************************************************
- * LoadImageW [USER32.366] Loads an icon, cursor, or bitmap
- *
- * PARAMS
- * hinst [I] Handle of instance that contains image
- * name [I] Name of image
- * type [I] Type of image
- * desiredx [I] Desired width
- * desiredy [I] Desired height
- * loadflags [I] Load flags
- *
- * RETURNS
- * Success: Handle to newly loaded image
- * Failure: NULL
- *
- * FIXME: Implementation lacks some features, see LR_ defines in windows.h
- */
-HANDLE WINAPI LoadImageW( HINSTANCE hinst, LPCWSTR name, UINT type,
- INT desiredx, INT desiredy, UINT loadflags )
-{
- if (HIWORD(name)) {
- TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
- hinst,name,type,desiredx,desiredy,loadflags);
- } else {
- TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
- hinst,name,type,desiredx,desiredy,loadflags);
- }
- if (loadflags & LR_DEFAULTSIZE) {
- if (type == IMAGE_ICON) {
- if (!desiredx) desiredx = GetSystemMetrics(SM_CXICON);
- if (!desiredy) desiredy = GetSystemMetrics(SM_CYICON);
- } else if (type == IMAGE_CURSOR) {
- if (!desiredx) desiredx = GetSystemMetrics(SM_CXCURSOR);
- if (!desiredy) desiredy = GetSystemMetrics(SM_CYCURSOR);
- }
- }
- if (loadflags & LR_LOADFROMFILE) loadflags &= ~LR_SHARED;
- switch (type) {
- case IMAGE_BITMAP:
- return BITMAP_Load( hinst, name, loadflags );
-
- case IMAGE_ICON:
- {
- HDC hdc = GetDC(0);
- UINT palEnts = GetSystemPaletteEntries(hdc, 0, 0, NULL);
- if (palEnts == 0)
- palEnts = 256;
- ReleaseDC(0, hdc);
-
- return CURSORICON_Load(hinst, name, desiredx, desiredy,
- palEnts, FALSE, loadflags);
- }
-
- case IMAGE_CURSOR:
- return CURSORICON_Load(hinst, name, desiredx, desiredy,
- 1, TRUE, loadflags);
- }
- return 0;
-}
-
-
/**********************************************************************
* BITMAP_CopyBitmap
*
@@ -491,157 +398,6 @@
return res;
}
-/******************************************************************************
- * CopyImage16 [USER.390] Creates new image and copies attributes to it
- *
- */
-HICON16 WINAPI CopyImage16( HANDLE16 hnd, UINT16 type, INT16 desiredx,
- INT16 desiredy, UINT16 flags )
-{
- return (HICON16)CopyImage((HANDLE)hnd, (UINT)type, (INT)desiredx,
- (INT)desiredy, (UINT)flags);
-}
-
-/******************************************************************************
- * CopyImage32 [USER32.61] Creates new image and copies attributes to it
- *
- * PARAMS
- * hnd [I] Handle to image to copy
- * type [I] Type of image to copy
- * desiredx [I] Desired width of new image
- * desiredy [I] Desired height of new image
- * flags [I] Copy flags
- *
- * RETURNS
- * Success: Handle to newly created image
- * Failure: NULL
- *
- * FIXME: implementation still lacks nearly all features, see LR_*
- * defines in windows.h
- */
-HICON WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx,
- INT desiredy, UINT flags )
-{
- switch (type)
- {
- case IMAGE_BITMAP:
- return BITMAP_CopyBitmap(hnd);
- case IMAGE_ICON:
- return CURSORICON_ExtCopy(hnd,type, desiredx, desiredy, flags);
- case IMAGE_CURSOR:
- /* Should call CURSORICON_ExtCopy but more testing
- * needs to be done before we change this
- */
- return CopyCursor(hnd);
- }
- return 0;
-}
-
-/**********************************************************************
- * BITMAP_Load
- */
-HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, UINT loadflags )
-{
- HBITMAP hbitmap = 0;
- HDC hdc;
- HRSRC hRsrc;
- HGLOBAL handle;
- char *ptr = NULL;
- BITMAPINFO *info, *fix_info=NULL;
- HGLOBAL hFix;
- int size;
-
- if (!(loadflags & LR_LOADFROMFILE)) {
- if (!instance) /* OEM bitmap */
- {
- HDC hdc;
- DC *dc;
-
- if (HIWORD((int)name)) return 0;
- hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
- dc = DC_GetDCPtr( hdc );
- if(dc->funcs->pLoadOEMResource)
- hbitmap = dc->funcs->pLoadOEMResource( LOWORD((int)name),
- OEM_BITMAP );
- GDI_HEAP_UNLOCK( hdc );
- DeleteDC( hdc );
- return hbitmap;
- }
-
- if (!(hRsrc = FindResourceW( instance, name, RT_BITMAPW ))) return 0;
- if (!(handle = LoadResource( instance, hRsrc ))) return 0;
-
- if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0;
- }
- else
- {
- if (!(ptr = (char *)VIRTUAL_MapFileW( name ))) return 0;
- info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER));
- }
- size = DIB_BitmapInfoSize(info, DIB_RGB_COLORS);
- if ((hFix = GlobalAlloc(0, size))) fix_info=GlobalLock(hFix);
- if (fix_info) {
- BYTE pix;
-
- memcpy(fix_info, info, size);
- pix = *((LPBYTE)info+DIB_BitmapInfoSize(info, DIB_RGB_COLORS));
- DIB_FixColorsToLoadflags(fix_info, loadflags, pix);
- if ((hdc = GetDC(0)) != 0) {
- char *bits = (char *)info + size;
- if (loadflags & LR_CREATEDIBSECTION) {
- DIBSECTION dib;
- hbitmap = CreateDIBSection(hdc, fix_info, DIB_RGB_COLORS, NULL, 0, 0);
- GetObjectA(hbitmap, sizeof(DIBSECTION), &dib);
- SetDIBits(hdc, hbitmap, 0, dib.dsBm.bmHeight, bits, info,
- DIB_RGB_COLORS);
- }
- else {
- hbitmap = CreateDIBitmap( hdc, &fix_info->bmiHeader, CBM_INIT,
- bits, fix_info, DIB_RGB_COLORS );
- }
- ReleaseDC( 0, hdc );
- }
- GlobalUnlock(hFix);
- GlobalFree(hFix);
- }
- if (loadflags & LR_LOADFROMFILE) UnmapViewOfFile( ptr );
- return hbitmap;
-}
-
-
-/******************************************************************************
- * LoadBitmapW [USER32.358] Loads bitmap from the executable file
- *
- * RETURNS
- * Success: Handle to specified bitmap
- * Failure: NULL
- */
-HBITMAP WINAPI LoadBitmapW(
- HINSTANCE instance, /* [in] Handle to application instance */
- LPCWSTR name) /* [in] Address of bitmap resource name */
-{
- return LoadImageW( instance, name, IMAGE_BITMAP, 0, 0, 0 );
-}
-
-/**********************************************************************
- * LoadBitmapA (USER32.357)
- */
-HBITMAP WINAPI LoadBitmapA( HINSTANCE instance, LPCSTR name )
-{
- return LoadImageA( instance, name, IMAGE_BITMAP, 0, 0, 0 );
-}
-
-/**********************************************************************
- * LoadBitmap16 (USER.175)
- */
-HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
-{
- LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
- return LoadBitmapA( instance, nameStr );
-}
-
-
-
/***********************************************************************
* BITMAP_DeleteObject
*/
diff --git a/windows/cursoricon.c b/windows/cursoricon.c
index 5b59686..afcca46 100644
--- a/windows/cursoricon.c
+++ b/windows/cursoricon.c
@@ -52,8 +52,9 @@
#include "message.h"
#include "winerror.h"
-DECLARE_DEBUG_CHANNEL(cursor)
-DECLARE_DEBUG_CHANNEL(icon)
+DECLARE_DEBUG_CHANNEL(cursor);
+DECLARE_DEBUG_CHANNEL(icon);
+DECLARE_DEBUG_CHANNEL(resource);
static HCURSOR hActiveCursor = 0; /* Active cursor */
static INT CURSOR_ShowCount = 0; /* Cursor display count */
@@ -2016,3 +2017,246 @@
GlobalUnlock16( hIcon );
return result;
}
+
+/**********************************************************************
+ * BITMAP_Load
+ */
+static HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, UINT loadflags )
+{
+ HBITMAP hbitmap = 0;
+ HDC hdc;
+ HRSRC hRsrc;
+ HGLOBAL handle;
+ char *ptr = NULL;
+ BITMAPINFO *info, *fix_info=NULL;
+ HGLOBAL hFix;
+ int size;
+
+ if (!(loadflags & LR_LOADFROMFILE)) {
+ if (!instance) /* OEM bitmap */
+ {
+ HDC hdc;
+ DC *dc;
+
+ if (HIWORD((int)name)) return 0;
+ hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
+ dc = DC_GetDCPtr( hdc );
+ if(dc->funcs->pLoadOEMResource)
+ hbitmap = dc->funcs->pLoadOEMResource( LOWORD((int)name),
+ OEM_BITMAP );
+ GDI_HEAP_UNLOCK( hdc );
+ DeleteDC( hdc );
+ return hbitmap;
+ }
+
+ if (!(hRsrc = FindResourceW( instance, name, RT_BITMAPW ))) return 0;
+ if (!(handle = LoadResource( instance, hRsrc ))) return 0;
+
+ if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0;
+ }
+ else
+ {
+ if (!(ptr = (char *)VIRTUAL_MapFileW( name ))) return 0;
+ info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER));
+ }
+ size = DIB_BitmapInfoSize(info, DIB_RGB_COLORS);
+ if ((hFix = GlobalAlloc(0, size))) fix_info=GlobalLock(hFix);
+ if (fix_info) {
+ BYTE pix;
+
+ memcpy(fix_info, info, size);
+ pix = *((LPBYTE)info+DIB_BitmapInfoSize(info, DIB_RGB_COLORS));
+ DIB_FixColorsToLoadflags(fix_info, loadflags, pix);
+ if ((hdc = GetDC(0)) != 0) {
+ char *bits = (char *)info + size;
+ if (loadflags & LR_CREATEDIBSECTION) {
+ DIBSECTION dib;
+ hbitmap = CreateDIBSection(hdc, fix_info, DIB_RGB_COLORS, NULL, 0, 0);
+ GetObjectA(hbitmap, sizeof(DIBSECTION), &dib);
+ SetDIBits(hdc, hbitmap, 0, dib.dsBm.bmHeight, bits, info,
+ DIB_RGB_COLORS);
+ }
+ else {
+ hbitmap = CreateDIBitmap( hdc, &fix_info->bmiHeader, CBM_INIT,
+ bits, fix_info, DIB_RGB_COLORS );
+ }
+ ReleaseDC( 0, hdc );
+ }
+ GlobalUnlock(hFix);
+ GlobalFree(hFix);
+ }
+ if (loadflags & LR_LOADFROMFILE) UnmapViewOfFile( ptr );
+ return hbitmap;
+}
+
+
+/***********************************************************************
+ * LoadImage16 [USER.389]
+ *
+ */
+HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type,
+ INT16 desiredx, INT16 desiredy, UINT16 loadflags)
+{
+ LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
+ return LoadImageA( hinst, nameStr, type,
+ desiredx, desiredy, loadflags );
+}
+
+/**********************************************************************
+ * LoadImageA (USER32.365)
+ *
+ * FIXME: implementation lacks some features, see LR_ defines in windows.h
+ */
+
+HANDLE WINAPI LoadImageA( HINSTANCE hinst, LPCSTR name, UINT type,
+ INT desiredx, INT desiredy, UINT loadflags)
+{
+ HANDLE res;
+ LPWSTR u_name;
+
+ if (HIWORD(name)) u_name = HEAP_strdupAtoW(GetProcessHeap(), 0, name);
+ else u_name=(LPWSTR)name;
+ res = LoadImageW(hinst, u_name, type, desiredx, desiredy, loadflags);
+ if (HIWORD(name)) HeapFree(GetProcessHeap(), 0, u_name);
+ return res;
+}
+
+
+/******************************************************************************
+ * LoadImageW [USER32.366] Loads an icon, cursor, or bitmap
+ *
+ * PARAMS
+ * hinst [I] Handle of instance that contains image
+ * name [I] Name of image
+ * type [I] Type of image
+ * desiredx [I] Desired width
+ * desiredy [I] Desired height
+ * loadflags [I] Load flags
+ *
+ * RETURNS
+ * Success: Handle to newly loaded image
+ * Failure: NULL
+ *
+ * FIXME: Implementation lacks some features, see LR_ defines in windows.h
+ */
+HANDLE WINAPI LoadImageW( HINSTANCE hinst, LPCWSTR name, UINT type,
+ INT desiredx, INT desiredy, UINT loadflags )
+{
+ if (HIWORD(name)) {
+ TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+ hinst,name,type,desiredx,desiredy,loadflags);
+ } else {
+ TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+ hinst,name,type,desiredx,desiredy,loadflags);
+ }
+ if (loadflags & LR_DEFAULTSIZE) {
+ if (type == IMAGE_ICON) {
+ if (!desiredx) desiredx = GetSystemMetrics(SM_CXICON);
+ if (!desiredy) desiredy = GetSystemMetrics(SM_CYICON);
+ } else if (type == IMAGE_CURSOR) {
+ if (!desiredx) desiredx = GetSystemMetrics(SM_CXCURSOR);
+ if (!desiredy) desiredy = GetSystemMetrics(SM_CYCURSOR);
+ }
+ }
+ if (loadflags & LR_LOADFROMFILE) loadflags &= ~LR_SHARED;
+ switch (type) {
+ case IMAGE_BITMAP:
+ return BITMAP_Load( hinst, name, loadflags );
+
+ case IMAGE_ICON:
+ {
+ HDC hdc = GetDC(0);
+ UINT palEnts = GetSystemPaletteEntries(hdc, 0, 0, NULL);
+ if (palEnts == 0)
+ palEnts = 256;
+ ReleaseDC(0, hdc);
+
+ return CURSORICON_Load(hinst, name, desiredx, desiredy,
+ palEnts, FALSE, loadflags);
+ }
+
+ case IMAGE_CURSOR:
+ return CURSORICON_Load(hinst, name, desiredx, desiredy,
+ 1, TRUE, loadflags);
+ }
+ return 0;
+}
+
+
+/******************************************************************************
+ * CopyImage16 [USER.390] Creates new image and copies attributes to it
+ *
+ */
+HICON16 WINAPI CopyImage16( HANDLE16 hnd, UINT16 type, INT16 desiredx,
+ INT16 desiredy, UINT16 flags )
+{
+ return (HICON16)CopyImage((HANDLE)hnd, (UINT)type, (INT)desiredx,
+ (INT)desiredy, (UINT)flags);
+}
+
+/******************************************************************************
+ * CopyImage32 [USER32.61] Creates new image and copies attributes to it
+ *
+ * PARAMS
+ * hnd [I] Handle to image to copy
+ * type [I] Type of image to copy
+ * desiredx [I] Desired width of new image
+ * desiredy [I] Desired height of new image
+ * flags [I] Copy flags
+ *
+ * RETURNS
+ * Success: Handle to newly created image
+ * Failure: NULL
+ *
+ * FIXME: implementation still lacks nearly all features, see LR_*
+ * defines in windows.h
+ */
+HICON WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx,
+ INT desiredy, UINT flags )
+{
+ switch (type)
+ {
+ case IMAGE_BITMAP:
+ return BITMAP_CopyBitmap(hnd);
+ case IMAGE_ICON:
+ return CURSORICON_ExtCopy(hnd,type, desiredx, desiredy, flags);
+ case IMAGE_CURSOR:
+ /* Should call CURSORICON_ExtCopy but more testing
+ * needs to be done before we change this
+ */
+ return CopyCursor(hnd);
+ }
+ return 0;
+}
+
+
+/******************************************************************************
+ * LoadBitmapW [USER32.358] Loads bitmap from the executable file
+ *
+ * RETURNS
+ * Success: Handle to specified bitmap
+ * Failure: NULL
+ */
+HBITMAP WINAPI LoadBitmapW(
+ HINSTANCE instance, /* [in] Handle to application instance */
+ LPCWSTR name) /* [in] Address of bitmap resource name */
+{
+ return LoadImageW( instance, name, IMAGE_BITMAP, 0, 0, 0 );
+}
+
+/**********************************************************************
+ * LoadBitmapA (USER32.357)
+ */
+HBITMAP WINAPI LoadBitmapA( HINSTANCE instance, LPCSTR name )
+{
+ return LoadImageA( instance, name, IMAGE_BITMAP, 0, 0, 0 );
+}
+
+/**********************************************************************
+ * LoadBitmap16 (USER.175)
+ */
+HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
+{
+ LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
+ return LoadBitmapA( instance, nameStr );
+}