Beispiel #1
0
        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");
            }