Exemple #1
0
    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);
                    }
                }
        }