static void ParseChar(ReadOnlySpan <string> values, ref BitmapChar character) { foreach (var valuePair in values) { var splitValues = valuePair.Split("=", StringSplitOptions.TrimEntries); var key = splitValues[0]; var value = splitValues[1]; switch (key) { case "id": character.Id = int.Parse(value); break; case "x": character.X = int.Parse(value); break; case "y": character.Y = int.Parse(value); break; case "width": character.Width = int.Parse(value); break; case "height": character.Height = int.Parse(value); break; case "xoffset": character.XOffset = int.Parse(value); break; case "yoffset": character.YOffset = int.Parse(value); break; case "xadvance": character.XAdvance = int.Parse(value); break; case "page": character.Page = int.Parse(value); break; case "chnl": character.Channel = int.Parse(value); break; } } }
public static BitmapFont ReadFromFile(string path) { var info = new Info(); var common = new CommonSettings(); var page = new Page(); BitmapChar[] chars = null; Kerning[] kernings = null; var charIndex = 0; var kerningIndex = 0; using var file = File.OpenText(path); string line; while ((line = file.ReadLine()) != null) { var values = line.SplitQuotedStrings(' '); if (values.Length == 0) { continue; } var valueSpan = new ReadOnlySpan <string>(values, 1, values.Length - 1); switch (values[0]) { case "info": ParseInfo(valueSpan, ref info); break; case "common": ParseCommon(valueSpan, ref common); break; case "page": ParsePage(valueSpan, ref page); break; case "chars": chars = new BitmapChar[int.Parse(valueSpan[0].Split("=")[1])]; break; case "kernings": kernings = new Kerning[int.Parse(valueSpan[0].Split("=")[1])]; break; case "char": if (chars == null) { throw new InvalidOperationException("Chars has not been initialized, corrupt file"); } ParseChar(valueSpan, ref chars[charIndex++]); break; case "kerning": if (kernings == null) { throw new InvalidOperationException("Kernings has not been initialized, corrupt file"); } ParseKerning(valueSpan, ref kernings[kerningIndex++]); break; } } // Only supports a single bitmap return(new BitmapFont { Info = info, Common = common, Chars = chars, Page = page, Kernings = kernings, Bitmap = File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(path), page.File)) });