Esempio n. 1
0
        public FntParser(string path)
        {
            RootNode = new FntNode(Path.GetFileNameWithoutExtension(path), string.Empty);
            stream   = new FileStream(path, FileMode.Open);

            FntNode currentNode = null;

            while (NextToken(out string token))
            {
                if (!token.Contains('='))
                {
                    if (currentNode != null)
                    {
                        RootNode.AddChildren(currentNode);
                    }
                    currentNode = new FntNode(token, string.Empty);
                    continue;
                }

                string[] splittedToken = token.Split('=');

                string name  = splittedToken[0];
                string value = splittedToken[1];

                if (value[0] == '"' && value[value.Length - 1] == '"')
                {
                    value = value.Substring(1, value.Length - 2);
                }

                currentNode.AddChildren(new FntNode(name, value));
            }

            RootNode.AddChildren(currentNode);
        }
Esempio n. 2
0
 public void AddChildren(FntNode node)
 {
     if (children.ContainsKey(node.Name))
     {
         children[node.Name].Add(node);
         return;
     }
     children.Add(node.Name, new List <FntNode>()
     {
         node
     });
 }
Esempio n. 3
0
        public Font(string name, string path) : base(name)
        {
            FntParser parser = new FntParser(path);

            LineHeight = int.Parse(parser.RootNode["common"][0]["lineHeight"][0].Value);

            string[] paddings = parser.RootNode["info"][0]["padding"][0].Value.Split(',');

            PaddingTop    = int.Parse(paddings[0]);
            PaddingLeft   = int.Parse(paddings[1]);
            PaddingBottom = int.Parse(paddings[2]);
            PaddingRight  = int.Parse(paddings[3]);

            TextureWidth  = int.Parse(parser.RootNode["common"][0]["scaleW"][0].Value);
            TextureHeight = int.Parse(parser.RootNode["common"][0]["scaleH"][0].Value);

            int kerningsCount = int.Parse(parser.RootNode["kernings"][0]["count"][0].Value);

            for (int i = 0; i < kerningsCount; i++)
            {
                FntNode node = parser.RootNode["kerning"][i];

                CharsPair pair = new CharsPair(
                    (char)int.Parse(node["first"][0].Value),
                    (char)int.Parse(node["second"][0].Value));

                Kernings.Add(pair, int.Parse(node["amount"][0].Value));
            }

            int charsCount = int.Parse(parser.RootNode["chars"][0]["count"][0].Value);

            for (int i = 0; i < charsCount; i++)
            {
                FntNode node = parser.RootNode["char"][i];

                char c = (char)int.Parse(node["id"][0].Value);

                Vector2i size = new Vector2i(
                    int.Parse(node["width"][0].Value),
                    int.Parse(node["height"][0].Value));

                Vector2i offset = new Vector2i(
                    int.Parse(node["xoffset"][0].Value),
                    int.Parse(node["yoffset"][0].Value));

                Vector2i start = new Vector2i(
                    int.Parse(node["x"][0].Value),
                    int.Parse(node["y"][0].Value));

                Vector2i end = start + size;

                Characters.Add(c, new Character
                {
                    Start   = new Vector2(start.X / (float)TextureWidth, start.Y / (float)TextureHeight),
                    End     = new Vector2(end.X / (float)TextureWidth, end.Y / (float)TextureHeight),
                    Size    = size,
                    Offset  = offset,
                    Advance = int.Parse(node["xadvance"][0].Value) - PaddingLeft - PaddingRight
                });
            }

            string texPath = Path.Combine(Path.GetDirectoryName(path), parser.RootNode["page"][0]["file"][0].Value);

            Rgba32[] pixels = Helper.LoadImageFromFile(texPath, out _, out _);

            FontTexture = GL.GenTexture();
            GL.BindTexture(TextureTarget.Texture2D, FontTexture);
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, TextureWidth, TextureHeight, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

            GL.BindTexture(TextureTarget.Texture2D, 0);
        }