Имеет ли SkiaSharp метод Flatten, эквивалентный System.Drawing?

Я недавно столкнулся с блокпостом, используя SkiaSharp. Я портировал старый код из System.Drawing в SkiaSharp. Класс GraphicsPath имеет метод сглаживания, который преобразует кривые в серию соединенных отрезков.

https://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.flatten(v=vs.110).aspx

Я не могу найти эквивалентный метод для SkiaSharp. Метод SKPath Simplify кажется немного туманным в том, что он на самом деле делает. В моем тестировании это не показало сплющенного пути.

https://developer.xamarin.com/api/member/SkiaSharp.SKPath.Simplify()/

1 ответ

Решение

В какой-то момент после того, как я задал этот вопрос, Xamarin добавил документацию для этого. Он находится здесь

https://developer.xamarin.com/guides/xamarin-forms/advanced/skiasharp/curves/information/

static class PathExtensions
{
public static SKPath CloneWithTransform(this SKPath pathIn, Func<SKPoint, SKPoint> transform)
{
    SKPath pathOut = new SKPath();

    using (SKPath.RawIterator iterator = pathIn.CreateRawIterator())
    {
        SKPoint[] points = new SKPoint[4];
        SKPathVerb pathVerb = SKPathVerb.Move;
        SKPoint firstPoint = new SKPoint();
        SKPoint lastPoint = new SKPoint();

        while ((pathVerb = iterator.Next(points)) != SKPathVerb.Done)
        {
            switch (pathVerb)
            {
                case SKPathVerb.Move:
                    pathOut.MoveTo(transform(points[0]));
                    firstPoint = lastPoint = points[0];
                    break;

                case SKPathVerb.Line:
                    SKPoint[] linePoints = Interpolate(points[0], points[1]);

                    foreach (SKPoint pt in linePoints)
                    {
                        pathOut.LineTo(transform(pt));
                    }

                    lastPoint = points[1];
                    break;

                case SKPathVerb.Cubic:
                    SKPoint[] cubicPoints = FlattenCubic(points[0], points[1], points[2], points[3]);

                    foreach (SKPoint pt in cubicPoints)
                    {
                        pathOut.LineTo(transform(pt));
                    }

                    lastPoint = points[3];
                    break;

                case SKPathVerb.Quad:
                    SKPoint[] quadPoints = FlattenQuadratic(points[0], points[1], points[2]);

                    foreach (SKPoint pt in quadPoints)
                    {
                        pathOut.LineTo(transform(pt));
                    }

                    lastPoint = points[2];
                    break;

                case SKPathVerb.Conic:
                    SKPoint[] conicPoints = FlattenConic(points[0], points[1], points[2], iterator.ConicWeight());

                    foreach (SKPoint pt in conicPoints)
                    {
                        pathOut.LineTo(transform(pt));
                    }

                    lastPoint = points[2];
                    break;

                case SKPathVerb.Close:
                    SKPoint[] closePoints = Interpolate(lastPoint, firstPoint);

                    foreach (SKPoint pt in closePoints)
                    {
                        pathOut.LineTo(transform(pt));
                    }

                    firstPoint = lastPoint = new SKPoint(0, 0);
                    pathOut.Close();
                    break;
            }
        }
    }
    return pathOut;
}
...
}
Другие вопросы по тегам