Beispiel #1
0
        public static void ToSKPath(this SP.Path path, SkiaCodeGenObjectCounter counter, StringBuilder sb, string indent)
        {
            sb.AppendLine($"{indent}var {counter.PathVarName}{counter.Path} = new SKPath() {{ FillType = {path.FillType.ToSKPathFillType()} }};");

            if (path.Commands == null)
            {
                return;
            }

            foreach (var pathCommand in path.Commands)
            {
                switch (pathCommand)
                {
                case SP.MoveToPathCommand moveToPathCommand:
                {
                    var x = moveToPathCommand.X;
                    var y = moveToPathCommand.Y;
                    sb.AppendLine($"{indent}skPath{counter.Path}.MoveTo({x.ToString(_ci)}f, {y.ToString(_ci)}f);");
                }
                break;

                case SP.LineToPathCommand lineToPathCommand:
                {
                    var x = lineToPathCommand.X;
                    var y = lineToPathCommand.Y;
                    sb.AppendLine($"{indent}skPath{counter.Path}.LineTo({x.ToString(_ci)}f, {y.ToString(_ci)}f);");
                }
                break;

                case SP.ArcToPathCommand arcToPathCommand:
                {
                    var rx          = arcToPathCommand.Rx;
                    var ry          = arcToPathCommand.Ry;
                    var xAxisRotate = arcToPathCommand.XAxisRotate;
                    var largeArc    = arcToPathCommand.LargeArc.ToSKPathArcSize();
                    var sweep       = arcToPathCommand.Sweep.ToSKPathDirection();
                    var x           = arcToPathCommand.X;
                    var y           = arcToPathCommand.Y;
                    sb.AppendLine($"{indent}skPath{counter.Path}.ArcTo({rx.ToString(_ci)}f, {ry.ToString(_ci)}f, {xAxisRotate.ToString(_ci)}f, {largeArc}, {sweep}, {x.ToString(_ci)}f, {y.ToString(_ci)}f);");
                }
                break;

                case SP.QuadToPathCommand quadToPathCommand:
                {
                    var x0 = quadToPathCommand.X0;
                    var y0 = quadToPathCommand.Y0;
                    var x1 = quadToPathCommand.X1;
                    var y1 = quadToPathCommand.Y1;
                    sb.AppendLine($"{indent}skPath{counter.Path}.QuadTo({x0.ToString(_ci)}f, {y0.ToString(_ci)}f, {x1.ToString(_ci)}f, {y1.ToString(_ci)}f);");
                }
                break;

                case SP.CubicToPathCommand cubicToPathCommand:
                {
                    var x0 = cubicToPathCommand.X0;
                    var y0 = cubicToPathCommand.Y0;
                    var x1 = cubicToPathCommand.X1;
                    var y1 = cubicToPathCommand.Y1;
                    var x2 = cubicToPathCommand.X2;
                    var y2 = cubicToPathCommand.Y2;
                    sb.AppendLine($"{indent}skPath{counter.Path}.CubicTo({x0.ToString(_ci)}f, {y0.ToString(_ci)}f, {x1.ToString(_ci)}f, {y1.ToString(_ci)}f, {x2.ToString(_ci)}f, {y2.ToString(_ci)}f);");
                }
                break;

                case SP.ClosePathCommand _:
                {
                    sb.AppendLine($"{indent}skPath{counter.Path}.Close();");
                }
                break;

                case SP.AddRectPathCommand addRectPathCommand:
                {
                    var rect = addRectPathCommand.Rect.ToSKRect();
                    sb.AppendLine($"{indent}skPath{counter.Path}.AddRect({rect});");
                }
                break;

                case SP.AddRoundRectPathCommand addRoundRectPathCommand:
                {
                    var rect = addRoundRectPathCommand.Rect.ToSKRect();
                    var rx   = addRoundRectPathCommand.Rx;
                    var ry   = addRoundRectPathCommand.Ry;
                    sb.AppendLine($"{indent}skPath{counter.Path}.AddRoundRect({rect}, {rx.ToString(_ci)}f, {ry.ToString(_ci)}f);");
                }
                break;

                case SP.AddOvalPathCommand addOvalPathCommand:
                {
                    var rect = addOvalPathCommand.Rect.ToSKRect();
                    sb.AppendLine($"{indent}skPath{counter.Path}.AddOval({rect});");
                }
                break;

                case SP.AddCirclePathCommand addCirclePathCommand:
                {
                    var x      = addCirclePathCommand.X;
                    var y      = addCirclePathCommand.Y;
                    var radius = addCirclePathCommand.Radius;
                    sb.AppendLine($"{indent}skPath{counter.Path}.AddCircle({x.ToString(_ci)}f, {y.ToString(_ci)}f, {radius.ToString(_ci)}f);");
                }
                break;

                case SP.AddPolyPathCommand addPolyPathCommand:
                {
                    if (addPolyPathCommand.Points != null)
                    {
                        var points = addPolyPathCommand.Points.ToSKPoints();
                        var close  = addPolyPathCommand.Close.ToString(_ci).ToLower();
                        sb.AppendLine($"{indent}skPath{counter.Path}.AddPoly(points, {close});");
                    }
                }
                break;

                default:
                    break;
                }
            }
        }
        public static IPathGeometry ToPathGeometry(SP.Path path, bool isFilled, IFactory factory)
        {
            if (path.Commands == null)
            {
                return(null);
            }

            var geometry = factory.CreatePathGeometry(
                ImmutableArray.Create <IPathFigure>(),
                path.FillType == SP.PathFillType.EvenOdd ? FillRule.EvenOdd : FillRule.Nonzero);

            var context = factory.CreateGeometryContext(geometry);

            bool endFigure  = false;
            bool haveFigure = false;

            for (int i = 0; i < path.Commands.Count; i++)
            {
                var pathCommand = path.Commands[i];
                var isLast      = i == path.Commands.Count - 1;

                switch (pathCommand)
                {
                case SP.MoveToPathCommand moveToPathCommand:
                {
                    if (endFigure == true && haveFigure == false)
                    {
                        return(null);
                    }
                    if (haveFigure == true)
                    {
                        context.SetClosedState(false);
                    }
                    if (isLast == true)
                    {
                        return(geometry);
                    }
                    else
                    {
                        if (path.Commands[i + 1] is SP.MoveToPathCommand)
                        {
                            return(geometry);
                        }

                        if (path.Commands[i + 1] is SP.ClosePathCommand)
                        {
                            return(geometry);
                        }
                    }
                    endFigure  = true;
                    haveFigure = false;
                    var x     = moveToPathCommand.X;
                    var y     = moveToPathCommand.Y;
                    var point = factory.CreatePointShape(x, y);
                    context.BeginFigure(point, false);
                }
                break;

                case SP.LineToPathCommand lineToPathCommand:
                {
                    if (endFigure == false)
                    {
                        return(null);
                    }
                    haveFigure = true;
                    var x     = lineToPathCommand.X;
                    var y     = lineToPathCommand.Y;
                    var point = factory.CreatePointShape(x, y);
                    context.LineTo(point);
                }
                break;

                case SP.ArcToPathCommand arcToPathCommand:
                {
                    if (endFigure == false)
                    {
                        return(null);
                    }
                    haveFigure = true;
                    var x             = arcToPathCommand.X;
                    var y             = arcToPathCommand.Y;
                    var point         = factory.CreatePointShape(x, y);
                    var rx            = arcToPathCommand.Rx;
                    var ry            = arcToPathCommand.Ry;
                    var size          = factory.CreatePathSize(rx, ry);
                    var rotationAngle = arcToPathCommand.XAxisRotate;
                    var isLargeArc    = arcToPathCommand.LargeArc == SP.PathArcSize.Large;
                    var sweep         = arcToPathCommand.Sweep == SP.PathDirection.Clockwise ? SweepDirection.Clockwise : SweepDirection.Counterclockwise;
                    context.ArcTo(point, size, rotationAngle, isLargeArc, sweep);
                }
                break;

                case SP.QuadToPathCommand quadToPathCommand:
                {
                    if (endFigure == false)
                    {
                        return(null);
                    }
                    haveFigure = true;
                    var x0       = quadToPathCommand.X0;
                    var y0       = quadToPathCommand.Y0;
                    var x1       = quadToPathCommand.X1;
                    var y1       = quadToPathCommand.Y1;
                    var control  = factory.CreatePointShape(x0, y0);
                    var endPoint = factory.CreatePointShape(x1, y1);
                    context.QuadraticBezierTo(control, endPoint);
                }
                break;

                case SP.CubicToPathCommand cubicToPathCommand:
                {
                    if (endFigure == false)
                    {
                        return(null);
                    }
                    haveFigure = true;
                    var x0     = cubicToPathCommand.X0;
                    var y0     = cubicToPathCommand.Y0;
                    var x1     = cubicToPathCommand.X1;
                    var y1     = cubicToPathCommand.Y1;
                    var x2     = cubicToPathCommand.X2;
                    var y2     = cubicToPathCommand.Y2;
                    var point1 = factory.CreatePointShape(x0, y0);
                    var point2 = factory.CreatePointShape(x1, y1);
                    var point3 = factory.CreatePointShape(x2, y2);
                    context.CubicBezierTo(point1, point2, point3);
                }
                break;

                case SP.ClosePathCommand _:
                {
                    if (endFigure == false)
                    {
                        return(null);
                    }
                    if (haveFigure == false)
                    {
                        return(null);
                    }
                    endFigure  = false;
                    haveFigure = false;
                    context.SetClosedState(true);
                }
                break;

                default:
                    break;
                }
            }

            if (endFigure)
            {
                if (haveFigure == false)
                {
                    return(null);
                }
                context.SetClosedState(false);
            }

            return(geometry);
        }