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); }