public void Write(string path, FontFile fontFile) { using (var fs = new FileStream(path, FileMode.Create)) { using (var bw = new BinaryWriter(fs, Encoding.Unicode)) { bw.Write(fontFile.CharCount); foreach (var c in fontFile.Chars) { bw.Write(c.Glyph); bw.Write(c.Cropping); bw.Write(c.Char); bw.Write(c.Kerning); } bw.Write(fontFile.LineSpacing); bw.Write(fontFile.Spacing); bw.Write(fontFile.HasDefaultChar); if (fontFile.HasDefaultChar) { bw.Write(fontFile.DefaultChar); } } } if (fontFile.Texture == null) { return; } fontFile.Texture.Save(path + ".png", ImageFormat.Png); }
public void PrintChars(FontFile fontFile, string dirPath) { if (fontFile.Texture == null) { return; } foreach (var c in fontFile.Chars) { try { var bitmap = new Bitmap(c.Glyph.Width, c.Glyph.Height); using (var g = Graphics.FromImage(bitmap)) { g.DrawImage(fontFile.Texture, new RectangleF(0, 0, c.Glyph.Width, c.Glyph.Height), c.Glyph.Convert(), GraphicsUnit.Pixel); var path = $"{dirPath}/{c.Char}.png"; if (Path.GetInvalidPathChars().Contains(c.Char)) { path = $"{dirPath}/{CharToUnicode(c.Char)}.png"; } bitmap.Save(path, ImageFormat.Png); } } catch (Exception e) { Console.WriteLine(e); } } }
public FontFile Read(string path, string texturePath = "") { if (!File.Exists(path)) { Console.WriteLine($"File not exist!: {path}"); return(null); } using (var fs = new FileStream(path, FileMode.Open)) { using (var br = new BinaryReader(fs, Encoding.Unicode)) { var charCount = br.ReadInt32(); if (charCount < 1) { Console.WriteLine($"Char count cannot less than 1!: {charCount}"); return(null); } var fontFile = new FontFile(charCount); for (int i = 0; i < charCount; i++) { fontFile.Chars.Add(new FontChar { Glyph = br.ReadRectangle(), Cropping = br.ReadRectangle(), Char = br.ReadChar(), Kerning = br.ReadVector3(), }); } fontFile.LineSpacing = br.ReadInt32(); fontFile.Spacing = br.ReadSingle(); if (br.ReadBoolean()) { fontFile.DefaultChar = br.ReadChar(); fontFile.HasDefaultChar = true; } else { fontFile.HasDefaultChar = false; } if (!string.IsNullOrWhiteSpace(texturePath)) { fontFile.Texture = ReadTexture(texturePath); } return(fontFile); } } }
public FontFile Generate(Font font, int size, char[] chars, int minusKerning = 5, int compressSize = 2, int lineSpacing = 24, float spacing = 0, char defaultChar = '*') { var fontFile = new FontFile(chars.Length); fontFile.LineSpacing = lineSpacing; fontFile.Spacing = spacing; fontFile.HasDefaultChar = true; fontFile.DefaultChar = '*'; Bitmap png = new Bitmap(size, size); using (var g = Graphics.FromImage(png)) { g.SmoothingMode = SmoothingMode.AntiAlias; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.PixelOffsetMode = PixelOffsetMode.HighQuality; float xNow = 1; float yNow = 1; float yMax = 0; int count = 0; foreach (var c in chars) { var charRect = g.MeasureString(c.ToString(), font); charRect.Width -= compressSize; charRect.Height -= compressSize; if (charRect.Height > yMax) { yMax = charRect.Height; } if (xNow + charRect.Width + 10 > size) { yNow += yMax; yMax = 0; xNow = 1; } if (yNow > size) { Console.WriteLine(count); } g.DrawString(c.ToString(), font, Brushes.White, new RectangleF((int)xNow, (int)yNow, (int)charRect.Width, (int)charRect.Height)); var fontChar = new FontChar { Char = c, Cropping = new Rectangle(0, 0, (int)charRect.Width, (int)charRect.Height + 2), Glyph = new Rectangle((int)xNow, (int)yNow, (int)charRect.Width, (int)charRect.Height), Kerning = new Vector3(0, charRect.Width - minusKerning, 0) }; fontFile.Chars.Add(fontChar); xNow += charRect.Width; count++; } fontFile.Texture = png; return(fontFile); } }