private void ParseKerningPair(ref ReadOnlySpan <char> line) { bool parsedFirst = false; bool parsedSecond = false; var kernPair = new BMFontKerningData(); while (line.Length > 0) { SkipWhitespace(ref line); var tagName = ParseIdentifier(ref line, "kerning"); if (CheckTag(tagName, "first")) { kernPair.FirstChar = ParseIntTag(ref line, "first"); parsedFirst = true; } else if (CheckTag(tagName, "second")) { kernPair.SecondChar = ParseIntTag(ref line, "second"); parsedSecond = true; } else if (CheckTag(tagName, "amount")) { kernPair.AmountX = ParseIntTag(ref line, "amount"); } else { throw new BMFontParseException( string.Format("Unsupported tag \"{0}\" on line \"{1}\".", tagName.ToString(), currentLine )); } } var pairVal = new RehashedValue <long> (BMFontInfo.GetKerningPairLong(kernPair.FirstChar, kernPair.SecondChar)); if (!parsedFirst) { throw new BMFontParseException($"Missing first char id on line {currentLine}."); } else if (!parsedSecond) { throw new BMFontParseException($"Missing second char id on line {currentLine}."); } else if (!kernPairs.TryAdd(pairVal, kernPair)) { throw new BMFontParseException($"Duplicate kerning pair ({kernPair.FirstChar}, {kernPair.SecondChar}) on line {currentLine}."); } }
public BMFontInfo Parse(ReadOnlySpan <char> text) { genInfo = new BMFontGenerationInfo(); commonInfo = new BMFontCommonInfo(); charData = new Dictionary <RehashedValue <int>, BMFontCharacterData> (); kernPairs = new Dictionary <RehashedValue <long>, BMFontKerningData> (); parsedGenInfo = false; parsedCommonInfo = false; parsedCharsTag = false; parsedKerningsTag = false; pages = null; pagesParsed.Dispose(); pagesParsed = PooledArray <bool> .Empty(); int lineEnd; int lineCount = 1; while ((lineEnd = text.IndexOf('\n')) != -1 || (lineEnd = text.Length) != 0) { ReadOnlySpan <char> line; if (lineEnd != 0 && text [lineEnd - 1] == '\r') { line = text.Slice(0, lineEnd - 1); } else { line = text.Slice(0, lineEnd); } Process(line, lineCount); text = text.Slice(lineEnd + 1); lineCount++; } var ret = new BMFontInfo(charData, kernPairs, pages, genInfo, commonInfo); pagesParsed.Dispose(); charData = null; pages = null; kernPairs = null; genInfo = new BMFontGenerationInfo(); commonInfo = new BMFontCommonInfo(); return(ret); }