/// <summary> /// Loads font information from the specified <see cref="TextReader"/>. /// </summary> /// <remarks> /// The source data must be in BMFont XML format. /// </remarks> /// <exception cref="ArgumentNullException">Thrown when one or more required arguments are null.</exception> /// <param name="reader">The <strong>TextReader</strong> used to feed the data into the font.</param> public void LoadXml(TextReader reader) { XmlDocument document; IDictionary <int, Page> pageData; IDictionary <Kerning, int> kerningDictionary; IDictionary <char, Character> charDictionary; XmlNode root; XmlNode properties; if (reader == null) { throw new ArgumentNullException("reader"); } document = new XmlDocument(); pageData = new SortedDictionary <int, Page>(); kerningDictionary = new Dictionary <Kerning, int>(); charDictionary = new Dictionary <char, Character>(); document.Load(reader); root = document.DocumentElement; // load the basic attributes properties = root.SelectSingleNode("info"); this.FamilyName = properties.Attributes["face"].Value; this.FontSize = Convert.ToInt32(properties.Attributes["size"].Value); this.Bold = Convert.ToInt32(properties.Attributes["bold"].Value) != 0; this.Italic = Convert.ToInt32(properties.Attributes["italic"].Value) != 0; this.Unicode = Convert.ToInt32(properties.Attributes["unicode"].Value) != 0; this.StretchedHeight = Convert.ToInt32(properties.Attributes["stretchH"].Value); this.Charset = properties.Attributes["charset"].Value; this.Smoothed = Convert.ToInt32(properties.Attributes["smooth"].Value) != 0; this.SuperSampling = Convert.ToInt32(properties.Attributes["aa"].Value); this.Padding = BitmapFontLoader.ParsePadding(properties.Attributes["padding"].Value); this.Spacing = BitmapFontLoader.ParsePoint(properties.Attributes["spacing"].Value); this.OutlineSize = Convert.ToInt32(properties.Attributes["outline"].Value); // common attributes properties = root.SelectSingleNode("common"); this.BaseHeight = Convert.ToInt32(properties.Attributes["lineHeight"].Value); this.LineHeight = Convert.ToInt32(properties.Attributes["base"].Value); this.TextureSize = new Point(Convert.ToInt32(properties.Attributes["scaleW"].Value), Convert.ToInt32(properties.Attributes["scaleH"].Value)); this.Packed = Convert.ToInt32(properties.Attributes["packed"].Value) != 0; this.AlphaChannel = Convert.ToInt32(properties.Attributes["alphaChnl"].Value); this.RedChannel = Convert.ToInt32(properties.Attributes["redChnl"].Value); this.GreenChannel = Convert.ToInt32(properties.Attributes["greenChnl"].Value); this.BlueChannel = Convert.ToInt32(properties.Attributes["blueChnl"].Value); // load texture information foreach (XmlNode node in root.SelectNodes("pages/page")) { Page page; page = new Page(); page.Id = Convert.ToInt32(node.Attributes["id"].Value); page.FileName = node.Attributes["file"].Value; pageData.Add(page.Id, page); } this.Pages = BitmapFontLoader.ToArray(pageData.Values); // load character information foreach (XmlNode node in root.SelectNodes("chars/char")) { Character character; character = new Character(); character.Char = (char)Convert.ToInt32(node.Attributes["id"].Value); character.Bounds = new Rectangle(Convert.ToInt32(node.Attributes["x"].Value), Convert.ToInt32(node.Attributes["y"].Value), Convert.ToInt32(node.Attributes["width"].Value), Convert.ToInt32(node.Attributes["height"].Value)); character.Offset = new Point(Convert.ToInt32(node.Attributes["xoffset"].Value), Convert.ToInt32(node.Attributes["yoffset"].Value)); character.XAdvance = Convert.ToInt32(node.Attributes["xadvance"].Value); character.TexturePage = Convert.ToInt32(node.Attributes["page"].Value); character.Channel = Convert.ToInt32(node.Attributes["chnl"].Value); charDictionary.Add(character.Char, character); } this.Characters = charDictionary; // loading kerning information foreach (XmlNode node in root.SelectNodes("kernings/kerning")) { Kerning key; key = new Kerning((char)Convert.ToInt32(node.Attributes["first"].Value), (char)Convert.ToInt32(node.Attributes["second"].Value), Convert.ToInt32(node.Attributes["amount"].Value)); if (!kerningDictionary.ContainsKey(key)) { kerningDictionary.Add(key, key.Amount); } } this.Kernings = kerningDictionary; }
/// <summary> /// Loads font information from the specified <see cref="TextReader"/>. /// </summary> /// <remarks> /// The source data must be in BMFont text format. /// </remarks> /// <exception cref="ArgumentNullException">Thrown when one or more required arguments are null.</exception> /// <param name="reader">The <strong>TextReader</strong> used to feed the data into the font.</param> public void LoadText(TextReader reader) { IDictionary <int, Page> pageData; IDictionary <Kerning, int> kerningDictionary; IDictionary <char, Character> charDictionary; string line; if (reader == null) { throw new ArgumentNullException("reader"); } pageData = new SortedDictionary <int, Page>(); kerningDictionary = new Dictionary <Kerning, int>(); charDictionary = new Dictionary <char, Character>(); do { line = reader.ReadLine(); if (line != null) { string[] parts; parts = BitmapFontLoader.Split(line, ' '); if (parts.Length != 0) { switch (parts[0]) { case "info": this.FamilyName = BitmapFontLoader.GetNamedString(parts, "face"); this.FontSize = BitmapFontLoader.GetNamedInt(parts, "size"); this.Bold = BitmapFontLoader.GetNamedBool(parts, "bold"); this.Italic = BitmapFontLoader.GetNamedBool(parts, "italic"); this.Charset = BitmapFontLoader.GetNamedString(parts, "charset"); this.Unicode = BitmapFontLoader.GetNamedBool(parts, "unicode"); this.StretchedHeight = BitmapFontLoader.GetNamedInt(parts, "stretchH"); this.Smoothed = BitmapFontLoader.GetNamedBool(parts, "smooth"); this.SuperSampling = BitmapFontLoader.GetNamedInt(parts, "aa"); this.Padding = BitmapFontLoader.ParsePadding(BitmapFontLoader.GetNamedString(parts, "padding")); this.Spacing = BitmapFontLoader.ParsePoint(BitmapFontLoader.GetNamedString(parts, "spacing")); this.OutlineSize = BitmapFontLoader.GetNamedInt(parts, "outline"); break; case "common": this.LineHeight = BitmapFontLoader.GetNamedInt(parts, "lineHeight"); this.BaseHeight = BitmapFontLoader.GetNamedInt(parts, "base"); this.TextureSize = new Point(BitmapFontLoader.GetNamedInt(parts, "scaleW"), BitmapFontLoader.GetNamedInt(parts, "scaleH")); this.Packed = BitmapFontLoader.GetNamedBool(parts, "packed"); this.AlphaChannel = BitmapFontLoader.GetNamedInt(parts, "alphaChnl"); this.RedChannel = BitmapFontLoader.GetNamedInt(parts, "redChnl"); this.GreenChannel = BitmapFontLoader.GetNamedInt(parts, "greenChnl"); this.BlueChannel = BitmapFontLoader.GetNamedInt(parts, "blueChnl"); break; case "page": int id; string name; id = BitmapFontLoader.GetNamedInt(parts, "id"); name = BitmapFontLoader.GetNamedString(parts, "file"); pageData.Add(id, new Page(id, name)); break; case "char": Character charData; charData = new Character { Char = (char)BitmapFontLoader.GetNamedInt(parts, "id"), Bounds = new Rectangle(BitmapFontLoader.GetNamedInt(parts, "x"), BitmapFontLoader.GetNamedInt(parts, "y"), BitmapFontLoader.GetNamedInt(parts, "width"), BitmapFontLoader.GetNamedInt(parts, "height")), Offset = new Point(BitmapFontLoader.GetNamedInt(parts, "xoffset"), BitmapFontLoader.GetNamedInt(parts, "yoffset")), XAdvance = BitmapFontLoader.GetNamedInt(parts, "xadvance"), TexturePage = BitmapFontLoader.GetNamedInt(parts, "page"), Channel = BitmapFontLoader.GetNamedInt(parts, "chnl") }; charDictionary.Add(charData.Char, charData); break; case "kerning": Kerning key; key = new Kerning((char)BitmapFontLoader.GetNamedInt(parts, "first"), (char)BitmapFontLoader.GetNamedInt(parts, "second"), BitmapFontLoader.GetNamedInt(parts, "amount")); if (!kerningDictionary.ContainsKey(key)) { kerningDictionary.Add(key, key.Amount); } break; } } } } while (line != null); this.Pages = BitmapFontLoader.ToArray(pageData.Values); this.Characters = charDictionary; this.Kernings = kerningDictionary; }