private void RenderGradient(Surface surface, PdnRegion clipRegion, CompositingMode compositingMode, PointF startPointF, ColorBgra startColor, PointF endPointF, ColorBgra endColor) { GradientRenderer gr = AppEnvironment.GradientInfo.CreateGradientRenderer(); gr.StartColor = startColor; gr.EndColor = endColor; gr.StartPoint = startPointF; gr.EndPoint = endPointF; gr.AlphaBlending = (compositingMode == CompositingMode.SourceOver); gr.BeforeRender(); Rectangle[] oldRois = clipRegion.GetRegionScansReadOnlyInt(); Rectangle[] newRois; if (oldRois.Length == 1) { newRois = new Rectangle[Processor.LogicalCpuCount]; Utility.SplitRectangle(oldRois[0], newRois); } else { newRois = oldRois; } RenderContext rc = new RenderContext(); rc.surface = surface; rc.rois = newRois; rc.renderer = gr; WaitCallback wc = new WaitCallback(rc.Render); for (int i = 0; i < Processor.LogicalCpuCount; ++i) { if (i == Processor.LogicalCpuCount - 1) { wc(BoxedConstants.GetInt32(i)); } else { PaintDotNet.Threading.ThreadPool.Global.QueueUserWorkItem(wc, BoxedConstants.GetInt32(i)); } } PaintDotNet.Threading.ThreadPool.Global.Drain(); }
protected override void OnMouseMove(object o, Gtk.MotionNotifyEventArgs args, Cairo.PointD point) { Document doc = PintaCore.Workspace.ActiveDocument; if (tracking) { GradientRenderer gr = CreateGradientRenderer(); if (button == 3) // Right-click { gr.StartColor = PintaCore.Palette.SecondaryColor.ToColorBgra(); gr.EndColor = PintaCore.Palette.PrimaryColor.ToColorBgra(); } else //1 Left-click { gr.StartColor = PintaCore.Palette.PrimaryColor.ToColorBgra(); gr.EndColor = PintaCore.Palette.SecondaryColor.ToColorBgra(); } gr.StartPoint = startpoint; gr.EndPoint = point; gr.AlphaBlending = UseAlphaBlending; gr.BeforeRender(); Gdk.Rectangle selection_bounds = doc.GetSelectedBounds(true); ImageSurface scratch_layer = doc.ToolLayer.Surface; gr.Render(scratch_layer, new Gdk.Rectangle[] { selection_bounds }); using (var g = doc.CreateClippedContext()) { g.SetSource(scratch_layer); g.Paint(); } doc.ToolLayer.Clear(); selection_bounds.Inflate(5, 5); doc.Workspace.Invalidate(selection_bounds); } }