HBITMAP hbmOldSrc;
ICONINFO ii;
BITMAP bmp;
+ BOOL ret;
TRACE("(%p %d %p)\n", himl, i, hIcon);
- if (!is_valid(himl))
- return -1;
- if ((i >= himl->cMaxImage) || (i < -1))
- return -1;
+ if (!is_valid(himl)) {
+ ERR("invalid image list\n");
+ return -1;
+ }
+ if ((i >= himl->cMaxImage) || (i < -1)) {
+ ERR("invalid image index %d / %d\n", i, himl->cMaxImage);
+ return -1;
+ }
hBestFitIcon = CopyImage(
hIcon, IMAGE_ICON,
himl->cx, himl->cy,
LR_COPYFROMRESOURCE);
+ /* the above will fail if the icon wasn't loaded from a resource, so try
+ * again without LR_COPYFROMRESOURCE flag */
+ if (!hBestFitIcon)
+ hBestFitIcon = CopyImage(
+ hIcon, IMAGE_ICON,
+ himl->cx, himl->cy,
+ 0);
+ if (!hBestFitIcon)
+ return -1;
+
+ ret = GetIconInfo (hBestFitIcon, &ii);
+ if (!ret) {
+ DestroyIcon(hBestFitIcon);
+ return -1;
+ }
- GetIconInfo (hBestFitIcon, &ii);
- if (ii.hbmMask == 0)
- ERR("no mask!\n");
if (ii.hbmColor == 0)
ERR("no color!\n");
- GetObjectA (ii.hbmMask, sizeof(BITMAP), (LPVOID)&bmp);
+ ret = GetObjectW (ii.hbmMask, sizeof(BITMAP), (LPVOID)&bmp);
+ if (!ret) {
+ ERR("couldn't get mask bitmap info\n");
+ if (ii.hbmColor)
+ DeleteObject (ii.hbmColor);
+ if (ii.hbmMask)
+ DeleteObject (ii.hbmMask);
+ DestroyIcon(hBestFitIcon);
+ return -1;
+ }
if (i == -1) {
if (himl->cCurImage + 1 > himl->cMaxImage)
SelectObject (hdcImage, hbmOldSrc);
- if(hBestFitIcon)
- DestroyIcon(hBestFitIcon);
+ DestroyIcon(hBestFitIcon);
if (hdcImage)
DeleteDC (hdcImage);
if (ii.hbmColor)