public unsafe static Gdk.Pixbuf ToPixbuf(this Cairo.ImageSurface surfSource) { Cairo.ImageSurface surf = surfSource.Clone(); surf.Flush(); ColorBgra *dstPtr = (ColorBgra *)surf.DataPtr; int len = surf.Data.Length / 4; for (int i = 0; i < len; i++) { if (dstPtr->A != 0) { *dstPtr = (ColorBgra.FromBgra(dstPtr->R, dstPtr->G, dstPtr->B, dstPtr->A)); } dstPtr++; } Gdk.Pixbuf pb = new Gdk.Pixbuf(surf.Data, true, 8, surf.Width, surf.Height, surf.Stride); (surf as IDisposable).Dispose(); return(pb); }
protected override bool OnExposeEvent(Gdk.EventExpose ev) { base.OnExposeEvent(ev); if (pages == null) return false; int width = (int)(report.PageWidthPoints * Scale); int height = (int)(report.PageHeightPoints * Scale); Cairo.Rectangle rep_r = new Cairo.Rectangle(1, 1, width - 1, height - 1); int widgetWidth, widgetHeight; ev.Window.GetSize(out widgetWidth, out widgetHeight); using (Context g = Gdk.CairoHelper.Create(this.GdkWindow)) using (ImageSurface rep_s = new ImageSurface(Format.Argb32, width, height)) using (Context rep_g = new Context(rep_s)) using (ImageSurface shadow_s = rep_s.Clone()) using (Context shadow_g = new Context(shadow_s)) { g.Translate(((widgetWidth - width) / 2) - rep_padding, 0); shadow_g.Pattern = new SolidPattern(new Color(0.6, 0.6, 0.6)); shadow_g.Paint(); g.SetSourceSurface(shadow_s, shadow_padding, shadow_padding); g.Paint(); rep_g.Pattern = new SolidPattern(new Color(1, 1, 1)); rep_g.Paint(); rep_g.DrawRectangle(rep_r, new Color(0.1, 0.1, 0.1), 1); using (var render = new RenderCairo(rep_g, Scale)) { render.RunPage(pages); } g.SetSourceSurface(rep_s, rep_padding, rep_padding); g.Paint(); } return true; }