#region usings using System.Collections.Generic; using System.Drawing; using System.Drawing.Text; using OpenTK.Graphics.OpenGL4; using SM.Base.Textures; #endregion namespace SM.Base.Drawing.Text { /// /// Represents a font. /// public class Font : Texture { /// /// The char set for the font. /// Default: /// public ICollection CharSet = FontCharStorage.SimpleUTF8; /// /// The font family, that is used to find the right font. /// public FontFamily FontFamily; /// /// The font size. /// Default: 12 /// public float FontSize = 12; public float Spacing = 1; /// /// The font style. /// Default: /// public FontStyle FontStyle = FontStyle.Regular; /// /// This contains all information for the different font character. /// public Dictionary Positions = new Dictionary(); /// /// Generates a font from a font family from the specified path. /// /// The specified path public Font(string path) { var pfc = new PrivateFontCollection(); pfc.AddFontFile(path); FontFamily = pfc.Families[0]; } /// /// Generates a font from a specified font family. /// /// Font-Family public Font(FontFamily font) { FontFamily = font; } /// public override TextureWrapMode WrapMode { get; set; } = TextureWrapMode.ClampToEdge; /// /// Regenerates the texture. /// public void RegenerateTexture() { Width = 0; Height = 0; Positions = new Dictionary(); var map = new Bitmap(1000, 20); var charParams = new Dictionary(); using (var f = new System.Drawing.Font(FontFamily, FontSize, FontStyle)) { using (var g = Graphics.FromImage(map)) { g.Clear(Color.Transparent); foreach (var c in CharSet) { var s = c.ToString(); var size = g.MeasureString(s, f); try { charParams.Add(c, new[] {size.Width, Width}); } catch { // ignored } if (Height < size.Height) Height = (int) size.Height; Width += (int) size.Width; } } map = new Bitmap(Width, Height); using (var g = Graphics.FromImage(map)) { foreach (var keyValuePair in charParams) { var normalizedX = (keyValuePair.Value[1] + 0.00001f) / Width; var normalizedWidth = keyValuePair.Value[0] / Width; CharParameter parameter; Positions.Add(keyValuePair.Key, parameter = new CharParameter { NormalizedWidth = normalizedWidth, NormalizedX = normalizedX, Width = keyValuePair.Value[0], X = (int) keyValuePair.Value[1] }); g.DrawString(keyValuePair.Key.ToString(), f, Brushes.White, parameter.X, 0); } } } Map = map; Recompile(); } /// public override void Compile() { RegenerateTexture(); base.Compile(); } } }