public static SKShader ToSkiaShader(IGradientBrush gradientBrush, IShape shape) { SKShaderTileMode tileMode = gradientBrush.SpreadMethod switch { GradientSpreadMethod.Pad => SKShaderTileMode.Clamp, GradientSpreadMethod.Reflect => SKShaderTileMode.Mirror, GradientSpreadMethod.Repeat => SKShaderTileMode.Repeat, _ => throw new InvalidOperationException($"Unknown GradientSpreadmethod value {gradientBrush.SpreadMethod}") }; List <SKColor> skiaColors = new List <SKColor>(); List <float> skiaColorPositions = new List <float>(); foreach (IGradientStop gradientStop in gradientBrush.GradientStops) { skiaColors.Add(ToSkiaColor(gradientStop.Color)); skiaColorPositions.Add((float)gradientStop.Offset); } if (gradientBrush is ILinearGradientBrush linearGradientBrush) { SKPoint skiaStartPoint = new SKPoint( (float)(shape.Left + linearGradientBrush.StartPoint.X * shape.Width), (float)(shape.Top + linearGradientBrush.StartPoint.Y * shape.Height)); SKPoint skiaEndPoint = new SKPoint( (float)(shape.Left + linearGradientBrush.EndPoint.X * shape.Width), (float)(shape.Top + linearGradientBrush.EndPoint.Y * shape.Height)); return(SKShader.CreateLinearGradient(skiaStartPoint, skiaEndPoint, skiaColors.ToArray(), skiaColorPositions.ToArray(), tileMode)); } else if (gradientBrush is IRadialGradientBrush radialGradientBrush) { SKPoint skiaCenterPoint = new SKPoint( (float)(shape.Left + radialGradientBrush.Center.X * shape.Width), (float)(shape.Top + radialGradientBrush.Center.Y * shape.Height)); float radius = (float)(radialGradientBrush.RadiusX * shape.Width); return(SKShader.CreateRadialGradient(skiaCenterPoint, radius, skiaColors.ToArray(), skiaColorPositions.ToArray(), tileMode)); } else { throw new InvalidOperationException($"GradientBrush type {gradientBrush.GetType()} is unknown"); } }
internal static IGradientBrush ConvertSolidColorBrushToGradient(IGradientBrush gradientBrush, ISolidColorBrush solidColorBrush) { switch (gradientBrush) { case IRadialGradientBrush oldRadial: return(new ImmutableRadialGradientBrush( CreateStopsFromSolidColorBrush(solidColorBrush, oldRadial.GradientStops), solidColorBrush.Opacity, oldRadial.SpreadMethod, oldRadial.Center, oldRadial.GradientOrigin, oldRadial.Radius)); case IConicGradientBrush oldConic: return(new ImmutableConicGradientBrush( CreateStopsFromSolidColorBrush(solidColorBrush, oldConic.GradientStops), solidColorBrush.Opacity, oldConic.SpreadMethod, oldConic.Center, oldConic.Angle)); case ILinearGradientBrush oldLinear: return(new ImmutableLinearGradientBrush( CreateStopsFromSolidColorBrush(solidColorBrush, oldLinear.GradientStops), solidColorBrush.Opacity, oldLinear.SpreadMethod, oldLinear.StartPoint, oldLinear.EndPoint)); default: throw new NotSupportedException($"Gradient of type {gradientBrush?.GetType()} is not supported"); }