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));
        }
Exemple #2
0
        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);
        }