private Paint CreateLinearPaint(ILinearGradient gradient, DrawContext context) { var rect = context.RenderRect; var line = new LinearGradientGeometry(); line.CalculateOffsets(gradient, (int)context.RenderRect.Width, (int)context.RenderRect.Height); line.CalculateGeometry(gradient, rect); var renderStops = GetRenderStops(gradient); var start = line.Start; var end = line.End; if (gradient.IsRepeating) { var firstOffset = renderStops.FirstOrDefault()?.Offset ?? 0; var lastOffset = renderStops.LastOrDefault()?.Offset ?? 1; start = line.GetColorPointAt(firstOffset); end = line.GetColorPointAt(lastOffset); foreach (var stop in renderStops) { stop.Offset = line.ScaleWithBias(stop.Offset, firstOffset, lastOffset, 0, 1); } } // Convert pixels to proportional var startPoint = new Point(start.X / rect.Width, start.Y / rect.Height); var endPoint = new Point(end.X / rect.Width, end.Y / rect.Height); return(new LinearGradientPaintEx(renderStops, startPoint, endPoint, gradient.IsRepeating)); }
public SKShader CreateShader(ILinearGradient gradient, DrawContext context) { var rect = context.RenderRect; var line = new LinearGradientGeometry(); line.CalculateOffsets(gradient, context.RenderRect.Width, context.RenderRect.Height); line.CalculateGeometry(gradient, rect.ToRectF()); var renderStops = GetRenderStops(gradient); var colors = renderStops.Select(x => x.Color.ToSKColor()).ToArray(); var colorPos = renderStops.Select(x => x.RenderOffset).ToArray(); var startPoint = line.Start; var endPoint = line.End; if (gradient.IsRepeating) { var firstOffset = renderStops.FirstOrDefault()?.RenderOffset ?? 0; var lastOffset = renderStops.LastOrDefault()?.RenderOffset ?? 1; startPoint = line.GetColorPointAt(firstOffset); endPoint = line.GetColorPointAt(lastOffset); for (var i = 0; i < colorPos.Length; i++) { colorPos[i] = line.ScaleWithBias(colorPos[i], firstOffset, lastOffset, 0, 1); } } var shader = SKShader.CreateLinearGradient( startPoint.ToSKPoint(), endPoint.ToSKPoint(), colors, colorPos, gradient.IsRepeating ? SKShaderTileMode.Repeat : SKShaderTileMode.Clamp); return(shader); }