From: Mikko Rasa Date: Fri, 23 Nov 2012 08:33:27 +0000 (+0200) Subject: Support non-square cells X-Git-Tag: 1.0~13 X-Git-Url: http://git.tdb.fi/?p=ttf2png.git;a=commitdiff_plain;h=8c890869ac0dc6aa6714b3276519f1703fbfb66e Support non-square cells --- diff --git a/ttf2png.c b/ttf2png.c index 67228e5..b61d51d 100644 --- a/ttf2png.c +++ b/ttf2png.c @@ -54,7 +54,7 @@ typedef struct sFont unsigned round_to_pot(unsigned); void usage(); void init_font(Font *, FT_Face, unsigned, unsigned, int); -void render_grid(Font *, unsigned, unsigned, int); +void render_grid(Font *, unsigned, unsigned, unsigned, int); void render_packed(Font *); int save_defs(const char *, const Font *); int save_png(const char *, const Image *, char); @@ -68,7 +68,8 @@ int main(int argc, char **argv) int end = 255; int size = 10; int cpl = 0; - int cell = 0; + int cellw = 0; + int cellh = 0; char autohinter = 0; char seq = 0; char alpha = 0; @@ -132,7 +133,22 @@ int main(int argc, char **argv) cpl = strtol(optarg, NULL, 0); break; case 'c': - cell = strtol(optarg, NULL, 0); + if(!strcmp(optarg, "auto")) + { + cellw = 0; + cellh = 0; + } + else if(!strcmp(optarg, "autorect")) + { + cellw = 0; + cellh = 1; + } + else + { + cellw = strtol(optarg, &ptr, 0); + if(ptr[0]=='x' && isdigit(ptr[1])) + cellh = strtol(ptr+1, NULL, 0); + } break; case 'o': out_fn = optarg; @@ -207,7 +223,7 @@ int main(int argc, char **argv) if(pack) render_packed(&font); else - render_grid(&font, cell, cpl, seq); + render_grid(&font, cellw, cellh, cpl, seq); save_png(out_fn, &font.image, alpha); if(def_fn) save_defs(def_fn, &font); @@ -329,7 +345,7 @@ void init_font(Font *font, FT_Face face, unsigned first, unsigned last, int auto printf("Loaded %u glyphs\n", font->n_glyphs); } -void render_grid(Font *font, unsigned cell, unsigned cpl, int seq) +void render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, int seq) { unsigned i; int top = 0, bot = 0; @@ -359,19 +375,27 @@ void render_grid(Font *font, unsigned cell, unsigned cpl, int seq) maxh = font->glyphs[i].image.h; } - if(cell==0) + if(cellw==0) { - cell = top-bot; - if(maxw>cell) - cell = maxw; + int square = (cellh==cellw); + cellw = maxw; + cellh = top-bot; + if(square) + { + if(cellh>cellw) + cellw = cellh; + else + cellh = cellw; + } } if(verbose>=1) { printf("Max size: %u x %u\n", maxw, maxh); printf("Y range: [%d %d]\n", bot, top); - if(maxw>cell || top-bot>cell) - fprintf(stderr, "Warning: character size exceeds cell size (%d)\n", cell); + printf("Cell size: %u x %u\n", cellw, cellh); + if(maxw>cellw || top-bot>cellh) + fprintf(stderr, "Warning: character size exceeds cell size\n"); } if(cpl==0) @@ -379,17 +403,17 @@ void render_grid(Font *font, unsigned cell, unsigned cpl, int seq) unsigned count = (seq ? font->n_glyphs : last-first+1); for(i=1;; i<<=1) { - cpl = i/cell; - if(cpl>0 && (count+cpl-1)/cpl<=cpl) + cpl = i/cellw; + if(cpl>0 && (count+cpl-1)/cpl*cellh<=cpl*cellw) break; } } - font->image.w = round_to_pot(cpl*cell); + font->image.w = round_to_pot(cpl*cellw); if(seq && font->n_glyphsimage.h = (font->n_glyphs+cpl-1)/cpl*cell; + font->image.h = (font->n_glyphs+cpl-1)/cpl*cellh; else - font->image.h = (last-first+cpl)/cpl*cell; + font->image.h = (last-first+cpl)/cpl*cellh; font->image.h = round_to_pot(font->image.h); font->image.data = (char *)malloc(font->image.w*font->image.h); @@ -398,24 +422,21 @@ void render_grid(Font *font, unsigned cell, unsigned cpl, int seq) for(i=0; in_glyphs; ++i) { Glyph *glyph; - int cx, cy; + int ci, cx, cy; unsigned x, y; glyph = &font->glyphs[i]; if(seq) - { - cx = (i%cpl)*cell; - cy = (i/cpl)*cell; - } + ci = i; else - { - cx = ((glyph->code-first)%cpl)*cell; - cy = ((glyph->code-first)/cpl)*cell; - } + ci = glyph->code-first; + + cx = (ci%cpl)*cellw; + cy = (ci/cpl)*cellh; - if(cell>glyph->image.w) - cx += (cell-glyph->image.w)/2; + if(cellw>glyph->image.w) + cx += (cellw-glyph->image.w)/2; cy += top-glyph->offset_y-glyph->image.h; glyph->x = cx;