From 971a66e912ab5d1ee6255cbff9a29cacb5a62c7d Mon Sep 17 00:00:00 2001 From: Daniel Jelinski Date: Sun, 6 May 2012 21:35:57 +0200 Subject: [PATCH] oleaut32: Added support for loading cursors in OLEPicture. --- dlls/oleaut32/olepicture.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index 2195ba58152..348529eba02 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -1228,16 +1228,34 @@ static HRESULT OLEPictureImpl_LoadIcon(OLEPictureImpl *This, BYTE *xbuf, ULONG x } if (i==cifd->idCount) i=0; } - - hicon = CreateIconFromResourceEx( - xbuf+cifd->idEntries[i].dwDIBOffset, - cifd->idEntries[i].dwDIBSize, - TRUE, /* is icon */ - 0x00030000, - cifd->idEntries[i].bWidth, - cifd->idEntries[i].bHeight, - 0 - ); + if (cifd->idType == 2) + { + LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, cifd->idEntries[i].dwDIBSize + 4); + memcpy(buf, &cifd->idEntries[i].xHotspot, 4); + memcpy(buf + 4, xbuf+cifd->idEntries[i].dwDIBOffset, cifd->idEntries[i].dwDIBSize); + hicon = CreateIconFromResourceEx( + buf, + cifd->idEntries[i].dwDIBSize + 4, + FALSE, /* is cursor */ + 0x00030000, + cifd->idEntries[i].bWidth, + cifd->idEntries[i].bHeight, + 0 + ); + HeapFree(GetProcessHeap(), 0, buf); + } + else + { + hicon = CreateIconFromResourceEx( + xbuf+cifd->idEntries[i].dwDIBOffset, + cifd->idEntries[i].dwDIBSize, + TRUE, /* is icon */ + 0x00030000, + cifd->idEntries[i].bWidth, + cifd->idEntries[i].bHeight, + 0 + ); + } if (!hicon) { ERR("CreateIcon failed.\n"); return E_FAIL; @@ -1322,7 +1340,7 @@ static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This, * DWORD magic; * DWORD len; * - * Currently implemented: BITMAP, ICON, JPEG, GIF, WMF, EMF + * Currently implemented: BITMAP, ICON, CURSOR, JPEG, GIF, WMF, EMF */ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface, IStream *pStm) { HRESULT hr; @@ -1477,7 +1495,7 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface, IStream *pStm) case BITMAP_FORMAT_APM: /* APM */ hr = OLEPictureImpl_LoadAPM(This, xbuf, xread); break; - case 0x0000: { /* ICON , first word is dwReserved */ + case 0x0000: { /* ICON or CURSOR, first word is dwReserved */ hr = OLEPictureImpl_LoadIcon(This, xbuf, xread); break; } -- 2.11.4.GIT