Exemple #1
0
 public static Gdk.Pixbuf FadeIcon(Gdk.Pixbuf source)
 {
     Gdk.Pixbuf result = source.Copy ();
     result.Fill (0);
     result = result.AddAlpha (true, 0, 0, 0);
     source.Composite (result, 0, 0, source.Width, source.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, 128);
     return result;
 }
Exemple #2
0
 public static Gdk.Pixbuf AddIconOverlay(Gdk.Pixbuf target, Gdk.Pixbuf overlay)
 {
     Gdk.Pixbuf res = new Gdk.Pixbuf (target.Colorspace, target.HasAlpha, target.BitsPerSample, target.Width, target.Height);
     res.Fill (0);
     target.CopyArea (0, 0, target.Width, target.Height, res, 0, 0);
     overlay.Composite (res, 0, 0, overlay.Width, overlay.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, 255);
     return res;
 }
		void AddOverlay (ref Gdk.Pixbuf icon, Gdk.Pixbuf overlay)
		{
			Gdk.Pixbuf cached = Context.GetComposedIcon (icon, overlay);
			if (cached != null) {
				icon = cached;
				return;
			}
			
			int dx = 2;
			int dy = 2;
			
			Gdk.Pixbuf res = new Gdk.Pixbuf (icon.Colorspace, icon.HasAlpha, icon.BitsPerSample, icon.Width + dx, icon.Height + dy);
			res.Fill (0);
			icon.CopyArea (0, 0, icon.Width, icon.Height, res, 0, 0);
			
			overlay.Composite (res,
				res.Width - overlay.Width,  res.Height - overlay.Height,
				overlay.Width, overlay.Height,
				res.Width - overlay.Width,  res.Height - overlay.Height,
				1, 1, Gdk.InterpType.Bilinear, 255); 
			
			Context.CacheComposedIcon (icon, overlay, res);
			icon = res;
		}
		//caller should check null and that sizes match
		static Gdk.Pixbuf MergeIcons (Gdk.Pixbuf icon1, Gdk.Pixbuf icon2)
		{
			Gdk.Pixbuf res = new Gdk.Pixbuf (icon1.Colorspace, icon1.HasAlpha, icon1.BitsPerSample, icon1.Width, icon1.Height);
			res.Fill (0);
			icon1.CopyArea (0, 0, icon1.Width, icon1.Height, res, 0, 0);
			icon2.Composite (res, 0, 0, icon2.Width, icon2.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, 255);
			return res;
		}
		public static Gdk.Pixbuf MakeTransparent (Gdk.Pixbuf icon, double opacity)
		{
			Gdk.Pixbuf result = icon.Copy ();
			result.Fill (0);
			result = result.AddAlpha (true, 0, 0, 0);
			icon.Composite (result, 0, 0, icon.Width, icon.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, (int)(256 * opacity));
			return result;
		}
	public static Gdk.Pixbuf ScaleToAspect (Gdk.Pixbuf orig, int width, int height)
	{
		Gdk.Rectangle pos;
		double scale = Fit (orig, width, height, false, out pos.Width, out pos.Height);
		pos.X = (width - pos.Width) / 2;
		pos.Y = (height - pos.Height) / 2;

		Pixbuf scaled = new Pixbuf (Colorspace.Rgb, false, 8, width, height);
		scaled.Fill (0x000000); 

		orig.Composite (scaled, pos.X, pos.Y, 
				pos.Width, pos.Height,
				pos.X, pos.Y, scale, scale,
				Gdk.InterpType.Bilinear,
				255);

		return scaled;
	}
 public static Gdk.Pixbuf CreateEmblemedPixbuf(Gdk.Pixbuf icon, Gdk.Pixbuf emblem)
 {
     if (icon == null || emblem == null) return null;
        if (icon.Width <= emblem.Width || icon.Height <= emblem.Height) return null;
        Gdk.Pixbuf dest = new Gdk.Pixbuf(icon.Colorspace, true, icon.BitsPerSample, icon.Width, icon.Height);
        dest.Fill(0x00000000);
        try
        {
     icon.Composite(dest,
     0,
     0,
     dest.Width,
     dest.Height,
     0,
     0,
     1.0,
     1.0,
     Gdk.InterpType.Bilinear,
     255);
     emblem.Composite(dest,
     icon.Width - emblem.Width - 1,
     icon.Height - emblem.Height - 1,
     emblem.Width,
     emblem.Height,
     icon.Width - emblem.Width - 1,
     icon.Height - emblem.Height - 1,
     1.0,
     1.0,
     Gdk.InterpType.Bilinear,
     255);
        }
        catch(Exception e)
        {
     dest = null;
        }
        return dest;
 }
 public Gdk.Pixbuf MakeTransparent(Gdk.Pixbuf icon, double opacity)
 {
     // If somebody knows a better way of doing this, please redo.
     Gdk.Pixbuf gicon = icon.Copy ();
     gicon.Fill (0);
     gicon = gicon.AddAlpha (true,0,0,0);
     icon.Composite (gicon, 0, 0, icon.Width, icon.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, (int)(256 * opacity));
     return gicon;
 }
		Gdk.Pixbuf ExpandImageVertically (Gdk.Pixbuf img, int newHeight)
		{
			if (newHeight <= img.Height)
				return img.Copy ();
			var res = new Gdk.Pixbuf (img.Colorspace, img.HasAlpha, img.BitsPerSample, img.Width, newHeight);
			var h1 = img.Height / 2;
			var h2 = img.Height - h1;
			res.Fill (0xff000000);
			img.Composite (res, 0, h1, res.Width, newHeight - img.Height, 0, 0, 1, (double)newHeight / (double)img.Height, InterpType.Bilinear, 255);
			img.Composite (res, 0, 0, img.Width, h1, 0, 0, 1, 1, InterpType.Bilinear, 255);
			img.Composite (res, 0, newHeight - h2, img.Width, h2, 0, newHeight - img.Height, 1, 1, InterpType.Bilinear, 255);
			return res;
		}
		//caller should check that sizes match
		public static Gdk.Pixbuf MergeIcons (Gdk.Pixbuf icon1, Gdk.Pixbuf icon2)
		{
			if (icon2 == null)
				return icon1;
			if (icon1 == null)
				return icon2;

			Gdk.Pixbuf res = new Gdk.Pixbuf (icon1.Colorspace, icon1.HasAlpha, icon1.BitsPerSample, icon1.Width, icon1.Height);
			res.Fill (0);
			icon1.CopyArea (0, 0, icon1.Width, icon1.Height, res, 0, 0);
			icon2.Composite (res, 0, 0, icon2.Width, icon2.Height, 0, 0, 1, 1, Gdk.InterpType.Bilinear, 255);

			var icon1_2x = Get2xIconVariant (icon1);
			var icon2_2x = Get2xIconVariant (icon2);

			if (icon1_2x != null || icon2_2x != null) {
				if (icon1_2x == null)
					icon1_2x = ScaleIcon (icon1, icon1.Width * 2, icon1.Height * 2);
				if (icon2_2x == null)
					icon2_2x = ScaleIcon (icon2, icon2.Width * 2, icon2.Height * 2);
				var res2x = MergeIcons (icon1_2x, icon2_2x);
				Set2xIconVariant (res, res2x);
			}

			return res;
		}