public SKShader CreateShader(IRadialGradient gradient, DrawContext context)
        {
            var rect = context.RenderRect.ToRectF();

            var circle = new RadialGradientGeometry();

            circle.CalculateOffsets(gradient, context.RenderRect.Width, context.RenderRect.Height);

            var renderStops = GetRenderStops(gradient);
            var lastOffset  = gradient.IsRepeating ? renderStops.LastOrDefault()?.RenderOffset ?? 1 : 1;
            var colors      = renderStops.Select(x => x.Color.ToSKColor()).ToArray();
            var colorPos    = renderStops.Select(x => lastOffset > 0 ? x.RenderOffset / lastOffset : 0).ToArray();

            circle.CalculateGeometry(gradient, rect, lastOffset, context.PixelScaling);

            var center = circle.Center.ToSKPoint();

            var shader = SKShader.CreateRadialGradient(
                center,
                Math.Min(circle.Radius.Width, circle.Radius.Height),
                colors,
                colorPos,
                gradient.IsRepeating ? SKShaderTileMode.Repeat : SKShaderTileMode.Clamp,
                GetScaleMatrix(center, circle.Radius.Width, circle.Radius.Height));

            return(shader);
        }
        private Paint CreateRadialPaint(IRadialGradient gradient, DrawContext context)
        {
            var rect = context.RenderRect;

            var circle = new RadialGradientGeometry();

            circle.CalculateOffsets(gradient, (int)context.RenderRect.Width, (int)context.RenderRect.Height);

            var renderStops = GetRenderStops(gradient);
            var lastOffset  = gradient.IsRepeating ? renderStops.LastOrDefault()?.Offset ?? 1 : 1;

            circle.CalculateGeometry(gradient, rect, lastOffset, context.PixelScaling);

            foreach (var stop in renderStops)
            {
                stop.Offset = lastOffset > 0 ? stop.Offset / lastOffset : 0;
            }

            // Convert pixels to proportional
            var center = new Point(circle.Center.X / rect.Width, circle.Center.Y / rect.Height);
            var radius = new Size(circle.Radius.Width / rect.Width, circle.Radius.Height / rect.Height);

            return(new RadialGradientPaintEx(renderStops, center, radius, gradient.IsRepeating));
        }
Example #3
0
 void AddFromIRadialGradient(IRadialGradient content, YamlMap result)
 {
     AddFromIGradient(content, result);
     result.Add(nameof(content.HighlightDegrees), FromAnimatable(content.HighlightDegrees));
     result.Add(nameof(content.HighlightLength), FromAnimatable(content.HighlightLength));
 }