private void Validate() { if (Size.Width == 0 && Size.Height == 0) { Size = new Size(256, 256); } else if (Size.Width == 0) { Size = new Size(256, Size.Height); } else if (Size.Height == 0 && ParentIcon.Type == IconType.Icon) { Size = new Size(Size.Width, 256); } if (ParentIcon.Type == IconType.Icon && ColorCount > 0 && BitCount == 0 ) // this regularly happens, so let's fix it { BitCount = (ushort)Math.Log( ColorCount, 2 ); // but it only works when ColorCount > 0 which doesn't apply to 16, 24, and 32-bit icons } if (BitCount == 0) { // get it from the ImageData, which is painful // IconPro does it in AdjustIconImagePointers // it casts the raw image data as BMP then reads in the DIB headers // but this wouldn't work for PNG-format icons // so check for the PNG header first if (PngImageResourceData.HasPngSignature(ImageData)) { BitCount = 32; // I know you can get non-32-bit PNGs, but meh } else { var dib = new Dib(ImageData); BitCount = (ushort)dib.BitCount; } } Description = string.Format( CultureInfo.InvariantCulture, "{0}x{1} {2}-bit", Size.Width, Size.Height, BitCount ); }
/// <summary>Tests the ResourceData type as specified by the hint. If it works it returns a ResourceData. If it fails it returns null.</summary> private static ResourceData Heuristic(ResourceLang lang, ResourceHint hint, Byte[] rawData) { // try the hint's suggestion, if it doesn't fall-back on the tried 'n' true brute-force approach ResourceData rd; switch (hint) { #region Image case ResourceHint.Bitmap: if (BmpImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Gif: if (GifImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Jpeg: if (JpegImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.Png: if (PngImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; #endregion #region Directory case ResourceHint.CursorDirectory: if (CursorDirectoryResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; case ResourceHint.IconDirectory: if (IconDirectoryResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; #endregion // experiment: case ResourceHint.IconImage: if (IconImageResourceData.TryCreate(lang, rawData, out rd)) { return(rd); } break; /* case Win32ResourceType.CursorImage: * case Win32ResourceType.IconImage: * * retval = new IconCursorImageResourceData(lang, rawData); * break; * * // case Win32ResourceType.CursorAnimated: // I have zero documentation on these 'animated' types * // case Win32ResourceType.IconAnimated: * case Win32ResourceType.CursorDirectory: * case Win32ResourceType.IconDirectory: * * retval = new IconCursorDirectoryResourceData(lang, rawData); * break; * * case Win32ResourceType.Manifest: * * retval = new XmlHtmlResourceData(lang, rawData); * break; * * case Win32ResourceType.Version: * * retval = new VersionResourceData(lang, rawData); * break; */ } return(null); }