private SKMatrix ReadTransform(string raw) { var t = SKMatrix.MakeIdentity(); if (string.IsNullOrWhiteSpace(raw)) { return(t); } var calls = raw.Trim().Split(new[] { ')' }, StringSplitOptions.RemoveEmptyEntries); foreach (var c in calls) { var args = c.Split(new[] { '(', ',', ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var nt = SKMatrix.MakeIdentity(); switch (args[0]) { case "matrix": if (args.Length == 7) { nt.Values = new float[] { ReadNumber(args[1]), ReadNumber(args[3]), ReadNumber(args[5]), ReadNumber(args[2]), ReadNumber(args[4]), ReadNumber(args[6]), 0, 0, 1 }; } else { LogOrThrow($"Matrices are expected to have 6 elements, this one has {args.Length - 1}"); } break; case "translate": if (args.Length >= 3) { nt = SKMatrix.MakeTranslation(ReadNumber(args[1]), ReadNumber(args[2])); } else if (args.Length >= 2) { nt = SKMatrix.MakeTranslation(ReadNumber(args[1]), 0); } break; case "scale": if (args.Length >= 3) { nt = SKMatrix.MakeScale(ReadNumber(args[1]), ReadNumber(args[2])); } else if (args.Length >= 2) { var sx = ReadNumber(args[1]); nt = SKMatrix.MakeScale(sx, sx); } break; case "rotate": var a = ReadNumber(args[1]); if (args.Length >= 4) { var x = ReadNumber(args[2]); var y = ReadNumber(args[3]); var t1 = SKMatrix.MakeTranslation(x, y); var t2 = SKMatrix.MakeRotationDegrees(a); var t3 = SKMatrix.MakeTranslation(-x, -y); SKMatrix.Concat(ref nt, ref t1, ref t2); SKMatrix.Concat(ref nt, ref nt, ref t3); } else { nt = SKMatrix.MakeRotationDegrees(a); } break; default: LogOrThrow($"Can't transform {args[0]}"); break; } SKMatrix.Concat(ref t, ref t, ref nt); } return(t); }