Пример #1
0
        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);
                        }
                    }
                }
            }
        }