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); }