private void DrawOrFillMesh([NotNull] IPaintProvider provider, [NotNull] Triangle[] mesh)
        {
            using (var paint = provider.Paint.Clone()) {
                const SKVertexMode geometryMode = SKVertexMode.Triangles;

                var vertices = new SKPoint[mesh.Length * 3];

                for (var i = 0; i < mesh.Length; ++i)
                {
                    var j = i * 3;

                    vertices[j]     = mesh[i].Point1.ToSKPoint();
                    vertices[j + 1] = mesh[i].Point2.ToSKPoint();
                    vertices[j + 2] = mesh[i].Point3.ToSKPoint();
                }

                var colors = new SKColor[vertices.Length];

                for (var i = 0; i < colors.Length; ++i)
                {
                    colors[i] = SKColors.White;
                }

                _canvas?.DrawVertices(geometryMode, vertices, colors, paint);
            }

            SetDirty();
        }
        private void DrawOrFillMultilineString([NotNull] IPaintProvider provider, [NotNull] Font font, [CanBeNull] string str, float x, float y, float maxWidth, float maxHeight, [CanBeNull] StringFormat stringFormat)
        {
            if (string.IsNullOrWhiteSpace(str))
            {
                return;
            }

            if (_canvas == null)
            {
                return;
            }

            using (var paint = provider.Paint.Clone()) {
                SetSKPaintFontProperties(paint, font, stringFormat);

                var lines      = SplitLines(str, paint, maxWidth, maxHeight, stringFormat);
                var lineHeight = DetermineLineHeight(paint, stringFormat);

                foreach (var line in lines)
                {
                    _canvas.DrawText(line.Value, x, y, paint);

                    y += lineHeight;
                }
            }

            SetDirty();
        }
        private void DrawOrFillString([NotNull] IPaintProvider provider, [NotNull] Font font, [CanBeNull] string str, float x, float y, [CanBeNull] StringFormat stringFormat)
        {
            if (string.IsNullOrWhiteSpace(str))
            {
                return;
            }

            using (var paint = provider.Paint.Clone()) {
                SetSKPaintFontProperties(paint, font, stringFormat);
                _canvas?.DrawText(str, x, y, paint);
            }

            SetDirty();
        }
        private void DrawOrFillPolygon([NotNull] IPaintProvider provider, [NotNull] Vector2[] points)
        {
            Guard.ArgumentNotNull(points, nameof(points));

            if (points.Length < 3)
            {
                throw new ArgumentException("A polygon should contain at least 3 points.", nameof(points));
            }

            if (_canvas == null)
            {
                return;
            }

            using (var path = new SKPath()) {
                var skPoints = Array.ConvertAll(points, XnaExtensions.ToSKPoint);

                path.AddPoly(skPoints);
                _canvas.DrawPath(path, provider.Paint);
            }

            SetDirty();
        }
 private void DrawOrFillEllipse([NotNull] IPaintProvider provider, float x, float y, float width, float height)
 {
     _canvas?.DrawOval(new SKRect(x, y, x + width, y + height), provider.Paint);
     SetDirty();
 }