Наследование: IControlObjectSource, IHandlerSource
Пример #1
0
        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));
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
		public Bitmap GetBitmap(IconFrame frame)
		{
			return new Bitmap(new BitmapHandler(((sd.Icon)frame.ControlObject).ToBitmap()));
		}
Пример #4
0
		public Size GetPixelSize(IconFrame frame)
		{
			return ((sd.Icon)frame.ControlObject).Size.ToEto();
		}
Пример #5
0
		public object Create(IconFrame frame, Func<Stream> load)
		{
			return sd.Icon.FromHandle(new sd.Bitmap(load()).GetHicon());
		}
Пример #6
0
		public object Create(IconFrame frame, Stream stream)
		{
			return new sd.Icon(stream);
		}
Пример #7
0
		public Size GetPixelSize(IconFrame frame)
		{
			return GetBitmap(frame).Size;
		}
Пример #8
0
		public object Create(IconFrame frame, Bitmap bitmap)
		{
			return sd.Icon.FromHandle(((sd.Bitmap)bitmap.ToSD()).GetHicon());
		}
Пример #9
0
		public Bitmap GetBitmap(IconFrame frame)
		{
			return (Bitmap)frame.ControlObject;
		}
Пример #10
0
		public object Create(IconFrame frame, Stream stream)
		{
			return new Bitmap(stream);
		}
Пример #11
0
		public object Create(IconFrame frame, Func<Stream> load)
		{
			return new Bitmap(load());
		}
Пример #12
0
		public object Create(IconFrame frame, Bitmap bitmap)
		{
			return bitmap;
		}
Пример #13
0
		public object Create(IconFrame frame, Func<Stream> load)
		{
			var img = new NSImage();
			img.AddRepresentation(new LazyImageRep { Load = load });
			return new Bitmap(new BitmapHandler(img));
		}