Moved LoadImage and related functions to cursoricon.c.
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 );
+}