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();
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':
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;