| using UnityEngine; | 
| using UnityEditor; | 
| using System.Text; | 
|   | 
| /// <summary> | 
| /// Helper class that takes care of loading BMFont's glyph information from the specified byte array. | 
| /// This functionality is not a part of BMFont anymore because Flash export option can't handle System.IO functions. | 
| /// </summary> | 
|   | 
| public static class CustomFontReader { | 
|     /// <summary> | 
|     /// Helper function that retrieves the string value of the key=value pair. | 
|     /// </summary> | 
|   | 
|     static string GetString (string s) { | 
|         int idx = s.IndexOf('='); | 
|         return (idx == -1) ? "" : s.Substring(idx + 1); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// Helper function that retrieves the integer value of the key=value pair. | 
|     /// </summary> | 
|   | 
|     static int GetInt (string s) { | 
|         int val = 0; | 
|         string text = GetString(s); | 
| #if UNITY_FLASH | 
|         try { val = int.Parse(text); } catch (System.Exception) { } | 
| #else | 
|         int.TryParse(text, out val); | 
| #endif | 
|         return val; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// Reload the font data. | 
|     /// </summary> | 
|   | 
|     static public void Load (BMFont font, string name, byte[] bytes) { | 
|         font.Clear(); | 
|   | 
|         if (bytes != null) { | 
|             ByteReader reader = new ByteReader(bytes); | 
|             char[] separator = new char[] { ' ' }; | 
|   | 
|             while (reader.canRead) { | 
|                 string line = reader.ReadLine(); | 
|                 if (string.IsNullOrEmpty(line)) | 
|                     break; | 
|                 string[] split = line.Split(separator, System.StringSplitOptions.RemoveEmptyEntries); | 
|                 int len = split.Length; | 
|   | 
|                 if (split[0] == "char") { | 
|                     // Expected data style: | 
|                     // char id=13 x=506 y=62 width=3 height=3 xoffset=-1 yoffset=50 xadvance=0 page=0 chnl=15 | 
|   | 
|                     int channel = (len > 10) ? GetInt(split[10]) : 15; | 
|   | 
|                     if (len > 9 && GetInt(split[9]) > 0) { | 
|                         Debug.LogError("Your font was exported with more than one texture. Only one texture is supported by NGUI.\n" + | 
|                             "You need to re-export your font, enlarging the texture's dimensions until everything fits into just one texture."); | 
|                         break; | 
|                     } | 
|   | 
|                     if (len > 8) { | 
|                         int id = GetInt(split[1]); | 
|                         BMGlyph glyph = font.GetGlyph(id, true); | 
|   | 
|                         if (glyph != null) { | 
|                             glyph.x = GetInt(split[2]); | 
|                             glyph.y = GetInt(split[3]); | 
|                             glyph.width = GetInt(split[4]); | 
|                             glyph.height = GetInt(split[5]); | 
|                             glyph.offsetX = GetInt(split[6]); | 
|                             glyph.offsetY = GetInt(split[7]); | 
|                             glyph.advance = GetInt(split[8]); | 
|                             glyph.channel = channel; | 
|                         } | 
|                         else | 
|                             Debug.Log("Char: " + split[1] + " (" + id + ") is NULL"); | 
|                     } | 
|                     else { | 
|                         Debug.LogError("Unexpected number of entries for the 'char' field (" + name + ", " + split.Length + "):\n" + line); | 
|                         break; | 
|                     } | 
|                 } | 
|                 else if (split[0] == "kerning") { | 
|                     // Expected data style: | 
|                     // kerning first=84 second=244 amount=-5  | 
|   | 
|                     if (len > 3) { | 
|                         int first = GetInt(split[1]); | 
|                         int second = GetInt(split[2]); | 
|                         int amount = GetInt(split[3]); | 
|   | 
|                         BMGlyph glyph = font.GetGlyph(second, true); | 
|                         if (glyph != null) | 
|                             glyph.SetKerning(first, amount); | 
|                     } | 
|                     else { | 
|                         Debug.LogError("Unexpected number of entries for the 'kerning' field (" + | 
|                             name + ", " + split.Length + "):\n" + line); | 
|                         break; | 
|                     } | 
|                 } | 
|                 else if (split[0] == "common") { | 
|                     // Expected data style: | 
|                     // common lineHeight=64 base=51 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=4 greenChnl=4 blueChnl=4 | 
|   | 
|                     if (len > 5) { | 
|                         font.charSize = GetInt(split[1]); | 
|                         font.baseOffset = GetInt(split[2]); | 
|                         font.texWidth = GetInt(split[3]); | 
|                         font.texHeight = GetInt(split[4]); | 
|   | 
|                         int pages = GetInt(split[5]); | 
|   | 
|                         if (pages != 1) { | 
|                             Debug.LogError("Font '" + name + "' must be created with only 1 texture, not " + pages); | 
|                             break; | 
|                         } | 
|                     } | 
|                     else { | 
|                         Debug.LogError("Unexpected number of entries for the 'common' field (" + | 
|                             name + ", " + split.Length + "):\n" + line); | 
|                         break; | 
|                     } | 
|                 } | 
|                 else if (split[0] == "page") { | 
|                     // Expected data style: | 
|                     // page id=0 file="textureName.png" | 
|   | 
|                     if (len > 2) { | 
|                         font.spriteName = GetString(split[2]).Replace("\"", ""); | 
|                         font.spriteName = font.spriteName.Replace(".png", ""); | 
|                         font.spriteName = font.spriteName.Replace(".tga", ""); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     } | 
| } |