mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 09:36:33 +00:00
[USER32]
- Implement CopyImage(LR_SHARED) case. CORE-7575 svn path=/trunk/; revision=64919
This commit is contained in:
parent
796aebbf35
commit
f20e2e7a8f
1 changed files with 36 additions and 13 deletions
|
@ -1684,8 +1684,9 @@ CURSORICON_CopyImage(
|
|||
{
|
||||
HICON ret = NULL;
|
||||
ICONINFO ii;
|
||||
CURSORDATA CursorData;
|
||||
|
||||
if(fuFlags & LR_COPYFROMRESOURCE)
|
||||
if (fuFlags & LR_COPYFROMRESOURCE)
|
||||
{
|
||||
/* Get the icon module/resource names */
|
||||
UNICODE_STRING ustrModule;
|
||||
|
@ -1697,14 +1698,14 @@ CURSORICON_CopyImage(
|
|||
ustrRsrc.MaximumLength = 256;
|
||||
|
||||
ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, ustrModule.MaximumLength);
|
||||
if(!ustrModule.Buffer)
|
||||
if (!ustrModule.Buffer)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return NULL;
|
||||
}
|
||||
/* Keep track of the buffer for the resource, NtUserGetIconInfo might overwrite it */
|
||||
pvBuf = HeapAlloc(GetProcessHeap(), 0, ustrRsrc.MaximumLength);
|
||||
if(!pvBuf)
|
||||
if (!pvBuf)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
|
@ -1745,7 +1746,7 @@ CURSORICON_CopyImage(
|
|||
{
|
||||
ustrRsrc.MaximumLength *= 2;
|
||||
pvBuf = HeapReAlloc(GetProcessHeap(), 0, ustrRsrc.Buffer, ustrRsrc.MaximumLength);
|
||||
if(!pvBuf)
|
||||
if (!pvBuf)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
goto leave;
|
||||
|
@ -1756,11 +1757,11 @@ CURSORICON_CopyImage(
|
|||
|
||||
/* NULL-terminate our strings */
|
||||
ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = 0;
|
||||
if(!IS_INTRESOURCE(ustrRsrc.Buffer))
|
||||
if (!IS_INTRESOURCE(ustrRsrc.Buffer))
|
||||
ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = 0;
|
||||
|
||||
/* Get the module handle */
|
||||
if(!GetModuleHandleExW(0, ustrModule.Buffer, &hModule))
|
||||
if (!GetModuleHandleExW(0, ustrModule.Buffer, &hModule))
|
||||
{
|
||||
/* This should never happen */
|
||||
ERR("Invalid handle?.\n");
|
||||
|
@ -1769,7 +1770,13 @@ CURSORICON_CopyImage(
|
|||
}
|
||||
|
||||
/* Call the relevant function */
|
||||
ret = CURSORICON_LoadImageW(hModule, ustrRsrc.Buffer, cxDesired, cyDesired, fuFlags & LR_DEFAULTSIZE, bIcon);
|
||||
ret = CURSORICON_LoadImageW(
|
||||
hModule,
|
||||
ustrRsrc.Buffer,
|
||||
cxDesired,
|
||||
cyDesired,
|
||||
fuFlags & (LR_DEFAULTSIZE | LR_SHARED),
|
||||
bIcon);
|
||||
|
||||
FreeLibrary(hModule);
|
||||
|
||||
|
@ -1784,21 +1791,37 @@ CURSORICON_CopyImage(
|
|||
}
|
||||
|
||||
/* This is a regular copy */
|
||||
if(fuFlags & ~LR_COPYDELETEORG)
|
||||
if (fuFlags & ~(LR_COPYDELETEORG | LR_SHARED))
|
||||
FIXME("Unimplemented flags: 0x%08x\n", fuFlags);
|
||||
|
||||
if(!GetIconInfo(hicon, &ii))
|
||||
if (!GetIconInfo(hicon, &ii))
|
||||
{
|
||||
ERR("GetIconInfo failed.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This is CreateIconIndirect with the LR_SHARED coat added */
|
||||
if (!CURSORICON_GetCursorDataFromIconInfo(&CursorData, &ii))
|
||||
goto Leave;
|
||||
|
||||
if (fuFlags & LR_SHARED)
|
||||
CursorData.CURSORF_flags |= CURSORF_LRSHARED;
|
||||
|
||||
ret = NtUserxCreateEmptyCurObject(FALSE);
|
||||
if (!ret)
|
||||
goto Leave;
|
||||
|
||||
if (!NtUserSetCursorIconData(ret, NULL, NULL, &CursorData))
|
||||
{
|
||||
NtUserDestroyCursor(ret, TRUE);
|
||||
goto Leave;
|
||||
}
|
||||
|
||||
ret = CreateIconIndirect(&ii);
|
||||
|
||||
Leave:
|
||||
DeleteObject(ii.hbmMask);
|
||||
if(ii.hbmColor) DeleteObject(ii.hbmColor);
|
||||
if (ii.hbmColor) DeleteObject(ii.hbmColor);
|
||||
|
||||
if(ret && (fuFlags & LR_COPYDELETEORG))
|
||||
if (ret && (fuFlags & LR_COPYDELETEORG))
|
||||
DestroyIcon(hicon);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue