typedef struct sImage
{
unsigned w, h;
- char *data;
+ char *data;
} Image;
typedef struct sGlyph
{
unsigned index;
unsigned code;
- Image image;
+ Image image;
unsigned x, y;
- int offset_x;
- int offset_y;
- int advance;
+ int offset_x;
+ int offset_y;
+ int advance;
} Glyph;
typedef struct sKerning
typedef struct sFont
{
unsigned size;
- int ascent;
- int descent;
+ int ascent;
+ int descent;
unsigned n_glyphs;
- Glyph *glyphs;
+ Glyph *glyphs;
unsigned n_kerning;
- Kerning *kerning;
- Image image;
+ Kerning *kerning;
+ Image image;
} Font;
-void usage();
+void usage(void);
unsigned round_to_pot(unsigned);
void *alloc_image_data(size_t, size_t);
int init_font(Font *, FT_Face, unsigned, unsigned, int);
int main(int argc, char **argv)
{
char *fn;
- int begin = 0;
- int end = 255;
- int size = 10;
- int cpl = 0;
- int cellw = 0;
- int cellh = 0;
+ int begin = 0;
+ int end = 255;
+ int size = 10;
+ int cpl = 0;
+ int cellw = 0;
+ int cellh = 0;
char autohinter = 0;
char seq = 0;
char alpha = 0;
char invert = 0;
char pack = 0;
- int margin = 0;
- int padding = 1;
+ int margin = 0;
+ int padding = 1;
FT_Library freetype;
- FT_Face face;
+ FT_Face face;
- int err;
- int i;
+ int err;
+ int i;
char *out_fn = "font.png";
char *def_fn = NULL;
while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:")) != -1)
{
char *ptr;
- int temp;
+ int temp;
switch(i)
{
case 'r':
return 0;
}
-void usage()
+void usage(void)
{
- printf("ttf2png 1.0 - True Type Font to PNG converter\n"
- "Copyright (c) 2004-2008 Mikko Rasa, Mikkosoft Productions\n"
+ printf("ttf2png 1.1 - True Type Font to PNG converter\n"
+ "Copyright (c) 2004-2018 Mikko Rasa, Mikkosoft Productions\n"
"Distributed under the GNU General Public License\n\n");
printf("Usage: ttf2png [options] <TTF file>\n\n");
printf("Accepted options (default values in [brackets])\n"
- " -r Range of characters to convert [0,255]\n"
+ " -r Range of code points to convert [0,255]\n"
" -s Font size to use, in pixels [10]\n"
- " -l Number of characters to put in one line [auto]\n"
- " -c Character cell size, in pixels [auto]\n"
+ " -l Number of glyphs to put in one line [auto]\n"
+ " -c Glyph cell size, in pixels (grid mode only) [auto]\n"
" -o Output file name (or - for stdout) [font.png]\n");
printf(" -a Force autohinter\n"
" -t Render glyphs to alpha channel\n"
" -i Invert colors of the glyphs\n"
" -v Increase the level of verbosity\n"
- " -e Use cells in sequence, without gaps\n"
+ " -e Use cells in sequence, without gaps (grid mode only)\n"
" -p Pack the glyphs tightly instead of in a grid\n"
- " -m Margin around image edges in packed mode [0]\n"
- " -n Padding between packed glyphs [1]\n"
+ " -m Margin around image edges (packed mode only) [0]\n"
+ " -n Padding between glyphs (packed mode only) [1]\n"
" -d File name for writing glyph definitions\n"
" -h Print this message\n");
}
font->glyphs = NULL;
for(i=first; i<=last; ++i)
{
- unsigned n;
+ unsigned n;
FT_Bitmap *bmp = &face->glyph->bitmap;
- unsigned x, y;
- int flags = 0;
- Glyph *glyph;
+ unsigned x, y;
+ int flags = 0;
+ Glyph *glyph;
n = FT_Get_Char_Index(face, i);
if(!n)
int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, int seq)
{
unsigned i;
- int top = 0, bot = 0;
+ int top = 0, bot = 0;
unsigned first, last;
unsigned maxw = 0, maxh = 0;
for(i=0; i<font->n_glyphs; ++i)
{
- Glyph *glyph;
+ Glyph *glyph;
unsigned ci, cx, cy;
unsigned x, y;
int render_packed(Font *font, unsigned margin, unsigned padding)
{
unsigned i;
- size_t area = 0;
- char *used_glyphs;
+ size_t area = 0;
+ char *used_glyphs;
unsigned *used_pixels;
unsigned cx = margin, cy;
unsigned used_h = 0;
{
unsigned w;
unsigned x, y;
- Glyph *glyph = NULL;
+ Glyph *glyph = NULL;
unsigned best_score = 0;
unsigned target_h = 0;
- /* Find the leftmost free pixel on this row. Also record the lowest extent of glyphs
- to the left of the free position. */
+ /* Find the leftmost free pixel on this row. Also record the lowest
+ extent of glyphs to the left of the free position. */
for(; (cx+margin<font->image.w && used_pixels[cx]>cy); ++cx)
if(used_pixels[cx]-cy-padding>target_h)
target_h = used_pixels[cx]-cy-padding;
int save_defs(const char *fn, const Font *font)
{
- FILE *out;
+ FILE *out;
unsigned i;
out = fopen(fn, "w");
int save_png(const char *fn, const Image *image, char alpha)
{
- FILE *out;
+ FILE *out;
png_struct *pngs;
- png_info *pngi;
- png_byte **rows;
- unsigned i;
- png_byte *data2 = 0;
- int color;
+ png_info *pngi;
+ png_byte **rows;
+ unsigned i;
+ png_byte *data2 = 0;
+ int color;
if(!strcmp(fn, "-"))
out = stdout;