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);
}