Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
            }
        }