From: Indrek Altpere Subject: [2/2] winemenubuilder: ignore icons in unsupported PNG format Message-Id: Date: Thu, 28 Aug 2014 19:09:48 +0300 While fixing https://bugs.winehq.org/show_bug.cgi?id=19241 I saw that winemenubuilder does not handle/ignore png icon entries currently. As per MSDN blog, icon resources can contain raw PNG information instead of regular BITMAPINFO, but due to weird decisions, only way to differentiate between them is to check if the resource starts with PNG header bytes. http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx Made the winemenubuilder ignore such entries for now (with fixme notices), since using PNG raw bytes as BITMAPINFO data is definitely invalid and is due to cause other issues/crashes when the best matching size icon happens to be PNG. A new bug should be opened for the missing PNG support. Regards, Indrek diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c index 7a75d10..09402af 100644 --- a/programs/winemenubuilder/winemenubuilder.c +++ b/programs/winemenubuilder/winemenubuilder.c @@ -601,6 +601,7 @@ static int populate_module_icons(HMODULE hModule, GRPICONDIR *grpIconDir, ICONDI { int i; int validEntries = 0; + static const BYTE png_header[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; for (i = 0; i < grpIconDir->idCount; i++) { @@ -621,6 +622,12 @@ static int populate_module_icons(HMODULE hModule, GRPICONDIR *grpIconDir, ICONDI } if ((pIcon = LockResource(hResData))) { + BOOL isPNG = iconBytes >= sizeof(png_header) && memcmp(pIcon, png_header, sizeof(png_header)) == 0; + if (isPNG) + { + WINE_FIXME("PNG icon not supported\n"); + continue; + } iconDirEntries[validEntries].bWidth = grpIconDir->idEntries[i].bWidth; iconDirEntries[validEntries].bHeight = grpIconDir->idEntries[i].bHeight; iconDirEntries[validEntries].bColorCount = grpIconDir->idEntries[i].bColorCount;