public void Dispose() { if (canvas != null) { canvas.RestoreToCount(saveCount); } }
/// <summary> /// Perform the restore now, instead of waiting for the Dispose. /// Will only do this once. /// </summary> public void Restore() { if (canvas != null) { canvas.RestoreToCount(saveCount); canvas = null; } }
private SKPoint DrawLineArrowInternal(SKCanvas canvas, SKPaint pen, SKPaint brush, float x, float y, double angle, ArrowStyle style) { SKPoint pt = default(SKPoint); var rt = MatrixHelper.Rotation(angle, new SKPoint(x, y)); double rx = style.RadiusX; double ry = style.RadiusY; double sx = 2.0 * rx; double sy = 2.0 * ry; switch (style.ArrowType) { default: case ArrowType.None: { pt = new SKPoint(x, y); } break; case ArrowType.Rectangle: { pt = MatrixHelper.TransformPoint(rt, new SKPoint(x - (float)sx, y)); var rect = ToSKRect(x - sx, y - ry, sx, sy); int count = canvas.Save(); canvas.SetMatrix(rt); DrawRectangleInternal(canvas, brush, pen, style.IsStroked, style.IsFilled, ref rect); canvas.RestoreToCount(count); } break; case ArrowType.Ellipse: { pt = MatrixHelper.TransformPoint(rt, new SKPoint(x - (float)sx, y)); int count = canvas.Save(); canvas.SetMatrix(rt); var rect = ToSKRect(x - sx, y - ry, sx, sy); DrawEllipseInternal(canvas, brush, pen, style.IsStroked, style.IsFilled, ref rect); canvas.RestoreToCount(count); } break; case ArrowType.Arrow: { var pts = new SKPoint[] { new SKPoint(x, y), new SKPoint(x - (float)sx, y + (float)sy), new SKPoint(x, y), new SKPoint(x - (float)sx, y - (float)sy), new SKPoint(x, y) }; pt = MatrixHelper.TransformPoint(rt, pts[0]); var p11 = MatrixHelper.TransformPoint(rt, pts[1]); var p21 = MatrixHelper.TransformPoint(rt, pts[2]); var p12 = MatrixHelper.TransformPoint(rt, pts[3]); var p22 = MatrixHelper.TransformPoint(rt, pts[4]); DrawLineInternal(canvas, pen, style.IsStroked, ref p11, ref p21); DrawLineInternal(canvas, pen, style.IsStroked, ref p12, ref p22); } break; } return pt; }