using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace SpriteFontPlus { public class TtfFontBakerResult { public Dictionary Glyphs { get; private set; } public float FontFontPixelHeight { get; private set; } public byte[] Pixels { get; private set; } public int Width { get; private set; } public int Height { get; private set; } public TtfFontBakerResult(Dictionary glyphs, float fontPixelHeight, byte[] pixels, int width, int height) { if (glyphs == null) { throw new ArgumentNullException(nameof(glyphs)); } if (fontPixelHeight <= 0) { throw new ArgumentOutOfRangeException(nameof(fontPixelHeight)); } if (pixels == null) { throw new ArgumentNullException(nameof(pixels)); } if (width <= 0) { throw new ArgumentOutOfRangeException(nameof(width)); } if (height <= 0) { throw new ArgumentOutOfRangeException(nameof(height)); } if (pixels.Length < width * height) { throw new ArgumentException("pixels.Length should be higher than width * height"); } Glyphs = glyphs; FontFontPixelHeight = fontPixelHeight; Pixels = pixels; Width = width; Height = height; } public SpriteFont CreateSpriteFont(GraphicsDevice graphicsDevice) { var rgb = new Color[Width * Height]; for (var i = 0; i < Pixels.Length; ++i) { var b = Pixels[i]; rgb[i].R = b; rgb[i].G = b; rgb[i].B = b; rgb[i].A = b; } var texture = new Texture2D(graphicsDevice, Width, Height); texture.SetData(rgb); var glyphBounds = new List(); var cropping = new List(); var chars = new List(); var kerning = new List(); var orderedKeys = Glyphs.Keys.OrderBy(a => a); foreach (var key in orderedKeys) { var character = Glyphs[key]; var bounds = new Rectangle(character.X, character.Y, character.Width, character.Height); glyphBounds.Add(bounds); cropping.Add(new Rectangle((int)character.XOffset, character.YOffset, bounds.Width, bounds.Height)); chars.Add((char)key); kerning.Add(new Vector3(0, bounds.Width, character.XAdvance - bounds.Width)); } var constructorInfo = typeof(SpriteFont).GetTypeInfo().DeclaredConstructors.First(); var font = (SpriteFont)constructorInfo.Invoke(new object[] { texture, glyphBounds, cropping, chars, (int)FontFontPixelHeight, 0, kerning, ' ' }); return font; } } }