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)); }
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)); }