private GradientLine GetGradientLine(SKRectI boxBounds, double angleDegrees) { // Calculation // https://medium.com/@patrickbrosset/do-you-really-understand-css-linear-gradients-631d9a895caf var angleRadians = GradientMath.ToRadians(GradientMath.FromDegrees(angleDegrees)); var lineLength = Math.Abs(boxBounds.Width * Math.Sin(angleRadians)) + Math.Abs(boxBounds.Height * Math.Cos(angleRadians)); var center = new SKPoint(boxBounds.MidX, boxBounds.MidY); var yDiff = (float)(Math.Sin(angleRadians - Math.PI / 2) * lineLength / 2); var xDiff = (float)(Math.Cos(angleRadians - Math.PI / 2) * lineLength / 2); return(new GradientLine { Start = new SKPoint( center.X - xDiff, center.Y - yDiff), End = new SKPoint( center.X + xDiff, center.Y + yDiff), Length = lineLength, Angle = angleRadians }); }
public double CalculateRenderOffset(double offset, int width, int height) { // Here the Pythagorean Theorem + Trigonometry is applied // to figure out the length of the gradient, which is needed to accurately calculate offset. // https://en.wikibooks.org/wiki/Trigonometry/The_Pythagorean_Theorem var angleRad = GradientMath.ToRadians(_gradient.Angle); var computedLength = Math.Sqrt(Math.Pow(width * Math.Cos(angleRad), 2) + Math.Pow(height * Math.Sin(angleRad), 2)); return(computedLength != 0 ? offset / computedLength : 1); }
internal bool TryConvertTurnToAngle(string token, out double angle) { if (token.TryExtractNumber("turn", out var turn)) { angle = GradientMath.FromDegrees(360 * turn); return(true); } angle = 0; return(false); }
internal bool TryConvertTurnToAngle(string token, out double angle) { if (Offset.TryExtractNumber(token, "turn", out var turn)) { angle = GradientMath.RotateBy180(360 * turn); return(true); } angle = 0; return(false); }
internal bool TryConvertDegreeToAngle(string token, out double angle) { if (token.TryExtractNumber("deg", out var degrees)) { angle = GradientMath.FromDegrees(degrees); return(true); } // For "0" deg is optional if (token.Equals("0", StringComparison.OrdinalIgnoreCase)) { angle = GradientMath.FromDegrees(0); return(true); } angle = 0; return(false); }
private string GetGradient(Gradient gradient) { if (gradient is LinearGradient linear) { var type = linear.IsRepeating ? "repeating-linear-gradient" : "linear-gradient"; var angle = $"{GradientMath.FromDegrees(linear.Angle)}deg"; return($"{type}({angle}, {GetColors(linear)})"); } if (gradient is RadialGradient radial) { var type = radial.IsRepeating ? "repeating-radial-gradient" : "radial-gradient"; return($"{type}({GetShapeAndSize(radial)} {GetPosition(radial)}, {GetColors(radial)})"); } return(string.Empty); }
public void CalculateGeometry(ILinearGradient gradient, RectangleF boxBounds) { // Calculation // https://medium.com/@patrickbrosset/do-you-really-understand-css-linear-gradients-631d9a895caf var angleDegrees = gradient.Angle; var angleRadians = GradientMath.ToRadians(GradientMath.RotateBy180(angleDegrees)); var lineLength = Math.Abs(boxBounds.Width * Math.Sin(angleRadians)) + Math.Abs(boxBounds.Height * Math.Cos(angleRadians)); var center = boxBounds.Center; var yDiff = (float)(Math.Sin(angleRadians - Math.PI / 2) * lineLength / 2); var xDiff = (float)(Math.Cos(angleRadians - Math.PI / 2) * lineLength / 2); Start = new PointF(center.X - xDiff, center.Y - yDiff); End = new PointF(center.X + xDiff, center.Y + yDiff); Length = lineLength; Angle = angleRadians; }