public static PathShapeViewModel ToPathGeometry(SKPath path, IViewModelFactory viewModelFactory) { var geometry = viewModelFactory.CreatePathShape( null, ImmutableArray.Create <PathFigureViewModel>(), path.FillType == SKPathFillType.EvenOdd ? FillRule.EvenOdd : FillRule.Nonzero); var context = viewModelFactory.CreateGeometryContext(geometry); using var iterator = path.CreateRawIterator(); var points = new SKPoint[4]; var pathVerb = SKPathVerb.Move; while ((pathVerb = iterator.Next(points)) != SKPathVerb.Done) { switch (pathVerb) { case SKPathVerb.Move: { context.BeginFigure( viewModelFactory.CreatePointShape(points[0].X, points[0].Y), false); } break; case SKPathVerb.Line: { context.LineTo( viewModelFactory.CreatePointShape(points[1].X, points[1].Y)); } break; case SKPathVerb.Cubic: { context.CubicBezierTo( viewModelFactory.CreatePointShape(points[1].X, points[1].Y), viewModelFactory.CreatePointShape(points[2].X, points[2].Y), viewModelFactory.CreatePointShape(points[3].X, points[3].Y)); } break; case SKPathVerb.Quad: { context.QuadraticBezierTo( viewModelFactory.CreatePointShape(points[1].X, points[1].Y), viewModelFactory.CreatePointShape(points[2].X, points[2].Y)); } break; case SKPathVerb.Conic: { var quads = SKPath.ConvertConicToQuads(points[0], points[1], points[2], iterator.ConicWeight(), 1); context.QuadraticBezierTo( viewModelFactory.CreatePointShape(quads[1].X, quads[1].Y), viewModelFactory.CreatePointShape(quads[2].X, quads[2].Y)); context.QuadraticBezierTo( viewModelFactory.CreatePointShape(quads[3].X, quads[3].Y), viewModelFactory.CreatePointShape(quads[4].X, quads[4].Y)); } break; case SKPathVerb.Close: { context.SetClosedState(true); } break; } } return(geometry); }
public static IPathGeometry ToPathGeometry(SKPath path, double dx, double dy, IFactory factory) { var geometry = factory.CreatePathGeometry( ImmutableArray.Create <IPathFigure>(), path.FillType == SKPathFillType.EvenOdd ? FillRule.EvenOdd : FillRule.Nonzero); var context = factory.CreateGeometryContext(geometry); using (var iterator = path.CreateRawIterator()) { var points = new SKPoint[4]; var pathVerb = SKPathVerb.Move; while ((pathVerb = iterator.Next(points)) != SKPathVerb.Done) { switch (pathVerb) { case SKPathVerb.Move: { context.BeginFigure( factory.CreatePointShape(points[0].X + dx, points[0].Y + dy), false, false); } break; case SKPathVerb.Line: { context.LineTo( factory.CreatePointShape(points[1].X + dx, points[1].Y + dy)); } break; case SKPathVerb.Cubic: { context.CubicBezierTo( factory.CreatePointShape(points[1].X + dx, points[1].Y + dy), factory.CreatePointShape(points[2].X + dx, points[2].Y + dy), factory.CreatePointShape(points[3].X + dx, points[3].Y + dy)); } break; case SKPathVerb.Quad: { context.QuadraticBezierTo( factory.CreatePointShape(points[1].X + dx, points[1].Y + dy), factory.CreatePointShape(points[2].X + dx, points[2].Y + dy)); } break; case SKPathVerb.Conic: { var quads = SKPath.ConvertConicToQuads(points[0], points[1], points[2], iterator.ConicWeight(), 1); context.QuadraticBezierTo( factory.CreatePointShape(quads[1].X + dx, quads[1].Y + dy), factory.CreatePointShape(quads[2].X + dx, quads[2].Y + dy)); context.QuadraticBezierTo( factory.CreatePointShape(quads[3].X + dx, quads[3].Y + dy), factory.CreatePointShape(quads[4].X + dx, quads[4].Y + dy)); } break; case SKPathVerb.Close: { context.SetClosedState(true); } break; } } } return(geometry); }
protected override void OnDrawSample(SKCanvas canvas, int width, int height) { canvas.Clear(SKColors.White); canvas.Scale(2); var points = new[] { new SKPoint(10, 10), new SKPoint(50, 20), new SKPoint(100, 150) }; using (SKPaint paint = new SKPaint()) using (SKPaint textPaint = new SKPaint()) { paint.Style = SKPaintStyle.Stroke; paint.StrokeWidth = 5; paint.IsAntialias = true; paint.StrokeCap = SKStrokeCap.Round; textPaint.IsAntialias = true; using (SKPath path = new SKPath()) { // create a conic path path.MoveTo(points[0]); path.ConicTo(points[1], points[2], 10); // draw the conic-based path paint.Color = SampleMedia.Colors.XamarinDarkBlue; canvas.DrawPath(path, paint); // get the quads from the conic points SKPoint[] pts; var quads = SKPath.ConvertConicToQuads(points[0], points[1], points[2], 10, out pts, 2); // move the points on a bit for (int i = 0; i < pts.Length; i++) { pts[i].Offset(120, 0); } // draw the quad-based path using (var quadsPath = new SKPath()) { quadsPath.MoveTo(pts[0].X, pts[0].Y); for (int i = 0; i < quads; i++) { var idx = i * 2; quadsPath.CubicTo( pts[idx].X, pts[idx].Y, pts[idx + 1].X, pts[idx + 1].Y, pts[idx + 2].X, pts[idx + 2].Y); } paint.Color = SampleMedia.Colors.XamarinPurple; canvas.DrawPath(quadsPath, paint); } // move the points on a bit for (int i = 0; i < pts.Length; i++) { pts[i].Offset(120, 0); } // draw the dots paint.Color = SampleMedia.Colors.XamarinGreen; canvas.DrawPoints(SKPointMode.Points, pts, paint); } } }