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", "");
|
}
|
}
|
}
|
}
|
}
|
}
|