// ReSharper disable MemberCanBePrivate.Global // ReSharper disable AutoPropertyCanBeMadeGetOnly.Global // ReSharper disable UnusedMember.Global using System; using RGB.NET.Brushes.Gradients; using RGB.NET.Brushes.Helper; using RGB.NET.Core; namespace RGB.NET.Brushes { /// /// /// /// Represents a brush drawing a radial gradient around a center point. /// public class RadialGradientBrush : AbstractBrush, IGradientBrush { #region Properties & Fields private Point _center = new Point(0.5, 0.5); /// /// Gets or sets the center (as percentage in the range [0..1]) around which the should be drawn. (default: 0.5, 0.5) /// public Point Center { get => _center; set => SetProperty(ref _center, value); } private IGradient _gradient; /// public IGradient Gradient { get => _gradient; set => SetProperty(ref _gradient, value); } #endregion #region Constructors /// /// /// Initializes a new instance of the class. /// public RadialGradientBrush() { } /// /// /// Initializes a new instance of the class. /// /// The gradient drawn by the brush. public RadialGradientBrush(IGradient gradient) { this.Gradient = gradient; } /// /// /// Initializes a new instance of the class. /// /// The center point (as percentage in the range [0..1]). /// The gradient drawn by the brush. public RadialGradientBrush(Point center, IGradient gradient) { this.Center = center; this.Gradient = gradient; } #endregion #region Methods /// protected override Color GetColorAtPoint(Rectangle rectangle, BrushRenderTarget renderTarget) { if (Gradient == null) return Color.Transparent; Point centerPoint = new Point(rectangle.Location.X + (rectangle.Size.Width * Center.X), rectangle.Location.Y + (rectangle.Size.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 ... double refDistance = Math.Max(Math.Max(Math.Max(GradientHelper.CalculateDistance(rectangle.Location, centerPoint), GradientHelper.CalculateDistance(new Point(rectangle.Location.X + rectangle.Size.Width, rectangle.Location.Y), centerPoint)), GradientHelper.CalculateDistance(new Point(rectangle.Location.X, rectangle.Location.Y + rectangle.Size.Height), centerPoint)), GradientHelper.CalculateDistance(new Point(rectangle.Location.X + rectangle.Size.Width, rectangle.Location.Y + rectangle.Size.Height), centerPoint)); double distance = GradientHelper.CalculateDistance(renderTarget.Point, centerPoint); double offset = distance / refDistance; return Gradient.GetColor(offset); } #endregion } }