public static void Reverse(this SKPath path)
        {
            var clone = new SKPath(path);

            path = new();
            path.AddPathReverse(clone);
        }
        void OnPaint(object sender, SKPaintSurfaceEventArgs e)
        {
            SKImageInfo info    = e.Info;
            SKSurface   surface = e.Surface;
            SKCanvas    canvas  = surface.Canvas;

            canvas.Clear();

            using (var primaryPaint = new SKPaint
            {
                IsAntialias = true,
                Style = SKPaintStyle.Stroke,
                StrokeCap = SKStrokeCap.Round,
                StrokeWidth = (float)Thickness,
            })
                using (var path = new SKPath())
                    using (var backgroundPath = new SKPath())
                    {
                        var margin = (float)Thickness / 2.0f;

                        if (RadialBackgroundColor != Color.Default && RadialBackgroundColor != Color.Transparent)
                        {
                            primaryPaint.Color = RadialBackgroundColor.ToSKColor();
                            backgroundPath.AddArc(new SKRect(margin, margin, info.Width - margin, info.Height - margin), -90 + (float)StartAngle, (float)SweepAngle);
                            canvas.DrawPath(backgroundPath, primaryPaint);
                        }


                        SKColor[] colors = new SKColor[]
                        {
                            RadialStartColor.ToSKColor(),
                                  RadialStartColor.ToSKColor(),
                                  RadialMiddleColor.ToSKColor(),
                                  RadialMiddleColor.ToSKColor(),
                                  RadialEndColor.ToSKColor(),
                                  RadialEndColor.ToSKColor(),
                                  RadialStartColor.ToSKColor(),
                        };

                        float[] colorPos = new float[]
                        {
                            0,                 // start
                            (1 / 6.0f) * 1,    // start
                            (1 / 6.0f) * 2,    // mid
                            (1 / 6.0f) * 3,    // mid
                            (1 / 6.0f) * 4,    // end
                            (1 / 6.0f) * 5.7f, // end
                            0.95f              // start
                        };

                        primaryPaint.Shader = SKShader.CreateSweepGradient(new SKPoint(info.Rect.MidX, info.Rect.MidY), colors, colorPos, SKShaderTileMode.Repeat, -90 + (float)StartAngle, -90 + (float)StartAngle + (float)SweepAngle);

                        path.AddArc(new SKRect(margin, margin, info.Width - margin, info.Height - margin), -90 + (float)StartAngle, (float)SweepAngle * (float)Progress);
                        canvas.DrawPath(path, primaryPaint);
                        if (HasLabel)
                        {
                            using (var fontPaint = new SKPaint
                            {
                                IsAntialias = true,
                                Color = TextColor.ToSKColor(),
                                TextSize = (float)FontSize,
                            })
                                using (var fontPath = new SKPath())
                                {
                                    fontPath.AddPathReverse(path);
                                    canvas.DrawTextOnPath(string.Format(TextFormat, Progress), fontPath, 0, (float)FontSize / 3.0f, fontPaint);
                                }
                        }
                    }
        }