public static void Draw(SKCanvas canvas, IViewport viewport, IStyle style, IGeometry geometry) { var polygon = (Polygon)geometry; float lineWidth = 1; var lineColor = Color.Black; // default var fillColor = Color.Gray; // default var vectorStyle = style as VectorStyle; if (vectorStyle != null) { lineWidth = (float) vectorStyle.Outline.Width; lineColor = vectorStyle.Outline.Color; fillColor = vectorStyle.Fill?.Color; } using (var path = ToSkia(viewport, polygon)) { using (var paint = new SKPaint()) { paint.IsAntialias = true; paint.StrokeWidth = lineWidth; paint.Style = SKPaintStyle.Fill; paint.Color = fillColor.ToSkia(); canvas.DrawPath(path, paint); paint.Style = SKPaintStyle.Stroke; paint.Color = lineColor.ToSkia(); canvas.DrawPath(path, paint); } } }
public static void Draw(SKCanvas canvas, IViewport viewport, IStyle style, IGeometry geometry) { var lineString = ((LineString) geometry).Vertices; float lineWidth = 1; var lineColor = new Color(); var vectorStyle = style as VectorStyle; if (vectorStyle != null) { lineWidth = (float) vectorStyle.Line.Width; lineColor = vectorStyle.Line.Color; } var line = WorldToScreen(viewport, lineString); var path = ToSkia(line); using (var paint = new SKPaint()) { paint.IsStroke = true; paint.StrokeWidth = lineWidth; paint.Color = lineColor.ToSkia(); paint.StrokeJoin = SKStrokeJoin.Round; canvas.DrawPath(path, paint); } }
public static void FilledHeptagram(SKCanvas canvas, int width, int height) { var size = ((float)height > width ? width : height) * 0.75f; var R = 0.45f * size; var TAU = 6.2831853f; using (var path = new SKPath()) { path.MoveTo(R, 0.0f); for (int i = 1; i < 7; ++i) { var theta = 3f * i * TAU / 7f; path.LineTo(R * (float)Math.Cos(theta), R * (float)Math.Sin(theta)); } path.Close(); using (var paint = new SKPaint()) { paint.IsAntialias = true; canvas.Clear(SKColors.White); canvas.Translate(width / 2f, height / 2f); canvas.DrawPath(path, paint); } } }
private void ReadElement(XElement e, SKCanvas canvas, SKPaint stroke, SKPaint fill) { ReadPaints(e, ref stroke, ref fill); // transform matrix var transform = ReadTransform(e.Attribute("transform")?.Value ?? string.Empty); canvas.Save(); canvas.Concat(ref transform); // SVG elements var elementName = e.Name.LocalName; switch (elementName) { case "text": if (stroke != null || fill != null) { ReadText(e, canvas, stroke?.Clone(), fill?.Clone()); } break; case "rect": if (stroke != null || fill != null) { var x = ReadNumber(e.Attribute("x")); var y = ReadNumber(e.Attribute("y")); var width = ReadNumber(e.Attribute("width")); var height = ReadNumber(e.Attribute("height")); var rx = ReadNumber(e.Attribute("rx")); var ry = ReadNumber(e.Attribute("ry")); var rect = SKRect.Create(x, y, width, height); if (rx > 0 || ry > 0) { if (fill != null) { canvas.DrawRoundRect(rect, rx, ry, fill); } if (stroke != null) { canvas.DrawRoundRect(rect, rx, ry, stroke); } } else { if (fill != null) { canvas.DrawRect(rect, fill); } if (stroke != null) { canvas.DrawRect(rect, stroke); } } } break; case "ellipse": if (stroke != null || fill != null) { var cx = ReadNumber(e.Attribute("cx")); var cy = ReadNumber(e.Attribute("cy")); var rx = ReadNumber(e.Attribute("rx")); var ry = ReadNumber(e.Attribute("ry")); if (fill != null) { canvas.DrawOval(cx, cy, rx, ry, fill); } if (stroke != null) { canvas.DrawOval(cx, cy, rx, ry, stroke); } } break; case "circle": if (stroke != null || fill != null) { var cx = ReadNumber(e.Attribute("cx")); var cy = ReadNumber(e.Attribute("cy")); var rr = ReadNumber(e.Attribute("r")); if (fill != null) { canvas.DrawCircle(cx, cy, rr, fill); } if (stroke != null) { canvas.DrawCircle(cx, cy, rr, stroke); } } break; case "path": if (stroke != null || fill != null) { var d = e.Attribute("d")?.Value; if (!string.IsNullOrWhiteSpace(d)) { var path = SKPath.ParseSvgPathData(d); if (fill != null) { canvas.DrawPath(path, fill); } if (stroke != null) { canvas.DrawPath(path, stroke); } } } break; case "polygon": case "polyline": if (stroke != null || fill != null) { var close = elementName == "polygon"; var p = e.Attribute("points")?.Value; if (!string.IsNullOrWhiteSpace(p)) { var path = ReadPolyPath(p, close); if (fill != null) { canvas.DrawPath(path, fill); } if (stroke != null) { canvas.DrawPath(path, stroke); } } } break; case "g": if (e.HasElements) { foreach (var gElement in e.Elements()) { ReadElement(gElement, canvas, stroke?.Clone(), fill?.Clone()); } } break; case "use": if (e.HasAttributes) { var href = ReadHref(e); if (href != null) { // TODO: copy/process other attributes var x = ReadNumber(e.Attribute("x")); var y = ReadNumber(e.Attribute("y")); var useTransform = SKMatrix.MakeTranslation(x, y); canvas.Save(); canvas.Concat(ref useTransform); ReadElement(href, canvas, stroke?.Clone(), fill?.Clone()); canvas.Restore(); } } break; case "line": if (stroke != null) { var x1 = ReadNumber(e.Attribute("x1")); var x2 = ReadNumber(e.Attribute("x2")); var y1 = ReadNumber(e.Attribute("y1")); var y2 = ReadNumber(e.Attribute("y2")); canvas.DrawLine(x1, y1, x2, y2, stroke); } break; case "switch": if (e.HasElements) { foreach (var ee in e.Elements()) { var requiredFeatures = ee.Attribute("requiredFeatures"); var requiredExtensions = ee.Attribute("requiredExtensions"); var systemLanguage = ee.Attribute("systemLanguage"); // TODO: evaluate requiredFeatures, requiredExtensions and systemLanguage var isVisible = requiredFeatures == null && requiredExtensions == null && systemLanguage == null; if (isVisible) { ReadElement(ee, canvas, stroke?.Clone(), fill?.Clone()); } } } break; case "defs": case "title": case "desc": case "description": // already read earlier break; default: LogOrThrow($"SVG element '{elementName}' is not supported"); break; } // restore matrix canvas.Restore(); }
#pragma warning restore 414 public static void DrawXamagon(SKCanvas canvas, int width, int height) { // Width 41.6587026 => 144.34135 // Height 56 => 147 var paddingFactor = .6f; var imageLeft = 41.6587026f; var imageRight = 144.34135f; var imageTop = 56f; var imageBottom = 147f; var imageWidth = imageRight - imageLeft; var scale = (((float)height > width ? width : height) / imageWidth) * paddingFactor; var translateX = (imageLeft + imageRight) / -2 + width / scale * 1 / 2; var translateY = (imageBottom + imageTop) / -2 + height / scale * 1 / 2; canvas.Scale(scale, scale); canvas.Translate(translateX, translateY); using (var paint = new SKPaint()) { paint.IsAntialias = true; paint.Color = SKColors.White; canvas.DrawPaint(paint); paint.StrokeCap = SKStrokeCap.Round; var t = paint.StrokeCap; using (var path = new SKPath()) { path.MoveTo(71.4311121f, 56f); path.CubicTo(68.6763107f, 56.0058575f, 65.9796704f, 57.5737917f, 64.5928855f, 59.965729f); path.LineTo(43.0238921f, 97.5342563f); path.CubicTo(41.6587026f, 99.9325978f, 41.6587026f, 103.067402f, 43.0238921f, 105.465744f); path.LineTo(64.5928855f, 143.034271f); path.CubicTo(65.9798162f, 145.426228f, 68.6763107f, 146.994582f, 71.4311121f, 147f); path.LineTo(114.568946f, 147f); path.CubicTo(117.323748f, 146.994143f, 120.020241f, 145.426228f, 121.407172f, 143.034271f); path.LineTo(142.976161f, 105.465744f); path.CubicTo(144.34135f, 103.067402f, 144.341209f, 99.9325978f, 142.976161f, 97.5342563f); path.LineTo(121.407172f, 59.965729f); path.CubicTo(120.020241f, 57.5737917f, 117.323748f, 56.0054182f, 114.568946f, 56f); path.LineTo(71.4311121f, 56f); path.Close(); paint.Color = XamDkBlue; canvas.DrawPath(path, paint); } using (var path = new SKPath()) { path.MoveTo(71.8225901f, 77.9780432f); path.CubicTo(71.8818491f, 77.9721857f, 71.9440029f, 77.9721857f, 72.0034464f, 77.9780432f); path.LineTo(79.444074f, 77.9780432f); path.CubicTo(79.773437f, 77.9848769f, 80.0929203f, 78.1757336f, 80.2573978f, 78.4623994f); path.LineTo(92.8795281f, 101.015639f); path.CubicTo(92.9430615f, 101.127146f, 92.9839987f, 101.251384f, 92.9995323f, 101.378901f); path.CubicTo(93.0150756f, 101.251354f, 93.055974f, 101.127107f, 93.1195365f, 101.015639f); path.LineTo(105.711456f, 78.4623994f); path.CubicTo(105.881153f, 78.167045f, 106.215602f, 77.975134f, 106.554853f, 77.9780432f); path.LineTo(113.995483f, 77.9780432f); path.CubicTo(114.654359f, 77.9839007f, 115.147775f, 78.8160066f, 114.839019f, 79.4008677f); path.LineTo(102.518299f, 101.500005f); path.LineTo(114.839019f, 123.568869f); path.CubicTo(115.176999f, 124.157088f, 114.671442f, 125.027775f, 113.995483f, 125.021957f); path.LineTo(106.554853f, 125.021957f); path.CubicTo(106.209673f, 125.019028f, 105.873247f, 124.81384f, 105.711456f, 124.507327f); path.LineTo(93.1195365f, 101.954088f); path.CubicTo(93.0560031f, 101.84258f, 93.0150659f, 101.718333f, 92.9995323f, 101.590825f); path.CubicTo(92.983989f, 101.718363f, 92.9430906f, 101.842629f, 92.8795281f, 101.954088f); path.LineTo(80.2573978f, 124.507327f); path.CubicTo(80.1004103f, 124.805171f, 79.7792269f, 125.008397f, 79.444074f, 125.021957f); path.LineTo(72.0034464f, 125.021957f); path.CubicTo(71.3274867f, 125.027814f, 70.8220664f, 124.157088f, 71.1600463f, 123.568869f); path.LineTo(83.4807624f, 101.500005f); path.LineTo(71.1600463f, 79.400867f); path.CubicTo(70.8647037f, 78.86725f, 71.2250368f, 78.0919422f, 71.8225901f, 77.9780432f); path.LineTo(71.8225901f, 77.9780432f); path.Close(); paint.Color = SKColors.White; canvas.DrawPath(path, paint); } } }
void DrawArc (SKCanvas canvas, SKPaint paint, double startAngleInDegrees, double endAngleInDegrees) { // find center and radius var centerx = (float)Bounds.Width / 2; var centery = (float)Bounds.Height / 2; var radius = Bounds.Width < Bounds.Height ? (float)Bounds.Width / 2 : (float)Bounds.Height / 2; var w = 0.558f; // convert degrees to radians var startAngleRadians = startAngleInDegrees * Math.PI / 180; var endAngleRadians = endAngleInDegrees * Math.PI / 180; // find x,y coordinates for start and end points var startx = centerx + radius * (float)Math.Cos (startAngleRadians); var starty = centery + radius * (float)Math.Sin (startAngleRadians); var startPoint = new SKPoint (startx, starty); var endx = centerx + radius * (float)Math.Cos (endAngleRadians); var endy = centery + radius * (float)Math.Sin (endAngleRadians); var endPoint = new SKPoint (endx, endy); // find linear distance & midpoint between start and end points var linearDistance = Math.Sqrt(Math.Pow(endy - starty, 2) / Math.Pow(endx - startx, 2)); var midx = (startx + endx) / 2; var midy = (starty + endy) / 2; var midPoint = new SKPoint (midx, midy); // rotate end point 45 degrees counterclockwise around midpoint to find Conic function anchor var anchorPoint = RotatePoint (endPoint, midPoint, 45); // build path var path = new SKPath (); //path.MoveTo (startx, starty); //path.ConicTo (anchorPoint.X, anchorPoint.Y, endx, endy, w); path.MoveTo (centerx, centery - radius); path.ConicTo (centerx + radius, centery - radius, centerx + radius, centery, w); path.ConicTo (centerx + radius, centery + radius, centerx, centery + radius, w); path.ConicTo (centerx - radius, centery + radius, centerx - radius, centery, w); //path.ConicTo (centerx - radius, centery - radius, centerx, centery - radius, w); //canvas.DrawPoints (SKPointMode.Points, new SKPoint [] { }, paint); canvas.DrawPath (path, paint); }
public void DrawPath(IPath trackPath, PaintBrush paint) => _canvas.DrawPath(trackPath.ToSkia(), GetSKPaint(paint));
public static void DrawPath(SKCanvas g, SKPath p, SKPaint stroke) { g.DrawPath(p, stroke); }
public static void FillPath(SKCanvas g, SKPath p, SKPaint fill) { g.DrawPath(p, fill); }
public static void DrawVxsSnap(SKCanvas g, VertexStoreSnap vxsSnap, SKPaint stroke) { using (var p = CreateGraphicsPath(vxsSnap)) { g.DrawPath(p, stroke); } }
public static void FillVxsSnap(SKCanvas g, VertexStoreSnap vxsSnap, SKPaint fill) { using (var p = CreateGraphicsPath(vxsSnap)) { g.DrawPath(p, fill); } }
private void DrawPathInternal(SKCanvas canvas, SKPaint brush, SKPaint pen, bool isStroked, bool isFilled, SKPath path) { if (isFilled) { canvas.DrawPath(path, brush); } if (isStroked) { canvas.DrawPath(path, pen); } }
private void DrawLineCurveInternal(SKCanvas canvas, SKPaint pen, bool isStroked, ref SKPoint pt1, ref SKPoint pt2, double curvature, CurveOrientation orientation, PointAlignment pt1a, PointAlignment pt2a) { if (isStroked) { using (var path = new SKPath()) { path.MoveTo(pt1.X, pt1.Y); double p1x = pt1.X; double p1y = pt1.Y; double p2x = pt2.X; double p2y = pt2.Y; XLineExtensions.GetCurvedLineBezierControlPoints(orientation, curvature, pt1a, pt2a, ref p1x, ref p1y, ref p2x, ref p2y); path.CubicTo( (float)p1x, (float)p1y, (float)p2x, (float)p2y, pt2.X, pt2.Y); canvas.DrawPath(path, pen); } } }
public static void FilledHeptagram (SKCanvas canvas, int width, int height) { var size = ((float)height > width ? width : height) * 0.75f; var R = 0.45f * size; var TAU = 6.2831853f; using (var path = new SKPath ()) { path.MoveTo (R, 0.0f); for (int i = 1; i < 7; ++i) { var theta = 3f * i * TAU / 7f; path.LineTo (R * (float)Math.Cos (theta), R * (float)Math.Sin (theta)); } path.Close (); using (var paint = new SKPaint ()) { paint.IsAntialias = true; canvas.Clear (SKColors.White); canvas.Translate (width / 2f, height / 2f); canvas.DrawPath (path, paint); } } }
#pragma warning restore 414 public static void DrawXamagon (SKCanvas canvas, int width, int height) { // Width 41.6587026 => 144.34135 // Height 56 => 147 var paddingFactor = .6f; var imageLeft = 41.6587026f; var imageRight = 144.34135f; var imageTop = 56f; var imageBottom = 147f; var imageWidth = imageRight - imageLeft; var scale = (((float)height > width ? width : height) / imageWidth) * paddingFactor; var translateX = (imageLeft + imageRight) / -2 + width/scale * 1/2; var translateY = (imageBottom + imageTop) / -2 + height/scale * 1/2; canvas.Scale (scale, scale); canvas.Translate (translateX , translateY); using (var paint = new SKPaint ()) { paint.IsAntialias = true; paint.Color = SKColors.White; canvas.DrawPaint (paint); paint.StrokeCap = SKStrokeCap.Round; var t = paint.StrokeCap; using (var path = new SKPath ()) { path.MoveTo (71.4311121f, 56f); path.CubicTo (68.6763107f, 56.0058575f, 65.9796704f, 57.5737917f, 64.5928855f, 59.965729f); path.LineTo (43.0238921f, 97.5342563f); path.CubicTo (41.6587026f, 99.9325978f, 41.6587026f, 103.067402f, 43.0238921f, 105.465744f); path.LineTo (64.5928855f, 143.034271f); path.CubicTo (65.9798162f, 145.426228f, 68.6763107f, 146.994582f, 71.4311121f, 147f); path.LineTo (114.568946f, 147f); path.CubicTo (117.323748f, 146.994143f, 120.020241f, 145.426228f, 121.407172f, 143.034271f); path.LineTo (142.976161f, 105.465744f); path.CubicTo (144.34135f, 103.067402f, 144.341209f, 99.9325978f, 142.976161f, 97.5342563f); path.LineTo (121.407172f, 59.965729f); path.CubicTo (120.020241f, 57.5737917f, 117.323748f, 56.0054182f, 114.568946f, 56f); path.LineTo (71.4311121f, 56f); path.Close (); paint.Color = XamDkBlue; canvas.DrawPath (path, paint); } using (var path = new SKPath ()) { path.MoveTo (71.8225901f, 77.9780432f); path.CubicTo (71.8818491f, 77.9721857f, 71.9440029f, 77.9721857f, 72.0034464f, 77.9780432f); path.LineTo (79.444074f, 77.9780432f); path.CubicTo (79.773437f, 77.9848769f, 80.0929203f, 78.1757336f, 80.2573978f, 78.4623994f); path.LineTo (92.8795281f, 101.015639f); path.CubicTo (92.9430615f, 101.127146f, 92.9839987f, 101.251384f, 92.9995323f, 101.378901f); path.CubicTo (93.0150756f, 101.251354f, 93.055974f, 101.127107f, 93.1195365f, 101.015639f); path.LineTo (105.711456f, 78.4623994f); path.CubicTo (105.881153f, 78.167045f, 106.215602f, 77.975134f, 106.554853f, 77.9780432f); path.LineTo (113.995483f, 77.9780432f); path.CubicTo (114.654359f, 77.9839007f, 115.147775f, 78.8160066f, 114.839019f, 79.4008677f); path.LineTo (102.518299f, 101.500005f); path.LineTo (114.839019f, 123.568869f); path.CubicTo (115.176999f, 124.157088f, 114.671442f, 125.027775f, 113.995483f, 125.021957f); path.LineTo (106.554853f, 125.021957f); path.CubicTo (106.209673f, 125.019028f, 105.873247f, 124.81384f, 105.711456f, 124.507327f); path.LineTo (93.1195365f, 101.954088f); path.CubicTo (93.0560031f, 101.84258f, 93.0150659f, 101.718333f, 92.9995323f, 101.590825f); path.CubicTo (92.983989f, 101.718363f, 92.9430906f, 101.842629f, 92.8795281f, 101.954088f); path.LineTo (80.2573978f, 124.507327f); path.CubicTo (80.1004103f, 124.805171f, 79.7792269f, 125.008397f, 79.444074f, 125.021957f); path.LineTo (72.0034464f, 125.021957f); path.CubicTo (71.3274867f, 125.027814f, 70.8220664f, 124.157088f, 71.1600463f, 123.568869f); path.LineTo (83.4807624f, 101.500005f); path.LineTo (71.1600463f, 79.400867f); path.CubicTo (70.8647037f, 78.86725f, 71.2250368f, 78.0919422f, 71.8225901f, 77.9780432f); path.LineTo (71.8225901f, 77.9780432f); path.Close (); paint.Color = SKColors.White; canvas.DrawPath (path, paint); } } }
public void DrawPath(IPath trackPath, PaintBrush straightTrackPaint) => _canvas.DrawPath(trackPath.ToSkia(), straightTrackPaint.ToSkia());