Exemplo n.º 1
0
 /// <summary>
 /// 文字エントリーを追加する。
 /// </summary>
 /// <param name="entry">文字エントリー</param>
 public void AddEntry(FsbBMFontCharacter entry)
 {
     if (this.Items.ContainsKey(entry.CharacterID))
     {
         var msg = $"Duplicate character-id({entry.CharacterID}).";
         throw new Exception(msg);
     }
     else
     {
         this.Items.Add(entry.CharacterID, entry);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// BMFontで作成されたXML形式の座標情報を読み込み、
        /// フォントマップ オブジェクを返す。
        /// </summary>
        /// <param name="path">座標情報ファイルのパス</param>
        /// <returns>フォントマップ オブジェク</returns>
        public static FsbBMFontMap Load(string path)
        {
            var xml = new XmlDocument();

            using (var fs = new FileStream(
                       path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var sr = new StreamReader(fs, Encoding.UTF8))
                {
                    var text = sr.ReadToEnd();
                    xml.LoadXml(text);
                }
            }

            XmlNode info   = xml.GetElementsByTagName("info")[0];
            XmlNode common = xml.GetElementsByTagName("common")[0];

            var fontMap = new FsbBMFontMap();

            fontMap.FontSize    = int.Parse(GetValue(info, "size"));
            fontMap.ImageWidth  = int.Parse(GetValue(common, "scaleW"));
            fontMap.ImageHeight = int.Parse(GetValue(common, "scaleH"));
            fontMap.FontBase    = int.Parse(GetValue(common, "base"));

            //// キャラクターの情報を処理する
            {
                XmlNodeList chars = xml.GetElementsByTagName("chars")[0].ChildNodes;
                for (int i = 0; i < chars.Count; i++)
                {
                    XmlNode charNode = chars[i];
                    if (charNode.Attributes != null)
                    {
                        var entry = new FsbBMFontCharacter();
                        entry.CharacterID = int.Parse(GetValue(charNode, "id"));
                        entry.PosX        = int.Parse(GetValue(charNode, "x"));
                        entry.PosY        = int.Parse(GetValue(charNode, "y"));
                        entry.Width       = int.Parse(GetValue(charNode, "width"));
                        entry.Height      = int.Parse(GetValue(charNode, "height"));
                        entry.OffsetX     = int.Parse(GetValue(charNode, "xoffset"));
                        entry.OffsetY     = int.Parse(GetValue(charNode, "yoffset"));

                        entry.AdvanceX = int.Parse(GetValue(charNode, "xadvance"));
                        entry.Channel  = int.Parse(GetValue(charNode, "chnl"));

                        fontMap.AddEntry(entry);
                    }
                }
            }

            //// カーニングの情報を処理する。
            {
                XmlNodeList kernings = xml.GetElementsByTagName("kernings")[0].ChildNodes;
                for (int i = 0; i < kernings.Count; i++)
                {
                    XmlNode kerningNode = kernings[i];
                    if (kerningNode.Attributes != null)
                    {
                        var first  = int.Parse(GetValue(kerningNode, "first"));
                        var second = int.Parse(GetValue(kerningNode, "second"));
                        var amount = int.Parse(GetValue(kerningNode, "amount"));

                        var entry = new FsbBMFontKerningPair(first, second, amount);
                        fontMap.AddKerningPair(entry);
                    }
                }
            }

            return(fontMap);
        }