static void draw(Cairo.Context gr, int width, int height) { int w, h; ImageSurface image; gr.Scale(width, height); gr.LineWidth = 0.04; gr.Arc(0.5, 0.5, 0.3, 0, 2 * M_PI); gr.Clip(); gr.NewPath(); image = new ImageSurface("data/e.png"); w = image.Width; h = image.Height; gr.Scale(1.0 / w, 1.0 / h); image.Show(gr, 0, 0); image.Destroy(); gr.Arc(0.5, 0.5, 0.3, 0, 2 * M_PI); gr.Clip(); gr.NewPath(); gr.Rectangle(new PointD(0, 0), 1, 1); gr.Fill(); gr.Color = new Color(0, 1, 0, 1); gr.MoveTo(new PointD(0, 0)); gr.LineTo(new PointD(1, 1)); gr.MoveTo(new PointD(1, 0)); gr.LineTo(new PointD(0, 1)); gr.Stroke(); }
private ImageInfo CreateBlur(ImageInfo source) { double scale = Math.Max(256 / (double)source.Bounds.Width, 256 / (double)source.Bounds.Height); Gdk.Rectangle small = new Gdk.Rectangle(0, 0, (int)Math.Ceiling(source.Bounds.Width * scale), (int)Math.Ceiling(source.Bounds.Height * scale)); ImageSurface image = new ImageSurface(Format.Argb32, small.Width, small.Height); Context ctx = new Context(image); ctx.Matrix = source.Fit(small); ctx.Operator = Operator.Source; Pattern p = new SurfacePattern(source.Surface); ctx.Source = p; ctx.Paint(); p.Destroy(); ((IDisposable)ctx).Dispose(); Gdk.Pixbuf normal = image.ToPixbuf(); Gdk.Pixbuf blur = PixbufUtils.Blur(normal, 3, null); ImageInfo overlay = new ImageInfo(blur); blur.Dispose(); normal.Dispose(); image.Destroy(); return(overlay); }
public void imagepattern(Context cr, int width, int height) { Normalize(cr, width, height); ImageSurface image = new ImageSurface("data/romedalen.png"); int w = image.Width; int h = image.Height; SurfacePattern pattern = new SurfacePattern(image); pattern.Extend = Extend.Repeat; cr.Translate(0.5, 0.5); cr.Rotate(Math.PI / 4); cr.Scale(1 / Math.Sqrt(2), 1 / Math.Sqrt(2)); cr.Translate(-0.5, -0.5); Matrix matrix = new Matrix(); matrix.InitScale(w * 5.0, h * 5.0); pattern.Matrix = matrix; cr.Source = pattern; cr.Rectangle(0, 0, 1.0, 1.0); cr.Fill(); pattern.Destroy(); image.Destroy(); }
private Pattern RenderBar(int w, int h) { ImageSurface s = new ImageSurface(Format.Argb32, w, h); Context cr = new Context(s); RenderBar(cr, w, h, h / 2); // TODO Implement the new ctor - see http://bugzilla.gnome.org/show_bug.cgi?id=561394 #pragma warning disable 0618 Pattern pattern = new Pattern(s); #pragma warning restore 0618 s.Destroy(); ((IDisposable)cr).Dispose(); return(pattern); }
public void image(Context cr, int width, int height) { Normalize(cr, width, height); ImageSurface image = new ImageSurface("data/romedalen.png"); int w = image.Width; int h = image.Height; cr.Translate(0.5, 0.5); cr.Rotate(45 * Math.PI / 180); cr.Scale(1.0 / w, 1.0 / h); cr.Translate(-0.5 * w, -0.5 * h); cr.SetSourceSurface(image, 0, 0); cr.Paint(); image.Destroy(); }
public void clip_image(Context cr, int width, int height) { Normalize(cr, width, height); cr.Arc(0.5, 0.5, 0.3, 0, 2 * Math.PI); cr.Clip(); cr.NewPath(); // path not consumed by clip() ImageSurface image = new ImageSurface("data/romedalen.png"); int w = image.Width; int h = image.Height; cr.Scale(1.0 / w, 1.0 / h); cr.SetSourceSurface(image, 0, 0); cr.Paint(); image.Destroy(); }
static void draw(Cairo.Context gr, int width, int height) { int w, h; ImageSurface image; gr.Scale(width, height); gr.LineWidth = 0.04; image = new ImageSurface("data/e.png"); w = image.Width; h = image.Height; gr.Translate(0.5, 0.5); gr.Rotate(45 * M_PI / 180); gr.Scale(1.0 / w, 1.0 / h); gr.Translate(-0.5 * w, -0.5 * h); image.Show(gr, 0, 0); image.Destroy(); }
static void draw(Cairo.Context gr, int width, int height) { int w, h; ImageSurface image; Matrix matrix; SurfacePattern pattern; gr.Scale(width, height); gr.LineWidth = 0.04; image = new ImageSurface("data/e.png"); w = image.Width; h = image.Height; pattern = new SurfacePattern(image); pattern.Extend = Cairo.Extend.Repeat; gr.Translate(0.5, 0.5); gr.Rotate(M_PI / 4); gr.Scale(1 / Math.Sqrt(2), 1 / Math.Sqrt(2)); gr.Translate(-0.5, -0.5); matrix = new Matrix(); matrix.InitScale(w * 5.0, h * 5.0); pattern.Matrix = matrix; gr.Pattern = pattern; gr.Rectangle(new PointD(0, 0), 1.0, 1.0); gr.Fill(); pattern.Destroy(); image.Destroy(); }
public unsafe static void GaussianBlur(this DockySurface self, int size) { // Note: This method is wickedly slow int gaussWidth = size * 2 + 1; double[] kernel = BuildGaussianKernel(gaussWidth); ImageSurface original = new ImageSurface(Format.Argb32, self.Width, self.Height); using (Cairo.Context cr = new Cairo.Context(original)) self.Internal.Show(cr, 0, 0); double gaussSum = 0; foreach (double d in kernel) { gaussSum += d; } for (int i = 0; i < kernel.Length; i++) { kernel[i] = kernel[i] / gaussSum; } int width = self.Width; int height = self.Height; byte[] src = original.Data; double[] xbuffer = new double[original.Data.Length]; double[] ybuffer = new double[original.Data.Length]; int dest, dest2, shift, source; byte *srcPtr = (byte *)original.DataPtr; fixed(double *xbufferPtr = xbuffer) fixed(double *ybufferPtr = ybuffer) fixed(double *kernelPtr = kernel) { // Horizontal Pass for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { dest = y * width + x; dest2 = dest * 4; for (int k = 0; k < gaussWidth; k++) { shift = k - size; source = dest + shift; if (x + shift <= 0 || x + shift >= width) { source = dest; } source = source * 4; xbufferPtr[dest2 + 0] = xbufferPtr[dest2 + 0] + (srcPtr[source + 0] * kernelPtr[k]); xbufferPtr[dest2 + 1] = xbufferPtr[dest2 + 1] + (srcPtr[source + 1] * kernelPtr[k]); xbufferPtr[dest2 + 2] = xbufferPtr[dest2 + 2] + (srcPtr[source + 2] * kernelPtr[k]); xbufferPtr[dest2 + 3] = xbufferPtr[dest2 + 3] + (srcPtr[source + 3] * kernelPtr[k]); } } } // Vertical Pass for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { dest = y * width + x; dest2 = dest * 4; for (int k = 0; k < gaussWidth; k++) { shift = k - size; source = dest + shift * width; if (y + shift <= 0 || y + shift >= height) { source = dest; } source = source * 4; ybufferPtr[dest2 + 0] = ybufferPtr[dest2 + 0] + (xbufferPtr[source + 0] * kernelPtr[k]); ybufferPtr[dest2 + 1] = ybufferPtr[dest2 + 1] + (xbufferPtr[source + 1] * kernelPtr[k]); ybufferPtr[dest2 + 2] = ybufferPtr[dest2 + 2] + (xbufferPtr[source + 2] * kernelPtr[k]); ybufferPtr[dest2 + 3] = ybufferPtr[dest2 + 3] + (xbufferPtr[source + 3] * kernelPtr[k]); } } } for (int i = 0; i < src.Length; i++) { srcPtr[i] = (byte)ybufferPtr[i]; } } self.Context.Operator = Operator.Source; self.Context.SetSource(original); self.Context.Paint(); (original as IDisposable).Dispose(); original.Destroy(); }
/// <summary> /// The average color of the pixels in the current represenation of the item, /// weighted for saturation and opacity. /// </summary> /// <returns> /// A <see cref="Cairo.Color"/> /// </returns> public Cairo.Color AverageColor() { if (icon_buffers [0] == null) { return(new Cairo.Color(1, 1, 1, 1)); } if (average_color.HasValue) { return(average_color.Value); } ImageSurface sr = new ImageSurface(Format.ARGB32, icon_buffers [0].Width, icon_buffers [0].Height); using (Context cr = new Context(sr)) { cr.Operator = Operator.Source; icon_buffers [0].Internal.Show(cr, 0, 0); } sr.Flush(); byte [] data; try { data = sr.Data; } catch { return(new Cairo.Color(1, 1, 1, 1)); } byte r, g, b; double rTotal = 0; double gTotal = 0; double bTotal = 0; unsafe { fixed(byte *dataSrc = data) { byte *dataPtr = dataSrc; for (int i = 0; i < data.Length - 3; i += 4) { b = dataPtr [0]; g = dataPtr [1]; r = dataPtr [2]; byte max = Math.Max(r, Math.Max(g, b)); byte min = Math.Min(r, Math.Min(g, b)); double delta = max - min; double sat; if (delta == 0) { sat = 0; } else { sat = delta / max; } double score = .2 + .8 * sat; rTotal += r * score; gTotal += g * score; bTotal += b * score; dataPtr += 4; } } } double pixelCount = icon_buffers [0].Width * icon_buffers [0].Height * byte.MaxValue; // FIXME: once we use mono 2.6.3+ we can do sr.Dispose () (sr as IDisposable).Dispose(); sr.Destroy(); average_color = new Cairo.Color(rTotal / pixelCount, gTotal / pixelCount, bTotal / pixelCount) .SetValue(.8) .MultiplySaturation(1.15); return(average_color.Value); }