Ejemplo n.º 1
0
        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}.");
            }
        }
Ejemplo n.º 2
0
        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);
        }