public NISFont DrawT3BFontBitmap(char[] strings) { NISFont fnt_data = new NISFont(); Bitmap bmp = new Bitmap(Config.texture_width, Config.texture_height); Graphics g = Graphics.FromImage(bmp); g.Clear(Color.FromArgb(0x00000000)); int x = 0, y = 0; int tile_w = Config.fontWidth; int tile_h = Config.fontHeight; int relativePositionX = 1; int relativePositionY = -2; int font_height = Config.fontSize; Library library = new Library(); string facename = Config.ttfName; Face face = library.NewFace(facename, 0); float left, right, top, bottom, FHT; int FHD, kx, ky; foreach (char currentChar0 in strings) { uint charid = uchar2code(currentChar0.ToString()); face.SetCharSize(0, font_height, 0, 72); if (charid < 0x7f) { font_height = Config.fontSize - 2; face.SetCharSize(0, font_height, 0, 72); } else { font_height = Config.fontSize; } face.SetPixelSizes((uint)0, (uint)font_height); uint glyphIndex = face.GetCharIndex(charid); //Console.WriteLine(glyphIndex); face.LoadGlyph(glyphIndex, LoadFlags.Default, LoadTarget.Lcd); face.Glyph.Outline.Embolden(0.5); face.Glyph.RenderGlyph(RenderMode.Normal); FTBitmap ftbmp = face.Glyph.Bitmap; FTBitmap ftbmp2 = face.Glyph.Bitmap; left = (float)face.Glyph.Metrics.HorizontalBearingX; right = (float)face.Glyph.Metrics.HorizontalBearingX + (float)face.Glyph.Metrics.Width; top = (float)face.Glyph.Metrics.HorizontalBearingY; bottom = (float)face.Glyph.Metrics.HorizontalBearingY + (float)face.Glyph.Metrics.Height; FHT = font_height; FHD = (int)Math.Ceiling(FHT); kx = x + (int)Math.Round(left); ky = (int)Math.Round((float)y + (float)Math.Ceiling(FHT) - (float)top); if (ftbmp.Width == 0 || glyphIndex < 0x20) { Face face1 = library.NewFace(Config.baseName, 0); face1.SetCharSize(0, font_height, 0, 72); face1.SetPixelSizes((uint)0, (uint)font_height); glyphIndex = face1.GetCharIndex(charid); face1.LoadGlyph(glyphIndex, LoadFlags.Default, LoadTarget.Lcd); face1.Glyph.Outline.Embolden(Fixed26Dot6.FromDouble(0.4)); face1.Glyph.RenderGlyph(RenderMode.Normal); left = (float)face1.Glyph.Metrics.HorizontalBearingX; right = (float)face1.Glyph.Metrics.HorizontalBearingX + (float)face1.Glyph.Metrics.Width; top = (float)face1.Glyph.Metrics.HorizontalBearingY; bottom = (float)face1.Glyph.Metrics.HorizontalBearingY + (float)face1.Glyph.Metrics.Height; FHT = font_height; FHD = (int)Math.Ceiling(FHT); kx = x + (int)Math.Round(left); ky = (int)Math.Round((float)y + (float)Math.Ceiling(FHT) - (float)top); ftbmp = face1.Glyph.Bitmap; ftbmp2 = face1.Glyph.Bitmap; } fnt_data.charvalues.Add(new XYWH((int)uchar2code(currentChar0.ToString()), x, y, tile_w, tile_h, 0)); if (ftbmp2.Width == 0) { x += tile_w; if (x + tile_w > Config.texture_width) { x = 0; y += tile_h; } continue; } Bitmap cBmp = ftbmp2.ToGdipBitmap(Color.White); g.DrawImageUnscaled(cBmp, kx + relativePositionX, ky + relativePositionY); g.DrawImageUnscaled(cBmp, kx + relativePositionX, ky + relativePositionY); cBmp.Dispose(); x += tile_w; if (x + tile_w > Config.texture_width) { x = 0; y += tile_h; } } fnt_data.bitmap = bmp; return(fnt_data); }
public static void MakeFontFromCSV(string fName) { BMFont bmfont = new BMFont(); string[] lines = System.IO.File.ReadAllLines(fName, EncodingType.GetType(fName)); foreach (string line in lines) { if (line.IndexOf("//") == 0) { continue; } if (line.Contains(",")) { string c_line = line.Replace("\n", ""); c_line = c_line.Replace("\r", ""); string[] par = c_line.Split(','); string _fontName = par[0]; string _ttfName = par[1]; string _charmap = par[2]; int _fontWidth = Convert.ToInt16(par[3]); int _fontHeight = Convert.ToInt16(par[4]); int _fontSize = Convert.ToInt16(par[5]); string chars = ReadFromFile(_charmap); int _texture_width = 1024; int a2 = _texture_width / _fontWidth; int t1 = chars.Length / a2; int t2 = chars.Length % a2; int _texture_height = t1 * _fontHeight; if (t2 > 0) { _texture_height += _fontHeight; } if (_texture_height % 256 != 0) { _texture_height = _texture_height + (256 - _texture_height % 256); } Config.fontWidth = _fontWidth; Config.fontHeight = _fontHeight; Config.fontSize = _fontSize; Config.ttfName = _ttfName; Config.texture_width = _texture_width; Config.texture_height = _texture_height; Config.unk0 = Convert.ToUInt32(par[6], 16); Config.unk1 = Convert.ToUInt32(par[7], 16); Config.unk2 = Convert.ToUInt32(par[8], 16); Config.unk3 = Convert.ToUInt32(par[9], 16); if (File.Exists(_ttfName)) { Console.WriteLine("Gen NIS font...\n_fontName:{0},{1},{2},{3},{4}:{5}x{6}", _fontName, _ttfName, _charmap, _fontHeight, chars.Length, _texture_width, _texture_height); NISFont fnt_data = bmfont.DrawT3BFontBitmap(chars.ToCharArray()); if (!Directory.Exists("import")) { Directory.CreateDirectory("import"); } using (Graphics g = Graphics.FromImage(fnt_data.bitmap)) { IntPtr hdc = g.GetHdc(); string dst_imgname = string.Format("import//{0}.tga", _fontName); string dst_nmfname = string.Format("import//{0}.nmf", _fontName); FIBITMAP fBitmap = FreeImage.CreateFromHbitmap(fnt_data.bitmap.GetHbitmap(), hdc ); if (File.Exists(dst_imgname)) { File.Delete(dst_imgname); } FreeImage.SaveEx(fBitmap, dst_imgname); byte[] dst_data = MakeFrm(fnt_data.charvalues); File.WriteAllBytes(dst_nmfname, dst_data); } } } } }