static void GetResources(string resourceName, Assembly assembly, List <IconFrame> frames) { var info = assembly.GetManifestResourceInfo(resourceName); if (info != null) { frames.Add(IconFrame.FromResource(1f, resourceName, assembly)); } // no extension? don't look for others var extensionIndex = resourceName.LastIndexOf('.'); if (extensionIndex < 0) { return; } // .ico files already have multiple resolutions var extension = resourceName.Substring(extensionIndex); if (extension.Equals(".ico", StringComparison.OrdinalIgnoreCase)) { return; } var resourceWithoutExtension = resourceName.Substring(0, extensionIndex); var nameWithAt = resourceWithoutExtension + "@"; foreach (var entryName in assembly.GetManifestResourceNames() .Where(r => r.StartsWith(nameWithAt, StringComparison.Ordinal)) .OrderByDescending(r => r)) { // must be same extension, if one is supplied with the resourceName if (extension != null && !entryName.EndsWith(extension, StringComparison.Ordinal)) { continue; } // get the scale, if supplied extensionIndex = entryName.LastIndexOf('.'); if (extensionIndex < 0) { extensionIndex = entryName.Length; } // parse out scale, e.g. @2x, @0.5x var scaleString = entryName.Substring(nameWithAt.Length, extensionIndex - nameWithAt.Length); float scale; if (!scaleString.EndsWith("x", StringComparison.Ordinal) || !float.TryParse(scaleString.TrimEnd('x'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out scale)) { continue; } frames.Add(IconFrame.FromResource(scale, entryName, assembly)); } }
/// <summary> /// find based on scale alone, we don't know the final render size /// </summary> IconFrame FindByScale(float scale) { IconFrame selected = null; float scaleDiff = 0; float lastScale = 0; foreach (var frame in Frames.OrderBy(r => r.Scale).ThenByDescending(r => r.Size.Width * r.Size.Height)) { var ps = Size.Ceiling((SizeF)Size * scale); var pixelSizeNeeded = ps.Width * ps.Height; var diff = scale - frame.Scale; if (selected == null || (diff < scaleDiff && (diff >= 0 || scaleDiff > 0))) { // found where scale is the next greater or equal to desired scale scaleDiff = diff; lastScale = frame.Scale; selected = frame; } else if (lastScale == frame.Scale) { // multiple resolutions with the same scale, use the one with the best pixel size // (e.g. ico file with multiple resolutions) ps = frame.PixelSize; if (ps.Width * ps.Height >= pixelSizeNeeded) { selected = frame; scaleDiff = diff; lastScale = frame.Scale; } else { break; } } else { break; } } if (selected == null) { // get largest selected = Frames.OrderBy(r => r.PixelSize.Width * r.PixelSize.Height).Last(); } return(selected); }
public Bitmap GetBitmap(IconFrame frame) { return new Bitmap(new BitmapHandler(((sd.Icon)frame.ControlObject).ToBitmap())); }
public Size GetPixelSize(IconFrame frame) { return ((sd.Icon)frame.ControlObject).Size.ToEto(); }
public object Create(IconFrame frame, Func<Stream> load) { return sd.Icon.FromHandle(new sd.Bitmap(load()).GetHicon()); }
public object Create(IconFrame frame, Stream stream) { return new sd.Icon(stream); }
public Size GetPixelSize(IconFrame frame) { return GetBitmap(frame).Size; }
public object Create(IconFrame frame, Bitmap bitmap) { return sd.Icon.FromHandle(((sd.Bitmap)bitmap.ToSD()).GetHicon()); }
public Bitmap GetBitmap(IconFrame frame) { return (Bitmap)frame.ControlObject; }
public object Create(IconFrame frame, Stream stream) { return new Bitmap(stream); }
public object Create(IconFrame frame, Func<Stream> load) { return new Bitmap(load()); }
public object Create(IconFrame frame, Bitmap bitmap) { return bitmap; }
public object Create(IconFrame frame, Func<Stream> load) { var img = new NSImage(); img.AddRepresentation(new LazyImageRep { Load = load }); return new Bitmap(new BitmapHandler(img)); }