public GradientHeader()
 {
     _startColor = this.BackColor;
     _endColor = this.ForeColor;
     this.ResizeRedraw = true;
     _gradientHelper = new GradientHelper<GradientHeader>(this);
 }        
Пример #2
0
            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);
            }
Пример #3
0
            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;
 }
Пример #6
0
        /// <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);
            }
Пример #9
0
        /// <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));
        }
Пример #10
0
 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));
 }
Пример #11
0
            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);
            }
Пример #12
0
 public override void ModifyVertices(List <UIVertex> vertexList)
 {
     GradientHelper.modifyVertices(vertexList, (c, t) => Color32.Lerp(bottomColor, topColor, t));
 }