yankejustin 1ba64128bb Dispose of old textures
If there were previously-stored fonts, dispose of them before creating
new fonts.
2015-08-07 14:11:33 -04:00

107 lines
2.9 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
namespace TrueCraft.Client.Rendering
{
/// <summary>
/// Represents a font.
/// </summary>
public class Font
{
private FontFile _definition;
private Texture2D[] _textures;
private Dictionary<char, FontChar> _glyphs;
/// <summary>
///
/// </summary>
public string Name { get; private set; }
/// <summary>
///
/// </summary>
public FontStyle Style { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="contentManager"></param>
/// <param name="name"></param>
/// <param name="style"></param>
public Font(ContentManager contentManager, string name, FontStyle style = FontStyle.Regular)
{
Name = name;
Style = style;
LoadContent(contentManager);
GenerateGlyphs();
}
/// <summary>
///
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
public Texture2D GetTexture(int page = 0)
{
return _textures[page];
}
/// <summary>
///
/// </summary>
/// <param name="ch"></param>
/// <returns></returns>
public FontChar GetGlyph(char ch)
{
FontChar glyph = null;
_glyphs.TryGetValue(ch, out glyph);
return glyph;
}
/// <summary>
///
/// </summary>
/// <param name="contentManager"></param>
private void LoadContent(ContentManager contentManager)
{
var definitionPath = string.Format("{0}_{1}.fnt", Name, Style);
using (var contents = File.OpenRead(Path.Combine(contentManager.RootDirectory, definitionPath)))
_definition = FontLoader.Load(contents);
if (_textures != null)
{
for (int i = 0; i < _textures.Length; i++)
{
_textures[i].Dispose();
}
}
// We need to support multiple texture pages for more than plain ASCII text.
_textures = new Texture2D[_definition.Pages.Count];
for (int i = 0; i < _definition.Pages.Count; i++)
{
var texturePath = string.Format("{0}_{1}_{2}.png", Name, Style, i);
_textures[i] = contentManager.Load<Texture2D>(texturePath);
}
}
/// <summary>
///
/// </summary>
private void GenerateGlyphs()
{
_glyphs = new Dictionary<char, FontChar>();
foreach (var glyph in _definition.Chars)
{
char c = (char)glyph.ID;
_glyphs.Add(c, glyph);
}
}
}
}