internal static void Draw (CGContext ctx, GradientInfo gradient) { ctx.SaveState (); ctx.Clip (); using (var cg = new CGGradient (Util.DeviceRGBColorSpace, gradient.Colors.ToArray (), gradient.Stops.ToArray ())) { if (gradient.Linear) ctx.DrawLinearGradient (cg, gradient.Start, gradient.End, CGGradientDrawingOptions.DrawsBeforeStartLocation | CGGradientDrawingOptions.DrawsAfterEndLocation); else ctx.DrawRadialGradient (cg, gradient.Start, gradient.StartRadius, gradient.End, gradient.EndRadius, CGGradientDrawingOptions.DrawsBeforeStartLocation | CGGradientDrawingOptions.DrawsAfterEndLocation); } ctx.RestoreState (); }
public static void FillGradient(CGContext context, RectangleF rect, CGColor color1, CGColor color2, bool isHorizontal) { CGGradient gradientBackground; CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB(); float[] locationListBackground = new float[] { 1.0f, 0.0f }; List<float> colorListBackground = new List<float>(); colorListBackground.AddRange(color1.Components); colorListBackground.AddRange(color2.Components); gradientBackground = new CGGradient(colorSpace, colorListBackground.ToArray(), locationListBackground); context.SaveState(); context.AddRect(rect); context.Clip(); //context.ScaleCTM(1, -1); if(isHorizontal) context.DrawLinearGradient(gradientBackground, new PointF(rect.X, rect.Y), new PointF(rect.X + rect.Width, rect.Y + rect.Height), CGGradientDrawingOptions.DrawsBeforeStartLocation); else context.DrawLinearGradient(gradientBackground, new PointF(0, 0), new PointF(0, rect.Height), CGGradientDrawingOptions.DrawsBeforeStartLocation); context.RestoreState(); }
public void DrawRadialGradient(CGGradient gradient, PointF startCenter, float startRadius, PointF endCenter, float endRadius, CGGradientDrawingOptions options) { CGContextDrawRadialGradient(handle, gradient.handle, startCenter, startRadius, endCenter, endRadius, options); }
public void DrawLinearGradient(CGGradient gradient, PointF startPoint, PointF endPoint, CGGradientDrawingOptions options) { CGContextDrawLinearGradient(handle, gradient.handle, startPoint, endPoint, options); }
public void DrawRadialGradient (CGGradient gradient, PointF startCenter, float startRadius, PointF endCenter, float endRadius, CGGradientDrawingOptions options) { CGContextDrawRadialGradient (handle, gradient.handle, startCenter, startRadius, endCenter, endRadius, options); }
public void DrawLinearGradient (CGGradient gradient, PointF startPoint, PointF endPoint, CGGradientDrawingOptions options) { CGContextDrawLinearGradient (handle, gradient.handle, startPoint, endPoint, options); }
public void Draw(GraphicsHandler graphics, RectangleF rect) { var outerRadius = Radius.Width; var yscale = Radius.Height / Radius.Width; var center = Center; var origin = GradientOrigin; var scale = 1f; if (wrap != GradientWrapMode.Pad) { // use eto's transformrectangle as it'll make the rect encompass the resulting transformed area var boundRect = transform.Invert().ToEto().TransformRectangle(rect); // find max number of iterations we need to fill the bounding rectangle scale = GradientHelper.GetRadialScale(Center, Radius, GradientOrigin, boundRect); } if (Gradient == null || scale > lastScale) { var stops = GradientHelper.GetGradientStops(StartColor.ToCG(), EndColor.ToCG(), scale, wrap).ToList(); lastScale = scale; Gradient = new CGGradient(CGColorSpace.CreateDeviceRGB(), stops.Select(r => r.Item2).ToArray(), stops.Select(r => (nfloat)r.Item1).ToArray()); } else { scale = lastScale; } var scaledRect = new RectangleF(GradientOrigin - (GradientOrigin - Center + Radius) * scale, GradientOrigin + (Center + Radius - GradientOrigin) * scale); center = scaledRect.Center; outerRadius *= scale; // adjust center based on ellipse scale from gradient origin center.Y = origin.Y - (origin.Y - center.Y) / yscale; // scale to draw elliptical gradient var t = new CGAffineTransform(1, 0f, 0f, yscale, 0, origin.Y - origin.Y * yscale); t.Multiply(transform); graphics.Control.SaveState(); graphics.Control.ConcatCTM(t); graphics.Control.DrawRadialGradient(Gradient, origin.ToNS(), 0, center.ToNS(), outerRadius, CGGradientDrawingOptions.DrawsAfterEndLocation | CGGradientDrawingOptions.DrawsBeforeStartLocation); graphics.Control.RestoreState(); }
public void SetGradient(Gradient g) { _gradient = g.GetCGGradient (); }
public void SetColor(Color c) { var cgcol = c.GetCGColor (); _c.SetFillColorWithColor (cgcol); _c.SetStrokeColorWithColor (cgcol); _gradient = null; }
public void Draw(GraphicsHandler graphics, RectangleF rect) { var start = StartPoint; var end = EndPoint; if (transform != null) { start = transform.TransformPoint(start); end = transform.TransformPoint(end); } if (wrap == GradientWrapMode.Pad) { if (Gradient == null) Gradient = new CGGradient(CGColorSpace.CreateDeviceRGB(), new [] { StartColor, EndColor }, new nnfloat[] { (nnfloat)0f, (nnfloat)1f }); } else { var scale = GradientHelper.GetLinearScale(ref start, ref end, rect, lastScale, wrap == GradientWrapMode.Reflect ? 2f : 1f); if (Gradient == null || scale > lastScale) { var stops = GradientHelper.GetGradientStops(StartColor, EndColor, scale, wrap).ToList(); Gradient = new CGGradient(CGColorSpace.CreateDeviceRGB(), stops.Select(r => r.Item2).ToArray(), stops.Select(r => (nnfloat)r.Item1).ToArray()); lastScale = scale; } } var context = graphics.Control; context.DrawLinearGradient(Gradient, start.ToNS(), end.ToNS(), CGGradientDrawingOptions.DrawsAfterEndLocation | CGGradientDrawingOptions.DrawsBeforeStartLocation); }
public override void DrawRect(System.Drawing.RectangleF dirtyRect) { base.DrawRect(dirtyRect); if(!IsPlaying) return; // Save context state CGContext context = NSGraphicsContext.CurrentContext.GraphicsPort; context.SaveState(); // Calculate size float size = (Bounds.Width > Bounds.Height) ? Bounds.Height : Bounds.Width; float circleRadius = (size - 4) / 2; RectangleF rect = new RectangleF(padding / 2, padding / 2, size - padding, size - padding); CGColor color1 = GlobalTheme.PanelBackgroundColor1; CGColor color2 = GlobalTheme.PanelBackgroundColor2; CGGradient gradientBackground; CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB(); float[] locationListBackground = new float[] { 1.0f, 0.0f }; List<float> colorListBackground = new List<float>(); colorListBackground.AddRange(color1.Components); colorListBackground.AddRange(color2.Components); gradientBackground = new CGGradient(colorSpace, colorListBackground.ToArray(), locationListBackground); // Create path CGPath path = new CGPath(); float x = Bounds.Width / 2; float y = Bounds.Height / 2; path.AddArc(x, y, circleRadius, 0, 2 * (float)Math.PI, false); path.AddArc(x, y, circleRadius / 3, 0, 2 * (float)Math.PI, false); context.AddPath(path); // Draw outline context.SetLineWidth(1.5f); context.SetStrokeColor(GlobalTheme.PanelBorderColor); context.StrokePath(); // Clip path and draw gradient inside context.AddPath(path); context.EOClip(); context.DrawLinearGradient(gradientBackground, new PointF(0, 0), new PointF(0, Bounds.Height), CGGradientDrawingOptions.DrawsAfterEndLocation); context.RestoreState(); }