/// TODO: CairoExtensions.CachedDraw seems not to work correctly for me. public static void CachedDraw(Cairo.Context self, ref SurfaceWrapper surface, Gdk.Rectangle region, object parameters = null, float opacity = 1.0f, Action <Cairo.Context, float> draw = null, double?forceScale = null) { double displayScale = forceScale.HasValue ? forceScale.Value : QuartzSurface.GetRetinaScale(self); int targetWidth = (int)(region.Width * displayScale); int targetHeight = (int)(region.Height * displayScale); bool redraw = false; if (surface == null || surface.Width != targetWidth || surface.Height != targetHeight) { if (surface != null) { surface.Dispose(); } surface = new SurfaceWrapper(self, targetWidth, targetHeight); redraw = true; } else if ((surface.Data == null && parameters != null) || (surface.Data != null && !surface.Data.Equals(parameters))) { redraw = true; } if (redraw) { surface.Data = parameters; using (var context = new Cairo.Context(surface.Surface)) { draw(context, 1.0f); } } self.SetSourceSurface(surface.Surface, 0, 0); self.Paint(); }
void UpdateScale() { if (MonoDevelop.Core.Platform.IsMac) { using (var similar = Gdk.CairoHelper.Create(owner.GdkWindow)) { Scale = QuartzSurface.GetRetinaScale(similar); } } else { Scale = 1; } }