public GradientHeader() { _startColor = this.BackColor; _endColor = this.ForeColor; this.ResizeRedraw = true; _gradientHelper = new GradientHelper<GradientHeader>(this); }
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 void Draw(GraphicsHandler graphics, bool stroke, FillMode fillMode, bool clip) { var outerRadius = Radius.Width; var yscale = Radius.Height / Radius.Width; var center = Center; var origin = GradientOrigin; var scale = 1f; var rect = graphics.Control.GetPathBoundingBox().ToEto(); if (stroke) { graphics.Control.ReplacePathWithStrokedPath(); } if (clip) { graphics.Clip(fillMode); } 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 GradientsTest() { var img = ImageHelper.LoadImageAsInt(TestResources.Bikesgray); Normalizer.Normalize(100, 500, img); var grad = GradientHelper.GenerateGradient(img); var path = Path.GetTempPath() + "grad.png"; ImageHelper.SaveIntArray(grad, path); Process.Start(path); }
public GradientPanel() { // Set the styles to make things draw properly: base.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); _gradientHelper = new GradientHelper<GradientPanel>(this); this.ResizeRedraw = true; }
/// <inheritdoc /> /// <summary> /// Gets the color at an specific point assuming the brush is drawn into the given rectangle. /// </summary> /// <param name="rectangle">The rectangle in which the brush should be drawn.</param> /// <param name="renderTarget">The target (key/point) from which the color should be taken.</param> /// <returns>The color at the specified point.</returns> protected override Color GetColorAtPoint(Rectangle rectangle, BrushRenderTarget renderTarget) { if (Gradient == null) { return(Color.Transparent); } Point startPoint = new Point(StartPoint.X * rectangle.Size.Width, StartPoint.Y * rectangle.Size.Height); Point endPoint = new Point(EndPoint.X * rectangle.Size.Width, EndPoint.Y * rectangle.Size.Height); double offset = GradientHelper.CalculateLinearGradientOffset(startPoint, endPoint, renderTarget.Point); return(Gradient.GetColor(offset)); }
public override void Draw(CGRect rect) { base.Draw(rect); GradientHelper stack = (GradientHelper)this.Element; CGColor startColor = stack.StartColor.ToCGColor(); CGColor endColor = stack.EndColor.ToCGColor(); var gradientLayer = new CAGradientLayer(); gradientLayer.Frame = rect; gradientLayer.Colors = new CGColor[] { startColor, endColor }; NativeView.Layer.InsertSublayer(gradientLayer, 0); }
public sd2.PathGradientBrush GetBrush(RectangleF rect) { var scale = 1f; var bounds = rect; if (Matrix != null) { bounds = Matrix.Inverse().TransformRectangle(bounds); } scale = GradientHelper.GetRadialScale(Center, Radius, GradientOrigin, bounds); if (brush == null || lastScale != scale) { lastScale = scale; var scaledRect = new RectangleF(GradientOrigin - (GradientOrigin - Center + Radius) * scale, GradientOrigin + (Center + Radius - GradientOrigin) * scale); var path = new sd2.GraphicsPath(); path.AddEllipse(scaledRect.ToSD()); brush = new sd2.PathGradientBrush(path); brush.CenterColor = StartColor.ToSD(); brush.CenterPoint = GradientOrigin.ToSD(); brush.WrapMode = wrapMode.ToSD(); brush.SurroundColors = new[] { EndColor.ToSD() }; if (Matrix != null) { brush.MultiplyTransform(Matrix.ToSD()); } if (scale > 1f) { var paths = GradientHelper.GetGradientStops(StartColor.ToSD(), EndColor.ToSD(), scale, wrapMode); brush.InterpolationColors = new sd2.ColorBlend { Positions = paths.Reverse().Select(r => 1f - r.Item1).ToArray(), Colors = paths.Reverse().Select(r => r.Item2).ToArray() }; } } return(brush); }
/// <summary> /// Gets the color at an specific point assuming the brush is drawn into the given rectangle. /// </summary> /// <param name="rectangle">The rectangle in which the brush should be drawn.</param> /// <param name="renderTarget">The target (key/point) from which the color should be taken.</param> /// <returns>The color at the specified point.</returns> protected override CorsairColor GetColorAtPoint(RectangleF rectangle, BrushRenderTarget renderTarget) { if (Gradient == null) { return(CorsairColor.Transparent); } PointF centerPoint = new PointF(rectangle.X + rectangle.Width * Center.X, rectangle.Y + rectangle.Height * Center.Y); // Calculate the distance to the farthest point from the center as reference (this has to be a corner) // ReSharper disable once RedundantCast - never trust this ... float refDistance = (float)Math.Max(Math.Max(Math.Max(GradientHelper.CalculateDistance(rectangle.Location, centerPoint), GradientHelper.CalculateDistance(new PointF(rectangle.X + rectangle.Width, rectangle.Y), centerPoint)), GradientHelper.CalculateDistance(new PointF(rectangle.X, rectangle.Y + rectangle.Height), centerPoint)), GradientHelper.CalculateDistance(new PointF(rectangle.X + rectangle.Width, rectangle.Y + rectangle.Height), centerPoint)); float distance = GradientHelper.CalculateDistance(renderTarget.Point, centerPoint); float offset = distance / refDistance; return(Gradient.GetColor(offset)); }
public object Create(RectangleF rectangle, Color startColor, Color endColor, float angle) { GradientHelper.GetLinearFromRectangle(rectangle, angle, out var startPoint, out var endPoint); return(Create(startColor, endColor, startPoint, endPoint)); }
public sd2.LinearGradientBrush GetBrush(RectangleF rect) { var start = StartPoint; var end = EndPoint; if (wrapMode == GradientWrapMode.Pad) { // winforms does not support pad, so extend to fill entire drawing region if (transform != null) { start = transform.TransformPoint(start); end = transform.TransformPoint(end); } PointF min, max; GradientHelper.GetLinearMinMax(start, end, rect, out min, out max, true); var len = max.LengthTo(min); // find start/end pos based on entire position var startpos = min.LengthTo(start) / len; var endpos = min.LengthTo(end) / len; if (brush == null || lastStartPos != startpos || lastEndPos > endpos) { lastStartPos = startpos; lastEndPos = endpos; start = min; end = max; var diff = end - start; // account for innacuracies in system.drawing when nearing horizontal or vertical if (Math.Abs(diff.X) < 0.0001) { end.X = start.X; } if (Math.Abs(diff.Y) < 0.0001) { end.Y = start.Y; } brush = new sd2.LinearGradientBrush(start.ToSD(), end.ToSD(), StartColor, EndColor); brush.WrapMode = sd2.WrapMode.Tile; brush.InterpolationColors = new sd2.ColorBlend { Colors = new[] { StartColor, StartColor, EndColor, EndColor }, Positions = new[] { 0f, startpos, endpos, 1f, } }; } } else if (brush == null) { brush = new sd2.LinearGradientBrush(StartPoint.ToSD(), EndPoint.ToSD(), StartColor, EndColor); brush.WrapMode = wrapMode.ToSD(); if (transform != null) { brush.MultiplyTransform(transform.ToSD()); } } return(brush); }
public override void ModifyVertices(List <UIVertex> vertexList) { GradientHelper.modifyVertices(vertexList, (c, t) => Color32.Lerp(bottomColor, topColor, t)); }