user32: Propagate the LoadImage flags into the low-level loader functions.

This commit is contained in:
Alexandre Julliard 2011-01-28 12:42:56 +01:00
parent 6e077e0bc0
commit ab4a5a327d
1 changed files with 26 additions and 25 deletions

View File

@ -413,7 +413,7 @@ typedef BOOL (*fnGetCIEntry)( LPCVOID dir, int n,
* Find the icon closest to the requested size and bit depth.
*/
static int CURSORICON_FindBestIcon( LPCVOID dir, fnGetCIEntry get_entry,
int width, int height, int depth )
int width, int height, int depth, UINT loadflags )
{
int i, cx, cy, bits, bestEntry = -1;
UINT iTotalDiff, iXDiff=0, iYDiff=0, iColorDiff;
@ -475,7 +475,7 @@ static BOOL CURSORICON_GetResIconEntry( LPCVOID dir, int n,
* FIXME: parameter 'color' ignored.
*/
static int CURSORICON_FindBestCursor( LPCVOID dir, fnGetCIEntry get_entry,
int width, int height, int depth )
int width, int height, int depth, UINT loadflags )
{
int i, maxwidth, maxheight, cx, cy, bits, bestEntry = -1;
@ -530,22 +530,24 @@ static BOOL CURSORICON_GetResCursorEntry( LPCVOID dir, int n,
}
static const CURSORICONDIRENTRY *CURSORICON_FindBestIconRes( const CURSORICONDIR * dir,
int width, int height, int depth )
int width, int height, int depth,
UINT loadflags )
{
int n;
n = CURSORICON_FindBestIcon( dir, CURSORICON_GetResIconEntry,
width, height, depth );
width, height, depth, loadflags );
if ( n < 0 )
return NULL;
return &dir->idEntries[n];
}
static const CURSORICONDIRENTRY *CURSORICON_FindBestCursorRes( const CURSORICONDIR *dir,
int width, int height, int depth )
int width, int height, int depth,
UINT loadflags )
{
int n = CURSORICON_FindBestCursor( dir, CURSORICON_GetResCursorEntry,
width, height, depth );
width, height, depth, loadflags );
if ( n < 0 )
return NULL;
return &dir->idEntries[n];
@ -570,20 +572,22 @@ static BOOL CURSORICON_GetFileEntry( LPCVOID dir, int n,
}
static const CURSORICONFILEDIRENTRY *CURSORICON_FindBestCursorFile( const CURSORICONFILEDIR *dir,
int width, int height, int depth )
int width, int height, int depth,
UINT loadflags )
{
int n = CURSORICON_FindBestCursor( (LPCVOID) dir, CURSORICON_GetFileEntry,
width, height, depth );
int n = CURSORICON_FindBestCursor( dir, CURSORICON_GetFileEntry,
width, height, depth, loadflags );
if ( n < 0 )
return NULL;
return &dir->idEntries[n];
}
static const CURSORICONFILEDIRENTRY *CURSORICON_FindBestIconFile( const CURSORICONFILEDIR *dir,
int width, int height, int depth )
int width, int height, int depth,
UINT loadflags )
{
int n = CURSORICON_FindBestIcon((LPCVOID) dir, CURSORICON_GetFileEntry,
width, height, depth );
int n = CURSORICON_FindBestIcon( dir, CURSORICON_GetFileEntry,
width, height, depth, loadflags );
if ( n < 0 )
return NULL;
return &dir->idEntries[n];
@ -945,7 +949,7 @@ static void riff_find_chunk( DWORD chunk_id, DWORD chunk_type, const riff_chunk_
* \- CHUNK:icon
*/
static HCURSOR CURSORICON_CreateIconFromANI( const LPBYTE bits, DWORD bits_size,
INT width, INT height, INT depth )
INT width, INT height, INT depth, UINT loadflags )
{
struct cursoricon_object *info;
ani_header header = {0};
@ -1003,7 +1007,7 @@ static HCURSOR CURSORICON_CreateIconFromANI( const LPBYTE bits, DWORD bits_size,
const BITMAPINFO *bmi;
entry = CURSORICON_FindBestIconFile((const CURSORICONFILEDIR *) icon_data,
width, height, depth );
width, height, depth, loadflags );
bmi = (const BITMAPINFO *) (icon_data + entry->dwDIBOffset);
info->hotspot.x = entry->xHotspot;
@ -1131,8 +1135,7 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
/* Check for .ani. */
if (memcmp( bits, "RIFF", 4 ) == 0)
{
hIcon = CURSORICON_CreateIconFromANI( bits, filesize, width, height,
depth );
hIcon = CURSORICON_CreateIconFromANI( bits, filesize, width, height, depth, loadflags );
goto end;
}
@ -1144,9 +1147,9 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
goto end;
if ( fCursor )
entry = CURSORICON_FindBestCursorFile( dir, width, height, depth );
entry = CURSORICON_FindBestCursorFile( dir, width, height, depth, loadflags );
else
entry = CURSORICON_FindBestIconFile( dir, width, height, depth );
entry = CURSORICON_FindBestIconFile( dir, width, height, depth, loadflags );
if ( !entry )
goto end;
@ -1207,9 +1210,9 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
if (!(handle = LoadResource( hInstance, hRsrc ))) return 0;
if (!(dir = LockResource( handle ))) return 0;
if (fCursor)
dirEntry = CURSORICON_FindBestCursorRes( dir, width, height, depth );
dirEntry = CURSORICON_FindBestCursorRes( dir, width, height, depth, loadflags );
else
dirEntry = CURSORICON_FindBestIconRes( dir, width, height, depth );
dirEntry = CURSORICON_FindBestIconRes( dir, width, height, depth, loadflags );
if (!dirEntry) return 0;
wResId = dirEntry->wResId;
FreeResource( handle );
@ -1548,9 +1551,9 @@ INT WINAPI LookupIconIdFromDirectoryEx( LPBYTE xdir, BOOL bIcon,
ReleaseDC(0, hdc);
if( bIcon )
entry = CURSORICON_FindBestIconRes( dir, width, height, depth );
entry = CURSORICON_FindBestIconRes( dir, width, height, depth, LR_DEFAULTSIZE );
else
entry = CURSORICON_FindBestCursorRes( dir, width, height, depth );
entry = CURSORICON_FindBestCursorRes( dir, width, height, depth, LR_DEFAULTSIZE );
if( entry ) retVal = entry->wResId;
}
@ -1563,9 +1566,7 @@ INT WINAPI LookupIconIdFromDirectoryEx( LPBYTE xdir, BOOL bIcon,
*/
INT WINAPI LookupIconIdFromDirectory( LPBYTE dir, BOOL bIcon )
{
return LookupIconIdFromDirectoryEx( dir, bIcon,
bIcon ? GetSystemMetrics(SM_CXICON) : GetSystemMetrics(SM_CXCURSOR),
bIcon ? GetSystemMetrics(SM_CYICON) : GetSystemMetrics(SM_CYCURSOR), bIcon ? 0 : LR_MONOCHROME );
return LookupIconIdFromDirectoryEx( dir, bIcon, 0, 0, bIcon ? 0 : LR_MONOCHROME );
}
/***********************************************************************